[{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:35\"\u003e\n\u003cspan id=\"はじめに背景目的\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB%E8%83%8C%E6%99%AF%E7%9B%AE%E7%9A%84\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに（背景・目的）\u003c/h1\u003e\n\u003cp data-sourcepos=\"2:1-3:125\"\u003eSnowflakeを利用しデータ分析基盤の構築を進めております.\u003cbr\u003e\nETL(ELT)処理をはじめデータ処理をする機能の開発のため, 以下3種類のツールを利用してます.\u003c/p\u003e\n\u003cul data-sourcepos=\"4:1-7:0\"\u003e\n\u003cli data-sourcepos=\"4:1-4:77\"\u003eSnowflakeの各種ツール(Workspaces, Task, UDF, Stored procedure etc.)\u003c/li\u003e\n\u003cli data-sourcepos=\"5:1-5:7\"\u003edbt\u003c/li\u003e\n\u003cli data-sourcepos=\"6:1-7:0\"\u003eTROCCO\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"8:1-13:57\"\u003e上記3種のツールについて開発・運用の際の利点や特徴についてまとめました.\u003cbr\u003e\n上記ツールは\u003ca href=\"https://docs.snowflake.com/ja/user-guide/ecosystem-etl\" rel=\"nofollow noopener\" target=\"_blank\"\u003eSnowflakeエコシステム\u003c/a\u003eの1つであったり,\u003cbr\u003e\n\u003ca href=\"https://www.snowflake.com/en/why-snowflake/partners/all-partners/primenumber/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eSnowflakeパートナー\u003c/a\u003eの一員となってます.\u003cbr\u003e\n従って, Snowflakeを利用してのデータ活用基盤構築に関わっているエンジニアで\u003cbr\u003e\n似たような構成をしている方がいるかもしれません.\u003cbr\u003e\nそのような方の参考になればと思います.\u003c/p\u003e\n\u003ch1 data-sourcepos=\"16:1-16:46\"\u003e\n\u003cspan id=\"徹底比較snowflake-vs-dbt-vs-trocco\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BE%B9%E5%BA%95%E6%AF%94%E8%BC%83snowflake-vs-dbt-vs-trocco\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e【徹底比較】Snowflake vs dbt vs TROCCO\u003c/h1\u003e\n\u003cp data-sourcepos=\"17:1-18:96\"\u003e各サービスの契約形態は以下を前提にしておりますので,\u003cbr\u003e\n導入検討の一環で本記事を閲覧している方はそちらもご確認ください.\u003c/p\u003e\n\u003cul data-sourcepos=\"19:1-21:21\"\u003e\n\u003cli data-sourcepos=\"19:1-19:26\"\u003eSnowflake：Enterprise\u003c/li\u003e\n\u003cli data-sourcepos=\"20:1-20:27\"\u003edbt(Cloud)：Enterprise\u003c/li\u003e\n\u003cli data-sourcepos=\"21:1-21:21\"\u003eTROCCO：Advanced\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 data-sourcepos=\"22:1-22:33\"\u003e\n\u003cspan id=\"各サービスの特徴比較\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%90%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E7%89%B9%E5%BE%B4%E6%AF%94%E8%BC%83\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e各サービスの特徴比較\u003c/h2\u003e\n\u003cp data-sourcepos=\"23:1-23:69\"\u003e各サービスの特徴をピックアップして記載します.\u003c/p\u003e\n\u003ctable data-sourcepos=\"25:1-31:215\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"25:1-25:60\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"25:2-25:15\"\u003e比較項目\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"25:17-25:36\"\u003eSnowflake (Native)\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"25:38-25:48\"\u003edbt Cloud\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"25:50-25:57\"\u003eTROCCO\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"27:1-27:230\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:2-27:19\"\u003e\u003cstrong\u003e主な役割\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:21-27:121\"\u003e・DWH\u003cbr\u003e・データ加工 (T)\u003cbr\u003e・その他開発(画面, AI, 分析, データシェア etc.)\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:123-27:172\"\u003e・データ加工 (T)\u003cbr\u003e・開発管理(CI/CD)\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:174-27:229\"\u003e・環境を跨いだデータ転送\u003cbr\u003e・ETL/ELT\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"28:1-28:316\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:2-28:19\"\u003e\u003cstrong\u003e得意事項\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:21-28:101\"\u003e・データ統合\u003cbr\u003e・UDF\u003cbr\u003e・低遅延タスク\u003cbr\u003e・コスト管理\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:103-28:239\"\u003e・品質の高い開発作業\u003cbr\u003e・SQLベースの複雑な変換\u003cbr\u003e・設計書の自動生成(公開)\u003cbr\u003e・リネージ管理\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:241-28:315\"\u003e・SaaS/DBからの抽出\u003cbr\u003e・GUIでの開発\u003cbr\u003e・資材の管理\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"29:1-29:279\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:2-29:37\"\u003e\u003cstrong\u003e開発ツール・スタイル\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:39-29:107\"\u003e・SnowSight(GUI)\u003cbr\u003e ・Notebook\u003cbr\u003e・SQL\u003cbr\u003e・Python (Snowpark)\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:109-29:186\"\u003e・dbt Studio IDE(dbt統合開発環境)\u003cbr\u003e ・モデル(SQL, YAML, md)\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:188-29:278\"\u003e・GUI(ノーコード/ローコード)\u003cbr\u003e ・SQL(高度な処理をしたい場合)\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"30:1-30:341\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:2-30:31\"\u003e\u003cstrong\u003e運用・監視ツール\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:33-30:200\"\u003e以下のような情報をGUI上で確認が可能\u003cbr\u003e ・クエリ履歴, Task履歴などの履歴情報\u003cbr\u003e ・コスト, セキュリティ等の管理情報\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:202-30:257\"\u003e・ジョブ実行管理\u003cbr\u003e ・データテスト\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:259-30:340\"\u003e・ワークフロー管理\u003cbr\u003e ・処理完了(エラー含む)通知機能\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"31:1-31:215\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:2-31:31\"\u003e\u003cstrong\u003eエンジニアスキル\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:33-31:123\"\u003e・SQL\u003cbr\u003e ・クラウドインフラ知識\u003cbr\u003e ・その他開発に適した知識\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:125-31:171\"\u003e・SQL\u003cbr\u003e ・開発手法(CI/CD, Git等)\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:173-31:214\"\u003e・比較的学習コストが低い\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"33:1-33:21\"\u003e\n\u003cspan id=\"難易度の比較\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%9B%A3%E6%98%93%E5%BA%A6%E3%81%AE%E6%AF%94%E8%BC%83\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e難易度の比較\u003c/h2\u003e\n\u003cp data-sourcepos=\"34:1-34:111\"\u003e上記比較をもとに開発・運用等の規模や難易度を比較した結果が以下になります.\u003c/p\u003e\n\u003ctable data-sourcepos=\"36:1-41:451\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"36:1-36:60\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"36:2-36:15\"\u003e比較項目\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"36:17-36:36\"\u003eSnowflake (Native)\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"36:38-36:48\"\u003edbt Cloud\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"36:50-36:57\"\u003eTROCCO\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"38:1-38:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:2-38:34\"\u003e\u003cstrong\u003e対応可能な開発規模\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:36-38:44\"\u003e小~中\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:46-38:54\"\u003e中~大\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:56-38:64\"\u003e小~中\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"39:1-39:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:2-39:25\"\u003e\u003cstrong\u003e開発の難易度\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:27-39:35\"\u003e中~難\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:37-39:45\"\u003e中~難\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:47-39:55\"\u003e易~中\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"40:1-40:52\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:2-40:25\"\u003e\u003cstrong\u003e運用の難易度\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:27-40:31\"\u003e難\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:33-40:41\"\u003e易~中\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:43-40:51\"\u003e易~中\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"41:1-41:451\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:2-41:28\"\u003e\u003cstrong\u003e利用のポイント\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:30-41:179\"\u003e・手軽に検証を開始したい場合\u003cbr\u003e ・開発にかかわる資材やコスト管理等を\u003cbr\u003eSnowflake内で完結させたい場合\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:181-41:293\"\u003e・開発のガバナンスと品質を重視する場合\u003cbr\u003e ・設計書の品質も担保したい場合\u003cbr\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:295-41:450\"\u003e・手軽に検証を開始したい場合\u003cbr\u003e ・接続先が多く, 開発速度を優先する場合\u003cbr\u003e ・資材管理を容易にしたい場合\u003cbr\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch1 data-sourcepos=\"43:1-43:50\"\u003e\n\u003cspan id=\"開発運用してわかった長所短所\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%96%8B%E7%99%BA%E9%81%8B%E7%94%A8%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F%E9%95%B7%E6%89%80%E7%9F%AD%E6%89%80\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e開発・運用してわかった長所・短所\u003c/h1\u003e\n\u003cp data-sourcepos=\"44:1-44:71\"\u003e実際にサービスを利用してみての特徴を記載します.\u003c/p\u003e\n\u003ch2 data-sourcepos=\"45:1-45:24\"\u003e\n\u003cspan id=\"snowflakeについて\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#snowflake%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eSnowflakeについて\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"46:1-46:10\"\u003e\n\u003cspan id=\"長所\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%95%B7%E6%89%80\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e長所\u003c/h3\u003e\n\u003cul data-sourcepos=\"47:1-91:53\"\u003e\n\u003cli data-sourcepos=\"47:1-75:150\"\u003e開発・運用をサポートする便利な機能をGUIで利用確認可能\n\u003cul data-sourcepos=\"48:3-75:150\"\u003e\n\u003cli data-sourcepos=\"48:3-62:140\"\u003e開発・運用\n\u003cul data-sourcepos=\"49:5-62:140\"\u003e\n\u003cli data-sourcepos=\"49:5-55:148\"\u003eワークスペース\u003cbr\u003e\n検証のためデータをSelectしたい等開発や運用時のちょっとした作業で有効.\u003cbr\u003e\nCortex Code(Snowflakeが提供するAI機能)も同じ画面で利用できるため,\u003cbr\u003e\nAIにクエリを書かせたり,\u003cbr\u003e\n自分が記載したクエリの構文エラーをチェック修正させることが容易.\u003cbr\u003e\n\u003cem\u003e図：ワークスペース. 画面右側がCortex Code.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F4a76202e-507f-4c5d-8967-af2d101b0156.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3191463c1bedb3bfe88d0e1fab88b086\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F4a76202e-507f-4c5d-8967-af2d101b0156.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3191463c1bedb3bfe88d0e1fab88b086\" alt=\"ワークスペース画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F4a76202e-507f-4c5d-8967-af2d101b0156.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b98ce70380b5892c0c5dc29fc7e83b3d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/4a76202e-507f-4c5d-8967-af2d101b0156.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"56:5-62:140\"\u003eウェアハウス利用履歴, クエリヒストリー\u003cbr\u003e\nウェアハウスのモニターから利用のピーク時間帯, どのクエリが重いか等を調査後\u003cbr\u003e\nクエリヒストリーからクエリの詳細を調査することが可能.\u003cbr\u003e\n\u003cem\u003e図：ウェアハウス利用状況\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F25179648-6795-4103-b372-f4dc79afa0ef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=99e2567537635540f5df14ac6fe6ee18\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F25179648-6795-4103-b372-f4dc79afa0ef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=99e2567537635540f5df14ac6fe6ee18\" alt=\"SF_WH_モニター画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F25179648-6795-4103-b372-f4dc79afa0ef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=544d92d58e6fbc984e73c5b20c240e3e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/25179648-6795-4103-b372-f4dc79afa0ef.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：クエリヒストリー\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc13b0c30-8c0d-4cb1-86d7-613f6873580a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=08a9a6b50776eee4b47370fd0caeba35\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc13b0c30-8c0d-4cb1-86d7-613f6873580a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=08a9a6b50776eee4b47370fd0caeba35\" alt=\"SF_QueryHistory画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc13b0c30-8c0d-4cb1-86d7-613f6873580a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=eecd55b163c031f67b80f6ee8cea6dfa 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c13b0c30-8c0d-4cb1-86d7-613f6873580a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"63:3-75:150\"\u003e管理\n\u003cul data-sourcepos=\"64:5-75:150\"\u003e\n\u003cli data-sourcepos=\"64:5-70:146\"\u003eコスト管理\u003cbr\u003e\nアカウント全体の支出, ウェアハウス毎消費上位, DB毎のストレージ使用料\u003cbr\u003e\n等を1画面で把握可能.\u003cbr\u003e\n\u003cem\u003e図：アカウント全体のコスト状況. 期間を指定して確認が可能.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc0094bee-f7d2-4ae4-8b06-6e9324152195.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9335b06c8239ff9070364c0de1db9cf6\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc0094bee-f7d2-4ae4-8b06-6e9324152195.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9335b06c8239ff9070364c0de1db9cf6\" alt=\"SF_アカウントコスト状況\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc0094bee-f7d2-4ae4-8b06-6e9324152195.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=aa14c5148e504892e6a7972643c4d55c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c0094bee-f7d2-4ae4-8b06-6e9324152195.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：ストレージ使用量. アカウントに存在するDBごとの利用状況が確認可能\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fbae4c7db-b393-4e0d-840e-b26a50195d3a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=57afc1312a66b4335d4269c967a882f9\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fbae4c7db-b393-4e0d-840e-b26a50195d3a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=57afc1312a66b4335d4269c967a882f9\" alt=\"SF_ストレージ使用量\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fbae4c7db-b393-4e0d-840e-b26a50195d3a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=99cc2bacda0f3bf6d814624c474b5d0f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/bae4c7db-b393-4e0d-840e-b26a50195d3a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"71:5-75:150\"\u003eトラストセンター. アカウントのセキュリティ関わるアクティビティが確認可能\u003cbr\u003e\nアカウントのセキュリティインシデントの調査をSnowflakeが自動で実施し,\u003cbr\u003e\nその結果を1画面で確認可能.\u003cbr\u003e\n\u003cem\u003e図：トラストセンター\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F70a7da63-82ac-42d1-81d0-20c3499863fa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=8f3f50a873085a538a4103526511b4f4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F70a7da63-82ac-42d1-81d0-20c3499863fa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=8f3f50a873085a538a4103526511b4f4\" alt=\"SF_トラストセンター\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F70a7da63-82ac-42d1-81d0-20c3499863fa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=9d74ddb3c286f3f66e3ea89b23576f28 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/70a7da63-82ac-42d1-81d0-20c3499863fa.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"76:1-84:129\"\u003eデータを活用するための機能にも積極的なアップデートがかかっている.\u003cbr\u003e\nただのDWH基盤ではなく,\u003cbr\u003e\n蓄積したデータを活用するための機能についても積極的にアップデートが実施されてます.\u003cbr\u003e\n例えば, 画面の開発をしたい⇒Streamlit, インタラクティブな分析をしたい⇒Notebook,\u003cbr\u003e\n近年ではAI関連の機能(Snowflake IntelligenceやCortexシリーズ)にも力を入れております.\u003cbr\u003e\n\u003cem\u003e図：Streamlit画面. ダッシュボードなどの画面開発に有用\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F803b8dc6-a4dd-4761-aa6e-f4eb1b05de1d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0c8352a4efb952e9e8c925bbdfe59e67\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F803b8dc6-a4dd-4761-aa6e-f4eb1b05de1d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0c8352a4efb952e9e8c925bbdfe59e67\" alt=\"SF_SLAPP例\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F803b8dc6-a4dd-4761-aa6e-f4eb1b05de1d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=afbf11c060115ca9d0cf85b0b8be11df 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/803b8dc6-a4dd-4761-aa6e-f4eb1b05de1d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：Snowflake Intelligence 組織が作成したエージェントに1画面でアクセス可能となる\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F1fbc0ee8-71a8-45e0-8c40-c7d1ffee4238.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bb8916e10207d6ec93719b103b3d4f69\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F1fbc0ee8-71a8-45e0-8c40-c7d1ffee4238.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bb8916e10207d6ec93719b103b3d4f69\" alt=\"SF_Intel画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F1fbc0ee8-71a8-45e0-8c40-c7d1ffee4238.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=1721336e18e5f6ed86bf4816f319c1bb 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/1fbc0ee8-71a8-45e0-8c40-c7d1ffee4238.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"85:1-91:53\"\u003eコストの管理をSnowflakeのみに絞ることが可能\u003cbr\u003e\n上記2つのメリットに付随する点となりますが,\u003cbr\u003e\nコストの消費・管理をSnowflake1つに絞ることが可能となります.\u003cbr\u003e\nSnowflakeの機能のみでデータの蓄積から利活用を実施可能ですし,\u003cbr\u003e\nそれら活動で生じるコストについてもメリット1つ目に挙げた管理機能で確認が可能となります.\u003cbr\u003e\n今回紹介する外部ツールdbt, TROCCOの利用にはどうしても少なくない一定のコストがかかってしまうので,\u003cbr\u003e\nこの点は無視できないかと思います.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"92:1-92:10\"\u003e\n\u003cspan id=\"短所\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9F%AD%E6%89%80\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e短所\u003c/h3\u003e\n\u003cul data-sourcepos=\"93:1-102:0\"\u003e\n\u003cli data-sourcepos=\"93:1-102:0\"\u003e開発規模が大きくなるにつれてガバナンスを保つことや資材の管理が困難になる\u003cbr\u003e\n上記メリットで記載した通り, Snowflakeの機能のみを利用し, 簡単な検証・開発等は実施可能ではあります.\u003cbr\u003e\nただ開発規模が大きくなるにつれて開発のガバナンスが取りづらくなりますし,\u003cbr\u003e\nオブジェクトの管理も煩雑になります.\u003cbr\u003e\nまた, 開発の際はSQL, (pythonなどの)コード, クラウドについての一定の知識が求められます.\u003cbr\u003e\nデータベースエクスプローラーというオブジェクト確認用のツールはあるものの,\u003cbr\u003e\nやはり他専門の開発ツールには劣ります.\u003cbr\u003e\n\u003cem\u003e図：データベースエクスプローラー. GUI上でDBやスキーマをクリックしオブジェクトの確認ができる\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F592e54ed-2a30-4289-9722-47da044e0c73.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a5e8efcaede0e3f536c212ac99d2c570\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F592e54ed-2a30-4289-9722-47da044e0c73.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a5e8efcaede0e3f536c212ac99d2c570\" alt=\"データベースエクスプローラー\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F592e54ed-2a30-4289-9722-47da044e0c73.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=76940e2beedf71fafae46c133af2c83b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/592e54ed-2a30-4289-9722-47da044e0c73.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 data-sourcepos=\"103:1-103:24\"\u003e\n\u003cspan id=\"dbt-cloudについて\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#dbt-cloud%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003edbt Cloudについて\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"104:1-104:10\"\u003e\n\u003cspan id=\"長所-1\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%95%B7%E6%89%80-1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e長所\u003c/h3\u003e\n\u003cul data-sourcepos=\"105:1-135:3\"\u003e\n\u003cli data-sourcepos=\"105:1-115:143\"\u003eガバナンスの効いた開発が可能.\u003cbr\u003e\nGitHubと連携し以下のような機能を利用したCI/CDパイプライン構築が容易です.\n\u003cul data-sourcepos=\"107:3-115:143\"\u003e\n\u003cli data-sourcepos=\"107:3-107:63\"\u003e.sqlfluffファイルを利用したリントチェック\u003c/li\u003e\n\u003cli data-sourcepos=\"108:3-108:66\"\u003epullリクエスト時自動に実行されるCI/CDジョブ\u003c/li\u003e\n\u003cli data-sourcepos=\"109:3-115:143\"\u003eデータ品質を担保するために利用できるテスト機能\u003cbr\u003e\n\u003cem\u003e図：CIジョブ実行結果. Lintチェックも実施されている\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F9b31eae3-adef-4c94-98d5-9477d16c2906.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1b6aac2ef74ac7b2f66179df065752c2\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F9b31eae3-adef-4c94-98d5-9477d16c2906.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1b6aac2ef74ac7b2f66179df065752c2\" alt=\"dbtCloud_CIジョブ\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F9b31eae3-adef-4c94-98d5-9477d16c2906.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=84743df11c470d19a4687849ee448ef7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/9b31eae3-adef-4c94-98d5-9477d16c2906.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：テスト結果. 一意性についてのテスト\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc44f32b7-54a2-47ff-b1f0-c7cdad97d091.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2768033634e56699c8fbba592c001f79\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc44f32b7-54a2-47ff-b1f0-c7cdad97d091.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2768033634e56699c8fbba592c001f79\" alt=\"dbtCloud_テスト結果\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fc44f32b7-54a2-47ff-b1f0-c7cdad97d091.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=be2958f4682286f69570bad7623ac95d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c44f32b7-54a2-47ff-b1f0-c7cdad97d091.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：上記テストはdbt Cloud標準機能を利用しているため, 設定ファイル~.ymlに簡単な記載するだけで機能の用意が完了します\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2607500d-0830-46d6-8418-f98efd1860e8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=02a37cf61281f29c9c2bd933696d05c9\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2607500d-0830-46d6-8418-f98efd1860e8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=02a37cf61281f29c9c2bd933696d05c9\" alt=\"dbtCloud_テスト設定.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2607500d-0830-46d6-8418-f98efd1860e8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=ddb1da00cadcf879834860f44bfc4917 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/2607500d-0830-46d6-8418-f98efd1860e8.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"116:1-121:141\"\u003e開発ツールの準備は不要\u003cbr\u003e\ndbt Studio IDEという開発環境が標準で用意されております.\u003cbr\u003e\n本機能を利用すれば一連の開発作業(Bulid, コンパイル, 実行 etc.)が可能ですし,\u003cbr\u003e\nリネージもその場で確認することが可能となります.\u003cbr\u003e\n\u003cem\u003e図：Studio IDE画面. 画面左側でブランチやファイルの管理, 画面下側でリネージを確認することが可能\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fb77d63ca-f99b-4f52-9628-3193301a4e9f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f7450f06a70ced7608402af303847e5\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fb77d63ca-f99b-4f52-9628-3193301a4e9f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f7450f06a70ced7608402af303847e5\" alt=\"dbtCloud_StudioIDE画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fb77d63ca-f99b-4f52-9628-3193301a4e9f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e0ccbec4b80c9b3ffacf66da6dea0506 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/b77d63ca-f99b-4f52-9628-3193301a4e9f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"122:1-135:3\"\u003e設計書作成・公開をサポートする機能が実装されている.\u003cbr\u003e\nモデルであるSQLを作成するだけで, 最低限の情報を自動で作成してくれます.\u003cbr\u003e\nまた, Markdownファイル(~.md)を追加することにより追加で情報を加えることも可能です.\u003cbr\u003e\n上記設計書情報はdbt Cloud上でユーザーを作成すれば, catalog機能を利用し確認が可能です.\u003cbr\u003e\nユーザーを作成できない場合でもdbt docs generateコマンドを実行するだけで,\u003cbr\u003e\n設計書を公開するための一連のファイルが作成されるので,\u003cbr\u003e\nそれらをAWS等のクラウドに配置し公開することが可能となります.\u003cbr\u003e\n\u003cem\u003e図：catalog画面. モデルのリネージや実行状態の確認が可能.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F6180a78d-ff15-46ff-8b80-66b3f02a8d0c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ac7d81855710c5c84b020b3216869d9b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F6180a78d-ff15-46ff-8b80-66b3f02a8d0c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ac7d81855710c5c84b020b3216869d9b\" alt=\"dbtCloud_catalog画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F6180a78d-ff15-46ff-8b80-66b3f02a8d0c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2d33f8eb1409d87f0abecf7081c2b09f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/6180a78d-ff15-46ff-8b80-66b3f02a8d0c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：dbt docs画面. AWS S3にファイルを配置し公開した設計書\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F910c0daa-d30e-4886-aade-a51241d47055.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b761c56b8a6148c4b0d953e3de87dba7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F910c0daa-d30e-4886-aade-a51241d47055.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b761c56b8a6148c4b0d953e3de87dba7\" alt=\"dbtCloud_dbtDocs画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F910c0daa-d30e-4886-aade-a51241d47055.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=be7117d416e2b739af46d2891e84015d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/910c0daa-d30e-4886-aade-a51241d47055.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：dbt docs を構成するファイルをS3に配置. 上記設計書はCloud Front経由で公開している\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe40758b1-9d3a-4c91-a173-b7ec44321340.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d82a4daa8b8efd213e84548eac2ba722\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe40758b1-9d3a-4c91-a173-b7ec44321340.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d82a4daa8b8efd213e84548eac2ba722\" alt=\"dbtCloud_docsDocs_s3配置\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe40758b1-9d3a-4c91-a173-b7ec44321340.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a0acae2341fb6859601d6119ed0529c7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e40758b1-9d3a-4c91-a173-b7ec44321340.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"136:1-136:10\"\u003e\n\u003cspan id=\"短所-1\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9F%AD%E6%89%80-1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e短所\u003c/h3\u003e\n\u003cul data-sourcepos=\"137:1-153:112\"\u003e\n\u003cli data-sourcepos=\"137:1-141:126\"\u003e環境のセットアップに一定の工数がかかる.\u003cbr\u003e\ndbt Cloudはプロジェクト単位で接続先設定を実施します.\u003cbr\u003e\nプロジェクト内で接続する環境を分ける(Snowflake開発DBと本番DBを分けて接続する)\u003cbr\u003e\nといった利用は可能ですが,\u003cbr\u003e\n新規接続先(BigQueryに繋ぎたい等)を増やす場合には設定に一定の工数がかかってしまいます.\u003c/li\u003e\n\u003cli data-sourcepos=\"142:1-146:147\"\u003e開発には一定のSQLの知識が必要となる.\u003cbr\u003e\nTROCCOではノーコード・ローコードでETL処理を組むことが可能ですが,\u003cbr\u003e\ndbtは一定の知識が必要となります.\u003cbr\u003e\n最低限モデルであるSQLファイルを記載する知識が必要となります.\u003cbr\u003e\n他にもCI/CDパイプラインの構築した高度な開発する場合, それを実施・運用していく知識が必要となります.\u003c/li\u003e\n\u003cli data-sourcepos=\"147:1-153:112\"\u003e開発・閲覧問わずユーザーが増やしにくい.\u003cbr\u003e\ndbt Cloudの場合ユーザー単位で課金が発生します.\u003cbr\u003e\n従って, 開発者を増やす場合や, ちょっと設計書を確認するために閲覧用ユーザーを増やすことも実施しにくいです.\u003cbr\u003e\nどちらもメリット記載の機能で手段の代替自体は可能ではありますが, やはり多少の不便は生じます.\u003cbr\u003e\n開発：GitHubと連携すればdbt Cloudのユーザーを利用せずとも資材開発可能.\u003cbr\u003e\n設計書の確認：AWS等のクラウドを利用して公開したものを確認する.\u003cbr\u003e\ndbt Coreやdbt on Snowflakeを利用すれば本課題は解消されるかもしれません(※未検証).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 data-sourcepos=\"154:1-154:21\"\u003e\n\u003cspan id=\"troccoについて\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#trocco%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTROCCOについて\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"155:1-155:10\"\u003e\n\u003cspan id=\"長所-2\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%95%B7%E6%89%80-2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e長所\u003c/h3\u003e\n\u003cul data-sourcepos=\"156:1-187:132\"\u003e\n\u003cli data-sourcepos=\"156:1-167:148\"\u003eGUIを利用しノーコード・ローコードで開発が可能.\u003cbr\u003e\nTROCCOで開発を実施する際は,\u003cbr\u003e\n転送設定(ローカルファイルや, 環境を跨いだデータ転送)や\u003cbr\u003e\nデータマート定義(DB内でのデータ加工),\u003cbr\u003e\nそれら実行を管理するワークフローと呼ばれるオブジェクトを作成します.\u003cbr\u003e\n上記をすべてノーコード, ローコードで開発することが可能となるため, 検証・開発の際のハードルが低くなります.\u003cbr\u003e\n\u003cem\u003e図：データマート定義編集画面. Selectで取得対象を記載するのみ.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2e68575d-0bf9-4cff-b404-f3ae399d2712.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=17f20ee50377f425486d99ee5e295e6b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2e68575d-0bf9-4cff-b404-f3ae399d2712.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=17f20ee50377f425486d99ee5e295e6b\" alt=\"TROCCO_DM定義編集画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F2e68575d-0bf9-4cff-b404-f3ae399d2712.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b591f810e39e6ceac77fcafdf7249b7f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/2e68575d-0bf9-4cff-b404-f3ae399d2712.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：ワークフロー. 転送設定や, データマート定義をフローで繋げるだけでETL処理が完成する.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7447dca8-865b-4be8-a963-82a73ac784a8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=15985863f11e3f3aea1469c6447c314a\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7447dca8-865b-4be8-a963-82a73ac784a8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=15985863f11e3f3aea1469c6447c314a\" alt=\"TROCCO_WF_フロー画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7447dca8-865b-4be8-a963-82a73ac784a8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6e03b460302fab750f5eb4a68532d765 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/7447dca8-865b-4be8-a963-82a73ac784a8.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：ワークフロージョブ実行結果画面. スケジュール実行した結果もフローで確認可能\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe552aabc-5cac-4b41-bd20-ceec1a017a2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1f66bc3ecce407a88878f2b8080a64f4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe552aabc-5cac-4b41-bd20-ceec1a017a2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1f66bc3ecce407a88878f2b8080a64f4\" alt=\"TROCCO_WF_JOB実行結果画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe552aabc-5cac-4b41-bd20-ceec1a017a2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=37bd3018a7654b4605488ca760108369 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e552aabc-5cac-4b41-bd20-ceec1a017a2f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"168:1-177:148\"\u003e外部接続の準備や分離が容易.\u003cbr\u003e\n接続情報と呼ばれる機能を利用し環境への接続を管理します.\u003cbr\u003e\n接続される側(Snowflakeなど)でもある程度準備は必要ですが,\u003cbr\u003e\n開発・本番を分けて接続する等の使い方ができ, 外部接続の準備や分離が容易となります.\u003cbr\u003e\n本機能はユーザー単位で作成を禁止することも可能ですので,\u003cbr\u003e\n以下リソースグループと併せて利用することにより, ガバナンス管理にも有用となります.\u003cbr\u003e\n\u003cem\u003e図：Snowflake接続情報作成画面. アカウント情報, 利用ユーザー, 認証方式等の設定で接続が可能となる\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Ff980feb9-c802-4a9b-ae46-62196d8ea2cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=55dcfb3307cec2be79999a9542c6a9b6\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Ff980feb9-c802-4a9b-ae46-62196d8ea2cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=55dcfb3307cec2be79999a9542c6a9b6\" alt=\"TROCCO_Snowflake接続情報作成画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Ff980feb9-c802-4a9b-ae46-62196d8ea2cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a93b4ecf56fdf6c649c3b8ab81c14566 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/f980feb9-c802-4a9b-ae46-62196d8ea2cd.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：ユーザー設定画面. 接続情報の作成を禁止することが可能.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F146166ff-22a9-455c-aab1-61d15afa25c4.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=666e6a966a48104a3a8f679909ff8371\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F146166ff-22a9-455c-aab1-61d15afa25c4.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=666e6a966a48104a3a8f679909ff8371\" alt=\"TROCCO_ユーザー設定画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F146166ff-22a9-455c-aab1-61d15afa25c4.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=d5e3170963a9df4826bdd9300b14cd9a 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/146166ff-22a9-455c-aab1-61d15afa25c4.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"178:1-187:132\"\u003eユーザーや資材一定のグループでまとめて管理できる.\u003cbr\u003e\nチームと呼ばれる単位でTROCCOユーザーを管理できます.\u003cbr\u003e\nまたリソースについてはリソースグループと呼ばれる単位で管理できます.\u003cbr\u003e\nチームを事業部単位で作成し,\u003cbr\u003e\nリソースグループAには管理者権限を, リソースグループBには運用権限を\u003cbr\u003e\nという形でユーザーとリソースのそれらの権限を管理することが出来ます.\u003cbr\u003e\n\u003cem\u003e図：チーム画面.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F09999903-d1df-4642-ab49-e6fb42d872f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=336aa9fc7a9fea8bcce8106c00267087\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F09999903-d1df-4642-ab49-e6fb42d872f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=336aa9fc7a9fea8bcce8106c00267087\" alt=\"TROCCO_TM画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F09999903-d1df-4642-ab49-e6fb42d872f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a9f581f6155978ee3763d84839a91355 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/09999903-d1df-4642-ab49-e6fb42d872f8.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e図：リソースグループ画面.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7f8c8835-77d7-47ff-b8a0-10c59898200c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3d9c50976a9f90ba59d7dc875f1c0dd1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7f8c8835-77d7-47ff-b8a0-10c59898200c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3d9c50976a9f90ba59d7dc875f1c0dd1\" alt=\"TROCCO_RG画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F7f8c8835-77d7-47ff-b8a0-10c59898200c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=17e661e1221aad38374113bcf3533ce5 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/7f8c8835-77d7-47ff-b8a0-10c59898200c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"188:1-188:10\"\u003e\n\u003cspan id=\"短所-2\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9F%AD%E6%89%80-2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e短所\u003c/h3\u003e\n\u003cul data-sourcepos=\"189:1-210:0\"\u003e\n\u003cli data-sourcepos=\"189:1-194:151\"\u003e大規模開発(開発人数が多い)には不向き.\u003cbr\u003e\nリビジョン機能と呼ばれる機能で資材の変更履歴を管理することが出来ます.\u003cbr\u003e\nただ本機能はGit程高機能ではなく, あくまで履歴管理しかできません.\u003cbr\u003e\n従って, 複数のユーザーが1つの資材を競合なく修正し合うようなことは難しいと思います.\u003cbr\u003e\n\u003cem\u003e図：リビジョン管理画面.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F951f9ce5-f1f9-4d5c-95b4-7fd421e80621.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=466e4a184deb4f3d9db04298b89375e2\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F951f9ce5-f1f9-4d5c-95b4-7fd421e80621.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=466e4a184deb4f3d9db04298b89375e2\" alt=\"TROCCO_リビジョン管理画面\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2F951f9ce5-f1f9-4d5c-95b4-7fd421e80621.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=9012f0cb52e62c79326d3c0eb62fd956 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/951f9ce5-f1f9-4d5c-95b4-7fd421e80621.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"195:1-202:158\"\u003eリソースが増える傾向にある\u003cbr\u003e\nワークフロー上でリソースをフローとして繋ぐことでETL処理を作成していくという性質から,\u003cbr\u003e\nどうしても作成するリソースが増える傾向があります.\u003cbr\u003e\n加えてリソースを管理するためのリソースグループも増える傾向にあります.\u003cbr\u003e\n管理対象のリソースグループが増えるかもしくは1つのリソースグループ内で管理するリソースが増えるかどちらかの状態になります.\u003cbr\u003e\n\u003cem\u003e図：リソースグループ画面. 1つのリソースグループにリソースが多い場合, 目的のリソースを探すのにも苦労する.\u003c/em\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe2ca59f2-5bd0-4eb1-b583-2fcad253a02a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a5756bcee999c38e2d251ad837fd3495\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe2ca59f2-5bd0-4eb1-b583-2fcad253a02a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a5756bcee999c38e2d251ad837fd3495\" alt=\"TROCCO_リソースが多いRG\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fe2ca59f2-5bd0-4eb1-b583-2fcad253a02a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=91fd9f9910bac2fb8d6a356b492849f9 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e2ca59f2-5bd0-4eb1-b583-2fcad253a02a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fd113ca53-4d72-415d-a950-b3fe8eb36b81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a71a72707b511cb6653e74607e091b07\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fd113ca53-4d72-415d-a950-b3fe8eb36b81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a71a72707b511cb6653e74607e091b07\" alt=\"TROCCO_リソースが多いRG_見切れる\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4174814%2Fd113ca53-4d72-415d-a950-b3fe8eb36b81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=4ca6996f0b1ec0b4641b9399f984dc0c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/d113ca53-4d72-415d-a950-b3fe8eb36b81.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"203:1-210:0\"\u003e設計書は自作する必要がある.\u003cbr\u003e\ndbtでは設計書の作成を補助してくれましたが, TROCCOについては自分たちで用意する必要があります.\u003cbr\u003e\n設計書の要否についてはここでは深く議論いたしません.\u003cbr\u003e\nデータ活用の観点での一意見としては, 簡単でもいいので作成した方がよいと思います.\u003cbr\u003e\n設計書が無いことはデータを蓄積するフェーズや限られた部署でしか利用していない状態では, 大きな問題になりません.\u003cbr\u003e\nしかし, 組織全体でデータを活用していく(データドリブン組織の醸成)ことを推し進める際の速度に影響します.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"211:1-211:62\"\u003e\n\u003cspan id=\"まとめこれから構築する人へのアドバイス\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E4%BA%BA%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%89%E3%83%90%E3%82%A4%E3%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ：これから構築する人へのアドバイス\u003c/h1\u003e\n\u003cul data-sourcepos=\"212:1-218:147\"\u003e\n\u003cli data-sourcepos=\"212:1-214:125\"\u003e今回紹介したサービス・ツールを最初からすべて一気に導入する方は少ないかと思います.\u003cbr\u003e\nまずはSnowflakeで開発・運用を実施し, その際募る不満や課題を解消できるかという観点で,\u003cbr\u003e\nTROCCOやdbtの導入を検討を進めるというやり方が現場の意見も反映できる方法かと思います.\u003c/li\u003e\n\u003cli data-sourcepos=\"215:1-218:147\"\u003e一個人としては以下のような使い分けを意識してます.\n\u003cul data-sourcepos=\"216:3-218:147\"\u003e\n\u003cli data-sourcepos=\"216:3-216:137\"\u003eちょっとした検証の実施や運用で利用するツールを素早く実施したい ⇒ TROCCOで簡単に素早く開発\u003c/li\u003e\n\u003cli data-sourcepos=\"217:3-217:107\"\u003e運用でデータを素早く確認したい ⇒ Snowflakeのワークスペース機能等の利用\u003c/li\u003e\n\u003cli data-sourcepos=\"218:3-218:147\"\u003e大規模なチームでのデータ連携開発プロジェクトの実施 ⇒ dbt(とGit)を利用したガバナンスの効いた開発\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","body":"# はじめに（背景・目的）  \nSnowflakeを利用しデータ分析基盤の構築を進めております.  \nETL(ELT)処理をはじめデータ処理をする機能の開発のため, 以下3種類のツールを利用してます.  \n- Snowflakeの各種ツール(Workspaces, Task, UDF, Stored procedure etc.)  \n- dbt  \n- TROCCO  \n\n上記3種のツールについて開発・運用の際の利点や特徴についてまとめました.  \n上記ツールは[Snowflakeエコシステム](https://docs.snowflake.com/ja/user-guide/ecosystem-etl)の1つであったり,  \n[Snowflakeパートナー](https://www.snowflake.com/en/why-snowflake/partners/all-partners/primenumber/)の一員となってます.  \n従って, Snowflakeを利用してのデータ活用基盤構築に関わっているエンジニアで  \n似たような構成をしている方がいるかもしれません.  \nそのような方の参考になればと思います.  \n\n\n# 【徹底比較】Snowflake vs dbt vs TROCCO  \n各サービスの契約形態は以下を前提にしておりますので,  \n導入検討の一環で本記事を閲覧している方はそちらもご確認ください.  \n- Snowflake：Enterprise  \n- dbt(Cloud)：Enterprise  \n- TROCCO：Advanced  \n## 各サービスの特徴比較  \n各サービスの特徴をピックアップして記載します.  \n\n| 比較項目 | Snowflake (Native) | dbt Cloud | TROCCO |  \n| :--- | :--- | :--- | :--- |  \n| **主な役割** | ・DWH\u003cbr\u003e・データ加工 (T)\u003cbr\u003e・その他開発(画面, AI, 分析, データシェア etc.) | ・データ加工 (T)\u003cbr\u003e・開発管理(CI/CD) | ・環境を跨いだデータ転送\u003cbr\u003e・ETL/ELT\u003cbr\u003e |\n| **得意事項** | ・データ統合\u003cbr\u003e・UDF\u003cbr\u003e・低遅延タスク\u003cbr\u003e・コスト管理\u003cbr\u003e | ・品質の高い開発作業\u003cbr\u003e・SQLベースの複雑な変換\u003cbr\u003e・設計書の自動生成(公開)\u003cbr\u003e・リネージ管理\u003cbr\u003e | ・SaaS/DBからの抽出\u003cbr\u003e・GUIでの開発\u003cbr\u003e・資材の管理\u003cbr\u003e |\n| **開発ツール・スタイル** | ・SnowSight(GUI)\u003cbr\u003e ・Notebook\u003cbr\u003e・SQL\u003cbr\u003e・Python (Snowpark) | ・dbt Studio IDE(dbt統合開発環境)\u003cbr\u003e ・モデル(SQL, YAML, md)\u003cbr\u003e | ・GUI(ノーコード/ローコード)\u003cbr\u003e ・SQL(高度な処理をしたい場合)\u003cbr\u003e |\n| **運用・監視ツール** | 以下のような情報をGUI上で確認が可能\u003cbr\u003e ・クエリ履歴, Task履歴などの履歴情報\u003cbr\u003e ・コスト, セキュリティ等の管理情報\u003cbr\u003e | ・ジョブ実行管理\u003cbr\u003e ・データテスト\u003cbr\u003e | ・ワークフロー管理\u003cbr\u003e ・処理完了(エラー含む)通知機能\u003cbr\u003e |\n| **エンジニアスキル** | ・SQL\u003cbr\u003e ・クラウドインフラ知識\u003cbr\u003e ・その他開発に適した知識\u003cbr\u003e | ・SQL\u003cbr\u003e ・開発手法(CI/CD, Git等)\u003cbr\u003e | ・比較的学習コストが低い\u003cbr\u003e |\n\n## 難易度の比較  \n上記比較をもとに開発・運用等の規模や難易度を比較した結果が以下になります.  \n\n| 比較項目 | Snowflake (Native) | dbt Cloud | TROCCO |  \n| :--- | :--- | :--- | :--- |  \n| **対応可能な開発規模** | 小~中 | 中~大 | 小~中 |\n| **開発の難易度** | 中~難 | 中~難 | 易~中 |\n| **運用の難易度** | 難 | 易~中 | 易~中 |\n| **利用のポイント** | ・手軽に検証を開始したい場合\u003cbr\u003e ・開発にかかわる資材やコスト管理等を\u003cbr\u003eSnowflake内で完結させたい場合\u003cbr\u003e | ・開発のガバナンスと品質を重視する場合\u003cbr\u003e ・設計書の品質も担保したい場合\u003cbr\u003e | ・手軽に検証を開始したい場合\u003cbr\u003e ・接続先が多く, 開発速度を優先する場合\u003cbr\u003e ・資材管理を容易にしたい場合\u003cbr\u003e |\n\n# 開発・運用してわかった長所・短所   \n実際にサービスを利用してみての特徴を記載します. \n## Snowflakeについて  \n### 長所  \n- 開発・運用をサポートする便利な機能をGUIで利用確認可能  \n  - 開発・運用  \n    - ワークスペース  \n      検証のためデータをSelectしたい等開発や運用時のちょっとした作業で有効.  \n      Cortex Code(Snowflakeが提供するAI機能)も同じ画面で利用できるため,  \n      AIにクエリを書かせたり, \n      自分が記載したクエリの構文エラーをチェック修正させることが容易.  \n      *図：ワークスペース. 画面右側がCortex Code.*        \n      ![ワークスペース画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/4a76202e-507f-4c5d-8967-af2d101b0156.png)  \n    - ウェアハウス利用履歴, クエリヒストリー  \n      ウェアハウスのモニターから利用のピーク時間帯, どのクエリが重いか等を調査後  \n      クエリヒストリーからクエリの詳細を調査することが可能.    \n      *図：ウェアハウス利用状況*  \n      ![SF_WH_モニター画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/25179648-6795-4103-b372-f4dc79afa0ef.png)  \n      *図：クエリヒストリー*  \n      ![SF_QueryHistory画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c13b0c30-8c0d-4cb1-86d7-613f6873580a.png)\n  - 管理  \n    - コスト管理\n      アカウント全体の支出, ウェアハウス毎消費上位, DB毎のストレージ使用料\n      等を1画面で把握可能.  \n      *図：アカウント全体のコスト状況. 期間を指定して確認が可能.*  \n      ![SF_アカウントコスト状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c0094bee-f7d2-4ae4-8b06-6e9324152195.png)\n      *図：ストレージ使用量. アカウントに存在するDBごとの利用状況が確認可能*  \n      ![SF_ストレージ使用量](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/bae4c7db-b393-4e0d-840e-b26a50195d3a.png)\n    - トラストセンター. アカウントのセキュリティ関わるアクティビティが確認可能  \n      アカウントのセキュリティインシデントの調査をSnowflakeが自動で実施し,  \n      その結果を1画面で確認可能.  \n      *図：トラストセンター*  \n    ![SF_トラストセンター](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/70a7da63-82ac-42d1-81d0-20c3499863fa.png)      \n- データを活用するための機能にも積極的なアップデートがかかっている.  \n  ただのDWH基盤ではなく, \n  蓄積したデータを活用するための機能についても積極的にアップデートが実施されてます.  \n  例えば, 画面の開発をしたい⇒Streamlit, インタラクティブな分析をしたい⇒Notebook,  \n  近年ではAI関連の機能(Snowflake IntelligenceやCortexシリーズ)にも力を入れております.\n  *図：Streamlit画面. ダッシュボードなどの画面開発に有用*  \n  ![SF_SLAPP例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/803b8dc6-a4dd-4761-aa6e-f4eb1b05de1d.png)\n  *図：Snowflake Intelligence 組織が作成したエージェントに1画面でアクセス可能となる*  \n  ![SF_Intel画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/1fbc0ee8-71a8-45e0-8c40-c7d1ffee4238.png)\n- コストの管理をSnowflakeのみに絞ることが可能\n  上記2つのメリットに付随する点となりますが, \n  コストの消費・管理をSnowflake1つに絞ることが可能となります.  \n  Snowflakeの機能のみでデータの蓄積から利活用を実施可能ですし,  \n  それら活動で生じるコストについてもメリット1つ目に挙げた管理機能で確認が可能となります.  \n  今回紹介する外部ツールdbt, TROCCOの利用にはどうしても少なくない一定のコストがかかってしまうので,  \n  この点は無視できないかと思います.  \n### 短所  \n- 開発規模が大きくなるにつれてガバナンスを保つことや資材の管理が困難になる  \n  上記メリットで記載した通り, Snowflakeの機能のみを利用し, 簡単な検証・開発等は実施可能ではあります.  \n  ただ開発規模が大きくなるにつれて開発のガバナンスが取りづらくなりますし,  \n  オブジェクトの管理も煩雑になります.  \n  また, 開発の際はSQL, (pythonなどの)コード, クラウドについての一定の知識が求められます.  \n  データベースエクスプローラーというオブジェクト確認用のツールはあるものの,  \n  やはり他専門の開発ツールには劣ります.  \n  *図：データベースエクスプローラー. GUI上でDBやスキーマをクリックしオブジェクトの確認ができる*  \n  ![データベースエクスプローラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/592e54ed-2a30-4289-9722-47da044e0c73.png)  \n\n## dbt Cloudについて  \n### 長所  \n- ガバナンスの効いた開発が可能.  \n  GitHubと連携し以下のような機能を利用したCI/CDパイプライン構築が容易です.  \n  - .sqlfluffファイルを利用したリントチェック  \n  - pullリクエスト時自動に実行されるCI/CDジョブ  \n  - データ品質を担保するために利用できるテスト機能  \n  *図：CIジョブ実行結果. Lintチェックも実施されている*  \n  ![dbtCloud_CIジョブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/9b31eae3-adef-4c94-98d5-9477d16c2906.png)  \n  *図：テスト結果. 一意性についてのテスト*  \n  ![dbtCloud_テスト結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/c44f32b7-54a2-47ff-b1f0-c7cdad97d091.png)  \n  *図：上記テストはdbt Cloud標準機能を利用しているため, 設定ファイル~.ymlに簡単な記載するだけで機能の用意が完了します*  \n  ![dbtCloud_テスト設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/2607500d-0830-46d6-8418-f98efd1860e8.png)\n- 開発ツールの準備は不要  \n  dbt Studio IDEという開発環境が標準で用意されております.  \n  本機能を利用すれば一連の開発作業(Bulid, コンパイル, 実行 etc.)が可能ですし,  \n  リネージもその場で確認することが可能となります.  \n  *図：Studio IDE画面. 画面左側でブランチやファイルの管理, 画面下側でリネージを確認することが可能*  \n  ![dbtCloud_StudioIDE画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/b77d63ca-f99b-4f52-9628-3193301a4e9f.png)  \n- 設計書作成・公開をサポートする機能が実装されている.  \n  モデルであるSQLを作成するだけで, 最低限の情報を自動で作成してくれます.  \n  また, Markdownファイル(~.md)を追加することにより追加で情報を加えることも可能です.  \n  上記設計書情報はdbt Cloud上でユーザーを作成すれば, catalog機能を利用し確認が可能です.  \n  ユーザーを作成できない場合でもdbt docs generateコマンドを実行するだけで, \n  設計書を公開するための一連のファイルが作成されるので,  \n  それらをAWS等のクラウドに配置し公開することが可能となります.  \n  *図：catalog画面. モデルのリネージや実行状態の確認が可能.*  \n  ![dbtCloud_catalog画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/6180a78d-ff15-46ff-8b80-66b3f02a8d0c.png)  \n  *図：dbt docs画面. AWS S3にファイルを配置し公開した設計書*  \n  ![dbtCloud_dbtDocs画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/910c0daa-d30e-4886-aade-a51241d47055.png)\n  *図：dbt docs を構成するファイルをS3に配置. 上記設計書はCloud Front経由で公開している*  \n  ![dbtCloud_docsDocs_s3配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e40758b1-9d3a-4c91-a173-b7ec44321340.png)\n   \n### 短所  \n- 環境のセットアップに一定の工数がかかる.  \n  dbt Cloudはプロジェクト単位で接続先設定を実施します.  \n  プロジェクト内で接続する環境を分ける(Snowflake開発DBと本番DBを分けて接続する)  \n  といった利用は可能ですが,  \n  新規接続先(BigQueryに繋ぎたい等)を増やす場合には設定に一定の工数がかかってしまいます.  \n- 開発には一定のSQLの知識が必要となる.  \n  TROCCOではノーコード・ローコードでETL処理を組むことが可能ですが, \n  dbtは一定の知識が必要となります.  \n  最低限モデルであるSQLファイルを記載する知識が必要となります.  \n  他にもCI/CDパイプラインの構築した高度な開発する場合, それを実施・運用していく知識が必要となります.  \n- 開発・閲覧問わずユーザーが増やしにくい.  \n  dbt Cloudの場合ユーザー単位で課金が発生します.  \n  従って, 開発者を増やす場合や, ちょっと設計書を確認するために閲覧用ユーザーを増やすことも実施しにくいです.  \n  どちらもメリット記載の機能で手段の代替自体は可能ではありますが, やはり多少の不便は生じます.  \n  開発：GitHubと連携すればdbt Cloudのユーザーを利用せずとも資材開発可能.  \n  設計書の確認：AWS等のクラウドを利用して公開したものを確認する.  \n  dbt Coreやdbt on Snowflakeを利用すれば本課題は解消されるかもしれません(※未検証).  \n## TROCCOについて  \n### 長所  \n- GUIを利用しノーコード・ローコードで開発が可能.  \n  TROCCOで開発を実施する際は, \n  転送設定(ローカルファイルや, 環境を跨いだデータ転送)や  \n  データマート定義(DB内でのデータ加工), \n  それら実行を管理するワークフローと呼ばれるオブジェクトを作成します. \n  上記をすべてノーコード, ローコードで開発することが可能となるため, 検証・開発の際のハードルが低くなります.  \n  *図：データマート定義編集画面. Selectで取得対象を記載するのみ.*  \n  ![TROCCO_DM定義編集画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/2e68575d-0bf9-4cff-b404-f3ae399d2712.png)  \n  *図：ワークフロー. 転送設定や, データマート定義をフローで繋げるだけでETL処理が完成する.*  \n  ![TROCCO_WF_フロー画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/7447dca8-865b-4be8-a963-82a73ac784a8.png)\n  *図：ワークフロージョブ実行結果画面. スケジュール実行した結果もフローで確認可能*  \n  ![TROCCO_WF_JOB実行結果画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e552aabc-5cac-4b41-bd20-ceec1a017a2f.png)  \n- 外部接続の準備や分離が容易.  \n  接続情報と呼ばれる機能を利用し環境への接続を管理します.  \n  接続される側(Snowflakeなど)でもある程度準備は必要ですが,  \n  開発・本番を分けて接続する等の使い方ができ, 外部接続の準備や分離が容易となります.  \n  本機能はユーザー単位で作成を禁止することも可能ですので,  \n  以下リソースグループと併せて利用することにより, ガバナンス管理にも有用となります.  \n  *図：Snowflake接続情報作成画面. アカウント情報, 利用ユーザー, 認証方式等の設定で接続が可能となる*  \n  ![TROCCO_Snowflake接続情報作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/f980feb9-c802-4a9b-ae46-62196d8ea2cd.png)  \n  *図：ユーザー設定画面. 接続情報の作成を禁止することが可能.*  \n  ![TROCCO_ユーザー設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/146166ff-22a9-455c-aab1-61d15afa25c4.png)  \n- ユーザーや資材一定のグループでまとめて管理できる.  \n  チームと呼ばれる単位でTROCCOユーザーを管理できます.  \n  またリソースについてはリソースグループと呼ばれる単位で管理できます.  \n  チームを事業部単位で作成し,  \n  リソースグループAには管理者権限を, リソースグループBには運用権限を  \n  という形でユーザーとリソースのそれらの権限を管理することが出来ます.  \n  *図：チーム画面.*  \n  ![TROCCO_TM画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/09999903-d1df-4642-ab49-e6fb42d872f8.png)  \n  *図：リソースグループ画面.*  \n  ![TROCCO_RG画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/7f8c8835-77d7-47ff-b8a0-10c59898200c.png)  \n### 短所  \n- 大規模開発(開発人数が多い)には不向き.  \n  リビジョン機能と呼ばれる機能で資材の変更履歴を管理することが出来ます.  \n  ただ本機能はGit程高機能ではなく, あくまで履歴管理しかできません.  \n  従って, 複数のユーザーが1つの資材を競合なく修正し合うようなことは難しいと思います.  \n  *図：リビジョン管理画面.*  \n  ![TROCCO_リビジョン管理画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/951f9ce5-f1f9-4d5c-95b4-7fd421e80621.png)  \n- リソースが増える傾向にある  \n  ワークフロー上でリソースをフローとして繋ぐことでETL処理を作成していくという性質から,\n  どうしても作成するリソースが増える傾向があります.  \n  加えてリソースを管理するためのリソースグループも増える傾向にあります.  \n  管理対象のリソースグループが増えるかもしくは1つのリソースグループ内で管理するリソースが増えるかどちらかの状態になります.  \n  *図：リソースグループ画面. 1つのリソースグループにリソースが多い場合, 目的のリソースを探すのにも苦労する.*\n  ![TROCCO_リソースが多いRG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/e2ca59f2-5bd0-4eb1-b583-2fcad253a02a.png)  \n  ![TROCCO_リソースが多いRG_見切れる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4174814/d113ca53-4d72-415d-a950-b3fe8eb36b81.png)\n- 設計書は自作する必要がある.  \n  dbtでは設計書の作成を補助してくれましたが, TROCCOについては自分たちで用意する必要があります.  \n  設計書の要否についてはここでは深く議論いたしません.  \n  データ活用の観点での一意見としては, 簡単でもいいので作成した方がよいと思います.  \n  設計書が無いことはデータを蓄積するフェーズや限られた部署でしか利用していない状態では, 大きな問題になりません.  \n  しかし, 組織全体でデータを活用していく(データドリブン組織の醸成)ことを推し進める際の速度に影響します.  \n\n\n# まとめ：これから構築する人へのアドバイス  \n- 今回紹介したサービス・ツールを最初からすべて一気に導入する方は少ないかと思います.\n  まずはSnowflakeで開発・運用を実施し, その際募る不満や課題を解消できるかという観点で, \n  TROCCOやdbtの導入を検討を進めるというやり方が現場の意見も反映できる方法かと思います.  \n- 一個人としては以下のような使い分けを意識してます.  \n  - ちょっとした検証の実施や運用で利用するツールを素早く実施したい ⇒ TROCCOで簡単に素早く開発  \n  - 運用でデータを素早く確認したい ⇒ Snowflakeのワークスペース機能等の利用  \n  - 大規模なチームでのデータ連携開発プロジェクトの実施 ⇒ dbt(とGit)を利用したガバナンスの効いた開発    \n","coediting":false,"comments_count":0,"created_at":"2026-04-27T07:58:19+09:00","group":null,"id":"6d1f14e26c699de5c1a0","likes_count":1,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"比較","versions":[]},{"name":"Snowflake","versions":[]},{"name":"データ基盤","versions":[]},{"name":"trocco","versions":[]},{"name":"dbt","versions":[]}],"title":"【比較】Snowflake  dbt Cloud  TROCCO どれをいつ使う？実務から見えた長所と短所","updated_at":"2026-04-27T07:58:19+09:00","url":"https://qiita.com/tkshiS/items/6d1f14e26c699de5c1a0","user":{"description":null,"facebook_id":null,"followees_count":3,"followers_count":2,"github_login_name":null,"id":"tkshiS","items_count":2,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":4174814,"profile_image_url":"https://lh3.googleusercontent.com/a/ACg8ocJ9XfR9X9YA6Zi0qu_m9wH_HI1UUQqlsFunlAS-tMm0vdKKew=s96-c","team_only":false,"twitter_screen_name":"tkshiS0922","website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"2:1-2:192\"\u003e我々の身の回りで日々発生するデータを収集し、分析することで、業務を効率化したり、下記に挙げたような課題を解決することができます。\u003c/p\u003e\n\u003cul data-sourcepos=\"4:1-9:0\"\u003e\n\u003cli data-sourcepos=\"4:1-4:83\"\u003e売り上げを伸ばすため、顧客にリーチする広告を打ちたい。\u003c/li\u003e\n\u003cli data-sourcepos=\"5:1-5:83\"\u003eサービスを解約しそうな顧客を引き止める施策を打ちたい。\u003c/li\u003e\n\u003cli data-sourcepos=\"6:1-6:83\"\u003eクレジットカードの不正利用をリアルタイムに検知したい。\u003c/li\u003e\n\u003cli data-sourcepos=\"7:1-7:89\"\u003e渋滞情報や荷物量を考慮し、最も効率的なルートを算出したい。\u003c/li\u003e\n\u003cli data-sourcepos=\"8:1-9:0\"\u003e勤怠データや面談記録から、離職リスクの高い社員を早期に発見したい。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"10:1-10:279\"\u003eデータアナリストは、データという『生の情報』を、ビジネスの意思決定に役立つ『価値ある知見』に翻訳することを生業としていますが、その元となるデータは彼らにどのように届けられるのでしょうか。\u003c/p\u003e\n\u003cp data-sourcepos=\"12:1-12:195\"\u003e実際のところ、データ分析基盤を構築して裏方で支えるデータエンジニアの存在があってこそ、表舞台でデータアナリストが活躍できるのです。\u003c/p\u003e\n\u003cp data-sourcepos=\"14:1-14:156\"\u003e今回は、データエンジニアに焦点を当て、その仕事の中でも重要な、データパイプラインの構築方法を紹介します。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"16:1-16:14\"\u003e\n\u003cspan id=\"前提条件\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e前提条件\u003c/h1\u003e\n\u003cul data-sourcepos=\"17:1-19:0\"\u003e\n\u003cli data-sourcepos=\"17:1-17:146\"\u003eWSLのUbuntu上にDockerでデータ分析基盤を構築するため、Dockerについて概要を理解している人を対象とします。\u003c/li\u003e\n\u003cli data-sourcepos=\"18:1-19:0\"\u003eデータパイプラインには、Apache Airflowを利用します。Airflowの詳細な設定方法は割愛します。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"20:1-20:8\"\u003e\n\u003cspan id=\"解説\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A7%A3%E8%AA%AC\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e解説\u003c/h1\u003e\n\u003ch2 data-sourcepos=\"21:1-21:63\"\u003e\n\u003cspan id=\"データアナリストとデータエンジニアの職域\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%8A%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E8%81%B7%E5%9F%9F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータアナリストとデータエンジニアの職域\u003c/h2\u003e\n\u003cp data-sourcepos=\"22:1-22:156\"\u003eデータアナリストは、データを集計、可視化し、経営層がビジネス的な意思決定を行うためのサポートを行います。\u003c/p\u003e\n\u003cp data-sourcepos=\"24:1-24:171\"\u003eデータエンジニアは、データアナリストが迅速かつ正確にデータ分析を行うためのデータ分析基盤を構築する役割を担います。\u003c/p\u003e\n\u003cp data-sourcepos=\"26:1-26:216\"\u003eデータの欠損や誤りがあったり、必要な時にタイムリーにデータが入手できなかったり、フォーマットがばらばらで扱いづらい場合、正確な分析ができません。\u003c/p\u003e\n\u003cp data-sourcepos=\"28:1-28:99\"\u003eデータの正確性、可用性を担保するのは、データエンジニアの役割です。\u003c/p\u003e\n\u003cp data-sourcepos=\"30:1-30:48\"\u003e主な職域の違いは以下の通りです。\u003c/p\u003e\n\u003ctable data-sourcepos=\"32:1-39:173\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"32:1-32:72\"\u003e\n\u003cth data-sourcepos=\"32:1-32:12\"\u003e比較項目\u003c/th\u003e\n\u003cth data-sourcepos=\"32:14-32:42\"\u003eデータアナリスト (DA)\u003c/th\u003e\n\u003cth data-sourcepos=\"32:44-32:72\"\u003eデータエンジニア (DE)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"34:1-34:122\"\u003e\n\u003ctd data-sourcepos=\"34:1-34:12\"\u003e主な目的\u003c/td\u003e\n\u003ctd data-sourcepos=\"34:14-34:58\"\u003eビジネス上の意思決定を支援する\u003c/td\u003e\n\u003ctd data-sourcepos=\"34:60-34:122\"\u003eデータの「流れ」と「基盤」を構築・維持する\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"35:1-35:121\"\u003e\n\u003ctd data-sourcepos=\"35:1-35:18\"\u003e注力ポイント\u003c/td\u003e\n\u003ctd data-sourcepos=\"35:20-35:71\"\u003eデータの活用・解釈 (現状把握と予測)\u003c/td\u003e\n\u003ctd data-sourcepos=\"35:73-35:121\"\u003eデータの収集・加工 (安定性と効率)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"36:1-36:128\"\u003e\n\u003ctd data-sourcepos=\"36:1-36:15\"\u003e主な成果物\u003c/td\u003e\n\u003ctd data-sourcepos=\"36:17-36:73\"\u003eダッシュボード、分析レポート、施策提案\u003c/td\u003e\n\u003ctd data-sourcepos=\"36:75-36:128\"\u003eデータパイプライン、DWH、データマート\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"37:1-37:140\"\u003e\n\u003ctd data-sourcepos=\"37:1-37:18\"\u003e得意なツール\u003c/td\u003e\n\u003ctd data-sourcepos=\"37:20-37:71\"\u003eSQL, Tableau, Power BI, Python (Pandas/Scikit-learn)\u003c/td\u003e\n\u003ctd data-sourcepos=\"37:73-37:140\"\u003eSQL, Python, Airflow, dbt, Spark, クラウドインフラ (AWS/GCP)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"38:1-38:131\"\u003e\n\u003ctd data-sourcepos=\"38:1-38:18\"\u003e向き合う相手\u003c/td\u003e\n\u003ctd data-sourcepos=\"38:20-38:73\"\u003e企画、マーケ、営業などのビジネス部門\u003c/td\u003e\n\u003ctd data-sourcepos=\"38:75-38:131\"\u003eデータアナリスト、サイエンティスト、SRE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"39:1-39:173\"\u003e\n\u003ctd data-sourcepos=\"39:1-39:12\"\u003e主な問い\u003c/td\u003e\n\u003ctd data-sourcepos=\"39:14-39:88\"\u003e「なぜ売上が下がったのか？」「次はどうすべきか？」\u003c/td\u003e\n\u003ctd data-sourcepos=\"39:90-39:173\"\u003e「データは欠損なく届いているか？」「処理速度は最適か？」\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"42:1-42:42\"\u003e\n\u003cspan id=\"データパイプラインについて\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータパイプラインについて\u003c/h2\u003e\n\u003cp data-sourcepos=\"43:1-43:141\"\u003eデータパイプラインとは、データの発生源から分析環境まで、自動的に流れるための一本道のことです。\u003c/p\u003e\n\u003cp data-sourcepos=\"45:1-45:139\"\u003e以下の4つのステップを通じて、生のデータから分析可能なデータに変換し、活用できるようにします。\u003c/p\u003e\n\u003col data-sourcepos=\"47:1-55:0\"\u003e\n\u003cli data-sourcepos=\"47:1-48:102\"\u003e\n\u003cstrong\u003e収集 (Ingestion):\u003c/strong\u003e\n\u003cul data-sourcepos=\"48:5-48:102\"\u003e\n\u003cli data-sourcepos=\"48:5-48:102\"\u003eアプリのログ、データベース、外部APIなどからデータを集めてきます。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"49:1-50:189\"\u003e\n\u003cstrong\u003e加工・変換 (Transformation):\u003c/strong\u003e \n\u003cul data-sourcepos=\"50:5-50:189\"\u003e\n\u003cli data-sourcepos=\"50:5-50:189\"\u003e重複を消す、型を揃える、個人情報を伏せる、計算して新しい項目を作るなど、データのクレンジングや名寄せなどの加工を行います。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"51:1-52:111\"\u003e\n\u003cstrong\u003e保存 (Storage):\u003c/strong\u003e \n\u003cul data-sourcepos=\"52:5-52:111\"\u003e\n\u003cli data-sourcepos=\"52:5-52:111\"\u003e綺麗になったデータを「データウェアハウス（DWH）」などの倉庫に溜めます。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"53:1-55:0\"\u003e\n\u003cstrong\u003e活用 (Analysis/Visualization):\u003c/strong\u003e \n\u003cul data-sourcepos=\"54:5-55:0\"\u003e\n\u003cli data-sourcepos=\"54:5-55:0\"\u003e分析ツール（BIツール）や機械学習モデルでデータを利用します。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 data-sourcepos=\"56:1-56:72\"\u003e\n\u003cspan id=\"データレイクデータウェアハウスデータマート\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%8F%E3%82%A6%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータレイク、データウェアハウス、データマート\u003c/h2\u003e\n\u003cp data-sourcepos=\"57:1-57:123\"\u003eデータパイプライン上で扱うデータ保管場所は、大きく分けて以下の３つに分類されます。\u003c/p\u003e\n\u003col data-sourcepos=\"59:1-69:0\"\u003e\n\u003cli data-sourcepos=\"59:1-61:228\"\u003e\n\u003cstrong\u003eデータレイク (Data Lake)\u003c/strong\u003e\n\u003cul data-sourcepos=\"60:5-61:228\"\u003e\n\u003cli data-sourcepos=\"60:5-61:228\"\u003e形式を問わずあらゆるデータをそのままの形で保管する、大きな泉のような場所です。\n\u003cul data-sourcepos=\"61:9-61:228\"\u003e\n\u003cli data-sourcepos=\"61:9-61:228\"\u003eExcel、アプリケーションログ、画像ファイル、SNSの投稿など、将来データ分析に利用できる可能性のあるものを、非構造化、未整理の状態でため込んでおきます。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"62:1-64:122\"\u003e\n\u003cstrong\u003eデータウェアハウス (Data Warehouse / DWH)\u003c/strong\u003e\n\u003cul data-sourcepos=\"63:5-64:122\"\u003e\n\u003cli data-sourcepos=\"63:5-64:122\"\u003eデータレイクから必要なデータを取り出し、計算や分析がしやすいように形を整えて保管する倉庫です。\n\u003cul data-sourcepos=\"64:9-64:122\"\u003e\n\u003cli data-sourcepos=\"64:9-64:122\"\u003e重複を消したり、型を揃えたりして、加工して\u003cstrong\u003e構造化したデータ\u003c/strong\u003eを格納します。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"65:1-69:0\"\u003e\n\u003cstrong\u003eデータマート (Data Mart)\u003c/strong\u003e\n\u003cul data-sourcepos=\"66:5-69:0\"\u003e\n\u003cli data-sourcepos=\"66:5-69:0\"\u003eDWHの中から、特定の部署や目的（営業部用、マーケティング用など）に必要なデータだけを切り出した小規模な保管庫です。\n\u003cul data-sourcepos=\"67:9-69:0\"\u003e\n\u003cli data-sourcepos=\"67:9-69:0\"\u003e特定の業務で使用するために、要約・加工しているため、データ量は比較的少なくなり、素早くデータを取り出すことができます。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-sourcepos=\"70:1-70:156\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F8e33f0d7-9eda-401c-8184-1e521886288b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec930a6396c1bd1460aeabd487ae2006\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F8e33f0d7-9eda-401c-8184-1e521886288b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec930a6396c1bd1460aeabd487ae2006\" alt=\"Gemini_Generated_Image_5wh4yg5wh4yg5wh4.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F8e33f0d7-9eda-401c-8184-1e521886288b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bad2ed774dce10d47f8dbbfb0083d9b5 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/8e33f0d7-9eda-401c-8184-1e521886288b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"72:1-72:140\"\u003eデータレイクには、S3やクラウドストレージなどのオブジェクトストレージが使われることが多いです。\u003c/p\u003e\n\u003cp data-sourcepos=\"74:1-74:155\"\u003eまた、DWHやデータマートには、BigQueryやAmazon Redshiftなどのカラムナー指向データベースが使われることが多いです。\u003c/p\u003e\n\u003cp data-sourcepos=\"76:1-76:103\"\u003e分析に利用するBIツールには、TableauやRedash、Looker Studioなどが用いられます。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"78:1-78:13\"\u003e\n\u003cspan id=\"etl-vs-elt\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#etl-vs-elt\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eETL vs ELT\u003c/h2\u003e\n\u003cp data-sourcepos=\"79:1-79:259\"\u003eデータパイプライン上で、データレイクからデータ抽出し、加工し、DWHに格納する際に、ETL/ELTツールが使われます。ETLとELTの違いは、データの加工（Transform）をどのタイミングで行うかです。\u003c/p\u003e\n\u003cp data-sourcepos=\"81:1-81:42\"\u003e主な相違点は以下の通りです。\u003c/p\u003e\n\u003ctable data-sourcepos=\"83:1-89:95\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"83:1-83:74\"\u003e\n\u003cth data-sourcepos=\"83:1-83:12\"\u003e比較項目\u003c/th\u003e\n\u003cth data-sourcepos=\"83:14-83:43\"\u003eETL (Extract, Transform, Load)\u003c/th\u003e\n\u003cth data-sourcepos=\"83:45-83:74\"\u003eELT (Extract, Load, Transform)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"85:1-85:86\"\u003e\n\u003ctd data-sourcepos=\"85:1-85:24\"\u003e加工のタイミング\u003c/td\u003e\n\u003ctd data-sourcepos=\"85:26-85:55\"\u003eDWHに格納する前に加工\u003c/td\u003e\n\u003ctd data-sourcepos=\"85:57-85:86\"\u003eDWHに格納した後に加工\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"86:1-86:181\"\u003e\n\u003ctd data-sourcepos=\"86:1-86:18\"\u003e主なメリット\u003c/td\u003e\n\u003ctd data-sourcepos=\"86:20-86:92\"\u003e・DWH側の負荷が低い\u003cbr\u003e・データ保存容量を節約できる\u003c/td\u003e\n\u003ctd data-sourcepos=\"86:94-86:181\"\u003e・生データを残せるため再分析に強い\u003cbr\u003e・ロードが圧倒的に速い\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"87:1-87:241\"\u003e\n\u003ctd data-sourcepos=\"87:1-87:21\"\u003e主なデメリット\u003c/td\u003e\n\u003ctd data-sourcepos=\"87:23-87:125\"\u003e・加工用の専用サーバーが必要\u003cbr\u003e・データ形式変更時の修正に時間がかかる\u003c/td\u003e\n\u003ctd data-sourcepos=\"87:127-87:241\"\u003e・大量の生データを保存するストレージが必要\u003cbr\u003e・加工時にDWHの計算コストがかかる\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"88:1-88:113\"\u003e\n\u003ctd data-sourcepos=\"88:1-88:18\"\u003eデータの状態\u003c/td\u003e\n\u003ctd data-sourcepos=\"88:20-88:70\"\u003e加工済みのきれいなデータのみを保存\u003c/td\u003e\n\u003ctd data-sourcepos=\"88:72-88:113\"\u003e未加工（RAW）の状態でまず保存\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"89:1-89:95\"\u003e\n\u003ctd data-sourcepos=\"89:1-89:9\"\u003e柔軟性\u003c/td\u003e\n\u003ctd data-sourcepos=\"89:11-89:46\"\u003e低い（事前に設計が必要）\u003c/td\u003e\n\u003ctd data-sourcepos=\"89:48-89:95\"\u003e高い（後からSQLで自由に加工可能）\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"91:1-91:150\"\u003e昔はストレージが高価で計算能力も低かったため、「必要な分だけ小さくして入れる（ETL）」がが正解でした。\u003c/p\u003e\n\u003cp data-sourcepos=\"93:1-93:288\"\u003eしかし、現在はクラウドの進化で「大量に安く保存でき、超高速で計算できる」ようになったため、「全部放り込んでから後で考える（ELT）」ほうが、ビジネスのスピードに合わせやすく、主流になってきました。\u003c/p\u003e\n\u003cp data-sourcepos=\"95:1-95:159\"\u003eまた、ELTでは、「データを運ぶツール（EL）」と「DWH内で加工するツール（T）」を組み合わせて使うのが一般的です。\u003c/p\u003e\n\u003cul data-sourcepos=\"97:1-101:0\"\u003e\n\u003cli data-sourcepos=\"97:1-98:185\"\u003eデータを運ぶツールの例\n\u003cul data-sourcepos=\"98:5-98:185\"\u003e\n\u003cli data-sourcepos=\"98:5-98:185\"\u003e\n\u003ca href=\"https://primenumber.com/trocco\" rel=\"nofollow noopener\" target=\"_blank\"\u003eTROCCO\u003c/a\u003e（トロッコ）：日本発のSaaS型ツール。100種類以上のコネクタを使って、バラバラなデータをDWHへ運ぶ。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"99:1-101:0\"\u003eデータを加工するツールの例\n\u003cul data-sourcepos=\"100:5-101:0\"\u003e\n\u003cli data-sourcepos=\"100:5-101:0\"\u003e\n\u003ca href=\"https://www.getdbt.com/\" rel=\"nofollow noopener\" target=\"_blank\"\u003edbt\u003c/a\u003e (data build tool)：SQLで加工処理を書くことができ、バージョン管理（Git）やテストを自動化できる。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"102:1-102:131\"\u003eTROCCOでBigQueryに格納したデータをdbtで加工して、データマートに格納する事例もよく耳にします。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"104:1-104:30\"\u003e\n\u003cspan id=\"データ加工について\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E5%8A%A0%E5%B7%A5%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータ加工について\u003c/h2\u003e\n\u003cp data-sourcepos=\"105:1-105:120\"\u003eデータレイクに溜まったデータを加工する方法として、代表的な処理は以下の通りです。\u003c/p\u003e\n\u003cp data-sourcepos=\"107:1-107:159\"\u003eSQLで加工したり、Pythonスクリプトや専用のツールを用いてデータを編集し、分析しやすい形式にしてDWHに登録します。\u003c/p\u003e\n\u003ctable data-sourcepos=\"109:1-114:257\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"109:1-109:45\"\u003e\n\u003cth data-sourcepos=\"109:1-109:6\"\u003e項目\u003c/th\u003e\n\u003cth data-sourcepos=\"109:8-109:22\"\u003e内容・定義\u003c/th\u003e\n\u003cth data-sourcepos=\"109:24-109:35\"\u003e主な目的\u003c/th\u003e\n\u003cth data-sourcepos=\"109:37-109:45\"\u003e具体例\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"111:1-111:244\"\u003e\n\u003ctd data-sourcepos=\"111:1-111:18\"\u003eクレンジング\u003c/td\u003e\n\u003ctd data-sourcepos=\"111:20-111:97\"\u003eデータの誤記、重複、欠損、表記揺れを修正・削除する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"111:99-111:167\"\u003eデータの正確性を高め、分析のノイズを除去する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"111:169-111:244\"\u003e「東京都」と「東京都 」（末尾スペース）を統一する。\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"112:1-112:300\"\u003e\n\u003ctd data-sourcepos=\"112:1-112:9\"\u003e名寄せ\u003c/td\u003e\n\u003ctd data-sourcepos=\"112:11-112:111\"\u003e異なるシステムやDBにある「同一人物・企業」のデータを一つに統合する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"112:113-112:194\"\u003e顧客の重複を排除し、正しい1顧客としての動きを把握する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"112:196-112:300\"\u003e住所と電話番号が同じ「田中太郎」と「ﾀﾅｶ ﾀﾛｳ」を同一IDで紐付ける。\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"113:1-113:251\"\u003e\n\u003ctd data-sourcepos=\"113:1-113:27\"\u003eフォーマット合わせ\u003c/td\u003e\n\u003ctd data-sourcepos=\"113:29-113:106\"\u003e日付、数値、単位などの形式を特定のルールに統一する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"113:108-113:182\"\u003eシステム連携をスムーズにし、計算可能な状態にする。\u003c/td\u003e\n\u003ctd data-sourcepos=\"113:184-113:251\"\u003e「2026/03/04」と「R8.3.4」を「2026-03-04」に統一する。\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"114:1-114:257\"\u003e\n\u003ctd data-sourcepos=\"114:1-114:15\"\u003eマスキング\u003c/td\u003e\n\u003ctd data-sourcepos=\"114:17-114:112\"\u003e個人情報などの機密情報を、特定のルールで別の文字列に置き換える。\u003c/td\u003e\n\u003ctd data-sourcepos=\"114:114-114:194\"\u003eセキュリティを確保し、個人を特定せずに分析に利用する。\u003c/td\u003e\n\u003ctd data-sourcepos=\"114:196-114:257\"\u003e「\u003ca href=\"mailto:yamada@example.com\" class=\"autolink\"\u003eyamada@example.com\u003c/a\u003e」を「y****@example.com」にする。\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"116:1-116:33\"\u003e\n\u003cspan id=\"データマートの登録例\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%88%E3%81%AE%E7%99%BB%E9%8C%B2%E4%BE%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータマートの登録例\u003c/h2\u003e\n\u003cp data-sourcepos=\"117:1-117:123\"\u003e前述の通り、データマートには特定の目的に合わせた形式にデータを加工して登録します。\u003c/p\u003e\n\u003cp data-sourcepos=\"119:1-119:264\"\u003e例えば、サービスの利用者数の増減を月毎にグラフで可視化したい要件があった場合、会員情報の入会年月日ごとに人数を集計して、ユーザー数推移用のスナップショットテーブルに登録します。\u003c/p\u003e\n\u003cp data-sourcepos=\"121:1-123:63\"\u003eこの例の場合だと、ユーザー数推移スナップショットには合計人数のみで、利用者の性別や年齢などの属性情報が欠落するため、データマート上のデータを利用しづらくなります。\u003cbr\u003e\n例）\u003cbr\u003e\nDWHのユーザー情報テーブル。集計元テーブル。\u003c/p\u003e\n\u003ctable data-sourcepos=\"125:1-131:42\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"125:1-125:123\"\u003e\n\u003cth data-sourcepos=\"125:1-125:24\"\u003eユーザーID (user_id)\u003c/th\u003e\n\u003cth data-sourcepos=\"125:26-125:52\"\u003e入会年月日 (joined_at)\u003c/th\u003e\n\u003cth data-sourcepos=\"125:54-125:68\"\u003e性別 (gender)\u003c/th\u003e\n\u003cth data-sourcepos=\"125:70-125:81\"\u003e年代 (age)\u003c/th\u003e\n\u003cth data-sourcepos=\"125:83-125:98\"\u003e居住地 (pref)\u003c/th\u003e\n\u003cth data-sourcepos=\"125:100-125:123\"\u003eステータス (status)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"127:1-127:42\"\u003e\n\u003ctd data-sourcepos=\"127:1-127:4\"\u003eU001\u003c/td\u003e\n\u003ctd data-sourcepos=\"127:6-127:15\"\u003e2026-01-05\u003c/td\u003e\n\u003ctd data-sourcepos=\"127:17-127:22\"\u003e男性\u003c/td\u003e\n\u003ctd data-sourcepos=\"127:24-127:25\"\u003e24\u003c/td\u003e\n\u003ctd data-sourcepos=\"127:27-127:35\"\u003e東京都\u003c/td\u003e\n\u003ctd data-sourcepos=\"127:37-127:42\"\u003e有効\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"128:1-128:42\"\u003e\n\u003ctd data-sourcepos=\"128:1-128:4\"\u003eU002\u003c/td\u003e\n\u003ctd data-sourcepos=\"128:6-128:15\"\u003e2026-01-12\u003c/td\u003e\n\u003ctd data-sourcepos=\"128:17-128:22\"\u003e女性\u003c/td\u003e\n\u003ctd data-sourcepos=\"128:24-128:25\"\u003e29\u003c/td\u003e\n\u003ctd data-sourcepos=\"128:27-128:35\"\u003e大阪府\u003c/td\u003e\n\u003ctd data-sourcepos=\"128:37-128:42\"\u003e有効\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"129:1-129:42\"\u003e\n\u003ctd data-sourcepos=\"129:1-129:4\"\u003eU003\u003c/td\u003e\n\u003ctd data-sourcepos=\"129:6-129:15\"\u003e2026-01-28\u003c/td\u003e\n\u003ctd data-sourcepos=\"129:17-129:22\"\u003e男性\u003c/td\u003e\n\u003ctd data-sourcepos=\"129:24-129:25\"\u003e31\u003c/td\u003e\n\u003ctd data-sourcepos=\"129:27-129:35\"\u003e福岡県\u003c/td\u003e\n\u003ctd data-sourcepos=\"129:37-129:42\"\u003e退会\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"130:1-130:42\"\u003e\n\u003ctd data-sourcepos=\"130:1-130:4\"\u003eU004\u003c/td\u003e\n\u003ctd data-sourcepos=\"130:6-130:15\"\u003e2026-02-03\u003c/td\u003e\n\u003ctd data-sourcepos=\"130:17-130:22\"\u003e女性\u003c/td\u003e\n\u003ctd data-sourcepos=\"130:24-130:25\"\u003e22\u003c/td\u003e\n\u003ctd data-sourcepos=\"130:27-130:35\"\u003e東京都\u003c/td\u003e\n\u003ctd data-sourcepos=\"130:37-130:42\"\u003e有効\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"131:1-131:42\"\u003e\n\u003ctd data-sourcepos=\"131:1-131:4\"\u003eU005\u003c/td\u003e\n\u003ctd data-sourcepos=\"131:6-131:15\"\u003e2026-02-15\u003c/td\u003e\n\u003ctd data-sourcepos=\"131:17-131:22\"\u003e男性\u003c/td\u003e\n\u003ctd data-sourcepos=\"131:24-131:25\"\u003e38\u003c/td\u003e\n\u003ctd data-sourcepos=\"131:27-131:35\"\u003e愛知県\u003c/td\u003e\n\u003ctd data-sourcepos=\"131:37-131:42\"\u003e有効\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"133:1-133:180\"\u003eユーザー情報テーブル年月ごとのユーザー数の推移を可視化するため、ステータスが有効なユーザー数だけを集計したデータマート。\u003c/p\u003e\n\u003cp data-sourcepos=\"135:1-135:159\"\u003e性別や年齢などの属性は落とされているため、F1層（20～34歳の女性）、M1層（20～34歳の男性）などの分析には不向き。\u003c/p\u003e\n\u003ctable data-sourcepos=\"137:1-140:9\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"137:1-137:50\"\u003e\n\u003cth data-sourcepos=\"137:1-137:21\"\u003eログ月 (log_month)\u003c/th\u003e\n\u003cth data-sourcepos=\"137:23-137:50\"\u003eユーザー数 (user_count)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"139:1-139:9\"\u003e\n\u003ctd data-sourcepos=\"139:1-139:7\"\u003e2026-01\u003c/td\u003e\n\u003ctd data-sourcepos=\"139:9-139:9\"\u003e2\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"140:1-140:9\"\u003e\n\u003ctd data-sourcepos=\"140:1-140:7\"\u003e2026-02\u003c/td\u003e\n\u003ctd data-sourcepos=\"140:9-140:9\"\u003e2\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"142:1-142:99\"\u003e性別や年代の属性を残して、有効なユーザー数を集計したデータマート。\u003c/p\u003e\n\u003ctable data-sourcepos=\"144:1-149:25\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"144:1-144:85\"\u003e\n\u003cth data-sourcepos=\"144:1-144:21\"\u003eログ月 (log_month)\u003c/th\u003e\n\u003cth data-sourcepos=\"144:23-144:37\"\u003e性別 (gender)\u003c/th\u003e\n\u003cth data-sourcepos=\"144:39-144:56\"\u003e年代 (age_group)\u003c/th\u003e\n\u003cth data-sourcepos=\"144:58-144:85\"\u003eユーザー数 (user_count)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"146:1-146:25\"\u003e\n\u003ctd data-sourcepos=\"146:1-146:7\"\u003e2026-01\u003c/td\u003e\n\u003ctd data-sourcepos=\"146:9-146:14\"\u003e男性\u003c/td\u003e\n\u003ctd data-sourcepos=\"146:16-146:23\"\u003e20-34代\u003c/td\u003e\n\u003ctd data-sourcepos=\"146:25-146:25\"\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"147:1-147:25\"\u003e\n\u003ctd data-sourcepos=\"147:1-147:7\"\u003e2026-01\u003c/td\u003e\n\u003ctd data-sourcepos=\"147:9-147:14\"\u003e女性\u003c/td\u003e\n\u003ctd data-sourcepos=\"147:16-147:23\"\u003e20-34代\u003c/td\u003e\n\u003ctd data-sourcepos=\"147:25-147:25\"\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"148:1-148:25\"\u003e\n\u003ctd data-sourcepos=\"148:1-148:7\"\u003e2026-02\u003c/td\u003e\n\u003ctd data-sourcepos=\"148:9-148:14\"\u003e女性\u003c/td\u003e\n\u003ctd data-sourcepos=\"148:16-148:23\"\u003e20-34代\u003c/td\u003e\n\u003ctd data-sourcepos=\"148:25-148:25\"\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"149:1-149:25\"\u003e\n\u003ctd data-sourcepos=\"149:1-149:7\"\u003e2026-02\u003c/td\u003e\n\u003ctd data-sourcepos=\"149:9-149:14\"\u003e男性\u003c/td\u003e\n\u003ctd data-sourcepos=\"149:16-149:23\"\u003e35-49代\u003c/td\u003e\n\u003ctd data-sourcepos=\"149:25-149:25\"\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"151:1-151:30\"\u003e\n\u003cspan id=\"パイプラインの監視\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E7%9B%A3%E8%A6%96\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eパイプラインの監視\u003c/h2\u003e\n\u003cp data-sourcepos=\"152:1-152:165\"\u003e正確なデータ分析を行うためには、パイプラインを通してデータが正しくデータマートに登録されていることが前提です。\u003c/p\u003e\n\u003cul data-sourcepos=\"154:1-157:0\"\u003e\n\u003cli data-sourcepos=\"154:1-154:119\"\u003eデータの発生源である対向システムから、毎日定刻に届くはずのデータが届いていない\u003c/li\u003e\n\u003cli data-sourcepos=\"155:1-155:146\"\u003e対向システムの仕様変更で、送られてくるデータのフォーマットが変わって、DWHに正常に取り込みできない\u003c/li\u003e\n\u003cli data-sourcepos=\"156:1-157:0\"\u003e想定以上のデータ量が送られて、データマートに格納するまでに時間がかかり、データ分析者が利用開始する時刻までに間に合わない\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"158:1-158:204\"\u003eなど、何かしらの問題が発生して、データマートにデータが届かない事態になった場合に、迅速に復旧するためには、パイプラインの監視が必要です。\u003c/p\u003e\n\u003cp data-sourcepos=\"160:1-160:224\"\u003eエラーが発生した場合に、自動でリトライしたり、メールやSlackなどで担当者に通知する仕組みは、今どきのパイプライン用サービスには標準で組み込まれています。\u003c/p\u003e\n\u003cp data-sourcepos=\"162:1-162:456\"\u003e不正データ起因で発生したエラーについては、AIエージェントにデータ解析させて原因を取り除いて復旧させる方法もあるかもしれませんが、個人情報を含むデータをAIエージェントに読み込ませるのはセキュリティのリスクもあります。AIエージェントによる完全な自動復旧は課題も多いため、現時点では人間が判断する必要があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"164:1-164:352\"\u003eパイプライン上でAIを使うの一案としては、データ型としては正常でも、突発的なスパイク値や、ノイズ、外れ値など、統計分析に影響があるデータをAIで摘出し、データアナリストに通知する仕組みがあれば、データの正確性を担保できるようになるでしょう。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"166:1-166:17\"\u003e\n\u003cspan id=\"apache-airflow\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#apache-airflow\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eApache Airflow\u003c/h2\u003e\n\u003cp data-sourcepos=\"167:1-167:262\"\u003eワークフロー・オーケストレータのAirflowは、Airbnb社が作ったOSSで、データパイプラインの運行を管理するツールとして利用され、AWSやGoogle Cloudでもマネージドサービスとして提供されています。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"168:1-168:35\"\u003e\n\u003cspan id=\"airflowのアーキテクチャ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#airflow%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eAirflowのアーキテクチャ\u003c/h3\u003e\n\u003cp data-sourcepos=\"169:1-169:132\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fa4639fe2-6a58-4145-a13c-95a8d9bc217c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2bcda829c20625769319c715b339fcb7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fa4639fe2-6a58-4145-a13c-95a8d9bc217c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2bcda829c20625769319c715b339fcb7\" alt=\"arch-diag-basic.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fa4639fe2-6a58-4145-a13c-95a8d9bc217c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=73d9256ce001fe922d3e9b079fdac6c8 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/a4639fe2-6a58-4145-a13c-95a8d9bc217c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003eDAG（Directed Acyclic Graph：有向非巡回グラフ）\u003c/summary\u003e\nDAGは、タスクの実行順序、依存関係を定義したもので、Pythonで記載されます。\n\u003cp data-sourcepos=\"175:1-175:249\"\u003e例えば、「タスクA→タスクB→タスクCの順で実行」のように、タスクの実行順を定義できるだけでなく、エラー時のリトライ数、リトライ間隔、DAGの実行スケジュールを定義できます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"177:1-180:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e# DAG実行順の定義例\n\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eop\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eop\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003esome\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eother\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etask\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eop\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eop\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWebserver\u003c/summary\u003e\n「具体的に何をするか」というタスクのテンプレートです。クラウドサービスやプログラミング言語ごとに「部品」が用意されています。以下に挙げる他にも、様々なオペレーターが用意されています。\n\u003cp data-sourcepos=\"187:3-188:122\"\u003e\u003cstrong\u003ePythonOperator\u003c/strong\u003e\u003cbr\u003e\nDAGから別ファイル、または、DAG内に直書きしたPythonスクリプトを呼び出す際に利用する。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"190:3-210:5\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e# 1. 実行したい処理を「関数」として定義する\n\u003c/span\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003emy_python_function\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eこんにちは、\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003eさん！\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e今日の実行日付は \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eds\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e です。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e処理完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nc\"\u003eDAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003edag_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eexample_python_operator\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003estart_date\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nf\"\u003edatetime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2026\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e    \u003cspan class=\"c1\"\u003e# 2026-03-01 から起動する\n\u003c/span\u003e    \u003cspan class=\"n\"\u003eschedule_interval\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e@daily\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e         \u003cspan class=\"c1\"\u003e# 日次バッチ\n\u003c/span\u003e    \u003cspan class=\"n\"\u003ecatchup\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003eFalse\u003c/span\u003e                       \u003cspan class=\"c1\"\u003e# 過去に未実行だったスケジュールは実行しない\n\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edag\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\n    \u003cspan class=\"c1\"\u003e# 2. PythonOperatorで関数を呼び出す\n\u003c/span\u003e    \u003cspan class=\"n\"\u003erun_python_task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eexecute_logic\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003emy_python_function\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 実行する関数名を指定\n\u003c/span\u003e        \u003cspan class=\"n\"\u003eop_kwargs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003ename\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eデータエンジニア\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 関数に渡す引数を辞書で指定\n\u003c/span\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"212:3-213:96\"\u003e\u003cstrong\u003eBashOperator\u003c/strong\u003e\u003cbr\u003e\nDAGから別ファイルで定義したBashスクリプトを呼び出す際に利用する。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"215:3-232:5\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e  \u003cspan class=\"c1\"\u003e# 1. シンプルなコマンド\n\u003c/span\u003e  \u003cspan class=\"n\"\u003eprint_hello\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eBashOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eprint_hello\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"n\"\u003ebash_command\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eecho \u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eHello, Airflow! 実行日は {{ ds }} です\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"'\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# 2. 複数のコマンドを連続実行\n\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# カレントディレクトリを確認し、ファイルを生成する\n\u003c/span\u003e  \u003cspan class=\"n\"\u003erun_multi_commands\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eBashOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003erun_multi_commands\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"n\"\u003ebash_command\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003e\n          pwd \u0026amp;\u0026amp; \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e          ls -al \u0026amp;\u0026amp; \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e          echo \u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e作成完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e \u0026gt; /tmp/test_file.txt\n      \u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"234:3-235:124\"\u003e\u003cstrong\u003eBigQueryExecuteQueryOperator\u003c/strong\u003e\u003cbr\u003e\nDAGから別ファイル、または、DAG内に直書きしたSQLをBigQueryに対して発行する際に利用する。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"237:3-254:5\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e  \u003cspan class=\"c1\"\u003e# BigQueryでクエリを実行するタスク\n\u003c/span\u003e  \u003cspan class=\"n\"\u003erun_query\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eBigQueryExecuteQueryOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003erun_my_sql\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003e\n          SELECT \n              user_id, \n              COUNT(*) as action_count\n          FROM `my_project.my_dataset.user_logs`\n          WHERE date = \u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e{{ ds }}\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e\n          GROUP BY user_id\n      \u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"n\"\u003euse_legacy_sql\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 標準SQLを使用\n\u003c/span\u003e      \u003cspan class=\"n\"\u003edestination_dataset_table\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003emy_project.my_dataset.summary_table\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 結果をテーブルに保存する場合\n\u003c/span\u003e      \u003cspan class=\"n\"\u003ewrite_disposition\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003eWRITE_TRUNCATE\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 上書き設定（他にはWRITE_APPENDなど）\n\u003c/span\u003e      \u003cspan class=\"n\"\u003egcp_conn_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003egoogle_cloud_default\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# Airflowで設定した接続ID\n\u003c/span\u003e  \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"255:3-255:350\"\u003eAirflowのDAG内で、Pythonスクリプトを使って複雑な処理を並行で行うと、マシンリソースを消費してメモリー不足になりタスクが異常終了したり、CPU100%になりタスクが反応しなくなりAirflowが該当タスクを強制終了させるため、パイプラインが不安定になります。\u003c/p\u003e\n\u003cp data-sourcepos=\"257:3-257:145\"\u003e大量データの加工処理はDAGで実行するのではなく、BigQuery上でSQLを発行して実行することをお勧めします。\u003c/p\u003e\n\u003cp data-sourcepos=\"259:3-259:246\"\u003eAirflowは、パイプラインの交通整理役であり、重い荷物を運ぶトラック役は外部の専門基盤に委譲し、タスクの開始と終了を見守る役に徹することが、安定的な運用につながります。\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eMetadata Database（メタデータDB）\u003c/summary\u003e\nAirflowの全情報を保存するデータベース（PostgreSQLやMySQL）です。\n\u003cp data-sourcepos=\"266:1-266:162\"\u003eDAGの定義、過去の実行結果（成功・失敗）、現在のタスクの状態、ユーザー設定、変数（Variables）などが保存されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"268:1-268:142\"\u003eこれが壊れると、Airflowは「自分がいま何をすべきか」「過去に何をしたか」をすべて忘れてしまいます。\u003c/p\u003e\n\u003cp data-sourcepos=\"270:1-270:109\"\u003eメタデータDBへのデータ登録、更新はWebUIやスケジューラ、ワーカーが行います。\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eScheduler（スケジューラ）\u003c/summary\u003e\nスケジューラはAirflowの司令塔であり、「Metadata DB（過去と現在の状態）」と「DAGファイル（未来の予定）」を常に突き合わせ続け、ギャップがあれば埋めるという動作を繰り返しています。\n\u003cp data-sourcepos=\"277:1-277:175\"\u003e「毎日深夜1:00に実行」などのスケジュールや、「タスクDとタスクEの終了を待って、タスクFを実行」などの実行指示を出します。\u003c/p\u003e\n\u003cp data-sourcepos=\"279:1-279:524\"\u003e実行条件が揃ったタスクをキューに登録し、メタデータDBを更新して実行待ち状態にします。なお、実行待ちになったタスクは、エクゼキュータが取り出し、ワーカーに処理を実行させます。ワーカーが実行中のタスクについて、スケジューラはハートビートを送り生死を監視します。タスクの生存が確認できなかった場合は、ゾンビタスクとして扱い、強制終了させてリトライさせます。\u003c/p\u003e\n\u003cp data-sourcepos=\"281:1-281:137\"\u003eその他、DAGの定義を定期的にチェックし、新規登録や変更があった場合はメタデータDBを更新します。\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eExecutor（エグゼキュータ）\u003c/summary\u003e\nスケジューラに組み込まれている機能で、タスクの実行先ワーカーの振り分け役を担います。\n\u003cp data-sourcepos=\"288:1-288:292\"\u003e「自分の同じマシンの中で、サブプロセスとして動かそう」、「タスクをキューに投げて、遠くにいるWorkerたちに拾わせよう」、「タスクごとに、コンテナを新しく1個作ってそこで動かそう」などの判断を行います。\u003c/p\u003e\n\u003cp data-sourcepos=\"290:1-290:165\"\u003eスケジューラが「脳」、ワーカーが「体」であれば、エグゼキュータは脳と体を繋ぐ「神経」のような役割を果たします。\u003c/p\u003e\n\u003cp data-sourcepos=\"292:1-292:259\"\u003eGoogle Cloudの \u003cstrong\u003eCloud Composer\u003c/strong\u003e を使うなら、内部では \u003cstrong\u003eKubernetesExecutor\u003c/strong\u003e（またはCeleryとK8sのハイブリッド）が動いており、ユーザーは「神経」の管理をあまり意識せずに済むようになっています。\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWorker（ワーカー）\u003c/summary\u003e\nワーカーは、指示されたタスクを、指定された環境で実行し、結果を報告します。\n\u003cp data-sourcepos=\"299:1-299:117\"\u003eタスクに定義されているオペレーター（PythonOperator、BigQueryOperatorなど）を動かします。\u003c/p\u003e\n\u003cp data-sourcepos=\"301:1-301:108\"\u003eタスクの開始時、完了時（成功/失敗）に、その状態をMetadata DBに書き込みます。\u003c/p\u003e\n\u003cp data-sourcepos=\"303:1-303:177\"\u003eタスクがあまりに重く、ワーカーのマシンリソースを使い果たしてしまうと、ワーカー自身がフリーズしてしまうことがあります。\u003c/p\u003e\n\u003cp data-sourcepos=\"305:1-305:107\"\u003e「ワーカーがどこでどう動くか」は、どのExecutorを使うかで大きく変わります。\u003c/p\u003e\n\u003ctable data-sourcepos=\"307:1-311:198\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"307:1-307:37\"\u003e\n\u003cth data-sourcepos=\"307:1-307:8\"\u003eExecutor\u003c/th\u003e\n\u003cth data-sourcepos=\"307:10-307:30\"\u003eワーカーの実体\u003c/th\u003e\n\u003cth data-sourcepos=\"307:32-307:37\"\u003e特徴\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"309:1-309:148\"\u003e\n\u003ctd data-sourcepos=\"309:1-309:13\"\u003eLocalExecutor\u003c/td\u003e\n\u003ctd data-sourcepos=\"309:15-309:50\"\u003eスケジューラと同じマシン\u003c/td\u003e\n\u003ctd data-sourcepos=\"309:52-309:148\"\u003e1台のマシン内で、複数のPythonプロセスとして動く。小規模・開発向け。\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"310:1-310:148\"\u003e\n\u003ctd data-sourcepos=\"310:1-310:14\"\u003eCeleryExecutor\u003c/td\u003e\n\u003ctd data-sourcepos=\"310:16-310:42\"\u003e独立したサーバー群\u003c/td\u003e\n\u003ctd data-sourcepos=\"310:44-310:148\"\u003e複数の専用サーバー（Workerノード）を常時立ち上げておく。中〜大規模向け。\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"311:1-311:198\"\u003e\n\u003ctd data-sourcepos=\"311:1-311:18\"\u003eKubernetesExecutor\u003c/td\u003e\n\u003ctd data-sourcepos=\"311:20-311:55\"\u003e使い捨てのPod（コンテナ）\u003c/td\u003e\n\u003ctd data-sourcepos=\"311:57-311:198\"\u003eタスクが実行される時だけ、Kubernetes上に新しいコンテナが立ち上がり、終わると消える。モダンな標準。\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\u003ch2 data-sourcepos=\"315:1-315:18\"\u003e\n\u003cspan id=\"ハンズオン\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eハンズオン\u003c/h2\u003e\n\u003cp data-sourcepos=\"316:1-316:78\"\u003eDocker Compose で、以下のデータパイプラインを構築します。\u003c/p\u003e\n\u003cul data-sourcepos=\"318:1-322:0\"\u003e\n\u003cli data-sourcepos=\"318:1-318:36\"\u003eデータレイク：S3（MinIO）\u003c/li\u003e\n\u003cli data-sourcepos=\"319:1-319:39\"\u003eDWH／データマート：PostgreSQL\u003c/li\u003e\n\u003cli data-sourcepos=\"320:1-320:37\"\u003eデータ分析ツール：Metabase\u003c/li\u003e\n\u003cli data-sourcepos=\"321:1-322:0\"\u003eパイプラインの基盤：Airflow\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003eプロジェクト構成\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"326:1-365:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e  project/                           # データ分析 PoC プロジェクト\n  ├── README.md                      # プロジェクト説明\n  ├── docker-compose.yml             # Docker 構成（Airflow, DB, Metabase 等）\n  ├── pyproject.toml                 # Python プロジェクト設定\n  ├── .env / .env.example            # 環境変数\n  │\n  ├── dags/                          # Airflow DAG 定義\n  │   ├── etl_raw_to_dwh.py          #   Raw → DWH の ETL DAG\n  │   ├── etl_dwh_to_mart.py         #   DWH → Mart の ETL DAG\n  │   ├── transforms/                #   変換ロジック\n  │   │   ├── raw_to_dwh.py          #     Raw → DWH 変換\n  │   │   └── dwh_to_mart.py         #     DWH → Mart 変換（MRR集計等）\n  │   └── tests/                     #   ユニットテスト\n  │       ├── test_raw_to_dwh.py\n  │       └── test_dwh_to_mart.py\n  │\n  ├── db/                            # データベース初期化\n  │   └── init/\n  │       ├── 01_create_schemas.sql  #   スキーマ作成\n  │       ├── 02_create_tables.sql   #   テーブル作成\n  │       └── 001_seed.sql           #   シードデータ\n  │\n  ├── data/                          # サンプルデータ\n  │   ├── generate_sample.py         #   データ生成スクリプト\n  │   └── sample/\n  │       ├── users.csv\n  │       ├── subscriptions.csv\n  │       └── orders.csv\n  │\n  ├── metabase/                      # Metabase ダッシュボード定義\n  │   └── dashboards/\n  │       ├── revenue-dashboard.json #   MRR 分析ダッシュボード\n  │       └── churn-dashboard.json   #   解約分析ダッシュボード\n  │\n  └── scripts/                       # ユーティリティスクリプト\n       ├── init-s3.sh                #   S3 (MinIO) 初期化\n       ├── setup-metabase.py         #   Metabase セットアップ\n       └── setup-metabase.sh\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003edocker-compose.yml\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"yaml\" data-sourcepos=\"373:1-603:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e# データ分析基盤 PoC: Docker Compose 定義\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e# 全サービスを docker compose up -d で起動可能\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e# サービス起動順序: postgres → minio → data-init → airflow-init → airflow-* → metabase\u003c/span\u003e\n\n\u003cspan class=\"na\"\u003eservices\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e# === PostgreSQL（DWH/Mart/Airflow メタデータ DB）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003epostgres\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epostgres:16\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-postgres\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_USER:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_PASSWORD:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eports\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e5435:5432\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003epostgres_data:/var/lib/postgresql/data\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./db/init:/docker-entrypoint-initdb.d\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etest\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eCMD-SHELL\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epg_isready\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e-U\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e${POSTGRES_USER:-analytics}\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e-d\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e${POSTGRES_DB:-analytics_db}\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n      \u003cspan class=\"na\"\u003einterval\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e5s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etimeout\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e5s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eretries\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === MinIO（S3 互換オブジェクトストレージ / データレイク）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003eminio\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eminio/minio:latest\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-minio\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMINIO_ROOT_USER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_USER:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMINIO_ROOT_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_PASSWORD:-minioadmin}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eports\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e9000:9000\"\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e9001:9001\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003eminio_data:/data\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ecommand\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eserver /data --console-address \":9001\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etest\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eCMD-SHELL\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emc\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eready\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003elocal\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e||\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eexit\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e1\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n      \u003cspan class=\"na\"\u003einterval\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e5s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etimeout\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e5s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eretries\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === data-init（S3 バケット作成 + サンプル CSV アップロード）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003edata-init\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eamazon/aws-cli:latest\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-data-init\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eminio\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n      \u003cspan class=\"na\"\u003epostgres\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_USER:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_PASSWORD:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AWS_DEFAULT_REGION:-ap-northeast-1}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp://minio:9000\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${S3_BUCKET_NAME:-data-lake}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./scripts/init-s3.sh:/scripts/init-s3.sh:ro\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./data/sample:/data/sample:ro\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eentrypoint\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e/bin/sh\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e/scripts/init-s3.sh\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n    \u003cspan class=\"na\"\u003erestart\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eno\"\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === Airflow 初期化（DB マイグレーション + 管理者ユーザー作成）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003eairflow-init\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eapache/airflow:2.9.3-python3.11\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-airflow-init\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003epostgres\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__EXECUTOR\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eLocalExecutor\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__DATABASE__SQL_ALCHEMY_CONN\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epostgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__DAGS_FOLDER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e/opt/airflow/dags\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__LOAD_EXAMPLES\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eFalse\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_AIRFLOW_DB_MIGRATE\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_AIRFLOW_WWW_USER_CREATE\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_AIRFLOW_WWW_USER_USERNAME\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AIRFLOW_ADMIN_USER:-airflow}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_AIRFLOW_WWW_USER_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AIRFLOW_ADMIN_PASSWORD:-airflow}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eentrypoint\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e/bin/bash\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ecommand\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e-c\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"pi\"\u003e|\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow db migrate\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow users create \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--username $${_AIRFLOW_WWW_USER_USERNAME} \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--password $${_AIRFLOW_WWW_USER_PASSWORD} \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--firstname Admin \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--lastname User \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--role Admin \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--email admin@example.com || true\u003c/span\u003e\n        \u003cspan class=\"s\"\u003e# Airflow Connection: MinIO S3\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow connections delete aws_default 2\u0026gt;/dev/null || true\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow connections add aws_default \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-type aws \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-extra '{\"endpoint_url\": \"http://minio:9000\", \"aws_access_key_id\": \"minioadmin\", \"aws_secret_access_key\": \"minioadmin\", \"region_name\": \"ap-northeast-1\"}'\u003c/span\u003e\n        \u003cspan class=\"s\"\u003e# Airflow Connection: PostgreSQL DWH\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow connections delete postgres_dwh 2\u0026gt;/dev/null || true\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eairflow connections add postgres_dwh \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-type postgres \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-host postgres \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-port 5432 \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-login $${POSTGRES_USER:-analytics} \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-password $${POSTGRES_PASSWORD:-analytics} \\\u003c/span\u003e\n          \u003cspan class=\"s\"\u003e--conn-schema $${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n        \u003cspan class=\"s\"\u003eecho \"=== Airflow 初期化完了 ===\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003erestart\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eno\"\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === Airflow Webserver（UI + REST API）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003eairflow-webserver\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eapache/airflow:2.9.3-python3.11\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-airflow-webserver\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eairflow-init\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_completed_successfully\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__EXECUTOR\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eLocalExecutor\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__DATABASE__SQL_ALCHEMY_CONN\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epostgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__DAGS_FOLDER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e/opt/airflow/dags\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__LOAD_EXAMPLES\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eFalse\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__API__AUTH_BACKENDS\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eairflow.api.auth.backend.basic_auth\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__WEBSERVER__EXPOSE_CONFIG\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTrue\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__WEBSERVER__SECRET_KEY\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AIRFLOW_SECRET_KEY:-a1b2c3d4e5f6a1b2c3d4e5f6}\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# DAG で使用する追加パッケージ\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_PIP_ADDITIONAL_REQUIREMENTS\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epandas\u0026gt;=2.0\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eboto3\u0026gt;=1.28\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003epsycopg2-binary\u0026gt;=2.9\"\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# S3 接続用（DAG 内で boto3 直接使用時 → MinIO）\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_USER:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_PASSWORD:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AWS_DEFAULT_REGION:-ap-northeast-1}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp://minio:9000\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${S3_BUCKET_NAME:-data-lake}\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# DB 接続用（DAG 内で psycopg2 直接使用時）\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_USER:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_PASSWORD:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eports\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e8081:8080\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./dags:/opt/airflow/dags\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ecommand\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003ewebserver\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etest\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eCMD-SHELL\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ecurl\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e-f\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ehttp://localhost:8080/health\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e||\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eexit\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e1\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n      \u003cspan class=\"na\"\u003einterval\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e10s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etimeout\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e10s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eretries\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e12\u003c/span\u003e\n      \u003cspan class=\"na\"\u003estart_period\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e30s\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === Airflow Scheduler（DAG スケジューリング・タスク実行）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003eairflow-scheduler\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eapache/airflow:2.9.3-python3.11\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-airflow-scheduler\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eairflow-init\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_completed_successfully\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__EXECUTOR\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eLocalExecutor\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__DATABASE__SQL_ALCHEMY_CONN\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epostgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__DAGS_FOLDER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e/opt/airflow/dags\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__CORE__LOAD_EXAMPLES\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eFalse\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAIRFLOW__WEBSERVER__SECRET_KEY\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AIRFLOW_SECRET_KEY:-a1b2c3d4e5f6a1b2c3d4e5f6}\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# DAG で使用する追加パッケージ\u003c/span\u003e\n      \u003cspan class=\"na\"\u003e_PIP_ADDITIONAL_REQUIREMENTS\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epandas\u0026gt;=2.0\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eboto3\u0026gt;=1.28\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003epsycopg2-binary\u0026gt;=2.9\"\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# S3 接続用（DAG 内で boto3 直接使用時 → MinIO）\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_USER:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${MINIO_ROOT_PASSWORD:-minioadmin}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${AWS_DEFAULT_REGION:-ap-northeast-1}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp://minio:9000\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${S3_BUCKET_NAME:-data-lake}\u003c/span\u003e\n      \u003cspan class=\"c1\"\u003e# DB 接続用（DAG 内で psycopg2 直接使用時）\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_USER:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_PASSWORD:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./dags:/opt/airflow/dags\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ecommand\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003escheduler\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etest\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eCMD-SHELL\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eairflow\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ejobs\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003echeck\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e--job-type\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eSchedulerJob\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e--hostname\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e$(hostname)\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e||\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eexit\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e1\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n      \u003cspan class=\"na\"\u003einterval\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e15s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etimeout\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e10s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eretries\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\n      \u003cspan class=\"na\"\u003estart_period\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e30s\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === Metabase（BI ダッシュボード）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003emetabase\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003emetabase/metabase:latest\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-metabase\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003epostgres\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMB_DB_TYPE\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eh2\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMB_JETTY_PORT\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eports\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e3000:3000\"\u003c/span\u003e\n    \u003cspan class=\"na\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etest\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eCMD-SHELL\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ecurl\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e-f\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ehttp://localhost:3000/api/health\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e||\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003eexit\u003c/span\u003e\u003cspan class=\"nv\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e1\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n      \u003cspan class=\"na\"\u003einterval\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e10s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003etimeout\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e10s\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eretries\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e12\u003c/span\u003e\n      \u003cspan class=\"na\"\u003estart_period\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e30s\u003c/span\u003e\n\n  \u003cspan class=\"c1\"\u003e# === Metabase 初期化（データソース登録 + ダッシュボード自動作成）===\u003c/span\u003e\n  \u003cspan class=\"na\"\u003emetabase-init\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eimage\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epython:3.11-slim\u003c/span\u003e\n    \u003cspan class=\"na\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epoc-metabase-init\u003c/span\u003e\n    \u003cspan class=\"na\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003emetabase\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n      \u003cspan class=\"na\"\u003epostgres\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"na\"\u003econdition\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003eservice_healthy\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMETABASE_URL\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp://metabase:3000\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMETABASE_ADMIN_EMAIL\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${METABASE_ADMIN_EMAIL:-admin@example.com}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eMETABASE_ADMIN_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${METABASE_ADMIN_PASSWORD:-password}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eDB_HOST\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003epostgres\u003c/span\u003e\n      \u003cspan class=\"na\"\u003eDB_PORT\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e5432\"\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_DB:-analytics_db}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_USER:-analytics}\u003c/span\u003e\n      \u003cspan class=\"na\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e${POSTGRES_PASSWORD:-analytics}\u003c/span\u003e\n    \u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n      \u003cspan class=\"pi\"\u003e-\u003c/span\u003e \u003cspan class=\"s\"\u003e./scripts/setup-metabase.py:/scripts/setup-metabase.py:ro\u003c/span\u003e\n    \u003cspan class=\"na\"\u003eentrypoint\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"pi\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epython3\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e/scripts/setup-metabase.py\"\u003c/span\u003e\u003cspan class=\"pi\"\u003e]\u003c/span\u003e\n    \u003cspan class=\"na\"\u003erestart\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eno\"\u003c/span\u003e\n\n\u003cspan class=\"na\"\u003evolumes\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n  \u003cspan class=\"na\"\u003epostgres_data\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n  \u003cspan class=\"na\"\u003eminio_data\u003c/span\u003e\u003cspan class=\"pi\"\u003e:\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cp data-sourcepos=\"607:1-607:63\"\u003eDockerを起動して、各種コンテナを起動します。\u003c/p\u003e\n\u003ctable data-sourcepos=\"609:1-614:63\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"609:1-609:31\"\u003e\n\u003cth data-sourcepos=\"609:2-609:15\"\u003eサービス\u003c/th\u003e\n\u003cth data-sourcepos=\"609:17-609:24\"\u003e用途\u003c/th\u003e\n\u003cth data-sourcepos=\"609:26-609:30\"\u003eURL\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"611:1-611:122\"\u003e\n\u003ctd data-sourcepos=\"611:2-611:11\"\u003eMinIO S3\u003c/td\u003e\n\u003ctd data-sourcepos=\"611:13-611:97\"\u003eデータレイク（API: \u003ca href=\"http://localhost:9000\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttp://localhost:9000\u003c/a\u003e / Console: \u003ca href=\"http://localhost:9001%EF%BC%89\" class=\"autolink\"\u003ehttp://localhost:9001）\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd data-sourcepos=\"611:99-611:121\"\u003e\u003ca href=\"http://localhost:9001\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttp://localhost:9001\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"612:1-612:58\"\u003e\n\u003ctd data-sourcepos=\"612:2-612:13\"\u003ePostgreSQL\u003c/td\u003e\n\u003ctd data-sourcepos=\"612:15-612:40\"\u003eDWH / データマート\u003c/td\u003e\n\u003ctd data-sourcepos=\"612:42-612:57\"\u003elocalhost:5435\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"613:1-613:72\"\u003e\n\u003ctd data-sourcepos=\"613:2-613:10\"\u003eAirflow\u003c/td\u003e\n\u003ctd data-sourcepos=\"613:12-613:47\"\u003eETL オーケストレーション\u003c/td\u003e\n\u003ctd data-sourcepos=\"613:49-613:71\"\u003e\u003ca href=\"http://localhost:8081\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttp://localhost:8081\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"614:1-614:63\"\u003e\n\u003ctd data-sourcepos=\"614:2-614:11\"\u003eMetabase\u003c/td\u003e\n\u003ctd data-sourcepos=\"614:13-614:38\"\u003eBI ダッシュボード\u003c/td\u003e\n\u003ctd data-sourcepos=\"614:40-614:62\"\u003e\u003ca href=\"http://localhost:3000\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttp://localhost:3000\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"617:1-629:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nv\"\u003e$ \u003c/span\u003edocker compose up \u003cspan class=\"nt\"\u003e-d\u003c/span\u003e\n\u003cspan class=\"o\"\u003e[\u003c/span\u003e+] Running 9/9\n ✔ Network tun-202603_default       Created                                                   0.0s \n ✔ Container poc-minio              Healthy                                                   6.3s \n ✔ Container poc-postgres           Healthy                                                   7.2s \n ✔ Container poc-airflow-init       Exited                                                   43.5s \n ✔ Container poc-data-init          Started                                                   6.6s \n ✔ Container poc-metabase           Healthy                                                  48.5s \n ✔ Container poc-metabase-init      Started                                                  48.6s \n ✔ Container poc-airflow-webserver  Started                                                  43.6s \n ✔ Container poc-airflow-scheduler  Started \n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"631:1-632:162\"\u003e\u003cstrong\u003eMinIO\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fed9a7847-d642-4b87-92a1-059febdea3ff.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=495e090ca7199d13411ced34b8663906\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fed9a7847-d642-4b87-92a1-059febdea3ff.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=495e090ca7199d13411ced34b8663906\" alt=\"スクリーンショット 2026-03-28 200756.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fed9a7847-d642-4b87-92a1-059febdea3ff.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=5bf20510e23de2d640f78ca9c68650ae 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/ed9a7847-d642-4b87-92a1-059febdea3ff.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"634:1-635:162\"\u003e\u003cstrong\u003eAirflow\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F02d84690-a876-4be1-90c8-c52b001fb43d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6233f098fc0d0a7213ed4c8b6db86f36\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F02d84690-a876-4be1-90c8-c52b001fb43d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6233f098fc0d0a7213ed4c8b6db86f36\" alt=\"スクリーンショット 2026-03-28 200844.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F02d84690-a876-4be1-90c8-c52b001fb43d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=db8fffd2db4f33141ecc653369fcbeb5 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/02d84690-a876-4be1-90c8-c52b001fb43d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"637:1-638:162\"\u003e\u003cstrong\u003eMetabase\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F7dc7bf07-9d1b-47a6-b748-b57d98f88690.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4027ae0afef785d95fcc8f407936d818\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F7dc7bf07-9d1b-47a6-b748-b57d98f88690.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4027ae0afef785d95fcc8f407936d818\" alt=\"スクリーンショット 2026-03-28 200925.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F7dc7bf07-9d1b-47a6-b748-b57d98f88690.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=dcd531463244a8bb68d4cc92583fd103 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/7dc7bf07-9d1b-47a6-b748-b57d98f88690.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"641:1-641:43\"\u003e\n\u003cspan id=\"データソースデータレイク\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータソース→データレイク\u003c/h3\u003e\n\u003cp data-sourcepos=\"643:1-643:153\"\u003eDockerコンテナ起動時にシェルスクリプトを実行し、AWS のAPIを使ってS3に以下のCSVファイルをアップロードします。\u003c/p\u003e\n\u003cul data-sourcepos=\"645:1-648:0\"\u003e\n\u003cli data-sourcepos=\"645:1-645:35\"\u003eusers.csv : ユーザーデータ\u003c/li\u003e\n\u003cli data-sourcepos=\"646:1-646:30\"\u003eorders.csv : 注文データ\u003c/li\u003e\n\u003cli data-sourcepos=\"647:1-648:0\"\u003esubscriptions.csv : 購読データ\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003einit-s3.sh\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"652:1-688:3\"\u003e\n\u003cdiv class=\"code-lang\"\u003e\u003cspan class=\"bold\"\u003escripts/init-s3.sh\u003c/span\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e#!/bin/bash\u003c/span\u003e\n\u003cspan class=\"c\"\u003e# MinIO S3 初期化スクリプト\u003c/span\u003e\n\u003cspan class=\"c\"\u003e# バケット作成 + サンプル CSV アップロード（べき等）\u003c/span\u003e\n\n\u003cspan class=\"nb\"\u003eset\u003c/span\u003e \u003cspan class=\"nt\"\u003e-euo\u003c/span\u003e pipefail\n\n\u003cspan class=\"nv\"\u003eENDPOINT_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"nv\"\u003ehttp\u003c/span\u003e://minio:9000\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"nv\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e-lake\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eREGION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"nv\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e-northeast-1\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eDATA_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"/data/sample\"\u003c/span\u003e\n\n\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"=== S3 初期化開始 ===\"\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# バケット作成（既存の場合はスキップ）\u003c/span\u003e\n\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"バケット作成: \u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\naws \u003cspan class=\"nt\"\u003e--endpoint-url\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eENDPOINT_URL\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    s3 mb \u003cspan class=\"s2\"\u003e\"s3://\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e 2\u0026gt;/dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"バケットは既に存在します\"\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# CSV アップロード\u003c/span\u003e\n\u003cspan class=\"k\"\u003efor \u003c/span\u003efile \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eDATA_DIR\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e/\u003cspan class=\"k\"\u003e*\u003c/span\u003e.csv\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\n    \u003c/span\u003e\u003cspan class=\"nv\"\u003efilename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003ebasename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efile\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"si\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"アップロード: \u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efilename\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e → s3://\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/raw/\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efilename\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\n    aws \u003cspan class=\"nt\"\u003e--endpoint-url\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eENDPOINT_URL\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n        \u003cspan class=\"nt\"\u003e--region\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eREGION\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n        s3 \u003cspan class=\"nb\"\u003ecp\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efile\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"s3://\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/raw/\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efilename\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\n\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# アップロード確認\u003c/span\u003e\n\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\"\u003c/span\u003e\n\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"=== アップロード結果 ===\"\u003c/span\u003e\naws \u003cspan class=\"nt\"\u003e--endpoint-url\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eENDPOINT_URL\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--region\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eREGION\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    s3 \u003cspan class=\"nb\"\u003els\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"s3://\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eBUCKET_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/raw/\"\u003c/span\u003e\n\n\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\"=== S3 初期化完了 ===\"\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/details\u003e\n\u003cp data-sourcepos=\"692:1-692:80\"\u003eCSVがアップロードされたMinIOのバケットは以下の通りです。\u003c/p\u003e\n\u003cp data-sourcepos=\"694:1-694:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2e21bcbe-ecc5-4440-94c2-1553823548b3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6ba69b575f51acf63ec8b4fa8fa3f178\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2e21bcbe-ecc5-4440-94c2-1553823548b3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6ba69b575f51acf63ec8b4fa8fa3f178\" alt=\"スクリーンショット 2026-03-28 202138.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2e21bcbe-ecc5-4440-94c2-1553823548b3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=4d83ffe469f5f18df796333b3b50413e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/2e21bcbe-ecc5-4440-94c2-1553823548b3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"696:1-696:28\"\u003e\n\u003cspan id=\"データレイクdwh\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AFdwh\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータレイク→DWH\u003c/h3\u003e\n\u003cp data-sourcepos=\"698:1-698:204\"\u003eAirflowのDAGを使って、MinIOバケット上のCSVファイルをDWHにロードします。ロード前にデータのバリデーションチェックを行い、不正データを検出します。\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003eetl_raw_to_dwh.py\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"703:1-864:3\"\u003e\n\u003cdiv class=\"code-lang\"\u003e\u003cspan class=\"bold\"\u003edags/etl_raw_to_dwh.py\u003c/span\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eETL DAG: S3 (raw) → DWH\n\nS3 から CSV を取得し、変換ロジックで DWH レコードに変換後、\nPostgreSQL の dwh スキーマに TRUNCATE + INSERT する。\n\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eboto3\u003c/span\u003e\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003epsycopg2\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003eairflow\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eDAG\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003eairflow.operators.python\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePythonOperator\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003etransforms.raw_to_dwh\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eparse_orders_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eparse_subscriptions_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eparse_users_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e# 環境変数から接続情報を取得\n\u003c/span\u003e\u003cspan class=\"n\"\u003eS3_ENDPOINT_URL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ehttp://minio:9000\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eS3_BUCKET_NAME\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003edata-lake\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eAWS_REGION\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eap-northeast-1\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eDB_HOST\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eDB_HOST\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epostgres\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_PORT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eDB_PORT\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e5432\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_NAME\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics_db\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_USER\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_PASSWORD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_s3_client\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eMinIO S3 クライアントを取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eboto3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003es3\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eendpoint_url\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eS3_ENDPOINT_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eaws_access_key_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eminioadmin\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eaws_secret_access_key\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eminioadmin\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eregion_name\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eAWS_REGION\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePostgreSQL 接続を取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003epsycopg2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_HOST\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eport\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_PORT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003edbname\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_NAME\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_csv_from_s3\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3 から CSV テキストを取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003es3\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_s3_client\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget_object\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBucket\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eS3_BUCKET_NAME\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eKey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eBody\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nf\"\u003eread\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003edecode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eload_users\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3 から users.csv を取得し、dwh.users に TRUNCATE + INSERT する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_csv_from_s3\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eraw/users.csv\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"n\"\u003erecords\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eparse_users_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE dwh.users CASCADE\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO dwh.users\n                       (user_id, name, plan, registered_at, churn_date, segment)\n                       VALUES (%s, %s, %s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003euser_id\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ename\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eplan\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n                     \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eregistered_at\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003echurn_date\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003esegment\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.users: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eload_orders\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3 から orders.csv を取得し、dwh.orders に TRUNCATE + INSERT する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_csv_from_s3\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eraw/orders.csv\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"n\"\u003erecords\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eparse_orders_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE dwh.orders CASCADE\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO dwh.orders\n                       (order_id, user_id, amount, category, ordered_at)\n                       VALUES (%s, %s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eorder_id\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003euser_id\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eamount\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n                     \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ecategory\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eordered_at\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.orders: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eload_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3 から subscriptions.csv を取得し、dwh.subscriptions に TRUNCATE + INSERT する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_csv_from_s3\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eraw/subscriptions.csv\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"n\"\u003erecords\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eparse_subscriptions_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv_text\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE dwh.subscriptions CASCADE\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO dwh.subscriptions\n                       (sub_id, user_id, plan, started_at, ended_at, monthly_fee)\n                       VALUES (%s, %s, %s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003esub_id\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003euser_id\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eplan\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n                     \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003estarted_at\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eended_at\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emonthly_fee\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.subscriptions: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"c1\"\u003e# DAG 定義\n\u003c/span\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nc\"\u003eDAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003edag_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eetl_raw_to_dwh\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eS3 raw CSV → DWH テーブル（TRUNCATE + INSERT）\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eschedule\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e0 1 * * *\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003estart_date\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nf\"\u003edatetime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2026\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecatchup\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eetl\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eraw-to-dwh\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edag\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\n    \u003cspan class=\"c1\"\u003e# users を先にロード（orders, subscriptions が FK 参照するため）\n\u003c/span\u003e    \u003cspan class=\"n\"\u003et_users\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eload_users\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eload_users\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003et_orders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eload_orders\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eload_orders\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003et_subscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eload_subscriptions\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eload_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"c1\"\u003e# users → (orders, subscriptions) の順序依存\n\u003c/span\u003e    \u003cspan class=\"n\"\u003et_users\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et_orders\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003et_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/details\u003e\n\u003cp data-sourcepos=\"868:1-868:77\"\u003eDAGのトグルスイッチをONにすると、DAGが実行開始します。\u003c/p\u003e\n\u003cp data-sourcepos=\"870:1-870:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F29bc6bde-a452-4ef3-80a8-c4fb1185cbef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec055bd41f7813fb2dd36b6bacdeba24\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F29bc6bde-a452-4ef3-80a8-c4fb1185cbef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec055bd41f7813fb2dd36b6bacdeba24\" alt=\"スクリーンショット 2026-03-28 202647.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F29bc6bde-a452-4ef3-80a8-c4fb1185cbef.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6d579be73f7918ac3625767682da0362 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/29bc6bde-a452-4ef3-80a8-c4fb1185cbef.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"872:1-872:151\"\u003eDAGが正常終了したら、PostgreSQLのdwhスキーマに定義したテーブルにCSVがロードされていることを確認しましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"874:1-874:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F92c7cd89-a80e-48af-a869-582509b9d2f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=60647bb2f8617a5d8229452b6e4b4805\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F92c7cd89-a80e-48af-a869-582509b9d2f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=60647bb2f8617a5d8229452b6e4b4805\" alt=\"スクリーンショット 2026-03-28 203203.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F92c7cd89-a80e-48af-a869-582509b9d2f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=44b0dc93b3f9551b5de3e1498b43cd9a 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/92c7cd89-a80e-48af-a869-582509b9d2f7.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"876:1-876:28\"\u003e\n\u003cspan id=\"dwhデータマート\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#dwh%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eDWH→データマート\u003c/h3\u003e\n\u003cp data-sourcepos=\"878:1-878:103\"\u003eAirflowのDAGを使って、DWHのテーブルを集計して、データマートに登録します。\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003eetl_dwh_to_mart.py\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"883:1-1075:3\"\u003e\n\u003cdiv class=\"code-lang\"\u003e\u003cspan class=\"bold\"\u003edags/etl_dwh_to_mart.py\u003c/span\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eETL DAG: DWH → データマート\n\nDWH テーブルからデータを取得し、集計ロジックで変換後、\nmart スキーマに TRUNCATE + INSERT する。\n\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edecimal\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eDecimal\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003epsycopg2\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003eairflow\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eDAG\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003eairflow.operators.python\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePythonOperator\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003etransforms.dwh_to_mart\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ecalc_churn_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecalc_mrr_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecalc_revenue_summary\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e# 環境変数から接続情報を取得\n\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_HOST\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eDB_HOST\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003epostgres\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_PORT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eDB_PORT\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e5432\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_NAME\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_DB\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics_db\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_USER\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_USER\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"n\"\u003eDB_PASSWORD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePOSTGRES_PASSWORD\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eanalytics\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e# 集計対象期間（2024-01 〜 2025-12 の 24 ヶ月）\n\u003c/span\u003e\u003cspan class=\"n\"\u003eYEAR_MONTHS\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"si\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e04\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"si\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e02\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nf\"\u003erange\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2024\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2026\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003em\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nf\"\u003erange\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e13\u003c/span\u003e\u003cspan class=\"p\"\u003e)]\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003ePostgreSQL 接続を取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003epsycopg2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_HOST\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eport\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_PORT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003edbname\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_NAME\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eDB_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_users\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.users からレコードを取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eSELECT user_id, name, plan, registered_at, churn_date, segment FROM dwh.users\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\n            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nf\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003efetchall\u003c/span\u003e\u003cspan class=\"p\"\u003e()]\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_orders\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.orders からレコードを取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eSELECT order_id, user_id, amount, category, ordered_at FROM dwh.orders\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\n            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n            \u003cspan class=\"n\"\u003erows\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003efetchall\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n                \u003cspan class=\"n\"\u003erecord\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n                \u003cspan class=\"c1\"\u003e# psycopg2 が返す amount を Decimal に変換\n\u003c/span\u003e                \u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eamount\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eDecimal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eamount\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e\n                \u003cspan class=\"n\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003erows\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh.subscriptions からレコードを取得する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eSELECT sub_id, user_id, plan, started_at, ended_at, monthly_fee FROM dwh.subscriptions\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\n            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n            \u003cspan class=\"n\"\u003erows\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003efetchall\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n                \u003cspan class=\"n\"\u003erecord\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecolumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erow\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n                \u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emonthly_fee\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eDecimal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emonthly_fee\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e\n                \u003cspan class=\"n\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003erows\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebuild_churn_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eチャーン率サマリーを計算し mart.churn_summary に格納する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eusers\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_users\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eresults\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003ecalc_churn_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eusers\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eYEAR_MONTHS\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE mart.churn_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO mart.churn_summary\n                       (year_month, plan, active_start, churned, churn_rate)\n                       VALUES (%s, %s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eyear_month\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eplan\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eactive_start\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n                     \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003echurned\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003echurn_rate\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e])),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emart.churn_summary: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebuild_revenue_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003e売上サマリーを計算し mart.revenue_summary に格納する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eusers\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_users\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eorders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_orders\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eresults\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003ecalc_revenue_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eorders\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eusers\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eYEAR_MONTHS\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE mart.revenue_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO mart.revenue_summary\n                       (year_month, plan, total_revenue, order_count)\n                       VALUES (%s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eyear_month\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eplan\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003etotal_revenue\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                     \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eorder_count\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emart.revenue_summary: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebuild_mrr_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eMRR サマリーを計算し mart.mrr_summary に格納する。\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_fetch_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eresults\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003ecalc_mrr_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eYEAR_MONTHS\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003econn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e_get_db_conn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eTRUNCATE TABLE mart.mrr_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n                \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eINSERT INTO mart.mrr_summary\n                       (year_month, plan, active_subs, total_mrr, new_mrr, churned_mrr, net_new_mrr)\n                       VALUES (%s, %s, %s, %s, %s, %s, %s)\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eyear_month\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eplan\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eactive_subs\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n                     \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003etotal_mrr\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003enew_mrr\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e\n                     \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003echurned_mrr\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e]),\u003c/span\u003e \u003cspan class=\"nf\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003enet_new_mrr\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e])),\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n        \u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003emart.mrr_summary: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nf\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s\"\u003e 件ロード完了\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\n\u003cspan class=\"c1\"\u003e# DAG 定義\n\u003c/span\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nc\"\u003eDAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003edag_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eetl_dwh_to_mart\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eDWH → データマート（チャーン率・売上集計、TRUNCATE + INSERT）\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eschedule\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e0 2 * * *\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003estart_date\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nf\"\u003edatetime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2026\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecatchup\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003eetl\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003edwh-to-mart\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edag\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003et_churn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ebuild_churn_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild_churn_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003et_revenue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ebuild_revenue_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild_revenue_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"n\"\u003et_mrr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003ePythonOperator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003etask_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003ebuild_mrr_summary\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003epython_callable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild_mrr_summary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n    \u003cspan class=\"c1\"\u003e# チャーン・売上・MRR は独立して実行可能\n\u003c/span\u003e    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et_churn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003et_revenue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003et_mrr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/details\u003e\n\u003cp data-sourcepos=\"1079:1-1079:24\"\u003eDAGを実行します。\u003c/p\u003e\n\u003cp data-sourcepos=\"1081:1-1081:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2946e0fa-d434-4d01-bea0-48aae333912b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c0a57a308f5c9d9d28058e66349a0da0\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2946e0fa-d434-4d01-bea0-48aae333912b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c0a57a308f5c9d9d28058e66349a0da0\" alt=\"スクリーンショット 2026-03-28 205715.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F2946e0fa-d434-4d01-bea0-48aae333912b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c29752f0e31e018b72113b81ca57340f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/2946e0fa-d434-4d01-bea0-48aae333912b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1083:1-1083:152\"\u003eDAGが正常終了したら、PostgreSQLのmartスキーマに定義したテーブルにCSVがロードされていることを確認しましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"1085:1-1085:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F9be2fda0-ecdd-4653-8353-974a213cd619.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0b7753fddad5acad66de70400c7fa15e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F9be2fda0-ecdd-4653-8353-974a213cd619.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0b7753fddad5acad66de70400c7fa15e\" alt=\"スクリーンショット 2026-03-28 205944.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F9be2fda0-ecdd-4653-8353-974a213cd619.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=ba4ae23c0cdcf5feec971e7853fb370c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/9be2fda0-ecdd-4653-8353-974a213cd619.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"1087:1-1087:49\"\u003e\n\u003cspan id=\"データマートデータ分析ツール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%83%84%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータマート→データ分析ツール\u003c/h3\u003e\n\u003cp data-sourcepos=\"1089:1-1089:144\"\u003eデータマートのテーブルを、データ分析ツールのMetabase で読み込み、以下のダッシュボードを作成します。\u003c/p\u003e\n\u003cp data-sourcepos=\"1091:1-1091:25\"\u003e\u003cstrong\u003eチャーン率分析\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1093:1-1093:33\"\u003e\u003ciframe id=\"qiita-embed-content__3e8f8e3df491640715c6188807f21566\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__3e8f8e3df491640715c6188807f21566\" data-content=\"http%3A%2F%2Flocalhost%3A3000%2Fdashboard%2F2\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"1095:1-1095:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F86cbf017-076f-4d0c-bcb0-49bd09c8094d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5662f973151bded029a51da68876a6a4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F86cbf017-076f-4d0c-bcb0-49bd09c8094d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5662f973151bded029a51da68876a6a4\" alt=\"スクリーンショット 2026-03-28 210240.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F86cbf017-076f-4d0c-bcb0-49bd09c8094d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=8ca61d2a5a0a34ea935b2e54e263d3ca 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/86cbf017-076f-4d0c-bcb0-49bd09c8094d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1097:1-1097:16\"\u003e\u003cstrong\u003e売上分析\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1099:1-1099:33\"\u003e\u003ciframe id=\"qiita-embed-content__50639d24f2e3d7ed1dd2ae0b1a2c3b64\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__50639d24f2e3d7ed1dd2ae0b1a2c3b64\" data-content=\"http%3A%2F%2Flocalhost%3A3000%2Fdashboard%2F3\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"1101:1-1101:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fb042b9cf-c7c1-49c1-a442-ff3ada944da2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=eb4ba22499f0e2953f88653491b8a5d7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fb042b9cf-c7c1-49c1-a442-ff3ada944da2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=eb4ba22499f0e2953f88653491b8a5d7\" alt=\"スクリーンショット 2026-03-28 210315.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2Fb042b9cf-c7c1-49c1-a442-ff3ada944da2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e123475d3ab175b235b2ac54cbe55e5d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/b042b9cf-c7c1-49c1-a442-ff3ada944da2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1103:1-1103:13\"\u003e\u003cstrong\u003eMRR分析\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"1105:1-1105:33\"\u003e\u003ciframe id=\"qiita-embed-content__f20fdd73e4c35c7c8bed93621b34b925\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__f20fdd73e4c35c7c8bed93621b34b925\" data-content=\"http%3A%2F%2Flocalhost%3A3000%2Fdashboard%2F4\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"1107:1-1107:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F10014908-47af-4a66-8ed0-f48d3a649e2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1606e48578e4cef0e358f34baac52ef\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F10014908-47af-4a66-8ed0-f48d3a649e2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1606e48578e4cef0e358f34baac52ef\" alt=\"スクリーンショット 2026-03-28 210338.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4072121%2F10014908-47af-4a66-8ed0-f48d3a649e2f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=47c9906add05e986c5a18eea0d4f3b27 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/10014908-47af-4a66-8ed0-f48d3a649e2f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 data-sourcepos=\"1110:1-1110:11\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h1\u003e\n\u003cp data-sourcepos=\"1111:1-1111:216\"\u003e今回は、データ分析の裏側で動く“データパイプライン”の全体像と、その設計・運用を担うデータエンジニアの役割について、実践的な視点で解説しました。\u003c/p\u003e\n\u003cp data-sourcepos=\"1113:1-1113:105\"\u003eデータ分析は、正確でタイムリーなデータがあってこそ価値を生み出せます。\u003c/p\u003e\n\u003cp data-sourcepos=\"1115:1-1115:270\"\u003eつまり、分析の成果はパイプラインの品質に大きく依存します。データが正しく流れ、整い、蓄積され、活用されるまでの一連の仕組みを理解することは、分析者・エンジニア双方にとって重要です。\u003c/p\u003e\n\u003cp data-sourcepos=\"1117:1-1117:234\"\u003e自分の業務で扱っているデータが、どのような流れで届いているのかを一度棚卸ししてみると、どこにボトルネックがあるか、どこを自動化できるかが見えてくるでしょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"1119:1-1119:133\"\u003e今回紹介したAirflowなどのツールを試しに触ってみて、パイプライン設計を体感してみてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"1121:1-1121:230\"\u003e一緒にデータパイプラインについて学んでいきたいなど、ご興味を持たれた方は、\u003ca href=\"https://www.tech-ult.com/contact-8\" rel=\"nofollow noopener\" target=\"_blank\"\u003e弊社ホームページ\u003c/a\u003eからお問い合わせいただければ幸いです。\u003c/p\u003e\n","body":"# はじめに\n我々の身の回りで日々発生するデータを収集し、分析することで、業務を効率化したり、下記に挙げたような課題を解決することができます。\n\n- 売り上げを伸ばすため、顧客にリーチする広告を打ちたい。\n- サービスを解約しそうな顧客を引き止める施策を打ちたい。\n- クレジットカードの不正利用をリアルタイムに検知したい。\n- 渋滞情報や荷物量を考慮し、最も効率的なルートを算出したい。\n- 勤怠データや面談記録から、離職リスクの高い社員を早期に発見したい。\n\nデータアナリストは、データという『生の情報』を、ビジネスの意思決定に役立つ『価値ある知見』に翻訳することを生業としていますが、その元となるデータは彼らにどのように届けられるのでしょうか。\n\n実際のところ、データ分析基盤を構築して裏方で支えるデータエンジニアの存在があってこそ、表舞台でデータアナリストが活躍できるのです。\n\n今回は、データエンジニアに焦点を当て、その仕事の中でも重要な、データパイプラインの構築方法を紹介します。\n\n# 前提条件\n- WSLのUbuntu上にDockerでデータ分析基盤を構築するため、Dockerについて概要を理解している人を対象とします。\n- データパイプラインには、Apache Airflowを利用します。Airflowの詳細な設定方法は割愛します。\n\n# 解説\n## データアナリストとデータエンジニアの職域\nデータアナリストは、データを集計、可視化し、経営層がビジネス的な意思決定を行うためのサポートを行います。\n\nデータエンジニアは、データアナリストが迅速かつ正確にデータ分析を行うためのデータ分析基盤を構築する役割を担います。\n\nデータの欠損や誤りがあったり、必要な時にタイムリーにデータが入手できなかったり、フォーマットがばらばらで扱いづらい場合、正確な分析ができません。\n\nデータの正確性、可用性を担保するのは、データエンジニアの役割です。\n\n主な職域の違いは以下の通りです。\n\n比較項目|データアナリスト (DA)|データエンジニア (DE)\n--|--|--\n主な目的|ビジネス上の意思決定を支援する|データの「流れ」と「基盤」を構築・維持する\n注力ポイント|データの活用・解釈 (現状把握と予測)|データの収集・加工 (安定性と効率)\n主な成果物|ダッシュボード、分析レポート、施策提案|データパイプライン、DWH、データマート\n得意なツール|SQL, Tableau, Power BI, Python (Pandas/Scikit-learn)|SQL, Python, Airflow, dbt, Spark, クラウドインフラ (AWS/GCP)\n向き合う相手|企画、マーケ、営業などのビジネス部門|データアナリスト、サイエンティスト、SRE\n主な問い|「なぜ売上が下がったのか？」「次はどうすべきか？」|「データは欠損なく届いているか？」「処理速度は最適か？」\n\n\n## データパイプラインについて\nデータパイプラインとは、データの発生源から分析環境まで、自動的に流れるための一本道のことです。\n\n以下の4つのステップを通じて、生のデータから分析可能なデータに変換し、活用できるようにします。\n\n1. **収集 (Ingestion):**\n    - アプリのログ、データベース、外部APIなどからデータを集めてきます。\n2. **加工・変換 (Transformation):** \n    - 重複を消す、型を揃える、個人情報を伏せる、計算して新しい項目を作るなど、データのクレンジングや名寄せなどの加工を行います。\n3. **保存 (Storage):** \n    - 綺麗になったデータを「データウェアハウス（DWH）」などの倉庫に溜めます。\n4. **活用 (Analysis/Visualization):** \n    - 分析ツール（BIツール）や機械学習モデルでデータを利用します。\n\n## データレイク、データウェアハウス、データマート\nデータパイプライン上で扱うデータ保管場所は、大きく分けて以下の３つに分類されます。\n\n1. **データレイク (Data Lake)**\n    - 形式を問わずあらゆるデータをそのままの形で保管する、大きな泉のような場所です。\n        - Excel、アプリケーションログ、画像ファイル、SNSの投稿など、将来データ分析に利用できる可能性のあるものを、非構造化、未整理の状態でため込んでおきます。\n2. **データウェアハウス (Data Warehouse / DWH)**\n    - データレイクから必要なデータを取り出し、計算や分析がしやすいように形を整えて保管する倉庫です。\n        - 重複を消したり、型を揃えたりして、加工して**構造化したデータ**を格納します。\n3. **データマート (Data Mart)**\n    - DWHの中から、特定の部署や目的（営業部用、マーケティング用など）に必要なデータだけを切り出した小規模な保管庫です。\n        - 特定の業務で使用するために、要約・加工しているため、データ量は比較的少なくなり、素早くデータを取り出すことができます。\n\n\n![Gemini_Generated_Image_5wh4yg5wh4yg5wh4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/8e33f0d7-9eda-401c-8184-1e521886288b.png)\n\nデータレイクには、S3やクラウドストレージなどのオブジェクトストレージが使われることが多いです。\n\nまた、DWHやデータマートには、BigQueryやAmazon Redshiftなどのカラムナー指向データベースが使われることが多いです。\n\n分析に利用するBIツールには、TableauやRedash、Looker Studioなどが用いられます。\n\n## ETL vs ELT\nデータパイプライン上で、データレイクからデータ抽出し、加工し、DWHに格納する際に、ETL/ELTツールが使われます。ETLとELTの違いは、データの加工（Transform）をどのタイミングで行うかです。\n\n主な相違点は以下の通りです。\n\n比較項目|ETL (Extract, Transform, Load)|ELT (Extract, Load, Transform)\n--|--|--\n加工のタイミング|DWHに格納する前に加工|DWHに格納した後に加工\n主なメリット|・DWH側の負荷が低い\u003cbr\u003e・データ保存容量を節約できる|・生データを残せるため再分析に強い\u003cbr\u003e・ロードが圧倒的に速い\n主なデメリット|・加工用の専用サーバーが必要\u003cbr\u003e・データ形式変更時の修正に時間がかかる|・大量の生データを保存するストレージが必要\u003cbr\u003e・加工時にDWHの計算コストがかかる\nデータの状態|加工済みのきれいなデータのみを保存|未加工（RAW）の状態でまず保存\n柔軟性|低い（事前に設計が必要）|高い（後からSQLで自由に加工可能）\n\n昔はストレージが高価で計算能力も低かったため、「必要な分だけ小さくして入れる（ETL）」がが正解でした。\n\nしかし、現在はクラウドの進化で「大量に安く保存でき、超高速で計算できる」ようになったため、「全部放り込んでから後で考える（ELT）」ほうが、ビジネスのスピードに合わせやすく、主流になってきました。\n\nまた、ELTでは、「データを運ぶツール（EL）」と「DWH内で加工するツール（T）」を組み合わせて使うのが一般的です。\n\n- データを運ぶツールの例\n    - [TROCCO](https://primenumber.com/trocco)（トロッコ）：日本発のSaaS型ツール。100種類以上のコネクタを使って、バラバラなデータをDWHへ運ぶ。\n- データを加工するツールの例\n    - [dbt](https://www.getdbt.com/) (data build tool)：SQLで加工処理を書くことができ、バージョン管理（Git）やテストを自動化できる。\n\nTROCCOでBigQueryに格納したデータをdbtで加工して、データマートに格納する事例もよく耳にします。\n\n## データ加工について\nデータレイクに溜まったデータを加工する方法として、代表的な処理は以下の通りです。\n\nSQLで加工したり、Pythonスクリプトや専用のツールを用いてデータを編集し、分析しやすい形式にしてDWHに登録します。\n\n項目|内容・定義|主な目的|具体例\n--|--|--|--\nクレンジング|データの誤記、重複、欠損、表記揺れを修正・削除する。|データの正確性を高め、分析のノイズを除去する。|「東京都」と「東京都 」（末尾スペース）を統一する。\n名寄せ|異なるシステムやDBにある「同一人物・企業」のデータを一つに統合する。|顧客の重複を排除し、正しい1顧客としての動きを把握する。|住所と電話番号が同じ「田中太郎」と「ﾀﾅｶ ﾀﾛｳ」を同一IDで紐付ける。\nフォーマット合わせ|日付、数値、単位などの形式を特定のルールに統一する。|システム連携をスムーズにし、計算可能な状態にする。|「2026/03/04」と「R8.3.4」を「2026-03-04」に統一する。\nマスキング|個人情報などの機密情報を、特定のルールで別の文字列に置き換える。|セキュリティを確保し、個人を特定せずに分析に利用する。|「yamada@example.com」を「y****@example.com」にする。\n\n## データマートの登録例\n前述の通り、データマートには特定の目的に合わせた形式にデータを加工して登録します。\n\n例えば、サービスの利用者数の増減を月毎にグラフで可視化したい要件があった場合、会員情報の入会年月日ごとに人数を集計して、ユーザー数推移用のスナップショットテーブルに登録します。\n\nこの例の場合だと、ユーザー数推移スナップショットには合計人数のみで、利用者の性別や年齢などの属性情報が欠落するため、データマート上のデータを利用しづらくなります。\n例）\nDWHのユーザー情報テーブル。集計元テーブル。\n\nユーザーID (user_id)|入会年月日 (joined_at)|性別 (gender)|年代 (age)|居住地 (pref)|ステータス (status)\n--|--|--|--|--|--\nU001|2026-01-05|男性|24|東京都|有効\nU002|2026-01-12|女性|29|大阪府|有効\nU003|2026-01-28|男性|31|福岡県|退会\nU004|2026-02-03|女性|22|東京都|有効\nU005|2026-02-15|男性|38|愛知県|有効\n\nユーザー情報テーブル年月ごとのユーザー数の推移を可視化するため、ステータスが有効なユーザー数だけを集計したデータマート。\n\n性別や年齢などの属性は落とされているため、F1層（20～34歳の女性）、M1層（20～34歳の男性）などの分析には不向き。\n\nログ月 (log_month)|ユーザー数 (user_count)\n--|--\n2026-01|2\n2026-02|2\n\n性別や年代の属性を残して、有効なユーザー数を集計したデータマート。\n\nログ月 (log_month)|性別 (gender)|年代 (age_group)|ユーザー数 (user_count)\n--|--|--|--\n2026-01|男性|20-34代|1\n2026-01|女性|20-34代|1\n2026-02|女性|20-34代|1\n2026-02|男性|35-49代|1\n\n## パイプラインの監視\n正確なデータ分析を行うためには、パイプラインを通してデータが正しくデータマートに登録されていることが前提です。\n\n- データの発生源である対向システムから、毎日定刻に届くはずのデータが届いていない\n- 対向システムの仕様変更で、送られてくるデータのフォーマットが変わって、DWHに正常に取り込みできない\n- 想定以上のデータ量が送られて、データマートに格納するまでに時間がかかり、データ分析者が利用開始する時刻までに間に合わない\n\nなど、何かしらの問題が発生して、データマートにデータが届かない事態になった場合に、迅速に復旧するためには、パイプラインの監視が必要です。\n\nエラーが発生した場合に、自動でリトライしたり、メールやSlackなどで担当者に通知する仕組みは、今どきのパイプライン用サービスには標準で組み込まれています。\n\n不正データ起因で発生したエラーについては、AIエージェントにデータ解析させて原因を取り除いて復旧させる方法もあるかもしれませんが、個人情報を含むデータをAIエージェントに読み込ませるのはセキュリティのリスクもあります。AIエージェントによる完全な自動復旧は課題も多いため、現時点では人間が判断する必要があります。\n\nパイプライン上でAIを使うの一案としては、データ型としては正常でも、突発的なスパイク値や、ノイズ、外れ値など、統計分析に影響があるデータをAIで摘出し、データアナリストに通知する仕組みがあれば、データの正確性を担保できるようになるでしょう。\n\n## Apache Airflow\nワークフロー・オーケストレータのAirflowは、Airbnb社が作ったOSSで、データパイプラインの運行を管理するツールとして利用され、AWSやGoogle Cloudでもマネージドサービスとして提供されています。\n### Airflowのアーキテクチャ\n![arch-diag-basic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/a4639fe2-6a58-4145-a13c-95a8d9bc217c.png)\n\n\u003cdetails\u003e\n\u003csummary\u003eDAG（Directed Acyclic Graph：有向非巡回グラフ）\u003c/summary\u003e\nDAGは、タスクの実行順序、依存関係を定義したもので、Pythonで記載されます。\n\n例えば、「タスクA→タスクB→タスクCの順で実行」のように、タスクの実行順を定義できるだけでなく、エラー時のリトライ数、リトライ間隔、DAGの実行スケジュールを定義できます。\n\n```python\n# DAG実行順の定義例\nstart \u003e\u003e [op-1, op-2] \u003e\u003e some-other-task \u003e\u003e [op-3, op-4] \u003e\u003e end\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWebserver\u003c/summary\u003e\n「具体的に何をするか」というタスクのテンプレートです。クラウドサービスやプログラミング言語ごとに「部品」が用意されています。以下に挙げる他にも、様々なオペレーターが用意されています。\n\n  **PythonOperator**\n  DAGから別ファイル、または、DAG内に直書きしたPythonスクリプトを呼び出す際に利用する。\n\n  ```python\n  # 1. 実行したい処理を「関数」として定義する\n  def my_python_function(name, **kwargs):\n      print(f\"こんにちは、{name}さん！\")\n      print(f\"今日の実行日付は {kwargs['ds']} です。\")\n      return \"処理完了\"\n\n  with DAG(\n      dag_id='example_python_operator',\n      start_date=datetime(2026, 3, 1),    # 2026-03-01 から起動する\n      schedule_interval='@daily',         # 日次バッチ\n      catchup=False                       # 過去に未実行だったスケジュールは実行しない\n  ) as dag:\n\n      # 2. PythonOperatorで関数を呼び出す\n      run_python_task = PythonOperator(\n          task_id='execute_logic',\n          python_callable=my_python_function,  # 実行する関数名を指定\n          op_kwargs={'name': 'データエンジニア'}, # 関数に渡す引数を辞書で指定\n      )\n  ```\n\n  **BashOperator**\n  DAGから別ファイルで定義したBashスクリプトを呼び出す際に利用する。\n\n  ```python\n    # 1. シンプルなコマンド\n    print_hello = BashOperator(\n        task_id='print_hello',\n        bash_command='echo \"Hello, Airflow! 実行日は {{ ds }} です\"'\n    )\n\n    # 2. 複数のコマンドを連続実行\n    # カレントディレクトリを確認し、ファイルを生成する\n    run_multi_commands = BashOperator(\n        task_id='run_multi_commands',\n        bash_command=\"\"\"\n            pwd \u0026\u0026 \\\n            ls -al \u0026\u0026 \\\n            echo \"作成完了\" \u003e /tmp/test_file.txt\n        \"\"\"\n    )\n  ```\n\n  **BigQueryExecuteQueryOperator**\n  DAGから別ファイル、または、DAG内に直書きしたSQLをBigQueryに対して発行する際に利用する。\n\n  ```python\n    # BigQueryでクエリを実行するタスク\n    run_query = BigQueryExecuteQueryOperator(\n        task_id='run_my_sql',\n        sql=\"\"\"\n            SELECT \n                user_id, \n                COUNT(*) as action_count\n            FROM `my_project.my_dataset.user_logs`\n            WHERE date = '{{ ds }}'\n            GROUP BY user_id\n        \"\"\",\n        use_legacy_sql=False,  # 標準SQLを使用\n        destination_dataset_table='my_project.my_dataset.summary_table', # 結果をテーブルに保存する場合\n        write_disposition='WRITE_TRUNCATE', # 上書き設定（他にはWRITE_APPENDなど）\n        gcp_conn_id='google_cloud_default'  # Airflowで設定した接続ID\n    )\n  ```\n  AirflowのDAG内で、Pythonスクリプトを使って複雑な処理を並行で行うと、マシンリソースを消費してメモリー不足になりタスクが異常終了したり、CPU100%になりタスクが反応しなくなりAirflowが該当タスクを強制終了させるため、パイプラインが不安定になります。\n\n  大量データの加工処理はDAGで実行するのではなく、BigQuery上でSQLを発行して実行することをお勧めします。\n\n  Airflowは、パイプラインの交通整理役であり、重い荷物を運ぶトラック役は外部の専門基盤に委譲し、タスクの開始と終了を見守る役に徹することが、安定的な運用につながります。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMetadata Database（メタデータDB）\u003c/summary\u003e\nAirflowの全情報を保存するデータベース（PostgreSQLやMySQL）です。\n\nDAGの定義、過去の実行結果（成功・失敗）、現在のタスクの状態、ユーザー設定、変数（Variables）などが保存されます。\n\nこれが壊れると、Airflowは「自分がいま何をすべきか」「過去に何をしたか」をすべて忘れてしまいます。\n\nメタデータDBへのデータ登録、更新はWebUIやスケジューラ、ワーカーが行います。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eScheduler（スケジューラ）\u003c/summary\u003e\nスケジューラはAirflowの司令塔であり、「Metadata DB（過去と現在の状態）」と「DAGファイル（未来の予定）」を常に突き合わせ続け、ギャップがあれば埋めるという動作を繰り返しています。\n\n「毎日深夜1:00に実行」などのスケジュールや、「タスクDとタスクEの終了を待って、タスクFを実行」などの実行指示を出します。\n\n実行条件が揃ったタスクをキューに登録し、メタデータDBを更新して実行待ち状態にします。なお、実行待ちになったタスクは、エクゼキュータが取り出し、ワーカーに処理を実行させます。ワーカーが実行中のタスクについて、スケジューラはハートビートを送り生死を監視します。タスクの生存が確認できなかった場合は、ゾンビタスクとして扱い、強制終了させてリトライさせます。\n\nその他、DAGの定義を定期的にチェックし、新規登録や変更があった場合はメタデータDBを更新します。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eExecutor（エグゼキュータ）\u003c/summary\u003e\nスケジューラに組み込まれている機能で、タスクの実行先ワーカーの振り分け役を担います。\n\n「自分の同じマシンの中で、サブプロセスとして動かそう」、「タスクをキューに投げて、遠くにいるWorkerたちに拾わせよう」、「タスクごとに、コンテナを新しく1個作ってそこで動かそう」などの判断を行います。\n\nスケジューラが「脳」、ワーカーが「体」であれば、エグゼキュータは脳と体を繋ぐ「神経」のような役割を果たします。\n\nGoogle Cloudの **Cloud Composer** を使うなら、内部では **KubernetesExecutor**（またはCeleryとK8sのハイブリッド）が動いており、ユーザーは「神経」の管理をあまり意識せずに済むようになっています。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWorker（ワーカー）\u003c/summary\u003e\nワーカーは、指示されたタスクを、指定された環境で実行し、結果を報告します。\n\nタスクに定義されているオペレーター（PythonOperator、BigQueryOperatorなど）を動かします。\n\nタスクの開始時、完了時（成功/失敗）に、その状態をMetadata DBに書き込みます。\n\nタスクがあまりに重く、ワーカーのマシンリソースを使い果たしてしまうと、ワーカー自身がフリーズしてしまうことがあります。\n\n「ワーカーがどこでどう動くか」は、どのExecutorを使うかで大きく変わります。\n\nExecutor|ワーカーの実体|特徴\n--|--|--\nLocalExecutor|スケジューラと同じマシン|1台のマシン内で、複数のPythonプロセスとして動く。小規模・開発向け。\nCeleryExecutor|独立したサーバー群|複数の専用サーバー（Workerノード）を常時立ち上げておく。中〜大規模向け。\nKubernetesExecutor|使い捨てのPod（コンテナ）|タスクが実行される時だけ、Kubernetes上に新しいコンテナが立ち上がり、終わると消える。モダンな標準。\n\n\u003c/details\u003e\n\n## ハンズオン\nDocker Compose で、以下のデータパイプラインを構築します。\n\n- データレイク：S3（MinIO）\n- DWH／データマート：PostgreSQL\n- データ分析ツール：Metabase\n- パイプラインの基盤：Airflow\n\n\u003cdetails\u003e\n\u003csummary\u003eプロジェクト構成\u003c/summary\u003e\n\n```\n  project/                           # データ分析 PoC プロジェクト\n  ├── README.md                      # プロジェクト説明\n  ├── docker-compose.yml             # Docker 構成（Airflow, DB, Metabase 等）\n  ├── pyproject.toml                 # Python プロジェクト設定\n  ├── .env / .env.example            # 環境変数\n  │\n  ├── dags/                          # Airflow DAG 定義\n  │   ├── etl_raw_to_dwh.py          #   Raw → DWH の ETL DAG\n  │   ├── etl_dwh_to_mart.py         #   DWH → Mart の ETL DAG\n  │   ├── transforms/                #   変換ロジック\n  │   │   ├── raw_to_dwh.py          #     Raw → DWH 変換\n  │   │   └── dwh_to_mart.py         #     DWH → Mart 変換（MRR集計等）\n  │   └── tests/                     #   ユニットテスト\n  │       ├── test_raw_to_dwh.py\n  │       └── test_dwh_to_mart.py\n  │\n  ├── db/                            # データベース初期化\n  │   └── init/\n  │       ├── 01_create_schemas.sql  #   スキーマ作成\n  │       ├── 02_create_tables.sql   #   テーブル作成\n  │       └── 001_seed.sql           #   シードデータ\n  │\n  ├── data/                          # サンプルデータ\n  │   ├── generate_sample.py         #   データ生成スクリプト\n  │   └── sample/\n  │       ├── users.csv\n  │       ├── subscriptions.csv\n  │       └── orders.csv\n  │\n  ├── metabase/                      # Metabase ダッシュボード定義\n  │   └── dashboards/\n  │       ├── revenue-dashboard.json #   MRR 分析ダッシュボード\n  │       └── churn-dashboard.json   #   解約分析ダッシュボード\n  │\n  └── scripts/                       # ユーティリティスクリプト\n       ├── init-s3.sh                #   S3 (MinIO) 初期化\n       ├── setup-metabase.py         #   Metabase セットアップ\n       └── setup-metabase.sh\n```\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003edocker-compose.yml\u003c/summary\u003e\n\n```yaml\n# データ分析基盤 PoC: Docker Compose 定義\n# 全サービスを docker compose up -d で起動可能\n# サービス起動順序: postgres → minio → data-init → airflow-init → airflow-* → metabase\n\nservices:\n  # === PostgreSQL（DWH/Mart/Airflow メタデータ DB）===\n  postgres:\n    image: postgres:16\n    container_name: poc-postgres\n    environment:\n      POSTGRES_USER: ${POSTGRES_USER:-analytics}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-analytics}\n      POSTGRES_DB: ${POSTGRES_DB:-analytics_db}\n    ports:\n      - \"5435:5432\"\n    volumes:\n      - postgres_data:/var/lib/postgresql/data\n      - ./db/init:/docker-entrypoint-initdb.d\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-analytics} -d ${POSTGRES_DB:-analytics_db}\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n\n  # === MinIO（S3 互換オブジェクトストレージ / データレイク）===\n  minio:\n    image: minio/minio:latest\n    container_name: poc-minio\n    environment:\n      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}\n      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}\n    ports:\n      - \"9000:9000\"\n      - \"9001:9001\"\n    volumes:\n      - minio_data:/data\n    command: server /data --console-address \":9001\"\n    healthcheck:\n      test: [\"CMD-SHELL\", \"mc ready local || exit 1\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n\n  # === data-init（S3 バケット作成 + サンプル CSV アップロード）===\n  data-init:\n    image: amazon/aws-cli:latest\n    container_name: poc-data-init\n    depends_on:\n      minio:\n        condition: service_healthy\n      postgres:\n        condition: service_healthy\n    environment:\n      AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin}\n      AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin}\n      AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION:-ap-northeast-1}\n      S3_ENDPOINT_URL: http://minio:9000\n      S3_BUCKET_NAME: ${S3_BUCKET_NAME:-data-lake}\n    volumes:\n      - ./scripts/init-s3.sh:/scripts/init-s3.sh:ro\n      - ./data/sample:/data/sample:ro\n    entrypoint: [\"/bin/sh\", \"/scripts/init-s3.sh\"]\n    restart: \"no\"\n\n  # === Airflow 初期化（DB マイグレーション + 管理者ユーザー作成）===\n  airflow-init:\n    image: apache/airflow:2.9.3-python3.11\n    container_name: poc-airflow-init\n    depends_on:\n      postgres:\n        condition: service_healthy\n    environment:\n      AIRFLOW__CORE__EXECUTOR: LocalExecutor\n      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\n      AIRFLOW__CORE__DAGS_FOLDER: /opt/airflow/dags\n      AIRFLOW__CORE__LOAD_EXAMPLES: \"False\"\n      _AIRFLOW_DB_MIGRATE: \"true\"\n      _AIRFLOW_WWW_USER_CREATE: \"true\"\n      _AIRFLOW_WWW_USER_USERNAME: ${AIRFLOW_ADMIN_USER:-airflow}\n      _AIRFLOW_WWW_USER_PASSWORD: ${AIRFLOW_ADMIN_PASSWORD:-airflow}\n    entrypoint: /bin/bash\n    command:\n      - -c\n      - |\n        airflow db migrate\n        airflow users create \\\n          --username $${_AIRFLOW_WWW_USER_USERNAME} \\\n          --password $${_AIRFLOW_WWW_USER_PASSWORD} \\\n          --firstname Admin \\\n          --lastname User \\\n          --role Admin \\\n          --email admin@example.com || true\n        # Airflow Connection: MinIO S3\n        airflow connections delete aws_default 2\u003e/dev/null || true\n        airflow connections add aws_default \\\n          --conn-type aws \\\n          --conn-extra '{\"endpoint_url\": \"http://minio:9000\", \"aws_access_key_id\": \"minioadmin\", \"aws_secret_access_key\": \"minioadmin\", \"region_name\": \"ap-northeast-1\"}'\n        # Airflow Connection: PostgreSQL DWH\n        airflow connections delete postgres_dwh 2\u003e/dev/null || true\n        airflow connections add postgres_dwh \\\n          --conn-type postgres \\\n          --conn-host postgres \\\n          --conn-port 5432 \\\n          --conn-login $${POSTGRES_USER:-analytics} \\\n          --conn-password $${POSTGRES_PASSWORD:-analytics} \\\n          --conn-schema $${POSTGRES_DB:-analytics_db}\n        echo \"=== Airflow 初期化完了 ===\"\n    restart: \"no\"\n\n  # === Airflow Webserver（UI + REST API）===\n  airflow-webserver:\n    image: apache/airflow:2.9.3-python3.11\n    container_name: poc-airflow-webserver\n    depends_on:\n      airflow-init:\n        condition: service_completed_successfully\n    environment:\n      AIRFLOW__CORE__EXECUTOR: LocalExecutor\n      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\n      AIRFLOW__CORE__DAGS_FOLDER: /opt/airflow/dags\n      AIRFLOW__CORE__LOAD_EXAMPLES: \"False\"\n      AIRFLOW__API__AUTH_BACKENDS: airflow.api.auth.backend.basic_auth\n      AIRFLOW__WEBSERVER__EXPOSE_CONFIG: \"True\"\n      AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW_SECRET_KEY:-a1b2c3d4e5f6a1b2c3d4e5f6}\n      # DAG で使用する追加パッケージ\n      _PIP_ADDITIONAL_REQUIREMENTS: \"pandas\u003e=2.0 boto3\u003e=1.28 psycopg2-binary\u003e=2.9\"\n      # S3 接続用（DAG 内で boto3 直接使用時 → MinIO）\n      AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin}\n      AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin}\n      AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION:-ap-northeast-1}\n      S3_ENDPOINT_URL: http://minio:9000\n      S3_BUCKET_NAME: ${S3_BUCKET_NAME:-data-lake}\n      # DB 接続用（DAG 内で psycopg2 直接使用時）\n      POSTGRES_USER: ${POSTGRES_USER:-analytics}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-analytics}\n      POSTGRES_DB: ${POSTGRES_DB:-analytics_db}\n    ports:\n      - \"8081:8080\"\n    volumes:\n      - ./dags:/opt/airflow/dags\n    command: webserver\n    healthcheck:\n      test: [\"CMD-SHELL\", \"curl -f http://localhost:8080/health || exit 1\"]\n      interval: 10s\n      timeout: 10s\n      retries: 12\n      start_period: 30s\n\n  # === Airflow Scheduler（DAG スケジューリング・タスク実行）===\n  airflow-scheduler:\n    image: apache/airflow:2.9.3-python3.11\n    container_name: poc-airflow-scheduler\n    depends_on:\n      airflow-init:\n        condition: service_completed_successfully\n    environment:\n      AIRFLOW__CORE__EXECUTOR: LocalExecutor\n      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${POSTGRES_USER:-analytics}:${POSTGRES_PASSWORD:-analytics}@postgres:5432/${POSTGRES_DB:-analytics_db}\n      AIRFLOW__CORE__DAGS_FOLDER: /opt/airflow/dags\n      AIRFLOW__CORE__LOAD_EXAMPLES: \"False\"\n      AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW_SECRET_KEY:-a1b2c3d4e5f6a1b2c3d4e5f6}\n      # DAG で使用する追加パッケージ\n      _PIP_ADDITIONAL_REQUIREMENTS: \"pandas\u003e=2.0 boto3\u003e=1.28 psycopg2-binary\u003e=2.9\"\n      # S3 接続用（DAG 内で boto3 直接使用時 → MinIO）\n      AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin}\n      AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin}\n      AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION:-ap-northeast-1}\n      S3_ENDPOINT_URL: http://minio:9000\n      S3_BUCKET_NAME: ${S3_BUCKET_NAME:-data-lake}\n      # DB 接続用（DAG 内で psycopg2 直接使用時）\n      POSTGRES_USER: ${POSTGRES_USER:-analytics}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-analytics}\n      POSTGRES_DB: ${POSTGRES_DB:-analytics_db}\n    volumes:\n      - ./dags:/opt/airflow/dags\n    command: scheduler\n    healthcheck:\n      test: [\"CMD-SHELL\", \"airflow jobs check --job-type SchedulerJob --hostname $(hostname) || exit 1\"]\n      interval: 15s\n      timeout: 10s\n      retries: 5\n      start_period: 30s\n\n  # === Metabase（BI ダッシュボード）===\n  metabase:\n    image: metabase/metabase:latest\n    container_name: poc-metabase\n    depends_on:\n      postgres:\n        condition: service_healthy\n    environment:\n      MB_DB_TYPE: h2\n      MB_JETTY_PORT: 3000\n    ports:\n      - \"3000:3000\"\n    healthcheck:\n      test: [\"CMD-SHELL\", \"curl -f http://localhost:3000/api/health || exit 1\"]\n      interval: 10s\n      timeout: 10s\n      retries: 12\n      start_period: 30s\n\n  # === Metabase 初期化（データソース登録 + ダッシュボード自動作成）===\n  metabase-init:\n    image: python:3.11-slim\n    container_name: poc-metabase-init\n    depends_on:\n      metabase:\n        condition: service_healthy\n      postgres:\n        condition: service_healthy\n    environment:\n      METABASE_URL: http://metabase:3000\n      METABASE_ADMIN_EMAIL: ${METABASE_ADMIN_EMAIL:-admin@example.com}\n      METABASE_ADMIN_PASSWORD: ${METABASE_ADMIN_PASSWORD:-password}\n      DB_HOST: postgres\n      DB_PORT: \"5432\"\n      POSTGRES_DB: ${POSTGRES_DB:-analytics_db}\n      POSTGRES_USER: ${POSTGRES_USER:-analytics}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-analytics}\n    volumes:\n      - ./scripts/setup-metabase.py:/scripts/setup-metabase.py:ro\n    entrypoint: [\"python3\", \"/scripts/setup-metabase.py\"]\n    restart: \"no\"\n\nvolumes:\n  postgres_data:\n  minio_data:\n\n```\n\n\u003c/details\u003e\n\nDockerを起動して、各種コンテナを起動します。\n\n| サービス | 用途 | URL |\n|---|---|---|\n| MinIO S3 | データレイク（API: http://localhost:9000 / Console: http://localhost:9001） | http://localhost:9001 |\n| PostgreSQL | DWH / データマート | localhost:5435 |\n| Airflow | ETL オーケストレーション | http://localhost:8081 |\n| Metabase | BI ダッシュボード | http://localhost:3000 |\n\n\n```bash\n$ docker compose up -d\n[+] Running 9/9\n ✔ Network tun-202603_default       Created                                                   0.0s \n ✔ Container poc-minio              Healthy                                                   6.3s \n ✔ Container poc-postgres           Healthy                                                   7.2s \n ✔ Container poc-airflow-init       Exited                                                   43.5s \n ✔ Container poc-data-init          Started                                                   6.6s \n ✔ Container poc-metabase           Healthy                                                  48.5s \n ✔ Container poc-metabase-init      Started                                                  48.6s \n ✔ Container poc-airflow-webserver  Started                                                  43.6s \n ✔ Container poc-airflow-scheduler  Started \n```\n\n**MinIO**\n![スクリーンショット 2026-03-28 200756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/ed9a7847-d642-4b87-92a1-059febdea3ff.png)\n\n**Airflow**\n![スクリーンショット 2026-03-28 200844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/02d84690-a876-4be1-90c8-c52b001fb43d.png)\n\n**Metabase**\n![スクリーンショット 2026-03-28 200925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/7dc7bf07-9d1b-47a6-b748-b57d98f88690.png)\n\n\n### データソース→データレイク\n\nDockerコンテナ起動時にシェルスクリプトを実行し、AWS のAPIを使ってS3に以下のCSVファイルをアップロードします。\n\n- users.csv : ユーザーデータ\n- orders.csv : 注文データ\n- subscriptions.csv : 購読データ\n\n\u003cdetails\u003e\n\u003csummary\u003einit-s3.sh\u003c/summary\u003e\n\n```bash:scripts/init-s3.sh\n#!/bin/bash\n# MinIO S3 初期化スクリプト\n# バケット作成 + サンプル CSV アップロード（べき等）\n\nset -euo pipefail\n\nENDPOINT_URL=\"${S3_ENDPOINT_URL:-http://minio:9000}\"\nBUCKET_NAME=\"${S3_BUCKET_NAME:-data-lake}\"\nREGION=\"${AWS_DEFAULT_REGION:-ap-northeast-1}\"\nDATA_DIR=\"/data/sample\"\n\necho \"=== S3 初期化開始 ===\"\n\n# バケット作成（既存の場合はスキップ）\necho \"バケット作成: ${BUCKET_NAME}\"\naws --endpoint-url \"${ENDPOINT_URL}\" \\\n    s3 mb \"s3://${BUCKET_NAME}\" 2\u003e/dev/null || echo \"バケットは既に存在します\"\n\n# CSV アップロード\nfor file in \"${DATA_DIR}\"/*.csv; do\n    filename=$(basename \"${file}\")\n    echo \"アップロード: ${filename} → s3://${BUCKET_NAME}/raw/${filename}\"\n    aws --endpoint-url \"${ENDPOINT_URL}\" \\\n        --region \"${REGION}\" \\\n        s3 cp \"${file}\" \"s3://${BUCKET_NAME}/raw/${filename}\"\ndone\n\n# アップロード確認\necho \"\"\necho \"=== アップロード結果 ===\"\naws --endpoint-url \"${ENDPOINT_URL}\" \\\n    --region \"${REGION}\" \\\n    s3 ls \"s3://${BUCKET_NAME}/raw/\"\n\necho \"=== S3 初期化完了 ===\"\n```\n\n\u003c/details\u003e\n\nCSVがアップロードされたMinIOのバケットは以下の通りです。\n\n![スクリーンショット 2026-03-28 202138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/2e21bcbe-ecc5-4440-94c2-1553823548b3.png)\n\n### データレイク→DWH\n\nAirflowのDAGを使って、MinIOバケット上のCSVファイルをDWHにロードします。ロード前にデータのバリデーションチェックを行い、不正データを検出します。\n\n\u003cdetails\u003e\n\u003csummary\u003eetl_raw_to_dwh.py\u003c/summary\u003e\n\n```python:dags/etl_raw_to_dwh.py\n\"\"\"ETL DAG: S3 (raw) → DWH\n\nS3 から CSV を取得し、変換ロジックで DWH レコードに変換後、\nPostgreSQL の dwh スキーマに TRUNCATE + INSERT する。\n\"\"\"\n\nimport os\nfrom datetime import datetime\n\nimport boto3\nimport psycopg2\n\nfrom airflow import DAG\nfrom airflow.operators.python import PythonOperator\n\nfrom transforms.raw_to_dwh import (\n    parse_orders_csv,\n    parse_subscriptions_csv,\n    parse_users_csv,\n)\n\n# 環境変数から接続情報を取得\nS3_ENDPOINT_URL = os.environ.get(\"S3_ENDPOINT_URL\", \"http://minio:9000\")\nS3_BUCKET_NAME = os.environ.get(\"S3_BUCKET_NAME\", \"data-lake\")\nAWS_REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"ap-northeast-1\")\n\nDB_HOST = os.environ.get(\"DB_HOST\", \"postgres\")\nDB_PORT = os.environ.get(\"DB_PORT\", \"5432\")\nDB_NAME = os.environ.get(\"POSTGRES_DB\", \"analytics_db\")\nDB_USER = os.environ.get(\"POSTGRES_USER\", \"analytics\")\nDB_PASSWORD = os.environ.get(\"POSTGRES_PASSWORD\", \"analytics\")\n\n\ndef _get_s3_client():\n    \"\"\"MinIO S3 クライアントを取得する。\"\"\"\n    return boto3.client(\n        \"s3\",\n        endpoint_url=S3_ENDPOINT_URL,\n        aws_access_key_id=os.environ.get(\"AWS_ACCESS_KEY_ID\", \"minioadmin\"),\n        aws_secret_access_key=os.environ.get(\"AWS_SECRET_ACCESS_KEY\", \"minioadmin\"),\n        region_name=AWS_REGION,\n    )\n\n\ndef _get_db_conn():\n    \"\"\"PostgreSQL 接続を取得する。\"\"\"\n    return psycopg2.connect(\n        host=DB_HOST,\n        port=DB_PORT,\n        dbname=DB_NAME,\n        user=DB_USER,\n        password=DB_PASSWORD,\n    )\n\n\ndef _fetch_csv_from_s3(key: str) -\u003e str:\n    \"\"\"S3 から CSV テキストを取得する。\"\"\"\n    s3 = _get_s3_client()\n    response = s3.get_object(Bucket=S3_BUCKET_NAME, Key=key)\n    return response[\"Body\"].read().decode(\"utf-8\")\n\n\ndef load_users(**kwargs):\n    \"\"\"S3 から users.csv を取得し、dwh.users に TRUNCATE + INSERT する。\"\"\"\n    csv_text = _fetch_csv_from_s3(\"raw/users.csv\")\n    records = parse_users_csv(csv_text)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE dwh.users CASCADE\")\n            for r in records:\n                cur.execute(\n                    \"\"\"INSERT INTO dwh.users\n                       (user_id, name, plan, registered_at, churn_date, segment)\n                       VALUES (%s, %s, %s, %s, %s, %s)\"\"\",\n                    (r[\"user_id\"], r[\"name\"], r[\"plan\"],\n                     r[\"registered_at\"], r[\"churn_date\"], r[\"segment\"]),\n                )\n        conn.commit()\n        print(f\"dwh.users: {len(records)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\ndef load_orders(**kwargs):\n    \"\"\"S3 から orders.csv を取得し、dwh.orders に TRUNCATE + INSERT する。\"\"\"\n    csv_text = _fetch_csv_from_s3(\"raw/orders.csv\")\n    records = parse_orders_csv(csv_text)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE dwh.orders CASCADE\")\n            for r in records:\n                cur.execute(\n                    \"\"\"INSERT INTO dwh.orders\n                       (order_id, user_id, amount, category, ordered_at)\n                       VALUES (%s, %s, %s, %s, %s)\"\"\",\n                    (r[\"order_id\"], r[\"user_id\"], r[\"amount\"],\n                     r[\"category\"], r[\"ordered_at\"]),\n                )\n        conn.commit()\n        print(f\"dwh.orders: {len(records)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\ndef load_subscriptions(**kwargs):\n    \"\"\"S3 から subscriptions.csv を取得し、dwh.subscriptions に TRUNCATE + INSERT する。\"\"\"\n    csv_text = _fetch_csv_from_s3(\"raw/subscriptions.csv\")\n    records = parse_subscriptions_csv(csv_text)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE dwh.subscriptions CASCADE\")\n            for r in records:\n                cur.execute(\n                    \"\"\"INSERT INTO dwh.subscriptions\n                       (sub_id, user_id, plan, started_at, ended_at, monthly_fee)\n                       VALUES (%s, %s, %s, %s, %s, %s)\"\"\",\n                    (r[\"sub_id\"], r[\"user_id\"], r[\"plan\"],\n                     r[\"started_at\"], r[\"ended_at\"], r[\"monthly_fee\"]),\n                )\n        conn.commit()\n        print(f\"dwh.subscriptions: {len(records)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\n# DAG 定義\nwith DAG(\n    dag_id=\"etl_raw_to_dwh\",\n    description=\"S3 raw CSV → DWH テーブル（TRUNCATE + INSERT）\",\n    schedule=\"0 1 * * *\",\n    start_date=datetime(2026, 1, 1),\n    catchup=False,\n    tags=[\"etl\", \"raw-to-dwh\"],\n) as dag:\n\n    # users を先にロード（orders, subscriptions が FK 参照するため）\n    t_users = PythonOperator(\n        task_id=\"load_users\",\n        python_callable=load_users,\n    )\n\n    t_orders = PythonOperator(\n        task_id=\"load_orders\",\n        python_callable=load_orders,\n    )\n\n    t_subscriptions = PythonOperator(\n        task_id=\"load_subscriptions\",\n        python_callable=load_subscriptions,\n    )\n\n    # users → (orders, subscriptions) の順序依存\n    t_users \u003e\u003e [t_orders, t_subscriptions]\n\n```\n\n\u003c/details\u003e\n\nDAGのトグルスイッチをONにすると、DAGが実行開始します。\n\n![スクリーンショット 2026-03-28 202647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/29bc6bde-a452-4ef3-80a8-c4fb1185cbef.png)\n\nDAGが正常終了したら、PostgreSQLのdwhスキーマに定義したテーブルにCSVがロードされていることを確認しましょう。\n\n![スクリーンショット 2026-03-28 203203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/92c7cd89-a80e-48af-a869-582509b9d2f7.png)\n\n### DWH→データマート\n\nAirflowのDAGを使って、DWHのテーブルを集計して、データマートに登録します。\n\n\u003cdetails\u003e\n\u003csummary\u003eetl_dwh_to_mart.py\u003c/summary\u003e\n\n```python:dags/etl_dwh_to_mart.py\n\"\"\"ETL DAG: DWH → データマート\n\nDWH テーブルからデータを取得し、集計ロジックで変換後、\nmart スキーマに TRUNCATE + INSERT する。\n\"\"\"\n\nimport os\nfrom datetime import date, datetime\nfrom decimal import Decimal\n\nimport psycopg2\n\nfrom airflow import DAG\nfrom airflow.operators.python import PythonOperator\n\nfrom transforms.dwh_to_mart import calc_churn_summary, calc_mrr_summary, calc_revenue_summary\n\n# 環境変数から接続情報を取得\nDB_HOST = os.environ.get(\"DB_HOST\", \"postgres\")\nDB_PORT = os.environ.get(\"DB_PORT\", \"5432\")\nDB_NAME = os.environ.get(\"POSTGRES_DB\", \"analytics_db\")\nDB_USER = os.environ.get(\"POSTGRES_USER\", \"analytics\")\nDB_PASSWORD = os.environ.get(\"POSTGRES_PASSWORD\", \"analytics\")\n\n# 集計対象期間（2024-01 〜 2025-12 の 24 ヶ月）\nYEAR_MONTHS = [f\"{y:04d}-{m:02d}\" for y in range(2024, 2026) for m in range(1, 13)]\n\n\ndef _get_db_conn():\n    \"\"\"PostgreSQL 接続を取得する。\"\"\"\n    return psycopg2.connect(\n        host=DB_HOST,\n        port=DB_PORT,\n        dbname=DB_NAME,\n        user=DB_USER,\n        password=DB_PASSWORD,\n    )\n\n\ndef _fetch_users() -\u003e list[dict]:\n    \"\"\"dwh.users からレコードを取得する。\"\"\"\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\n                \"SELECT user_id, name, plan, registered_at, churn_date, segment FROM dwh.users\"\n            )\n            columns = [desc[0] for desc in cur.description]\n            return [dict(zip(columns, row)) for row in cur.fetchall()]\n    finally:\n        conn.close()\n\n\ndef _fetch_orders() -\u003e list[dict]:\n    \"\"\"dwh.orders からレコードを取得する。\"\"\"\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\n                \"SELECT order_id, user_id, amount, category, ordered_at FROM dwh.orders\"\n            )\n            columns = [desc[0] for desc in cur.description]\n            rows = []\n            for row in cur.fetchall():\n                record = dict(zip(columns, row))\n                # psycopg2 が返す amount を Decimal に変換\n                record[\"amount\"] = Decimal(str(record[\"amount\"]))\n                rows.append(record)\n            return rows\n    finally:\n        conn.close()\n\n\ndef _fetch_subscriptions() -\u003e list[dict]:\n    \"\"\"dwh.subscriptions からレコードを取得する。\"\"\"\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\n                \"SELECT sub_id, user_id, plan, started_at, ended_at, monthly_fee FROM dwh.subscriptions\"\n            )\n            columns = [desc[0] for desc in cur.description]\n            rows = []\n            for row in cur.fetchall():\n                record = dict(zip(columns, row))\n                record[\"monthly_fee\"] = Decimal(str(record[\"monthly_fee\"]))\n                rows.append(record)\n            return rows\n    finally:\n        conn.close()\n\n\ndef build_churn_summary(**kwargs):\n    \"\"\"チャーン率サマリーを計算し mart.churn_summary に格納する。\"\"\"\n    users = _fetch_users()\n    results = calc_churn_summary(users, YEAR_MONTHS)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE mart.churn_summary\")\n            for r in results:\n                cur.execute(\n                    \"\"\"INSERT INTO mart.churn_summary\n                       (year_month, plan, active_start, churned, churn_rate)\n                       VALUES (%s, %s, %s, %s, %s)\"\"\",\n                    (r[\"year_month\"], r[\"plan\"], r[\"active_start\"],\n                     r[\"churned\"], float(r[\"churn_rate\"])),\n                )\n        conn.commit()\n        print(f\"mart.churn_summary: {len(results)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\ndef build_revenue_summary(**kwargs):\n    \"\"\"売上サマリーを計算し mart.revenue_summary に格納する。\"\"\"\n    users = _fetch_users()\n    orders = _fetch_orders()\n    results = calc_revenue_summary(orders, users, YEAR_MONTHS)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE mart.revenue_summary\")\n            for r in results:\n                cur.execute(\n                    \"\"\"INSERT INTO mart.revenue_summary\n                       (year_month, plan, total_revenue, order_count)\n                       VALUES (%s, %s, %s, %s)\"\"\",\n                    (r[\"year_month\"], r[\"plan\"], float(r[\"total_revenue\"]),\n                     r[\"order_count\"]),\n                )\n        conn.commit()\n        print(f\"mart.revenue_summary: {len(results)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\ndef build_mrr_summary(**kwargs):\n    \"\"\"MRR サマリーを計算し mart.mrr_summary に格納する。\"\"\"\n    subscriptions = _fetch_subscriptions()\n    results = calc_mrr_summary(subscriptions, YEAR_MONTHS)\n\n    conn = _get_db_conn()\n    try:\n        with conn.cursor() as cur:\n            cur.execute(\"TRUNCATE TABLE mart.mrr_summary\")\n            for r in results:\n                cur.execute(\n                    \"\"\"INSERT INTO mart.mrr_summary\n                       (year_month, plan, active_subs, total_mrr, new_mrr, churned_mrr, net_new_mrr)\n                       VALUES (%s, %s, %s, %s, %s, %s, %s)\"\"\",\n                    (r[\"year_month\"], r[\"plan\"], r[\"active_subs\"],\n                     float(r[\"total_mrr\"]), float(r[\"new_mrr\"]),\n                     float(r[\"churned_mrr\"]), float(r[\"net_new_mrr\"])),\n                )\n        conn.commit()\n        print(f\"mart.mrr_summary: {len(results)} 件ロード完了\")\n    finally:\n        conn.close()\n\n\n# DAG 定義\nwith DAG(\n    dag_id=\"etl_dwh_to_mart\",\n    description=\"DWH → データマート（チャーン率・売上集計、TRUNCATE + INSERT）\",\n    schedule=\"0 2 * * *\",\n    start_date=datetime(2026, 1, 1),\n    catchup=False,\n    tags=[\"etl\", \"dwh-to-mart\"],\n) as dag:\n\n    t_churn = PythonOperator(\n        task_id=\"build_churn_summary\",\n        python_callable=build_churn_summary,\n    )\n\n    t_revenue = PythonOperator(\n        task_id=\"build_revenue_summary\",\n        python_callable=build_revenue_summary,\n    )\n\n    t_mrr = PythonOperator(\n        task_id=\"build_mrr_summary\",\n        python_callable=build_mrr_summary,\n    )\n\n    # チャーン・売上・MRR は独立して実行可能\n    [t_churn, t_revenue, t_mrr]\n\n```\n\n\u003c/details\u003e\n\nDAGを実行します。\n\n![スクリーンショット 2026-03-28 205715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/2946e0fa-d434-4d01-bea0-48aae333912b.png)\n\nDAGが正常終了したら、PostgreSQLのmartスキーマに定義したテーブルにCSVがロードされていることを確認しましょう。\n\n![スクリーンショット 2026-03-28 205944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/9be2fda0-ecdd-4653-8353-974a213cd619.png)\n\n### データマート→データ分析ツール\n\nデータマートのテーブルを、データ分析ツールのMetabase で読み込み、以下のダッシュボードを作成します。\n\n**チャーン率分析**\n\nhttp://localhost:3000/dashboard/2\n\n![スクリーンショット 2026-03-28 210240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/86cbf017-076f-4d0c-bcb0-49bd09c8094d.png)\n\n**売上分析**\n\nhttp://localhost:3000/dashboard/3\n\n![スクリーンショット 2026-03-28 210315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/b042b9cf-c7c1-49c1-a442-ff3ada944da2.png)\n\n**MRR分析**\n\nhttp://localhost:3000/dashboard/4\n\n![スクリーンショット 2026-03-28 210338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072121/10014908-47af-4a66-8ed0-f48d3a649e2f.png)\n\n\n# まとめ\n今回は、データ分析の裏側で動く“データパイプライン”の全体像と、その設計・運用を担うデータエンジニアの役割について、実践的な視点で解説しました。\n\nデータ分析は、正確でタイムリーなデータがあってこそ価値を生み出せます。\n\nつまり、分析の成果はパイプラインの品質に大きく依存します。データが正しく流れ、整い、蓄積され、活用されるまでの一連の仕組みを理解することは、分析者・エンジニア双方にとって重要です。\n\n自分の業務で扱っているデータが、どのような流れで届いているのかを一度棚卸ししてみると、どこにボトルネックがあるか、どこを自動化できるかが見えてくるでしょう。\n\n今回紹介したAirflowなどのツールを試しに触ってみて、パイプライン設計を体感してみてください。\n\n一緒にデータパイプラインについて学んでいきたいなど、ご興味を持たれた方は、[弊社ホームページ](https://www.tech-ult.com/contact-8)からお問い合わせいただければ幸いです。\n","coediting":false,"comments_count":0,"created_at":"2026-03-28T21:07:28+09:00","group":null,"id":"56b2c7d74b5790e7bc8f","likes_count":0,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"airflow","versions":[]}],"title":"作ってわかる、データ分析基盤のパイプライン構築方法","updated_at":"2026-03-28T21:07:28+09:00","url":"https://qiita.com/rharuki-tech-ult/items/56b2c7d74b5790e7bc8f","user":{"description":null,"facebook_id":null,"followees_count":6,"followers_count":1,"github_login_name":"rharuki-tech-ult","id":"rharuki-tech-ult","items_count":7,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":4072121,"profile_image_url":"https://avatars.githubusercontent.com/u/203510106?v=4","team_only":false,"twitter_screen_name":null,"website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"tech-ult","slide":false},{"rendered_body":"\u003cp data-sourcepos=\"1:1-2:33\"\u003eこんにちは、まつきです。\u003cbr\u003e\nTROCCOを利用しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"4:1-10:30\"\u003e今回は、\u003cbr\u003e\n\u003ca href=\"https://help.trocco.io/hc/ja/articles/4776634909214-%E5%85%83%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%A0%B4%E5%90%88-%E6%95%B0%E5%80%A4%E5%9E%8B%E3%81%A7%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B\" rel=\"nofollow noopener\" target=\"_blank\"\u003e元データの数値データがカンマ区切りのデータの場合、数値型で転送する方法はありますか\u003c/a\u003e\u003cbr\u003e\nこちらについて検証します。\u003cbr\u003e\n今回は\u003cbr\u003e\n転送元：BOX\u003cbr\u003e\n転送先：BigQuery\u003cbr\u003e\nとしたいと思います。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"12:1-12:22\"\u003e\n\u003cspan id=\"01-データ準備\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#01-%E3%83%87%E3%83%BC%E3%82%BF%E6%BA%96%E5%82%99\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e01. データ準備\u003c/h2\u003e\n\u003cp data-sourcepos=\"13:1-13:83\"\u003e以下のような列とデータを持つExcelファイルを作成しました。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"15:1-19:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e列1_文字列\t列2_数値\t列3_日付\nダミー\t1,234\t2025/12/1\nダミー\t1010\t2025/12/1\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"21:1-22:122\"\u003eこれをBOXに格納します。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Ff9cafb0b-86d3-4e8a-bf8e-1c3696cea95d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1d83700dd82c047c643134ded700034\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Ff9cafb0b-86d3-4e8a-bf8e-1c3696cea95d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1d83700dd82c047c643134ded700034\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Ff9cafb0b-86d3-4e8a-bf8e-1c3696cea95d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=f0ef142ac63c8e8133417ea813c35fc0 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f9cafb0b-86d3-4e8a-bf8e-1c3696cea95d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"24:1-24:22\"\u003e\n\u003cspan id=\"02-troccoの設定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#02-trocco%E3%81%AE%E8%A8%AD%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e02. TROCCOの設定\u003c/h2\u003e\n\u003cp data-sourcepos=\"25:1-25:54\"\u003eさて、手順に従って設定していきます。\u003c/p\u003e\n\u003cp data-sourcepos=\"27:1-27:113\"\u003e①STEP2データ設定タブ内「カラム定義」にて該当のカラムのデータ型をstring型に設定\u003c/p\u003e\n\u003cp data-sourcepos=\"29:1-29:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Fd4b9f018-eaad-4ba3-8a6e-806311e10947.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=41fb876311bf6684b150453e2acaa82c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Fd4b9f018-eaad-4ba3-8a6e-806311e10947.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=41fb876311bf6684b150453e2acaa82c\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2Fd4b9f018-eaad-4ba3-8a6e-806311e10947.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=9df1bfd43cbb64d1a5ef303604e7f705 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/d4b9f018-eaad-4ba3-8a6e-806311e10947.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"31:1-31:56\"\u003e「列2_数値」カラムをstring型としました。\u003c/p\u003e\n\u003cp data-sourcepos=\"33:1-35:54\"\u003e②データ設定タブ内「文字列 正規表現置換」にて該当のカラムからカンマを除去\u003cbr\u003e\na. 正規表現パターンに,を入力\u003cbr\u003e\nb. 置換させる文字列は空白で大丈夫です\u003c/p\u003e\n\u003cp data-sourcepos=\"37:1-37:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F3f9de650-8e60-49af-a1ab-ad2930661d16.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c5a480db3f578633a94e75bf8c3e405b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F3f9de650-8e60-49af-a1ab-ad2930661d16.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c5a480db3f578633a94e75bf8c3e405b\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F3f9de650-8e60-49af-a1ab-ad2930661d16.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b7cb897fd5b5284b6654d8c5390328af 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/3f9de650-8e60-49af-a1ab-ad2930661d16.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"39:1-39:65\"\u003e「列2_数値」カラムに対し設定を実施しました。\u003c/p\u003e\n\u003cp data-sourcepos=\"41:1-41:115\"\u003e③出力オプションタブ内「カラム設定」にて該当のカラムのデータ型をINTEGER型に設定\u003c/p\u003e\n\u003cp data-sourcepos=\"43:1-43:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F79b6309a-0bf3-47f5-a460-cf17319f90f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=092049b48eecaa1aa31b4512d7b1a402\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F79b6309a-0bf3-47f5-a460-cf17319f90f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=092049b48eecaa1aa31b4512d7b1a402\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F79b6309a-0bf3-47f5-a460-cf17319f90f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e47af690b6cfa26741f8e27937b35cf4 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/79b6309a-0bf3-47f5-a460-cf17319f90f2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"45:1-45:65\"\u003e「列2_数値」カラムに対し設定を実施しました。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"47:1-47:19\"\u003e\n\u003cspan id=\"03-実行結果\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#03-%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e03. 実行結果\u003c/h2\u003e\n\u003cp data-sourcepos=\"48:1-48:74\"\u003eBigQuery側のデータがどうなっているか見てみましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"50:1-50:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F6eea1243-b25b-4ca4-9d5e-9a4006e58363.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=e38e97d9908583865d59978c14f9d0ed\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F6eea1243-b25b-4ca4-9d5e-9a4006e58363.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=e38e97d9908583865d59978c14f9d0ed\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2731094%2F6eea1243-b25b-4ca4-9d5e-9a4006e58363.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=498f1a55142776c3bac49786378e75a9 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/6eea1243-b25b-4ca4-9d5e-9a4006e58363.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"52:1-52:42\"\u003eカンマが除去されていますね。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"54:1-54:12\"\u003e\n\u003cspan id=\"終わり\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%B5%82%E3%82%8F%E3%82%8A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e終わり\u003c/h2\u003e\n\u003cp data-sourcepos=\"56:1-58:51\"\u003e今回はTROCCOで数値データのカンマ（,）を削除する方法を検証しました。\u003cbr\u003e\n今後も検証記事を公開していく予定です。\u003cbr\u003e\n引き続きよろしくお願いいたします。\u003c/p\u003e\n","body":"こんにちは、まつきです。\nTROCCOを利用しています。\n\n今回は、\n[元データの数値データがカンマ区切りのデータの場合、数値型で転送する方法はありますか](https://help.trocco.io/hc/ja/articles/4776634909214-%E5%85%83%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%A0%B4%E5%90%88-%E6%95%B0%E5%80%A4%E5%9E%8B%E3%81%A7%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B)\nこちらについて検証します。\n今回は\n転送元：BOX\n転送先：BigQuery\nとしたいと思います。\n\n## 01. データ準備\n以下のような列とデータを持つExcelファイルを作成しました。\n\n```\n列1_文字列\t列2_数値\t列3_日付\nダミー\t1,234\t2025/12/1\nダミー\t1010\t2025/12/1\n```\n\nこれをBOXに格納します。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f9cafb0b-86d3-4e8a-bf8e-1c3696cea95d.png)\n\n## 02. TROCCOの設定\nさて、手順に従って設定していきます。\n\n①STEP2データ設定タブ内「カラム定義」にて該当のカラムのデータ型をstring型に設定\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/d4b9f018-eaad-4ba3-8a6e-806311e10947.png)\n\n「列2_数値」カラムをstring型としました。\n\n②データ設定タブ内「文字列 正規表現置換」にて該当のカラムからカンマを除去\na. 正規表現パターンに,を入力\nb. 置換させる文字列は空白で大丈夫です\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/3f9de650-8e60-49af-a1ab-ad2930661d16.png)\n\n「列2_数値」カラムに対し設定を実施しました。\n\n③出力オプションタブ内「カラム設定」にて該当のカラムのデータ型をINTEGER型に設定\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/79b6309a-0bf3-47f5-a460-cf17319f90f2.png)\n\n「列2_数値」カラムに対し設定を実施しました。\n\n## 03. 実行結果\nBigQuery側のデータがどうなっているか見てみましょう。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/6eea1243-b25b-4ca4-9d5e-9a4006e58363.png)\n\nカンマが除去されていますね。\n\n## 終わり\n\n今回はTROCCOで数値データのカンマ（,）を削除する方法を検証しました。\n今後も検証記事を公開していく予定です。\n引き続きよろしくお願いいたします。\n","coediting":false,"comments_count":0,"created_at":"2026-01-28T23:23:43+09:00","group":null,"id":"a313cb213b568bb1d877","likes_count":0,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"BigQuery","versions":[]},{"name":"trocco","versions":[]}],"title":"TROCCOで数値データのカンマ（,）を削除する","updated_at":"2026-01-28T23:23:43+09:00","url":"https://qiita.com/matsuki_work/items/a313cb213b568bb1d877","user":{"description":"データ利活用領域にいます。","facebook_id":"","followees_count":1,"followers_count":0,"github_login_name":null,"id":"matsuki_work","items_count":6,"linkedin_id":"","location":"東京","name":"まつき","organization":"","permanent_id":2731094,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/2731094/6ccd58c0cefa720d04960d3056c131186248317c/large.png?1740976239","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"zdh","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-4:126\"\u003eWebスクレイピングは、データ収集の実務において広く実践されている手法です。\u003cbr\u003e\n一方で、安定的に運用しようとすると以下のように問題が発生しがちなテーマでもあります。\u003c/p\u003e\n\u003cul data-sourcepos=\"6:1-10:0\"\u003e\n\u003cli data-sourcepos=\"6:1-6:80\"\u003e「サイトの構造が変わって、パース処理を全部書き直し」\u003c/li\u003e\n\u003cli data-sourcepos=\"7:1-7:65\"\u003e「Pythonの仮想環境が壊れて、動かなくなった」\u003c/li\u003e\n\u003cli data-sourcepos=\"8:1-8:66\"\u003e「定期実行のcronがいつの間にか止まっていた」\u003c/li\u003e\n\u003cli data-sourcepos=\"9:1-10:0\"\u003e「スクレイピング専用のインスタンスを管理するのが面倒」\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"11:1-11:160\"\u003eこうした運用負荷を軽減するアプローチとして、 \u003cstrong\u003eBigQuery Remote Functions × Playwright × TROCCO\u003c/strong\u003e の組み合わせを紹介します。\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-13:111\"\u003eこの構成を組んでみると、以下のようなシンプルな指示で運用が可能になります。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"15:1-22:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- スクレイピング対象のURLを登録\u003c/span\u003e\n\u003cspan class=\"k\"\u003eINSERT\u003c/span\u003e \u003cspan class=\"k\"\u003eINTO\u003c/span\u003e \u003cspan class=\"n\"\u003etargets\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eVALUES\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'https://books.toscrape.com/'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- SQLを実行すると、構造化されたJSONがテーブルに保存される\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003edata\u003c/span\u003e \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e-- → [{\"title\": \"A Light in the Attic\", \"price\": \"£51.77\", \"in_stock\": true}, ...]\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"24:1-24:143\"\u003eURLを登録してSQLを実行すると、ブラウザが起動し、HTMLが取得され、AIが構造化し、BigQueryに保存されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"26:1-26:170\"\u003e本記事では、この「SQLだけで運用が完結するAIスクレイピング基盤」の構築方法を、実際のコードとともに解説していきます。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"28:1-28:16\"\u003e\n\u003cspan id=\"対象読者\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AF%BE%E8%B1%A1%E8%AA%AD%E8%80%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e対象読者\u003c/h3\u003e\n\u003cul data-sourcepos=\"30:1-33:0\"\u003e\n\u003cli data-sourcepos=\"30:1-30:94\"\u003eBigQueryを利用しているデータエンジニア、アナリティクスエンジニア\u003c/li\u003e\n\u003cli data-sourcepos=\"31:1-31:62\"\u003eスクレイピングの保守に課題を感じている人\u003c/li\u003e\n\u003cli data-sourcepos=\"32:1-33:0\"\u003ePython環境の管理をしたくない、SQL中心で業務を回したい人\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"34:1-34:34\"\u003e\n\u003cspan id=\"この記事で学べること\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこの記事で学べること\u003c/h3\u003e\n\u003cul data-sourcepos=\"36:1-40:0\"\u003e\n\u003cli data-sourcepos=\"36:1-36:63\"\u003eBigQuery Remote Functionsを使ったCloud Run連携の実装\u003c/li\u003e\n\u003cli data-sourcepos=\"37:1-37:42\"\u003ePlaywrightによるスクレイピング\u003c/li\u003e\n\u003cli data-sourcepos=\"38:1-38:55\"\u003eGemini（ML.GENERATE_TEXT）を使ったHTML構造化\u003c/li\u003e\n\u003cli data-sourcepos=\"39:1-40:0\"\u003eTROCCOによるワークフロー自動化\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr data-sourcepos=\"41:1-42:0\"\u003e\n\u003ch1 data-sourcepos=\"43:1-43:29\"\u003e\n\u003cspan id=\"全体アーキテクチャ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%85%A8%E4%BD%93%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e全体アーキテクチャ\u003c/h1\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"45:1-69:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e┌─────────────────────────────────────────────────────────────────────────┐\n│                           データパイプライン                              │\n├─────────────────────────────────────────────────────────────────────────┤\n│                                                                         │\n│  ┌──────────┐    ┌──────────────┐    ┌────────────┐    ┌─────────────┐ │\n│  │  TROCCO  │───▶│   BigQuery   │───▶│  Cloud Run │───▶│ Target Site │ │\n│  │ (定期実行) │    │ (SQL実行)    │    │(Playwright)│    │  (HTML)     │ │\n│  └──────────┘    └──────────────┘    └────────────┘    └─────────────┘ │\n│       │                │                    │                 │        │\n│       │                │                    │                 │        │\n│       │                ▼                    ▼                 │        │\n│       │         ┌──────────────┐     ┌────────────┐          │        │\n│       │         │    Gemini    │◀────│    HTML    │◀─────────┘        │\n│       │         │  (構造化AI)   │     │  (生データ) │                   │\n│       │         └──────────────┘     └────────────┘                   │\n│       │                │                                              │\n│       │                ▼                                              │\n│       │         ┌──────────────┐                                      │\n│       └────────▶│  結果テーブル  │                                      │\n│                 │ (構造化JSON)  │                                      │\n│                 └──────────────┘                                      │\n│                                                                         │\n└─────────────────────────────────────────────────────────────────────────┘\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"71:1-71:37\"\u003e\n\u003cspan id=\"各コンポーネントの役割\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%90%84%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%BD%B9%E5%89%B2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e各コンポーネントの役割\u003c/h3\u003e\n\u003ctable data-sourcepos=\"73:1-78:64\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"73:1-73:34\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"73:2-73:24\"\u003eコンポーネント\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"73:26-73:33\"\u003e役割\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"75:1-75:101\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"75:2-75:13\"\u003e\u003cstrong\u003eTROCCO\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"75:15-75:100\"\u003eワークフローのスケジューリング、エラー監視、リトライ制御\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"76:1-76:94\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"76:2-76:15\"\u003e\u003cstrong\u003eBigQuery\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"76:17-76:93\"\u003eSQLによるオーケストレーション、Remote Functionの呼び出し\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"77:1-77:72\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"77:2-77:16\"\u003e\u003cstrong\u003eCloud Run\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"77:18-77:71\"\u003ePlaywrightによるヘッドレスブラウザ実行\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"78:1-78:64\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"78:2-78:13\"\u003e\u003cstrong\u003eGemini\u003c/strong\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"78:15-78:63\"\u003eHTMLからの情報抽出、構造化JSON生成\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"80:1-81:84\"\u003eCloud RunもGeminiも、BigQueryのSQL関数として呼び出す形にしています。\u003cbr\u003e\nTROCCOがそのSQLを定期実行し、エラー時には通知してくれます。\u003c/p\u003e\n\u003chr data-sourcepos=\"83:1-84:0\"\u003e\n\u003ch1 data-sourcepos=\"85:1-85:56\"\u003e\n\u003cspan id=\"実装ステップ1cloud-run-playwright-の準備\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E8%A3%85%E3%82%B9%E3%83%86%E3%83%83%E3%83%971cloud-run-playwright-%E3%81%AE%E6%BA%96%E5%82%99\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実装ステップ1：Cloud Run (Playwright) の準備\u003c/h1\u003e\n\u003cp data-sourcepos=\"87:1-87:78\"\u003eまずは、ブラウザを動かすCloud Runサービスを構築します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"89:1-89:19\"\u003e\n\u003cspan id=\"pythonコード\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#python%E3%82%B3%E3%83%BC%E3%83%89\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003ePythonコード\u003c/h3\u003e\n\u003cp data-sourcepos=\"91:1-91:190\"\u003eFastAPIとPlaywrightを組み合わせたWebスクレイピングサービスです。BigQuery Remote Functionsが要求するリクエスト/レスポンス形式に準拠しています。\u003c/p\u003e\n\u003cdetails\u003e\u003csummary\u003emain.py\u003c/summary\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"python\" data-sourcepos=\"95:1-158:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003e\nBigQuery Remote Functions用 Webスクレイピングサービス\n\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eAny\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003econtextlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003easynccontextmanager\u003c/span\u003e\n\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003epydantic\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\n\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003eplaywright.async_api\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003easync_playwright\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBrowser\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBrowser\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"bp\"\u003eNone\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eNone\u003c/span\u003e\n\n\u003cspan class=\"nd\"\u003e@asynccontextmanager\u003c/span\u003e\n\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003elifespan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eアプリケーション起動時にブラウザを初期化\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eglobal\u003c/span\u003e \u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eplaywright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"nf\"\u003easync_playwright\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eplaywright\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003elaunch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eheadless\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eyield\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eplaywright\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003estop\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nc\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elifespan\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003elifespan\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eBigQueryRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"n\"\u003erequestId\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecaller\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n    \u003cspan class=\"n\"\u003esessionUser\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecalls\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eAny\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eBigQueryResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ereplies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"bp\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eclean_html\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003escript/styleタグを除去してHTMLを軽量化\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003esub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026lt;script[^\u0026gt;]*\u0026gt;[\\s\\S]*?\u0026lt;/script\u0026gt;\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eflags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIGNORECASE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003esub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026lt;style[^\u0026gt;]*\u0026gt;[\\s\\S]*?\u0026lt;/style\u0026gt;\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eflags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIGNORECASE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003esub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e\\s+\u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"s\"\u003e \u003c/span\u003e\u003cspan class=\"sh\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003efetch_page\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eURLからHTMLを取得\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003ebrowser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003enew_page\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003egoto\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewait_until\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003enetworkidle\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e30000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nf\"\u003eclean_html\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efinally\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\n\u003cspan class=\"nd\"\u003e@app.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"s\"\u003e/\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBigQueryRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eBigQueryResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n    \u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\u003cspan class=\"s\"\u003eBigQueryからのリクエストを処理\u003c/span\u003e\u003cspan class=\"sh\"\u003e\"\"\"\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ereplies\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecalls\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n        \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"nf\"\u003efetch_page\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecall\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ereplies\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e[:\u003c/span\u003e\u003cspan class=\"mi\"\u003e500_000\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# トークン節約のため500KB制限\n\u003c/span\u003e        \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"nb\"\u003eException\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n            \u003cspan class=\"n\"\u003ereplies\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nc\"\u003eBigQueryResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereplies\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ereplies\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cp data-sourcepos=\"162:1-162:125\"\u003eURLを受け取り、Playwrightでページを取得し、HTMLを返すだけの単機能サービスになっています。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"164:1-164:20\"\u003e\n\u003cspan id=\"requirementstxt\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#requirementstxt\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003erequirements.txt\u003c/h3\u003e\n\u003cdetails\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"168:1-173:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003efastapi==0.109.0\nuvicorn==0.27.0\nplaywright==1.41.2\npydantic==2.5.3\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003ch3 data-sourcepos=\"177:1-177:14\"\u003e\n\u003cspan id=\"dockerfile\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#dockerfile\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eDockerfile\u003c/h3\u003e\n\u003cdetails\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"dockerfile\" data-sourcepos=\"181:1-198:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# Playwrightの公式イメージを使用（ブラウザ同梱）\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"s\"\u003e mcr.microsoft.com/playwright/python:v1.41.2-jammy\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"s\"\u003e /app\u003c/span\u003e\n\u003cspan class=\"k\"\u003eENV\u003c/span\u003e\u003cspan class=\"s\"\u003e PORT=8080\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e\u003cspan class=\"s\"\u003e requirements.txt .\u003c/span\u003e\n\u003cspan class=\"k\"\u003eRUN \u003c/span\u003epip \u003cspan class=\"nb\"\u003einstall\u003c/span\u003e \u003cspan class=\"nt\"\u003e--no-cache-dir\u003c/span\u003e \u003cspan class=\"nt\"\u003e-r\u003c/span\u003e requirements.txt\n\n\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e\u003cspan class=\"s\"\u003e main.py .\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# 非rootユーザーで実行（セキュリティ対策）\u003c/span\u003e\n\u003cspan class=\"k\"\u003eUSER\u003c/span\u003e\u003cspan class=\"s\"\u003e pwuser\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eEXPOSE\u003c/span\u003e\u003cspan class=\"s\"\u003e 8080\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCMD\u003c/span\u003e\u003cspan class=\"s\"\u003e [\"python\", \"main.py\"]\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003ch3 data-sourcepos=\"202:1-202:31\"\u003e\n\u003cspan id=\"cloud-runへのデプロイ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#cloud-run%E3%81%B8%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eCloud Runへのデプロイ\u003c/h3\u003e\n\u003cdetails\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"206:1-227:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# プロジェクトIDを設定\u003c/span\u003e\n\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"your-project-id\"\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eREGION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"asia-northeast1\"\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eSERVICE_NAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"bq-scraper\"\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# Container Registryにビルド＆プッシュ\u003c/span\u003e\ngcloud builds submit \u003cspan class=\"nt\"\u003e--tag\u003c/span\u003e gcr.io/\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e/\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eSERVICE_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# Cloud Runにデプロイ\u003c/span\u003e\ngcloud run deploy \u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eSERVICE_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--image\u003c/span\u003e gcr.io/\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e/\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eSERVICE_NAME\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--region\u003c/span\u003e \u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eREGION\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--platform\u003c/span\u003e managed \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--memory\u003c/span\u003e 2Gi \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--cpu\u003c/span\u003e 2 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--timeout\u003c/span\u003e 300 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--concurrency\u003c/span\u003e 10 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--min-instances\u003c/span\u003e 0 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--max-instances\u003c/span\u003e 5 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--no-allow-unauthenticated\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003chr data-sourcepos=\"231:1-232:0\"\u003e\n\u003ch1 data-sourcepos=\"233:1-233:57\"\u003e\n\u003cspan id=\"実装ステップ2bigquery-remote-functionの定義\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E8%A3%85%E3%82%B9%E3%83%86%E3%83%83%E3%83%972bigquery-remote-function%E3%81%AE%E5%AE%9A%E7%BE%A9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実装ステップ2：BigQuery Remote Functionの定義\u003c/h1\u003e\n\u003cp data-sourcepos=\"235:1-235:119\"\u003eCloud Runサービスができたら、BigQueryからそれを呼び出すためのRemote Functionを定義します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"237:1-237:44\"\u003e\n\u003cspan id=\"step-2-1cloud-resource接続の作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-2-1cloud-resource%E6%8E%A5%E7%B6%9A%E3%81%AE%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 2-1：CLOUD RESOURCE接続の作成\u003c/h3\u003e\n\u003cp data-sourcepos=\"239:1-239:80\"\u003eまず、BigQueryがCloud Runを呼び出すための接続を作成します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"241:1-247:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# 接続の作成\u003c/span\u003e\nbq mk \u003cspan class=\"nt\"\u003e--connection\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--connection_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eCLOUD_RESOURCE \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--location\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003easia-northeast1 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    scraper_connection\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"249:1-249:163\"\u003eGoogle Cloudコンソールから作成する場合は、「BigQuery」→「外部接続」→「接続を追加」から「Cloud Resource」を選択します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"251:1-251:60\"\u003e\n\u003cspan id=\"step-2-2サービスアカウントへの権限付与\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-2-2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E6%A8%A9%E9%99%90%E4%BB%98%E4%B8%8E\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 2-2：サービスアカウントへの権限付与\u003c/h3\u003e\n\u003cp data-sourcepos=\"253:1-253:117\"\u003e接続作成時に生成されるサービスアカウントに、Cloud Runを呼び出す権限を付与します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"255:1-266:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# 接続のサービスアカウントを取得\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eCONNECTION_SA\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e$(\u003c/span\u003ebq show \u003cspan class=\"nt\"\u003e--format\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ejson \u003cspan class=\"nt\"\u003e--connection\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e.asia-northeast1.scraper_connection \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    | jq \u003cspan class=\"nt\"\u003e-r\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.cloudResource.serviceAccountId'\u003c/span\u003e\u003cspan class=\"si\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# Cloud Run起動権限を付与\u003c/span\u003e\ngcloud run services add-iam-policy-binding bq-scraper \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--region\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003easia-northeast1 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--member\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"serviceAccount:\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCONNECTION_SA\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--role\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"roles/run.invoker\"\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"268:1-268:34\"\u003e\n\u003cspan id=\"step-2-3remote-function-ddl\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-2-3remote-function-ddl\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 2-3：Remote Function DDL\u003c/h3\u003e\n\u003cp data-sourcepos=\"270:1-270:72\"\u003eSQLからスクレイピングを呼び出す関数を定義します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"272:1-285:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- データセット作成（未作成の場合）\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eSCHEMA\u003c/span\u003e \u003cspan class=\"n\"\u003eIF\u003c/span\u003e \u003cspan class=\"k\"\u003eNOT\u003c/span\u003e \u003cspan class=\"k\"\u003eEXISTS\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eOPTIONS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'asia-northeast1'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- Remote Function定義\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e \u003cspan class=\"k\"\u003eFUNCTION\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.fetch_html`\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003eSTRING\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"k\"\u003eRETURNS\u003c/span\u003e \u003cspan class=\"n\"\u003eSTRING\u003c/span\u003e\n\u003cspan class=\"n\"\u003eREMOTE\u003c/span\u003e \u003cspan class=\"k\"\u003eWITH\u003c/span\u003e \u003cspan class=\"k\"\u003eCONNECTION\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.asia-northeast1.scraper_connection`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eOPTIONS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'https://bq-scraper-XXXXX-an.a.run.app'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003emax_batching_rows\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"287:1-287:27\"\u003e\n\u003cspan id=\"step-2-4動作確認\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-2-4%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 2-4：動作確認\u003c/h3\u003e\n\u003cp data-sourcepos=\"289:1-289:193\"\u003e\u003ca href=\"https://books.toscrape.com/\" rel=\"nofollow noopener\" target=\"_blank\"\u003ebooks.toscrape.com\u003c/a\u003e はスクレイピング練習用に公開されているサイトです（サイトに \"We love being scraped!\" と明記されています）\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"291:1-294:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 書籍サイトからHTMLを取得\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"n\"\u003escraping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efetch_html\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'https://books.toscrape.com/'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"296:1-296:107\"\u003eこれで、\u003cstrong\u003eSQLを実行するだけでWebページのHTMLが取得できる\u003c/strong\u003eようになりました。\u003c/p\u003e\n\u003chr data-sourcepos=\"298:1-299:0\"\u003e\n\u003ch1 data-sourcepos=\"300:1-300:66\"\u003e\n\u003cspan id=\"実装ステップ3geminiでの構造化とtroccoでの運用\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E8%A3%85%E3%82%B9%E3%83%86%E3%83%83%E3%83%973gemini%E3%81%A7%E3%81%AE%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%A8trocco%E3%81%A7%E3%81%AE%E9%81%8B%E7%94%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実装ステップ3：Geminiでの構造化とTROCCOでの運用\u003c/h1\u003e\n\u003cp data-sourcepos=\"302:1-302:114\"\u003eHTMLを取得できるようになったら、次はAIで構造化し、定期実行の仕組みを整えます。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"304:1-304:39\"\u003e\n\u003cspan id=\"step-3-1geminiモデルの登録\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-3-1gemini%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%99%BB%E9%8C%B2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 3-1：Geminiモデルの登録\u003c/h3\u003e\n\u003cp data-sourcepos=\"306:1-306:74\"\u003eBigQueryからGeminiを呼び出すためのモデルを登録します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"308:1-314:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# Vertex AI接続の作成\u003c/span\u003e\nbq mk \u003cspan class=\"nt\"\u003e--connection\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--connection_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eCLOUD_RESOURCE \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--location\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003easia-northeast1 \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    gemini_connection\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"316:1-316:97\"\u003e接続に紐づくサービスアカウントに、Vertex AI の利用権限を付与します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"318:1-328:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c\"\u003e# 接続のサービスアカウントを取得\u003c/span\u003e\n\u003cspan class=\"nv\"\u003eGEMINI_SA\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e$(\u003c/span\u003ebq show \u003cspan class=\"nt\"\u003e--format\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ejson \u003cspan class=\"nt\"\u003e--connection\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e.asia-northeast1.gemini_connection \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    | jq \u003cspan class=\"nt\"\u003e-r\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.cloudResource.serviceAccountId'\u003c/span\u003e\u003cspan class=\"si\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"c\"\u003e# Vertex AI 権限を付与\u003c/span\u003e\ngcloud projects add-iam-policy-binding \u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROJECT_ID\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--member\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"serviceAccount:\u003c/span\u003e\u003cspan class=\"k\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eGEMINI_SA\u003c/span\u003e\u003cspan class=\"k\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n    \u003cspan class=\"nt\"\u003e--role\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"roles/aiplatform.user\"\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"330:1-337:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- Geminiモデルの登録\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e \u003cspan class=\"n\"\u003eMODEL\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.gemini_model`\u003c/span\u003e\n\u003cspan class=\"n\"\u003eREMOTE\u003c/span\u003e \u003cspan class=\"k\"\u003eWITH\u003c/span\u003e \u003cspan class=\"k\"\u003eCONNECTION\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.asia-northeast1.gemini_connection`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eOPTIONS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"339:1-339:77\"\u003e\n\u003cspan id=\"step-3-2url--自然言語指示-から-構造化データへの変換\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-3-2url--%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E6%8C%87%E7%A4%BA-%E3%81%8B%E3%82%89-%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 3-2：URL + 自然言語指示 から 構造化データへの変換\u003c/h3\u003e\n\u003cp data-sourcepos=\"341:1-341:110\"\u003e\u003cstrong\u003eURLと「何を抽出したいか」を指定することで、構造化されたJSONが得られます\u003c/strong\u003e。\u003c/p\u003e\n\u003cp data-sourcepos=\"343:1-343:84\"\u003eまず、スクレイピング対象を管理するテーブルを作成します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"345:1-355:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- ターゲットURLを管理するテーブル\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eTABLE\u003c/span\u003e \u003cspan class=\"n\"\u003eIF\u003c/span\u003e \u003cspan class=\"k\"\u003eNOT\u003c/span\u003e \u003cspan class=\"k\"\u003eEXISTS\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.targets`\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003eSTRING\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- books.toscrape.com（スクレイピング練習用サイト）を使った例\u003c/span\u003e\n\u003cspan class=\"k\"\u003eINSERT\u003c/span\u003e \u003cspan class=\"k\"\u003eINTO\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.targets`\u003c/span\u003e \u003cspan class=\"k\"\u003eVALUES\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'https://books.toscrape.com/'\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'https://books.toscrape.com/catalogue/page-2.html'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"357:1-357:77\"\u003e次に、スクレイピングとAI構造化を実行するクエリです。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"359:1-404:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- スクレイピング → AI構造化 → 保存を1クエリで実行\u003c/span\u003e\n\u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e \u003cspan class=\"k\"\u003eTABLE\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.results`\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- Step 1: スクレイピング結果を確定\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWITH\u003c/span\u003e \u003cspan class=\"n\"\u003escraped\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003escraping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efetch_html\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.targets`\u003c/span\u003e\n\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- Step 2: Gemini で構造化\u003c/span\u003e\n\u003cspan class=\"n\"\u003eraw_results\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eCURRENT_TIMESTAMP\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003escraped_at\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eJSON_VALUE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eml_generate_text_result\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$.candidates[0].content.parts[0].text'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eraw_text\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003eML\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGENERATE_TEXT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eMODEL\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.gemini_model`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n        \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n            \u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n                \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                \u003cspan class=\"n\"\u003eCONCAT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n                    \u003cspan class=\"s1\"\u003e'以下のHTMLから情報を抽出し、JSON配列で出力してください。\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"s1\"\u003e'抽出項目: 書籍のタイトル（title）、価格（price）、在庫状況（in_stock）\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"s1\"\u003e'出力形式: [{\"title\": \"...\", \"price\": \"...\", \"in_stock\": true/false}]\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"s1\"\u003e'JSON以外は出力しないでください。\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n                    \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\n                \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eprompt\u003c/span\u003e\n            \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003escraped\u003c/span\u003e\n            \u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNOT\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e\n        \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n        \u003cspan class=\"n\"\u003eSTRUCT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003etemperature\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e65535\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003emax_output_tokens\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e-- Step 3: Markdownコードフェンスを除去してJSONパース\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003escraped_at\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eSAFE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePARSE_JSON\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eraw_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'```json'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"s1\"\u003e'```'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"k\"\u003edata\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003eraw_results\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"406:1-406:60\"\u003e実行すると、このような結果が得られます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"408:1-410:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003edata\u003c/span\u003e \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.results`\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ctable data-sourcepos=\"412:1-414:185\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"412:1-412:14\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"412:2-412:6\"\u003eurl\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"412:8-412:13\"\u003edata\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"414:1-414:185\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"414:2-414:30\"\u003e\u003ca href=\"https://books.toscrape.com/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://books.toscrape.com/\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"414:32-414:184\"\u003e\u003ccode\u003e[{\"title\": \"A Light in the Attic\", \"price\": \"£51.77\", \"in_stock\": true}, {\"title\": \"Tipping the Velvet\", \"price\": \"£53.74\", \"in_stock\": true}, ...]\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"416:1-416:195\"\u003eサイトのDOM構造などを意識せずとも、自然言語の指示によって解釈ができるため、Pythonに慣れていなくてもある程度の精度調整ができそうです。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"418:1-418:51\"\u003e\n\u003cspan id=\"step-3-3troccoでのワークフロー設定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#step-3-3trocco%E3%81%A7%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E8%A8%AD%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eStep 3-3：TROCCOでのワークフロー設定\u003c/h3\u003e\n\u003cp data-sourcepos=\"420:1-420:78\"\u003eTROCCOを使って、このSQLを定期実行し、エラー監視します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"422:1-431:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e[データ転送ジョブ: スクレイピング実行]\n        │\n        ▼\n[データチェック: 取得件数検証]\n        │\n        ├── 成功 → [完了通知]\n        │\n        └── 失敗 → [Slack通知] → [手動確認待ち]\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"433:1-433:28\"\u003e\u003cstrong\u003eTROCCOでの設定手順\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"435:1-435:44\"\u003e1. \u003cstrong\u003eデータマートジョブの作成\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"436:4-438:0\"\u003e\n\u003cli data-sourcepos=\"436:4-436:54\"\u003eサービス: BigQuery（自由記述モード）\u003c/li\u003e\n\u003cli data-sourcepos=\"437:4-438:0\"\u003e実行SQL: 上記のCREATE TABLE文から1行目を削除した、SELECT文\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"439:1-439:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F81049fb1-2d51-4ad2-82b5-c68af151fd54.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2b36befe983d523f8be0fecee9d311e4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F81049fb1-2d51-4ad2-82b5-c68af151fd54.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2b36befe983d523f8be0fecee9d311e4\" alt=\"スクリーンショット 2026-01-27 16.34.11.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F81049fb1-2d51-4ad2-82b5-c68af151fd54.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=9e7d00d5253a978a2c14da08a314c0d1 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/81049fb1-2d51-4ad2-82b5-c68af151fd54.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"441:1-441:35\"\u003e2. \u003cstrong\u003eワークフローの設定\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"442:4-443:0\"\u003e\n\u003cli data-sourcepos=\"442:4-443:0\"\u003eスケジュール: 毎日9:00 など（または必要な頻度）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"444:1-444:38\"\u003e3. \u003cstrong\u003eデータチェックの追加\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"445:1-455:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 取得件数が期待値を下回っていないかチェック\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003esuccess_count\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"nv\"\u003e`your-project.scraping.targets`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003etotal_count\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\n    \u003cspan class=\"nv\"\u003e`your-project.scraping.results`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e\n    \u003cspan class=\"n\"\u003escraped_at\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eTIMESTAMP_SUB\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eCURRENT_TIMESTAMP\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003eINTERVAL\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"k\"\u003eDAY\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eAND\u003c/span\u003e \u003cspan class=\"k\"\u003edata\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNOT\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"457:1-457:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fee7a2248-aa58-4e45-8629-1a9bcf18a39f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=53fa7051be1610f3552c68f15d0b5cbf\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fee7a2248-aa58-4e45-8629-1a9bcf18a39f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=53fa7051be1610f3552c68f15d0b5cbf\" alt=\"スクリーンショット 2026-01-27 16.53.34.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fee7a2248-aa58-4e45-8629-1a9bcf18a39f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b49abfa969526a6145e76db8c39275c2 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/ee7a2248-aa58-4e45-8629-1a9bcf18a39f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"459:1-459:20\"\u003e4. \u003cstrong\u003e通知設定\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"460:4-462:0\"\u003e\n\u003cli data-sourcepos=\"460:4-460:36\"\u003e成功時: Slackに完了通知\u003c/li\u003e\n\u003cli data-sourcepos=\"461:4-462:0\"\u003e失敗時: Slack + メールでアラート\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"463:1-463:117\"\u003eTROCCOを使うことで、GUI上でのスケジュール管理や履歴管理、通知管理などが可能です。\u003c/p\u003e\n\u003chr data-sourcepos=\"465:1-466:0\"\u003e\n\u003cdetails\u003e\u003csummary\u003e実践的なTips\u003c/summary\u003e\n\u003ch3 data-sourcepos=\"469:1-469:37\"\u003e\n\u003cspan id=\"tip-1htmlサイズの最適化\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#tip-1html%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTip 1：HTMLサイズの最適化\u003c/h3\u003e\n\u003cp data-sourcepos=\"471:1-471:96\"\u003eGeminiへの入力トークンを節約するため、必要な部分だけを抽出します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"473:1-480:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 特定のセクションだけを抽出するパターン\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eurl_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eREGEXP_EXTRACT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml_content\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u0026lt;main[^\u0026gt;]*\u0026gt;(.*?)\u0026lt;/main\u0026gt;'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003emain_content\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\n    \u003cspan class=\"n\"\u003escraped_results\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"482:1-482:39\"\u003e\n\u003cspan id=\"tip-2レート制限への対応\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#tip-2%E3%83%AC%E3%83%BC%E3%83%88%E5%88%B6%E9%99%90%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTip 2：レート制限への対応\u003c/h3\u003e\n\u003cp data-sourcepos=\"484:1-484:75\"\u003e大量のURLを処理する場合は、バッチ処理で分割します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"486:1-500:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 100件ずつ処理\u003c/span\u003e\n\u003cspan class=\"k\"\u003eDECLARE\u003c/span\u003e \u003cspan class=\"n\"\u003ebatch_size\u003c/span\u003e \u003cspan class=\"n\"\u003eINT64\u003c/span\u003e \u003cspan class=\"k\"\u003eDEFAULT\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eDECLARE\u003c/span\u003e \u003cspan class=\"k\"\u003eoffset\u003c/span\u003e \u003cspan class=\"n\"\u003eINT64\u003c/span\u003e \u003cspan class=\"k\"\u003eDEFAULT\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eWHILE\u003c/span\u003e \u003cspan class=\"k\"\u003eoffset\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003etarget_urls\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eDO\u003c/span\u003e\n    \u003cspan class=\"c1\"\u003e-- バッチ処理\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"k\"\u003eREPLACE\u003c/span\u003e \u003cspan class=\"k\"\u003eTABLE\u003c/span\u003e \u003cspan class=\"n\"\u003escraped_results_batch\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"p\"\u003e...\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003etarget_urls\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eLIMIT\u003c/span\u003e \u003cspan class=\"n\"\u003ebatch_size\u003c/span\u003e \u003cspan class=\"k\"\u003eOFFSET\u003c/span\u003e \u003cspan class=\"k\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n    \u003cspan class=\"k\"\u003eSET\u003c/span\u003e \u003cspan class=\"k\"\u003eoffset\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eoffset\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ebatch_size\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eEND\u003c/span\u003e \u003cspan class=\"n\"\u003eWHILE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"502:1-502:39\"\u003e\n\u003cspan id=\"tip-3エラーハンドリング\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#tip-3%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTip 3：エラーハンドリング\u003c/h3\u003e\n\u003cp data-sourcepos=\"504:1-504:69\"\u003eスクレイピング失敗時のフォールバック処理です。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"506:1-517:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n    \u003cspan class=\"n\"\u003eurl_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eCASE\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eWHEN\u003c/span\u003e \u003cspan class=\"n\"\u003ehtml_content\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e \u003cspan class=\"k\"\u003eTHEN\u003c/span\u003e \u003cspan class=\"s1\"\u003e'SCRAPE_FAILED'\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eWHEN\u003c/span\u003e \u003cspan class=\"n\"\u003estructured_data\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e \u003cspan class=\"k\"\u003eTHEN\u003c/span\u003e \u003cspan class=\"s1\"\u003e'PARSE_FAILED'\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eELSE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'SUCCESS'\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eEND\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003estructured_data\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\n    \u003cspan class=\"n\"\u003escraped_results\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003ch1 data-sourcepos=\"521:1-521:11\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h1\u003e\n\u003cp data-sourcepos=\"523:1-523:199\"\u003e本記事では、\u003cstrong\u003eBigQuery Remote Functions × Playwright × TROCCO\u003c/strong\u003eを組み合わせた「SQLだけで運用が完結するAIスクレイピング基盤」の構築方法を紹介しました。\u003c/p\u003e\n\u003cp data-sourcepos=\"525:1-525:96\"\u003e一度Pythonのサンプルコードをデプロイしておけば、SQLによる実行制御で\u003c/p\u003e\n\u003cul data-sourcepos=\"526:1-529:0\"\u003e\n\u003cli data-sourcepos=\"526:1-526:55\"\u003e① Remote Functionsによってブラウザを操り\u003c/li\u003e\n\u003cli data-sourcepos=\"527:1-527:48\"\u003e② Geminiによってテキストを理解し\u003c/li\u003e\n\u003cli data-sourcepos=\"528:1-529:0\"\u003e③ TROCCOによって運用が自動化されます\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"530:1-530:126\"\u003e既存のデータ基盤にスクレイピング処理を追加したい方などは、ぜひ検討してみてください。\u003c/p\u003e\n\u003chr data-sourcepos=\"532:1-533:0\"\u003e\n\u003ch2 data-sourcepos=\"534:1-534:18\"\u003e\n\u003cspan id=\"参考リンク\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e参考リンク\u003c/h2\u003e\n\u003cul data-sourcepos=\"536:1-540:124\"\u003e\n\u003cli data-sourcepos=\"536:1-536:111\"\u003e\u003ca href=\"https://cloud.google.com/bigquery/docs/remote-functions\" rel=\"nofollow noopener\" target=\"_blank\"\u003eBigQuery Remote Functions 公式ドキュメント\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"537:1-537:57\"\u003e\u003ca href=\"https://playwright.dev/python/\" rel=\"nofollow noopener\" target=\"_blank\"\u003ePlaywright Python API\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"538:1-538:46\"\u003e\u003ca href=\"https://trocco.io/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eTROCCO 公式サイト\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"539:1-539:102\"\u003e\u003ca href=\"https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini\" rel=\"nofollow noopener\" target=\"_blank\"\u003eVertex AI Gemini API\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"540:1-540:124\"\u003e\u003ca href=\"https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-text\" rel=\"nofollow noopener\" target=\"_blank\"\u003eBigQuery ML.GENERATE_TEXT\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","body":"# はじめに\n\nWebスクレイピングは、データ収集の実務において広く実践されている手法です。\n一方で、安定的に運用しようとすると以下のように問題が発生しがちなテーマでもあります。\n\n- 「サイトの構造が変わって、パース処理を全部書き直し」\n- 「Pythonの仮想環境が壊れて、動かなくなった」\n- 「定期実行のcronがいつの間にか止まっていた」\n- 「スクレイピング専用のインスタンスを管理するのが面倒」\n\nこうした運用負荷を軽減するアプローチとして、 **BigQuery Remote Functions × Playwright × TROCCO** の組み合わせを紹介します。\n\nこの構成を組んでみると、以下のようなシンプルな指示で運用が可能になります。\n\n```sql\n-- スクレイピング対象のURLを登録\nINSERT INTO targets (url) VALUES ('https://books.toscrape.com/');\n\n-- SQLを実行すると、構造化されたJSONがテーブルに保存される\nSELECT url, data FROM results;\n-- → [{\"title\": \"A Light in the Attic\", \"price\": \"£51.77\", \"in_stock\": true}, ...]\n```\n\nURLを登録してSQLを実行すると、ブラウザが起動し、HTMLが取得され、AIが構造化し、BigQueryに保存されます。\n\n本記事では、この「SQLだけで運用が完結するAIスクレイピング基盤」の構築方法を、実際のコードとともに解説していきます。\n\n### 対象読者\n\n- BigQueryを利用しているデータエンジニア、アナリティクスエンジニア\n- スクレイピングの保守に課題を感じている人\n- Python環境の管理をしたくない、SQL中心で業務を回したい人\n\n### この記事で学べること\n\n- BigQuery Remote Functionsを使ったCloud Run連携の実装\n- Playwrightによるスクレイピング\n- Gemini（ML.GENERATE_TEXT）を使ったHTML構造化\n- TROCCOによるワークフロー自動化\n\n---\n\n# 全体アーキテクチャ\n\n```\n┌─────────────────────────────────────────────────────────────────────────┐\n│                           データパイプライン                              │\n├─────────────────────────────────────────────────────────────────────────┤\n│                                                                         │\n│  ┌──────────┐    ┌──────────────┐    ┌────────────┐    ┌─────────────┐ │\n│  │  TROCCO  │───▶│   BigQuery   │───▶│  Cloud Run │───▶│ Target Site │ │\n│  │ (定期実行) │    │ (SQL実行)    │    │(Playwright)│    │  (HTML)     │ │\n│  └──────────┘    └──────────────┘    └────────────┘    └─────────────┘ │\n│       │                │                    │                 │        │\n│       │                │                    │                 │        │\n│       │                ▼                    ▼                 │        │\n│       │         ┌──────────────┐     ┌────────────┐          │        │\n│       │         │    Gemini    │◀────│    HTML    │◀─────────┘        │\n│       │         │  (構造化AI)   │     │  (生データ) │                   │\n│       │         └──────────────┘     └────────────┘                   │\n│       │                │                                              │\n│       │                ▼                                              │\n│       │         ┌──────────────┐                                      │\n│       └────────▶│  結果テーブル  │                                      │\n│                 │ (構造化JSON)  │                                      │\n│                 └──────────────┘                                      │\n│                                                                         │\n└─────────────────────────────────────────────────────────────────────────┘\n```\n\n### 各コンポーネントの役割\n\n| コンポーネント | 役割 |\n|:--------------|:------|\n| **TROCCO** | ワークフローのスケジューリング、エラー監視、リトライ制御 |\n| **BigQuery** | SQLによるオーケストレーション、Remote Functionの呼び出し |\n| **Cloud Run** | Playwrightによるヘッドレスブラウザ実行 |\n| **Gemini** | HTMLからの情報抽出、構造化JSON生成 |\n\nCloud RunもGeminiも、BigQueryのSQL関数として呼び出す形にしています。\nTROCCOがそのSQLを定期実行し、エラー時には通知してくれます。\n\n---\n\n# 実装ステップ1：Cloud Run (Playwright) の準備\n\nまずは、ブラウザを動かすCloud Runサービスを構築します。\n\n### Pythonコード\n\nFastAPIとPlaywrightを組み合わせたWebスクレイピングサービスです。BigQuery Remote Functionsが要求するリクエスト/レスポンス形式に準拠しています。\n\n\u003cdetails\u003e\u003csummary\u003emain.py\u003c/summary\u003e\n\n```python\n\"\"\"\nBigQuery Remote Functions用 Webスクレイピングサービス\n\"\"\"\nimport re\nfrom typing import Any\nfrom contextlib import asynccontextmanager\n\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel\nfrom playwright.async_api import async_playwright, Browser\n\nbrowser: Browser | None = None\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    \"\"\"アプリケーション起動時にブラウザを初期化\"\"\"\n    global browser\n    playwright = await async_playwright().start()\n    browser = await playwright.chromium.launch(headless=True)\n    yield\n    if browser:\n        await browser.close()\n    await playwright.stop()\n\napp = FastAPI(lifespan=lifespan)\n\nclass BigQueryRequest(BaseModel):\n    requestId: str\n    caller: str\n    sessionUser: str\n    calls: list[list[Any]]\n\nclass BigQueryResponse(BaseModel):\n    replies: list[str | None]\n\ndef clean_html(html: str) -\u003e str:\n    \"\"\"script/styleタグを除去してHTMLを軽量化\"\"\"\n    html = re.sub(r'\u003cscript[^\u003e]*\u003e[\\s\\S]*?\u003c/script\u003e', '', html, flags=re.IGNORECASE)\n    html = re.sub(r'\u003cstyle[^\u003e]*\u003e[\\s\\S]*?\u003c/style\u003e', '', html, flags=re.IGNORECASE)\n    html = re.sub(r'\\s+', ' ', html)\n    return html.strip()\n\nasync def fetch_page(url: str) -\u003e str:\n    \"\"\"URLからHTMLを取得\"\"\"\n    page = await browser.new_page()\n    try:\n        await page.goto(url, wait_until=\"networkidle\", timeout=30000)\n        return clean_html(await page.content())\n    finally:\n        await page.close()\n\n@app.post(\"/\")\nasync def handle(request: BigQueryRequest) -\u003e BigQueryResponse:\n    \"\"\"BigQueryからのリクエストを処理\"\"\"\n    replies = []\n    for call in request.calls:\n        try:\n            html = await fetch_page(call[0])\n            replies.append(html[:500_000])  # トークン節約のため500KB制限\n        except Exception:\n            replies.append(None)\n    return BigQueryResponse(replies=replies)\n```\n\n\u003c/details\u003e\n\nURLを受け取り、Playwrightでページを取得し、HTMLを返すだけの単機能サービスになっています。\n\n### requirements.txt\n\n\u003cdetails\u003e\n\n```\nfastapi==0.109.0\nuvicorn==0.27.0\nplaywright==1.41.2\npydantic==2.5.3\n```\n\n\u003c/details\u003e\n\n### Dockerfile\n\n\u003cdetails\u003e\n\n```dockerfile\n# Playwrightの公式イメージを使用（ブラウザ同梱）\nFROM mcr.microsoft.com/playwright/python:v1.41.2-jammy\n\nWORKDIR /app\nENV PORT=8080\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY main.py .\n\n# 非rootユーザーで実行（セキュリティ対策）\nUSER pwuser\n\nEXPOSE 8080\nCMD [\"python\", \"main.py\"]\n```\n\n\u003c/details\u003e\n\n### Cloud Runへのデプロイ\n\n\u003cdetails\u003e\n\n```bash\n# プロジェクトIDを設定\nPROJECT_ID=\"your-project-id\"\nREGION=\"asia-northeast1\"\nSERVICE_NAME=\"bq-scraper\"\n\n# Container Registryにビルド＆プッシュ\ngcloud builds submit --tag gcr.io/${PROJECT_ID}/${SERVICE_NAME}\n\n# Cloud Runにデプロイ\ngcloud run deploy ${SERVICE_NAME} \\\n    --image gcr.io/${PROJECT_ID}/${SERVICE_NAME} \\\n    --region ${REGION} \\\n    --platform managed \\\n    --memory 2Gi \\\n    --cpu 2 \\\n    --timeout 300 \\\n    --concurrency 10 \\\n    --min-instances 0 \\\n    --max-instances 5 \\\n    --no-allow-unauthenticated\n```\n\n\u003c/details\u003e\n\n---\n\n# 実装ステップ2：BigQuery Remote Functionの定義\n\nCloud Runサービスができたら、BigQueryからそれを呼び出すためのRemote Functionを定義します。\n\n### Step 2-1：CLOUD RESOURCE接続の作成\n\nまず、BigQueryがCloud Runを呼び出すための接続を作成します。\n\n```bash\n# 接続の作成\nbq mk --connection \\\n    --connection_type=CLOUD_RESOURCE \\\n    --location=asia-northeast1 \\\n    scraper_connection\n```\n\nGoogle Cloudコンソールから作成する場合は、「BigQuery」→「外部接続」→「接続を追加」から「Cloud Resource」を選択します。\n\n### Step 2-2：サービスアカウントへの権限付与\n\n接続作成時に生成されるサービスアカウントに、Cloud Runを呼び出す権限を付与します。\n\n```bash\n# 接続のサービスアカウントを取得\nCONNECTION_SA=$(bq show --format=json --connection \\\n    ${PROJECT_ID}.asia-northeast1.scraper_connection \\\n    | jq -r '.cloudResource.serviceAccountId')\n\n# Cloud Run起動権限を付与\ngcloud run services add-iam-policy-binding bq-scraper \\\n    --region=asia-northeast1 \\\n    --member=\"serviceAccount:${CONNECTION_SA}\" \\\n    --role=\"roles/run.invoker\"\n```\n\n### Step 2-3：Remote Function DDL\n\nSQLからスクレイピングを呼び出す関数を定義します。\n\n```sql\n-- データセット作成（未作成の場合）\nCREATE SCHEMA IF NOT EXISTS `your-project.scraping`\nOPTIONS (location = 'asia-northeast1');\n\n-- Remote Function定義\nCREATE OR REPLACE FUNCTION `your-project.scraping.fetch_html`(url STRING)\nRETURNS STRING\nREMOTE WITH CONNECTION `your-project.asia-northeast1.scraper_connection`\nOPTIONS (\n    endpoint = 'https://bq-scraper-XXXXX-an.a.run.app',\n    max_batching_rows = 10\n);\n```\n\n### Step 2-4：動作確認\n\n[books.toscrape.com](https://books.toscrape.com/) はスクレイピング練習用に公開されているサイトです（サイトに \"We love being scraped!\" と明記されています）\n\n```sql\n-- 書籍サイトからHTMLを取得\nSELECT scraping.fetch_html('https://books.toscrape.com/') AS html;\n```\n\nこれで、**SQLを実行するだけでWebページのHTMLが取得できる**ようになりました。\n\n---\n\n# 実装ステップ3：Geminiでの構造化とTROCCOでの運用\n\nHTMLを取得できるようになったら、次はAIで構造化し、定期実行の仕組みを整えます。\n\n### Step 3-1：Geminiモデルの登録\n\nBigQueryからGeminiを呼び出すためのモデルを登録します。\n\n```bash\n# Vertex AI接続の作成\nbq mk --connection \\\n    --connection_type=CLOUD_RESOURCE \\\n    --location=asia-northeast1 \\\n    gemini_connection\n```\n\n接続に紐づくサービスアカウントに、Vertex AI の利用権限を付与します。\n\n```bash\n# 接続のサービスアカウントを取得\nGEMINI_SA=$(bq show --format=json --connection \\\n    ${PROJECT_ID}.asia-northeast1.gemini_connection \\\n    | jq -r '.cloudResource.serviceAccountId')\n\n# Vertex AI 権限を付与\ngcloud projects add-iam-policy-binding ${PROJECT_ID} \\\n    --member=\"serviceAccount:${GEMINI_SA}\" \\\n    --role=\"roles/aiplatform.user\"\n```\n\n```sql\n-- Geminiモデルの登録\nCREATE OR REPLACE MODEL `your-project.scraping.gemini_model`\nREMOTE WITH CONNECTION `your-project.asia-northeast1.gemini_connection`\nOPTIONS (\n    endpoint = 'gemini-2.5-flash'\n);\n```\n\n### Step 3-2：URL + 自然言語指示 から 構造化データへの変換\n\n**URLと「何を抽出したいか」を指定することで、構造化されたJSONが得られます**。\n\nまず、スクレイピング対象を管理するテーブルを作成します。\n\n```sql\n-- ターゲットURLを管理するテーブル\nCREATE TABLE IF NOT EXISTS `your-project.scraping.targets` (\n    url STRING\n);\n\n-- books.toscrape.com（スクレイピング練習用サイト）を使った例\nINSERT INTO `your-project.scraping.targets` VALUES\n    ('https://books.toscrape.com/'),\n    ('https://books.toscrape.com/catalogue/page-2.html');\n```\n\n次に、スクレイピングとAI構造化を実行するクエリです。\n\n```sql\n-- スクレイピング → AI構造化 → 保存を1クエリで実行\nCREATE OR REPLACE TABLE `your-project.scraping.results` AS\n\n-- Step 1: スクレイピング結果を確定\nWITH scraped AS (\n    SELECT\n        url,\n        scraping.fetch_html(url) AS html\n    FROM `your-project.scraping.targets`\n),\n\n-- Step 2: Gemini で構造化\nraw_results AS (\n    SELECT\n        url,\n        CURRENT_TIMESTAMP() AS scraped_at,\n        JSON_VALUE(ml_generate_text_result, '$.candidates[0].content.parts[0].text') AS raw_text\n    FROM ML.GENERATE_TEXT(\n        MODEL `your-project.scraping.gemini_model`,\n        (\n            SELECT\n                url,\n                CONCAT(\n                    '以下のHTMLから情報を抽出し、JSON配列で出力してください。\\n',\n                    '抽出項目: 書籍のタイトル（title）、価格（price）、在庫状況（in_stock）\\n',\n                    '出力形式: [{\"title\": \"...\", \"price\": \"...\", \"in_stock\": true/false}]\\n',\n                    'JSON以外は出力しないでください。\\n\\n',\n                    html\n                ) AS prompt\n            FROM scraped\n            WHERE html IS NOT NULL\n        ),\n        STRUCT(0.1 AS temperature, 65535 AS max_output_tokens)\n    )\n)\n\n-- Step 3: Markdownコードフェンスを除去してJSONパース\nSELECT\n    url,\n    scraped_at,\n    SAFE.PARSE_JSON(\n        TRIM(REPLACE(REPLACE(raw_text, '```json', ''), '```', ''))\n    ) AS data\nFROM raw_results;\n```\n\n実行すると、このような結果が得られます。\n\n```sql\nSELECT url, data FROM `your-project.scraping.results`;\n```\n\n| url | data |\n|:----|:-----|\n| https://books.toscrape.com/ | `[{\"title\": \"A Light in the Attic\", \"price\": \"£51.77\", \"in_stock\": true}, {\"title\": \"Tipping the Velvet\", \"price\": \"£53.74\", \"in_stock\": true}, ...]` |\n\nサイトのDOM構造などを意識せずとも、自然言語の指示によって解釈ができるため、Pythonに慣れていなくてもある程度の精度調整ができそうです。\n\n### Step 3-3：TROCCOでのワークフロー設定\n\nTROCCOを使って、このSQLを定期実行し、エラー監視します。\n\n```\n[データ転送ジョブ: スクレイピング実行]\n        │\n        ▼\n[データチェック: 取得件数検証]\n        │\n        ├── 成功 → [完了通知]\n        │\n        └── 失敗 → [Slack通知] → [手動確認待ち]\n```\n\n**TROCCOでの設定手順**\n\n1\\. **データマートジョブの作成**\n   - サービス: BigQuery（自由記述モード）\n   - 実行SQL: 上記のCREATE TABLE文から1行目を削除した、SELECT文\n\n![スクリーンショット 2026-01-27 16.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/81049fb1-2d51-4ad2-82b5-c68af151fd54.png)\n\n2\\. **ワークフローの設定**\n   - スケジュール: 毎日9:00 など（または必要な頻度）\n\n3\\. **データチェックの追加**\n```sql\n-- 取得件数が期待値を下回っていないかチェック\nSELECT\n    COUNT(*) AS success_count,\n    (SELECT COUNT(*) FROM `your-project.scraping.targets`) AS total_count\nFROM\n    `your-project.scraping.results`\nWHERE\n    scraped_at \u003e TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)\n    AND data IS NOT NULL\n```\n\n![スクリーンショット 2026-01-27 16.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/ee7a2248-aa58-4e45-8629-1a9bcf18a39f.png)\n\n4\\. **通知設定**\n   - 成功時: Slackに完了通知\n   - 失敗時: Slack + メールでアラート\n\nTROCCOを使うことで、GUI上でのスケジュール管理や履歴管理、通知管理などが可能です。\n\n---\n\n\u003cdetails\u003e\u003csummary\u003e実践的なTips\u003c/summary\u003e\n\n### Tip 1：HTMLサイズの最適化\n\nGeminiへの入力トークンを節約するため、必要な部分だけを抽出します。\n\n```sql\n-- 特定のセクションだけを抽出するパターン\nSELECT\n    url_id,\n    REGEXP_EXTRACT(html_content, r'\u003cmain[^\u003e]*\u003e(.*?)\u003c/main\u003e') AS main_content\nFROM\n    scraped_results;\n```\n\n### Tip 2：レート制限への対応\n\n大量のURLを処理する場合は、バッチ処理で分割します。\n\n```sql\n-- 100件ずつ処理\nDECLARE batch_size INT64 DEFAULT 100;\nDECLARE offset INT64 DEFAULT 0;\n\nWHILE offset \u003c (SELECT COUNT(*) FROM target_urls) DO\n    -- バッチ処理\n    CREATE OR REPLACE TABLE scraped_results_batch AS\n    SELECT ...\n    FROM target_urls\n    LIMIT batch_size OFFSET offset;\n\n    SET offset = offset + batch_size;\nEND WHILE;\n```\n\n### Tip 3：エラーハンドリング\n\nスクレイピング失敗時のフォールバック処理です。\n\n```sql\nSELECT\n    url_id,\n    CASE\n        WHEN html_content IS NULL THEN 'SCRAPE_FAILED'\n        WHEN structured_data IS NULL THEN 'PARSE_FAILED'\n        ELSE 'SUCCESS'\n    END AS status,\n    structured_data\nFROM\n    scraped_results;\n```\n\n\u003c/details\u003e\n\n# まとめ\n\n本記事では、**BigQuery Remote Functions × Playwright × TROCCO**を組み合わせた「SQLだけで運用が完結するAIスクレイピング基盤」の構築方法を紹介しました。\n\n一度Pythonのサンプルコードをデプロイしておけば、SQLによる実行制御で\n* ① Remote Functionsによってブラウザを操り\n* ② Geminiによってテキストを理解し\n* ③ TROCCOによって運用が自動化されます\n\n既存のデータ基盤にスクレイピング処理を追加したい方などは、ぜひ検討してみてください。\n\n---\n\n## 参考リンク\n\n- [BigQuery Remote Functions 公式ドキュメント](https://cloud.google.com/bigquery/docs/remote-functions)\n- [Playwright Python API](https://playwright.dev/python/)\n- [TROCCO 公式サイト](https://trocco.io/)\n- [Vertex AI Gemini API](https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini)\n- [BigQuery ML.GENERATE_TEXT](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-text)\n","coediting":false,"comments_count":0,"created_at":"2026-01-27T16:55:34+09:00","group":null,"id":"7f4a39e1ccf5ce8b4a80","likes_count":0,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"BigQuery","versions":[]},{"name":"データエンジニアリング","versions":[]},{"name":"trocco","versions":[]},{"name":"GoogleCloud","versions":[]},{"name":"Playwright","versions":[]}],"title":"【BigQuery×Playwright×TROCCO】SQLだけで運用が完結するAIスクレイピング基盤の作り方","updated_at":"2026-01-27T16:58:14+09:00","url":"https://qiita.com/yam_dr/items/7f4a39e1ccf5ce8b4a80","user":{"description":null,"facebook_id":null,"followees_count":1,"followers_count":11,"github_login_name":null,"id":"yam_dr","items_count":9,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":3511608,"profile_image_url":"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/profile-images/1770261822","team_only":false,"twitter_screen_name":"yam_dr","website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003cp data-sourcepos=\"1:1-1:66\"\u003eSnowflake上でGeminiが呼び出せるようになりました！\u003c/p\u003e\n\u003cp data-sourcepos=\"3:1-3:63\"\u003e\u003ciframe id=\"qiita-embed-content__0dcb6cf42108ec509f4573c9c3573234\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__0dcb6cf42108ec509f4573c9c3573234\" data-content=\"https%3A%2F%2Fwww.snowflake.com%2Fja%2Fblog%2Fgemini-3-snowflake-cortex-ai%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:113\"\u003eデータパイプラインへのAI組み込みがさらに便利になりそうなので、試してみます。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"7:1-7:33\"\u003e\n\u003cspan id=\"サンプルユースケース\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eサンプルユースケース\u003c/h2\u003e\n\u003cp data-sourcepos=\"9:1-9:83\"\u003eAI利用の例として、問い合わせ内容の分類をしてみましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"11:1-11:171\"\u003e自由記述のテキストデータ(=非構造化データ)は分析が難しく、多くの企業で活用しきれていないのが実情ではないでしょうか。\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-13:230\"\u003eSQLを用いた従来のアプローチでは、\u003ccode\u003eCASE\u003c/code\u003e文や正規表現（\u003ccode\u003eLIKE '%不具合%'\u003c/code\u003e）などルールベースで分類を試みますが、表記ゆれや曖昧な表現に対応できず、限界がありました。\u003c/p\u003e\n\u003cp data-sourcepos=\"15:1-15:228\"\u003eこの記事では、\u003cstrong\u003eSnowflake Cortex\u003c/strong\u003eのAI関数(Geminiモデル使用)と\u003cstrong\u003eTROCCO\u003c/strong\u003eを組み合わせて、問い合わせデータを毎日自動でAI分類するパイプラインを構築する方法を解説します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"17:1-17:34\"\u003e\n\u003cspan id=\"この記事で学べること\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこの記事で学べること\u003c/h3\u003e\n\u003cul data-sourcepos=\"19:1-23:0\"\u003e\n\u003cli data-sourcepos=\"19:1-19:63\"\u003eSnowflake Cortex \u003ccode\u003eAI_COMPLETE\u003c/code\u003e 関数の基本的な使い方\u003c/li\u003e\n\u003cli data-sourcepos=\"20:1-20:44\"\u003eSnowflakeでのGeminiモデル利用方法\u003c/li\u003e\n\u003cli data-sourcepos=\"21:1-21:53\"\u003eSQLだけでLLMを呼び出すプロンプト設計\u003c/li\u003e\n\u003cli data-sourcepos=\"22:1-23:0\"\u003eTROCCOで日次バッチ処理を自動化する方法\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr data-sourcepos=\"24:1-25:0\"\u003e\n\u003ch2 data-sourcepos=\"26:1-26:24\"\u003e\n\u003cspan id=\"従来手法の課題\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BE%93%E6%9D%A5%E6%89%8B%E6%B3%95%E3%81%AE%E8%AA%B2%E9%A1%8C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e従来手法の課題\u003c/h2\u003e\n\u003cp data-sourcepos=\"28:1-28:90\"\u003e問い合わせ内容を分類する従来のSQLは、以下のようなものでした。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"30:1-41:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eCASE\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eWHEN\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%不具合%'\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%エラー%'\u003c/span\u003e \u003cspan class=\"k\"\u003eTHEN\u003c/span\u003e \u003cspan class=\"s1\"\u003e'不具合'\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eWHEN\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%追加してほしい%'\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%要望%'\u003c/span\u003e \u003cspan class=\"k\"\u003eTHEN\u003c/span\u003e \u003cspan class=\"s1\"\u003e'要望'\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eWHEN\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%方法%'\u003c/span\u003e \u003cspan class=\"k\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e \u003cspan class=\"k\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'%やり方%'\u003c/span\u003e \u003cspan class=\"k\"\u003eTHEN\u003c/span\u003e \u003cspan class=\"s1\"\u003e'質問'\u003c/span\u003e\n    \u003cspan class=\"k\"\u003eELSE\u003c/span\u003e \u003cspan class=\"s1\"\u003e'その他'\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eEND\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003ecategory\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003ecustomer_inquiries\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"43:1-43:51\"\u003eこの方法には以下の問題があります。\u003c/p\u003e\n\u003ctable data-sourcepos=\"45:1-49:104\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"45:1-45:22\"\u003e\n\u003cth data-sourcepos=\"45:2-45:9\"\u003e課題\u003c/th\u003e\n\u003cth data-sourcepos=\"45:11-45:21\"\u003e具体例\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"47:1-47:103\"\u003e\n\u003ctd data-sourcepos=\"47:2-47:24\"\u003e表記ゆれに弱い\u003c/td\u003e\n\u003ctd data-sourcepos=\"47:26-47:102\"\u003e「動かない」「止まった」を「不具合」と認識できない\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"48:1-48:133\"\u003e\n\u003ctd data-sourcepos=\"48:2-48:30\"\u003e文脈を理解できない\u003c/td\u003e\n\u003ctd data-sourcepos=\"48:32-48:132\"\u003e「エラーの対処法を教えて」を「不具合」ではなく「質問」と判定すべき\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"49:1-49:104\"\u003e\n\u003ctd data-sourcepos=\"49:2-49:30\"\u003eメンテナンスコスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"49:32-49:103\"\u003e新しい表現が出るたびにCASE文を追加する必要がある\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr data-sourcepos=\"51:1-52:0\"\u003e\n\u003ch2 data-sourcepos=\"53:1-53:42\"\u003e\n\u003cspan id=\"解決策-snowflake-cortex-ai_complete\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A7%A3%E6%B1%BA%E7%AD%96-snowflake-cortex-ai_complete\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e解決策: Snowflake Cortex AI_COMPLETE\u003c/h2\u003e\n\u003cp data-sourcepos=\"55:1-55:107\"\u003eSnowflake Cortexを使えば、\u003cstrong\u003eデータを外部に出さず、SQLだけでLLMを呼び出せます\u003c/strong\u003e。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"57:1-57:36\"\u003e\n\u003cspan id=\"ai_complete関数の基本構文\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#ai_complete%E9%96%A2%E6%95%B0%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eAI_COMPLETE関数の基本構文\u003c/h3\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"59:1-64:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'モデル名'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'プロンプト'\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"k\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"66:1-66:37\"\u003e\n\u003cspan id=\"問い合わせ分類の実装例\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%88%86%E9%A1%9E%E3%81%AE%E5%AE%9F%E8%A3%85%E4%BE%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e問い合わせ分類の実装例\u003c/h3\u003e\n\u003cp data-sourcepos=\"68:1-68:91\"\u003e以下のSQLで、問い合わせ内容を4つのカテゴリに自動分類できます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"70:1-83:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'以下の問い合わせ内容を「不具合」「要望」「質問」「その他」のいずれか1つに分類してください。\nカテゴリ名のみを出力してください。\n\n問い合わせ内容: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003ecustomer_inquiries\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003ecreated_at\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"k\"\u003eCURRENT_DATE\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"85:1-85:13\"\u003e\n\u003cspan id=\"出力例\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%87%BA%E5%8A%9B%E4%BE%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e出力例\u003c/h3\u003e\n\u003ctable data-sourcepos=\"87:1-91:89\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"87:1-87:43\"\u003e\n\u003cth data-sourcepos=\"87:2-87:13\"\u003einquiry_id\u003c/th\u003e\n\u003cth data-sourcepos=\"87:15-87:28\"\u003einquiry_text\u003c/th\u003e\n\u003cth data-sourcepos=\"87:30-87:42\"\u003eai_category\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"89:1-89:74\"\u003e\n\u003ctd data-sourcepos=\"89:2-89:7\"\u003e1001\u003c/td\u003e\n\u003ctd data-sourcepos=\"89:9-89:61\"\u003eアプリが突然落ちるようになりました\u003c/td\u003e\n\u003ctd data-sourcepos=\"89:63-89:73\"\u003e不具合\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"90:1-90:68\"\u003e\n\u003ctd data-sourcepos=\"90:2-90:7\"\u003e1002\u003c/td\u003e\n\u003ctd data-sourcepos=\"90:9-90:58\"\u003eダークモードを追加してほしいです\u003c/td\u003e\n\u003ctd data-sourcepos=\"90:60-90:67\"\u003e要望\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"91:1-91:89\"\u003e\n\u003ctd data-sourcepos=\"91:2-91:7\"\u003e1003\u003c/td\u003e\n\u003ctd data-sourcepos=\"91:9-91:76\"\u003eログインできないのですがどうすればいいですか\u003c/td\u003e\n\u003ctd data-sourcepos=\"91:78-91:88\"\u003e不具合\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv data-sourcepos=\"93:1-95:3\" class=\"note info\"\u003e\n\u003cspan class=\"fa fa-fw fa-check-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"94:1-94:80\"\u003e\u003ccode\u003eTRIM()\u003c/code\u003eでLLMの出力から余分な空白や改行を除去しています。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cp data-sourcepos=\"97:1-97:39\"\u003eSnowflake上で動作確認します。\u003c/p\u003e\n\u003cp data-sourcepos=\"99:1-99:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F1fd8c108-2a48-4f9f-afd3-1e8280032d4c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=aa02286795450b3a91410171f1f4d1b3\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F1fd8c108-2a48-4f9f-afd3-1e8280032d4c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=aa02286795450b3a91410171f1f4d1b3\" alt=\"スクリーンショット 2026-01-15 11.20.36.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F1fd8c108-2a48-4f9f-afd3-1e8280032d4c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=78c48647ffe83ee08cea0817ee920735 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/1fd8c108-2a48-4f9f-afd3-1e8280032d4c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"101:1-101:40\"\u003e\n\u003cspan id=\"プロンプト設計のポイント\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E8%A8%AD%E8%A8%88%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eプロンプト設計のポイント\u003c/h3\u003e\n\u003cp data-sourcepos=\"103:1-104:90\"\u003e先ほどの出力例で、「ログインできないのですがどうすればいいですか」という問い合わせが「不具合」と分類されていましたが、本来は「質問」と分類するのが適切そうです。\u003cbr\u003e\nLLMに明確な指示を与えることで、分類精度の向上を図ってみます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"106:1-130:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- より詳細なプロンプト例\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'## タスク\n以下の問い合わせ内容を分類してください。\n\n## カテゴリ定義\n- 不具合: 製品の動作不良、エラー、クラッシュに関する報告\n- 要望: 新機能の追加や改善の提案\n- 質問: 使い方や仕様に関する問い合わせ\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n- 迷った場合は「その他」を選択\n\n## 問い合わせ内容\n'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003ecustomer_inquiries\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"132:1-132:69\"\u003e指示を詳細化することで、出力が改善されました。\u003c/p\u003e\n\u003cp data-sourcepos=\"134:1-134:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fe945bf85-9359-44e6-ae5e-eb2a235a7fec.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1ebaf15b8e6cb79f4408f09b5f4e2b75\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fe945bf85-9359-44e6-ae5e-eb2a235a7fec.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1ebaf15b8e6cb79f4408f09b5f4e2b75\" alt=\"スクリーンショット 2026-01-15 11.51.54.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fe945bf85-9359-44e6-ae5e-eb2a235a7fec.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b29a25b067e1dba85cb244467983a53b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/e945bf85-9359-44e6-ae5e-eb2a235a7fec.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr data-sourcepos=\"136:1-137:0\"\u003e\n\u003ch2 data-sourcepos=\"138:1-138:45\"\u003e\n\u003cspan id=\"troccoで日次バッチ処理を自動化\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#trocco%E3%81%A7%E6%97%A5%E6%AC%A1%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTROCCOで日次バッチ処理を自動化\u003c/h2\u003e\n\u003cp data-sourcepos=\"140:1-140:121\"\u003e単発の実行ではなく、\u003cstrong\u003e毎日新しい問い合わせを自動分類\u003c/strong\u003eするためにTROCCOを活用します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"142:1-142:31\"\u003e\n\u003cspan id=\"なぜtroccoを使うのか\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AA%E3%81%9Ctrocco%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eなぜTROCCOを使うのか\u003c/h3\u003e\n\u003ctable data-sourcepos=\"144:1-149:75\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"144:1-144:25\"\u003e\n\u003cth data-sourcepos=\"144:2-144:9\"\u003e観点\u003c/th\u003e\n\u003cth data-sourcepos=\"144:11-144:24\"\u003eメリット\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"146:1-146:58\"\u003e\n\u003ctd data-sourcepos=\"146:2-146:15\"\u003e環境構築\u003c/td\u003e\n\u003ctd data-sourcepos=\"146:17-146:57\"\u003ePython環境やAPIキー管理が不要\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"147:1-147:79\"\u003e\n\u003ctd data-sourcepos=\"147:2-147:21\"\u003eスケジュール\u003c/td\u003e\n\u003ctd data-sourcepos=\"147:23-147:78\"\u003e画面上から柔軟に実行タイミングを設定\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"148:1-148:58\"\u003e\n\u003ctd data-sourcepos=\"148:2-148:9\"\u003e監視\u003c/td\u003e\n\u003ctd data-sourcepos=\"148:11-148:57\"\u003e実行履歴とエラー通知が標準装備\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"149:1-149:75\"\u003e\n\u003ctd data-sourcepos=\"149:2-149:15\"\u003e依存管理\u003c/td\u003e\n\u003ctd data-sourcepos=\"149:17-149:74\"\u003e前処理→AI分類→後処理をワークフロー化\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 data-sourcepos=\"151:1-151:22\"\u003e\n\u003cspan id=\"構成イメージ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%A7%8B%E6%88%90%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e構成イメージ\u003c/h3\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"153:1-160:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e[データソース] → [TROCCO転送] → [Snowflake生データ]\n                                      ↓\n                        [TROCCOデータマート/クエリ実行]\n                        (AI_COMPLETEを含むSQL)\n                                      ↓\n                              [分類済みテーブル]\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"162:1-162:16\"\u003e\n\u003cspan id=\"設定手順\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e設定手順\u003c/h3\u003e\n\u003ch4 data-sourcepos=\"164:1-164:53\"\u003e\n\u003cspan id=\"ステップ1-データマート定義を作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%88%E5%AE%9A%E7%BE%A9%E3%82%92%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eステップ1: データマート定義を作成\u003c/h4\u003e\n\u003cp data-sourcepos=\"166:1-166:77\"\u003eTROCCOの「データマート定義」で、AI分類SQLを登録します。\u003c/p\u003e\n\u003cp data-sourcepos=\"168:1-168:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fdb122e9e-f9c7-45d9-9cd9-4c3568ba6b3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bd29dc32d38a343f37af50e8f49f11d2\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fdb122e9e-f9c7-45d9-9cd9-4c3568ba6b3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bd29dc32d38a343f37af50e8f49f11d2\" alt=\"スクリーンショット 2026-01-15 11.26.17.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2Fdb122e9e-f9c7-45d9-9cd9-4c3568ba6b3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=0fcce15c1b053bcaae403c8d9813f399 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/db122e9e-f9c7-45d9-9cd9-4c3568ba6b3d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"170:1-197:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- TROCCOに登録するSQL\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'## タスク\n以下の問い合わせ内容を分類してください。\n\n## カテゴリ定義\n- 不具合: 製品の動作不良、エラー、クラッシュに関する報告\n- 要望: 新機能の追加や改善の提案\n- 質問: 使い方や仕様に関する問い合わせ\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n- 迷った場合は「その他」を選択\n\n## 問い合わせ内容: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_text\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eCURRENT_TIMESTAMP\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eclassified_at\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003eDATABASE\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003eSCHEMA\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecustomer_inquiries\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e-- 初回実行時は以下の行を削除して実行\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003ecreated_at\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"k\"\u003eCURRENT_DATE\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e \u003cspan class=\"k\"\u003eNOT\u003c/span\u003e \u003cspan class=\"k\"\u003eIN\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e \u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003eDATABASE\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003eSCHEMA\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclassified_inquiries\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch4 data-sourcepos=\"199:1-199:32\"\u003e\n\u003cspan id=\"ステップ2-初回実行\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E5%88%9D%E5%9B%9E%E5%AE%9F%E8%A1%8C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eステップ2: 初回実行\u003c/h4\u003e\n\u003cp data-sourcepos=\"201:1-201:105\"\u003e初回の手動実行を実施し、テーブル生成と初期データ投入を同時に行います。\u003c/p\u003e\n\u003cp data-sourcepos=\"203:1-203:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F82c610c5-b1dd-45c3-aea1-7d45e260cee3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7dde8883f186f5f2740b3adde0c75884\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F82c610c5-b1dd-45c3-aea1-7d45e260cee3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7dde8883f186f5f2740b3adde0c75884\" alt=\"スクリーンショット 2026-01-15 11.37.37.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F82c610c5-b1dd-45c3-aea1-7d45e260cee3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=d1e3ee468fadf2bdd8b539a93c4531a3 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/82c610c5-b1dd-45c3-aea1-7d45e260cee3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch4 data-sourcepos=\"205:1-205:77\"\u003e\n\u003cspan id=\"ステップ3-ワークフロー作成スケジュール通知設定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E4%BD%9C%E6%88%90%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E8%A8%AD%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eステップ3: ワークフロー作成(スケジュール/通知設定)\u003c/h4\u003e\n\u003cp data-sourcepos=\"207:1-208:110\"\u003e定期実行のために、ワークフローから連携ジョブを呼び出す設定を追加します。\u003cbr\u003e\nまた、エラー発生時にSlackへ通知するよう設定しておくと、運用が楽になります。\u003c/p\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F88b1eeeb-a266-43ca-8f90-788d9a025490.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=72f71a23518097b9f8198172861738d7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg width=\"400\" src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F88b1eeeb-a266-43ca-8f90-788d9a025490.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=72f71a23518097b9f8198172861738d7\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3511608%2F88b1eeeb-a266-43ca-8f90-788d9a025490.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2a3480965806e729e789853574ef342f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/88b1eeeb-a266-43ca-8f90-788d9a025490.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003chr data-sourcepos=\"212:1-213:0\"\u003e\n\u003ch2 data-sourcepos=\"214:1-214:13\"\u003e\n\u003cspan id=\"運用tips\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%81%8B%E7%94%A8tips\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e運用Tips\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"216:1-216:19\"\u003e\n\u003cspan id=\"コスト管理\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B3%E3%82%B9%E3%83%88%E7%AE%A1%E7%90%86\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eコスト管理\u003c/h3\u003e\n\u003cp data-sourcepos=\"218:1-218:175\"\u003eSnowflake Cortexの利用にはクレジットが消費されます。大量データを処理する前に、サンプルで動作確認することをおすすめします。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"220:1-227:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- まず10件でテスト\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003einquiry_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'...'\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003ecustomer_inquiries\u003c/span\u003e\n\u003cspan class=\"k\"\u003eLIMIT\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"229:1-229:25\"\u003e\n\u003cspan id=\"分類結果の検証\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%88%86%E9%A1%9E%E7%B5%90%E6%9E%9C%E3%81%AE%E6%A4%9C%E8%A8%BC\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e分類結果の検証\u003c/h3\u003e\n\u003cp data-sourcepos=\"231:1-231:105\"\u003e定期的に分類精度を確認し、プロンプトを改善するサイクルを回しましょう。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"233:1-243:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 分類結果の分布を確認\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"k\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eROUND\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"k\"\u003eSUM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eCOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"n\"\u003eOVER\u003c/span\u003e \u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003epercentage\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003eclassified_inquiries\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003eclassified_at\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"k\"\u003eCURRENT_DATE\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e7\u003c/span\u003e\n\u003cspan class=\"k\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"k\"\u003eBY\u003c/span\u003e \u003cspan class=\"n\"\u003eai_category\u003c/span\u003e\n\u003cspan class=\"k\"\u003eORDER\u003c/span\u003e \u003cspan class=\"k\"\u003eBY\u003c/span\u003e \u003cspan class=\"k\"\u003ecount\u003c/span\u003e \u003cspan class=\"k\"\u003eDESC\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003chr data-sourcepos=\"245:1-246:0\"\u003e\n\u003ch2 data-sourcepos=\"247:1-247:12\"\u003e\n\u003cspan id=\"応用例\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BF%9C%E7%94%A8%E4%BE%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e応用例\u003c/h2\u003e\n\u003cp data-sourcepos=\"249:1-249:192\"\u003e問い合わせ分類以外にも、同じ手法でさまざまなテキストデータにラベル付けできます。ここでは実務でよくあるユースケースを紹介します。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"251:1-251:55\"\u003e\n\u003cspan id=\"応用1-求人データへの職種ラベル付け\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BF%9C%E7%94%A81-%E6%B1%82%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%81%B8%E3%81%AE%E8%81%B7%E7%A8%AE%E3%83%A9%E3%83%99%E3%83%AB%E4%BB%98%E3%81%91\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e応用1: 求人データへの職種ラベル付け\u003c/h3\u003e\n\u003cp data-sourcepos=\"253:1-253:108\"\u003e求人サイトから収集したデータに、統一された職種カテゴリを付与する例です。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"255:1-280:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 求人タイトルと説明文から職種を推定\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ejob_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ejob_title\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'## タスク\n以下の求人情報から職種カテゴリを判定してください。\n\n## 職種カテゴリ\n- エンジニア: ソフトウェア開発、インフラ、データ分析など技術職\n- 営業: 法人営業、個人営業、インサイドセールスなど\n- マーケティング: 広告運用、PR、ブランディングなど\n- バックオフィス: 経理、人事、総務、法務など\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n\n## 求人タイトル\n'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_title\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_category\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_postings\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_category\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"282:1-282:14\"\u003e\u003cstrong\u003e出力例\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable data-sourcepos=\"284:1-288:74\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"284:1-284:37\"\u003e\n\u003cth data-sourcepos=\"284:2-284:9\"\u003ejob_id\u003c/th\u003e\n\u003cth data-sourcepos=\"284:11-284:21\"\u003ejob_title\u003c/th\u003e\n\u003cth data-sourcepos=\"284:23-284:36\"\u003ejob_category\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"286:1-286:89\"\u003e\n\u003ctd data-sourcepos=\"286:2-286:7\"\u003e2001\u003c/td\u003e\n\u003ctd data-sourcepos=\"286:9-286:70\"\u003eWebアプリケーションエンジニア（React/Python）\u003c/td\u003e\n\u003ctd data-sourcepos=\"286:72-286:88\"\u003eエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"287:1-287:62\"\u003e\n\u003ctd data-sourcepos=\"287:2-287:7\"\u003e2002\u003c/td\u003e\n\u003ctd data-sourcepos=\"287:9-287:52\"\u003eカスタマーサクセス責任者候補\u003c/td\u003e\n\u003ctd data-sourcepos=\"287:54-287:61\"\u003e営業\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"288:1-288:74\"\u003e\n\u003ctd data-sourcepos=\"288:2-288:7\"\u003e2003\u003c/td\u003e\n\u003ctd data-sourcepos=\"288:9-288:49\"\u003eSNSマーケター / TikTok運用担当\u003c/td\u003e\n\u003ctd data-sourcepos=\"288:51-288:73\"\u003eマーケティング\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 data-sourcepos=\"290:1-290:61\"\u003e\n\u003cspan id=\"応用2-商品レビューの感情トピック分類\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BF%9C%E7%94%A82-%E5%95%86%E5%93%81%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E6%84%9F%E6%83%85%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E5%88%86%E9%A1%9E\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e応用2: 商品レビューの感情・トピック分類\u003c/h3\u003e\n\u003cp data-sourcepos=\"292:1-292:71\"\u003eECサイトのレビューを複数の観点で分類する例です。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"294:1-316:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- 感情とトピックを同時に抽出\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ereview_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ereview_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'## タスク\n以下の商品レビューを分析してください。\n\n## 出力形式（JSON）\n{\"sentiment\": \"positive/negative/neutral\", \"topic\": \"品質/価格/配送/サポート/その他\"}\n\n## ルール\n- 必ず上記JSON形式で出力すること\n- sentimentとtopicの両方を判定すること\n\n## レビュー内容\n'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ereview_text\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eanalysis_json\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003eproduct_reviews\u003c/span\u003e\n\u003cspan class=\"k\"\u003eWHERE\u003c/span\u003e \u003cspan class=\"n\"\u003eanalyzed_at\u003c/span\u003e \u003cspan class=\"k\"\u003eIS\u003c/span\u003e \u003cspan class=\"k\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv data-sourcepos=\"318:1-320:3\" class=\"note warn\"\u003e\n\u003cspan class=\"fa fa-fw fa-exclamation-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"319:1-319:115\"\u003eJSON形式で出力させる場合、\u003ccode\u003eTRY_PARSE_JSON()\u003c/code\u003eで安全にパースすることをおすすめします。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"322:1-332:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"c1\"\u003e-- JSONをパースして個別カラムに展開\u003c/span\u003e\n\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ereview_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ereview_text\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eTRY_PARSE_JSON\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eanalysis_json\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\u003cspan class=\"n\"\u003esentiment\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSTRING\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003esentiment\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eTRY_PARSE_JSON\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eanalysis_json\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\u003cspan class=\"n\"\u003etopic\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSTRING\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003etopic\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e-- 上記のSELECT文\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"334:1-334:58\"\u003e\n\u003cspan id=\"応用3-社内ドキュメントの部門タグ付け\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BF%9C%E7%94%A83-%E7%A4%BE%E5%86%85%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E9%83%A8%E9%96%80%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%91\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e応用3: 社内ドキュメントの部門タグ付け\u003c/h3\u003e\n\u003cp data-sourcepos=\"336:1-336:97\"\u003e社内Wikiやナレッジベースの記事に、自動で部門タグを付与する例です。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"338:1-362:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\n  \u003cspan class=\"n\"\u003edoc_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003edoc_title\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eTRIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSNOWFLAKE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCORTEX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAI_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'gemini-2.5-flash'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'## タスク\n以下の社内ドキュメントのタイトルと概要から、関連する部門を判定してください。\n\n## 部門一覧\n- 開発部: システム開発、技術仕様、リリースノートなど\n- 営業部: 提案資料、顧客情報、商談管理など\n- 人事部: 採用、評価、研修、福利厚生など\n- 経理部: 経費精算、請求、予算管理など\n- 全社共通: 社内規定、セキュリティ、ITツールなど\n\n## ルール\n- 最も関連性の高い部門名を1つだけ出力すること\n\n## ドキュメント情報\nタイトル: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003edoc_title\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\n概要: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003edoc_summary\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003edepartment_tag\u003c/span\u003e\n\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e \u003cspan class=\"n\"\u003einternal_documents\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 data-sourcepos=\"364:1-364:25\"\u003e\n\u003cspan id=\"応用のポイント\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BF%9C%E7%94%A8%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e応用のポイント\u003c/h3\u003e\n\u003cp data-sourcepos=\"366:1-366:84\"\u003eこれらの応用例に共通するベストプラクティスをまとめます。\u003c/p\u003e\n\u003ctable data-sourcepos=\"368:1-373:102\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"368:1-368:25\"\u003e\n\u003cth data-sourcepos=\"368:2-368:15\"\u003eポイント\u003c/th\u003e\n\u003cth data-sourcepos=\"368:17-368:24\"\u003e説明\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"370:1-370:133\"\u003e\n\u003ctd data-sourcepos=\"370:2-370:33\"\u003eカテゴリ定義を明確に\u003c/td\u003e\n\u003ctd data-sourcepos=\"370:35-370:132\"\u003e曖昧なカテゴリは分類精度を下げる。各カテゴリの境界を具体例で示す\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"371:1-371:122\"\u003e\n\u003ctd data-sourcepos=\"371:2-371:24\"\u003e出力形式を限定\u003c/td\u003e\n\u003ctd data-sourcepos=\"371:26-371:121\"\u003e「カテゴリ名のみ」「JSON形式」など、パースしやすい形式を指定する\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"372:1-372:121\"\u003e\n\u003ctd data-sourcepos=\"372:2-372:30\"\u003e複数項目は段階的に\u003c/td\u003e\n\u003ctd data-sourcepos=\"372:32-372:120\"\u003e一度に多くの情報を抽出しようとせず、必要なら複数回に分ける\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"373:1-373:102\"\u003e\n\u003ctd data-sourcepos=\"373:2-373:30\"\u003eエラーハンドリング\u003c/td\u003e\n\u003ctd data-sourcepos=\"373:32-373:101\"\u003e\n\u003ccode\u003eTRY_PARSE_JSON()\u003c/code\u003eやCOALESCEで、想定外の出力に対応する\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr data-sourcepos=\"375:1-376:0\"\u003e\n\u003ch2 data-sourcepos=\"377:1-377:12\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h2\u003e\n\u003cp data-sourcepos=\"379:1-379:161\"\u003eSnowflake Cortex とTROCCO を組み合わせて、問い合わせデータをAI自動分類するパイプラインを構築する方法を解説しました。\u003c/p\u003e\n\u003cul data-sourcepos=\"381:1-384:0\"\u003e\n\u003cli data-sourcepos=\"381:1-381:71\"\u003e\n\u003cstrong\u003eSnowflake Cortex\u003c/strong\u003e を使えば、SQLだけでLLMを呼び出せる\u003c/li\u003e\n\u003cli data-sourcepos=\"382:1-382:78\"\u003e\n\u003cstrong\u003eプロンプト設計\u003c/strong\u003e次第で分類精度をチューニングできる\u003c/li\u003e\n\u003cli data-sourcepos=\"383:1-384:0\"\u003e\n\u003cstrong\u003eTROCCO\u003c/strong\u003e と組み合わせれば、日次バッチ処理を簡単に自動化できる\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"385:1-385:138\"\u003e定性データ（自由記述）を定量データ（カテゴリ）に変換することで、分析の幅が大きく広がります。\u003c/p\u003e\n\u003cp data-sourcepos=\"387:1-387:84\"\u003eぜひ、あなたのデータパイプラインでも試してみてください。\u003c/p\u003e\n\u003chr data-sourcepos=\"389:1-390:0\"\u003e\n\u003ch2 data-sourcepos=\"391:1-391:18\"\u003e\n\u003cspan id=\"参考リンク\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e参考リンク\u003c/h2\u003e\n\u003cul data-sourcepos=\"393:1-395:90\"\u003e\n\u003cli data-sourcepos=\"393:1-393:106\"\u003e\u003ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions\" rel=\"nofollow noopener\" target=\"_blank\"\u003eSnowflake Cortex AI Functions\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"394:1-394:64\"\u003e\u003ca href=\"https://documents.trocco.io/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eTROCCO公式ドキュメント\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"395:1-395:90\"\u003e\u003ca href=\"https://documents.trocco.io/docs/data-mart-definition\" rel=\"nofollow noopener\" target=\"_blank\"\u003eTROCCO データマート定義\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","body":"Snowflake上でGeminiが呼び出せるようになりました！\n\nhttps://www.snowflake.com/ja/blog/gemini-3-snowflake-cortex-ai/\n\nデータパイプラインへのAI組み込みがさらに便利になりそうなので、試してみます。\n\n## サンプルユースケース\n\nAI利用の例として、問い合わせ内容の分類をしてみましょう。\n\n自由記述のテキストデータ(=非構造化データ)は分析が難しく、多くの企業で活用しきれていないのが実情ではないでしょうか。\n\nSQLを用いた従来のアプローチでは、`CASE`文や正規表現（`LIKE '%不具合%'`）などルールベースで分類を試みますが、表記ゆれや曖昧な表現に対応できず、限界がありました。\n\nこの記事では、**Snowflake Cortex**のAI関数(Geminiモデル使用)と**TROCCO**を組み合わせて、問い合わせデータを毎日自動でAI分類するパイプラインを構築する方法を解説します。\n\n### この記事で学べること\n\n- Snowflake Cortex `AI_COMPLETE` 関数の基本的な使い方\n- SnowflakeでのGeminiモデル利用方法\n- SQLだけでLLMを呼び出すプロンプト設計\n- TROCCOで日次バッチ処理を自動化する方法\n\n---\n\n## 従来手法の課題\n\n問い合わせ内容を分類する従来のSQLは、以下のようなものでした。\n\n```sql\nSELECT\n  inquiry_id,\n  inquiry_text,\n  CASE\n    WHEN inquiry_text LIKE '%不具合%' OR inquiry_text LIKE '%エラー%' THEN '不具合'\n    WHEN inquiry_text LIKE '%追加してほしい%' OR inquiry_text LIKE '%要望%' THEN '要望'\n    WHEN inquiry_text LIKE '%方法%' OR inquiry_text LIKE '%やり方%' THEN '質問'\n    ELSE 'その他'\n  END AS category\nFROM customer_inquiries;\n```\n\nこの方法には以下の問題があります。\n\n| 課題 | 具体例 |\n|------|--------|\n| 表記ゆれに弱い | 「動かない」「止まった」を「不具合」と認識できない |\n| 文脈を理解できない | 「エラーの対処法を教えて」を「不具合」ではなく「質問」と判定すべき |\n| メンテナンスコスト | 新しい表現が出るたびにCASE文を追加する必要がある |\n\n---\n\n## 解決策: Snowflake Cortex AI_COMPLETE\n\nSnowflake Cortexを使えば、**データを外部に出さず、SQLだけでLLMを呼び出せます**。\n\n### AI_COMPLETE関数の基本構文\n\n```sql\nSELECT SNOWFLAKE.CORTEX.AI_COMPLETE(\n  'モデル名',\n  'プロンプト'\n) AS result;\n```\n\n### 問い合わせ分類の実装例\n\n以下のSQLで、問い合わせ内容を4つのカテゴリに自動分類できます。\n\n```sql\nSELECT\n  inquiry_id,\n  inquiry_text,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '以下の問い合わせ内容を「不具合」「要望」「質問」「その他」のいずれか1つに分類してください。\nカテゴリ名のみを出力してください。\n\n問い合わせ内容: ' || inquiry_text\n  )) AS ai_category\nFROM customer_inquiries\nWHERE created_at \u003e= CURRENT_DATE - 1;\n```\n\n### 出力例\n\n| inquiry_id | inquiry_text | ai_category |\n|------------|--------------|-------------|\n| 1001 | アプリが突然落ちるようになりました | 不具合 |\n| 1002 | ダークモードを追加してほしいです | 要望 |\n| 1003 | ログインできないのですがどうすればいいですか | 不具合 |\n\n:::note info\n`TRIM()`でLLMの出力から余分な空白や改行を除去しています。\n:::\n\nSnowflake上で動作確認します。\n\n![スクリーンショット 2026-01-15 11.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/1fd8c108-2a48-4f9f-afd3-1e8280032d4c.png)\n\n### プロンプト設計のポイント\n\n先ほどの出力例で、「ログインできないのですがどうすればいいですか」という問い合わせが「不具合」と分類されていましたが、本来は「質問」と分類するのが適切そうです。\nLLMに明確な指示を与えることで、分類精度の向上を図ってみます。\n\n```sql\n-- より詳細なプロンプト例\nSELECT\n  inquiry_id,\n  inquiry_text,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '## タスク\n以下の問い合わせ内容を分類してください。\n\n## カテゴリ定義\n- 不具合: 製品の動作不良、エラー、クラッシュに関する報告\n- 要望: 新機能の追加や改善の提案\n- 質問: 使い方や仕様に関する問い合わせ\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n- 迷った場合は「その他」を選択\n\n## 問い合わせ内容\n' || inquiry_text\n  )) AS ai_category\nFROM customer_inquiries;\n```\n\n指示を詳細化することで、出力が改善されました。\n\n![スクリーンショット 2026-01-15 11.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/e945bf85-9359-44e6-ae5e-eb2a235a7fec.png)\n\n---\n\n## TROCCOで日次バッチ処理を自動化\n\n単発の実行ではなく、**毎日新しい問い合わせを自動分類**するためにTROCCOを活用します。\n\n### なぜTROCCOを使うのか\n\n| 観点 | メリット |\n|------|----------|\n| 環境構築 | Python環境やAPIキー管理が不要 |\n| スケジュール | 画面上から柔軟に実行タイミングを設定 |\n| 監視 | 実行履歴とエラー通知が標準装備 |\n| 依存管理 | 前処理→AI分類→後処理をワークフロー化 |\n\n### 構成イメージ\n\n```\n[データソース] → [TROCCO転送] → [Snowflake生データ]\n                                      ↓\n                        [TROCCOデータマート/クエリ実行]\n                        (AI_COMPLETEを含むSQL)\n                                      ↓\n                              [分類済みテーブル]\n```\n\n### 設定手順\n\n#### ステップ1: データマート定義を作成\n\nTROCCOの「データマート定義」で、AI分類SQLを登録します。\n\n![スクリーンショット 2026-01-15 11.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/db122e9e-f9c7-45d9-9cd9-4c3568ba6b3d.png)\n\n```sql\n-- TROCCOに登録するSQL\nSELECT\n  inquiry_id,\n  inquiry_text,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '## タスク\n以下の問い合わせ内容を分類してください。\n\n## カテゴリ定義\n- 不具合: 製品の動作不良、エラー、クラッシュに関する報告\n- 要望: 新機能の追加や改善の提案\n- 質問: 使い方や仕様に関する問い合わせ\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n- 迷った場合は「その他」を選択\n\n## 問い合わせ内容: ' || inquiry_text\n  )) AS ai_category,\n  CURRENT_TIMESTAMP() AS classified_at\nFROM \u003cDATABASE\u003e.\u003cSCHEMA\u003e.customer_inquiries\n-- 初回実行時は以下の行を削除して実行\nWHERE created_at \u003e= CURRENT_DATE - 1\n  AND inquiry_id NOT IN (SELECT inquiry_id FROM \u003cDATABASE\u003e.\u003cSCHEMA\u003e.classified_inquiries)\n```\n\n#### ステップ2: 初回実行\n\n初回の手動実行を実施し、テーブル生成と初期データ投入を同時に行います。\n\n![スクリーンショット 2026-01-15 11.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/82c610c5-b1dd-45c3-aea1-7d45e260cee3.png)\n\n#### ステップ3: ワークフロー作成(スケジュール/通知設定)\n\n定期実行のために、ワークフローから連携ジョブを呼び出す設定を追加します。\nまた、エラー発生時にSlackへ通知するよう設定しておくと、運用が楽になります。\n\n\u003cimg width=\"400\" src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/88b1eeeb-a266-43ca-8f90-788d9a025490.png\"\u003e\n\n---\n\n## 運用Tips\n\n### コスト管理\n\nSnowflake Cortexの利用にはクレジットが消費されます。大量データを処理する前に、サンプルで動作確認することをおすすめします。\n\n```sql\n-- まず10件でテスト\nSELECT\n  inquiry_id,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE('gemini-2.5-flash', '...')) AS ai_category\nFROM customer_inquiries\nLIMIT 10;\n```\n\n### 分類結果の検証\n\n定期的に分類精度を確認し、プロンプトを改善するサイクルを回しましょう。\n\n```sql\n-- 分類結果の分布を確認\nSELECT\n  ai_category,\n  COUNT(*) AS count,\n  ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) AS percentage\nFROM classified_inquiries\nWHERE classified_at \u003e= CURRENT_DATE - 7\nGROUP BY ai_category\nORDER BY count DESC;\n```\n\n---\n\n## 応用例\n\n問い合わせ分類以外にも、同じ手法でさまざまなテキストデータにラベル付けできます。ここでは実務でよくあるユースケースを紹介します。\n\n### 応用1: 求人データへの職種ラベル付け\n\n求人サイトから収集したデータに、統一された職種カテゴリを付与する例です。\n\n```sql\n-- 求人タイトルと説明文から職種を推定\nSELECT\n  job_id,\n  job_title,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '## タスク\n以下の求人情報から職種カテゴリを判定してください。\n\n## 職種カテゴリ\n- エンジニア: ソフトウェア開発、インフラ、データ分析など技術職\n- 営業: 法人営業、個人営業、インサイドセールスなど\n- マーケティング: 広告運用、PR、ブランディングなど\n- バックオフィス: 経理、人事、総務、法務など\n- その他: 上記に該当しないもの\n\n## ルール\n- カテゴリ名のみを1つ出力すること\n\n## 求人タイトル\n' || job_title\n  )) AS job_category\nFROM job_postings\nWHERE job_category IS NULL;\n```\n\n**出力例**:\n\n| job_id | job_title | job_category |\n|--------|-----------|--------------|\n| 2001 | Webアプリケーションエンジニア（React/Python） | エンジニア |\n| 2002 | カスタマーサクセス責任者候補 | 営業 |\n| 2003 | SNSマーケター / TikTok運用担当 | マーケティング |\n\n### 応用2: 商品レビューの感情・トピック分類\n\nECサイトのレビューを複数の観点で分類する例です。\n\n```sql\n-- 感情とトピックを同時に抽出\nSELECT\n  review_id,\n  review_text,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '## タスク\n以下の商品レビューを分析してください。\n\n## 出力形式（JSON）\n{\"sentiment\": \"positive/negative/neutral\", \"topic\": \"品質/価格/配送/サポート/その他\"}\n\n## ルール\n- 必ず上記JSON形式で出力すること\n- sentimentとtopicの両方を判定すること\n\n## レビュー内容\n' || review_text\n  )) AS analysis_json\nFROM product_reviews\nWHERE analyzed_at IS NULL;\n```\n\n:::note warn\nJSON形式で出力させる場合、`TRY_PARSE_JSON()`で安全にパースすることをおすすめします。\n:::\n\n```sql\n-- JSONをパースして個別カラムに展開\nSELECT\n  review_id,\n  review_text,\n  TRY_PARSE_JSON(analysis_json):sentiment::STRING AS sentiment,\n  TRY_PARSE_JSON(analysis_json):topic::STRING AS topic\nFROM (\n  -- 上記のSELECT文\n);\n```\n\n### 応用3: 社内ドキュメントの部門タグ付け\n\n社内Wikiやナレッジベースの記事に、自動で部門タグを付与する例です。\n\n```sql\nSELECT\n  doc_id,\n  doc_title,\n  TRIM(SNOWFLAKE.CORTEX.AI_COMPLETE(\n    'gemini-2.5-flash',\n    '## タスク\n以下の社内ドキュメントのタイトルと概要から、関連する部門を判定してください。\n\n## 部門一覧\n- 開発部: システム開発、技術仕様、リリースノートなど\n- 営業部: 提案資料、顧客情報、商談管理など\n- 人事部: 採用、評価、研修、福利厚生など\n- 経理部: 経費精算、請求、予算管理など\n- 全社共通: 社内規定、セキュリティ、ITツールなど\n\n## ルール\n- 最も関連性の高い部門名を1つだけ出力すること\n\n## ドキュメント情報\nタイトル: ' || doc_title || '\n概要: ' || doc_summary\n  )) AS department_tag\nFROM internal_documents;\n```\n\n### 応用のポイント\n\nこれらの応用例に共通するベストプラクティスをまとめます。\n\n| ポイント | 説明 |\n|----------|------|\n| カテゴリ定義を明確に | 曖昧なカテゴリは分類精度を下げる。各カテゴリの境界を具体例で示す |\n| 出力形式を限定 | 「カテゴリ名のみ」「JSON形式」など、パースしやすい形式を指定する |\n| 複数項目は段階的に | 一度に多くの情報を抽出しようとせず、必要なら複数回に分ける |\n| エラーハンドリング | `TRY_PARSE_JSON()`やCOALESCEで、想定外の出力に対応する |\n\n---\n\n## まとめ\n\nSnowflake Cortex とTROCCO を組み合わせて、問い合わせデータをAI自動分類するパイプラインを構築する方法を解説しました。\n\n- **Snowflake Cortex** を使えば、SQLだけでLLMを呼び出せる\n- **プロンプト設計**次第で分類精度をチューニングできる\n- **TROCCO** と組み合わせれば、日次バッチ処理を簡単に自動化できる\n\n定性データ（自由記述）を定量データ（カテゴリ）に変換することで、分析の幅が大きく広がります。\n\nぜひ、あなたのデータパイプラインでも試してみてください。\n\n---\n\n## 参考リンク\n\n- [Snowflake Cortex AI Functions](https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions)\n- [TROCCO公式ドキュメント](https://documents.trocco.io/)\n- [TROCCO データマート定義](https://documents.trocco.io/docs/data-mart-definition)\n","coediting":false,"comments_count":0,"created_at":"2026-01-15T11:53:43+09:00","group":null,"id":"67db2a3835df05126459","likes_count":1,"private":false,"reactions_count":0,"stocks_count":1,"tags":[{"name":"SQL","versions":[]},{"name":"機械学習","versions":[]},{"name":"Snowflake","versions":[]},{"name":"データエンジニアリング","versions":[]},{"name":"trocco","versions":[]}],"title":"Snowflake Cortex (with Gemini) + TROCCOで問い合わせをAI自動分類する方法","updated_at":"2026-01-15T11:55:45+09:00","url":"https://qiita.com/yam_dr/items/67db2a3835df05126459","user":{"description":null,"facebook_id":null,"followees_count":1,"followers_count":11,"github_login_name":null,"id":"yam_dr","items_count":9,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":3511608,"profile_image_url":"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511608/profile-images/1770261822","team_only":false,"twitter_screen_name":"yam_dr","website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch2 data-sourcepos=\"2:1-2:9\"\u003e\n\u003cspan id=\"導入\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%B0%8E%E5%85%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e導入\u003c/h2\u003e\n\u003cp data-sourcepos=\"4:1-4:168\"\u003e「データエンジニアとデータサイエンティストって何が違うの？」「アナリティクスエンジニアって最近よく聞くけど何？」\u003c/p\u003e\n\u003cp data-sourcepos=\"6:1-6:318\"\u003eデータ領域で働いていると、こうした質問を会社の他部署の人からよく受けます。実際、職種の境界は曖昧になりつつあり、会社によって定義も異なります。あと、名前は一つだけど兼任になっているってことも大いにあると思います！\u003c/p\u003e\n\u003cp data-sourcepos=\"8:1-8:363\"\u003eこの記事では、2026年1月上旬現在のデータ職種について整理し、それぞれの役割(筆者の偏見アリ)と今後のトレンドをなんとなくまとめます。筆者も生成AIと調べながらまとめており、間違いも多く含んでいると思います。ご教示のほど何卒よろしくお願いいたしますm(__)m\u003c/p\u003e\n\u003cp data-sourcepos=\"10:1-10:94\"\u003e※ 文章や内容はもちろん、参考リンクの中身は全て確認しています。\u003c/p\u003e\n\u003chr data-sourcepos=\"12:1-13:0\"\u003e\n\u003ch2 data-sourcepos=\"14:1-14:36\"\u003e\n\u003cspan id=\"データ職種の全体マップ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E8%81%B7%E7%A8%AE%E3%81%AE%E5%85%A8%E4%BD%93%E3%83%9E%E3%83%83%E3%83%97\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータ職種の全体マップ\u003c/h2\u003e\n\u003cp data-sourcepos=\"16:1-16:106\"\u003e以下の図は、データ関連職種を役割ごとに5つのグループに分類したものです。\u003c/p\u003e\n\u003cp data-sourcepos=\"18:1-18:181\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F786011%2Ffad4ed82-81f1-491f-b76d-0330aba95366.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4ac37aaee85702fddacccd8c9d7efc83\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F786011%2Ffad4ed82-81f1-491f-b76d-0330aba95366.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4ac37aaee85702fddacccd8c9d7efc83\" alt=\"データ職種の全体像：役割と関係性がわかるマップ\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F786011%2Ffad4ed82-81f1-491f-b76d-0330aba95366.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=89717e4ce0b4a0d9c0be0b7787f68839 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786011/fad4ed82-81f1-491f-b76d-0330aba95366.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr data-sourcepos=\"20:1-21:0\"\u003e\n\u003ch2 data-sourcepos=\"22:1-22:15\"\u003e\n\u003cspan id=\"職種一覧\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%81%B7%E7%A8%AE%E4%B8%80%E8%A6%A7\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e職種一覧\u003c/h2\u003e\n\u003cp data-sourcepos=\"24:1-25:78\"\u003e本記事で扱うデータ関連職種の一覧です。\u003cbr\u003e\n※他にもデータに関する職種があれば、教えてください！\u003c/p\u003e\n\u003ch3 data-sourcepos=\"27:1-27:22\"\u003e\n\u003cspan id=\"実務現場系\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E5%8B%99%E7%8F%BE%E5%A0%B4%E7%B3%BB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実務・現場系\u003c/h3\u003e\n\u003col data-sourcepos=\"28:1-36:0\"\u003e\n\u003cli data-sourcepos=\"28:1-28:88\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2data-engineer\"\u003eデータエンジニア（Data Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"29:1-29:122\"\u003e\u003ca href=\"#%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2analytics-engineer\"\u003eアナリティクスエンジニア（Analytics Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"30:1-30:86\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%8A%E3%83%AA%E3%82%B9%E3%83%88data-analyst\"\u003eデータアナリスト（Data Analyst）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"31:1-31:70\"\u003e\u003ca href=\"#bi%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2bi-engineer\"\u003eBIエンジニア（BI Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"32:1-32:108\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88data-scientist\"\u003eデータサイエンティスト（Data Scientist）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"33:1-33:129\"\u003e\u003ca href=\"#ml%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2--%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2ml-engineer\"\u003eMLエンジニア / 機械学習エンジニア（ML Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"34:1-34:82\"\u003e\u003ca href=\"#mlops%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2mlops-engineer\"\u003eMLOpsエンジニア（MLOps Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"35:1-36:0\"\u003e\u003ca href=\"#ai%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2ai-engineer\"\u003eAIエンジニア（AI Engineer）\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 data-sourcepos=\"37:1-37:37\"\u003e\n\u003cspan id=\"設計アーキテクチャ系\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A8%AD%E8%A8%88%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E7%B3%BB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e設計・アーキテクチャ系\u003c/h3\u003e\n\u003col data-sourcepos=\"38:1-39:0\"\u003e\n\u003cli data-sourcepos=\"38:1-39:0\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88data-architect\"\u003eデータアーキテクト（Data Architect）\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 data-sourcepos=\"40:1-40:43\"\u003e\n\u003cspan id=\"ガバナンスマネジメント系\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AC%E3%83%90%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E7%B3%BB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eガバナンス・マネジメント系\u003c/h3\u003e\n\u003col data-sourcepos=\"41:1-44:0\"\u003e\n\u003cli data-sourcepos=\"41:1-41:93\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%81%E3%83%A5%E3%83%AF%E3%83%BC%E3%83%89data-steward\"\u003eデータスチュワード（Data Steward）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"42:1-42:93\"\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BCdata-manager\"\u003eデータマネージャー（Data Manager）\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"43:1-44:0\"\u003e\u003ca href=\"#cdochief-data-officer\"\u003eCDO（Chief Data Officer）\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr data-sourcepos=\"45:1-46:0\"\u003e\n\u003ch2 data-sourcepos=\"47:1-47:18\"\u003e\n\u003cspan id=\"職種比較表\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%81%B7%E7%A8%AE%E6%AF%94%E8%BC%83%E8%A1%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e職種比較表\u003c/h2\u003e\n\u003ctable data-sourcepos=\"49:1-62:223\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"49:1-49:64\"\u003e\n\u003cth data-sourcepos=\"49:2-49:9\"\u003e職種\u003c/th\u003e\n\u003cth data-sourcepos=\"49:11-49:24\"\u003e主な役割\u003c/th\u003e\n\u003cth data-sourcepos=\"49:26-49:45\"\u003e注力する領域\u003c/th\u003e\n\u003cth data-sourcepos=\"49:47-49:63\"\u003e主な成果物\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"51:1-51:257\"\u003e\n\u003ctd data-sourcepos=\"51:2-51:27\"\u003eデータエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:29-51:105\"\u003eデータの収集・保存・変換など、活用基盤の整備を行う\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:107-51:169\"\u003eETL/ELT、データパイプライン構築、データ提供\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:171-51:256\"\u003e整形済みのデータ基盤、データ連携仕様、パイプライン構成図\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"52:1-52:268\"\u003e\n\u003ctd data-sourcepos=\"52:2-52:39\"\u003eアナリティクスエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:41-52:135\"\u003e分析者が扱いやすい形でデータを整形・モデリングし、環境を整える\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:137-52:204\"\u003eデータモデリング、SQL変換、パイプライン自動化\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:206-52:267\"\u003eデータマート、データモデル、ドキュメント\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"53:1-53:235\"\u003e\n\u003ctd data-sourcepos=\"53:2-53:27\"\u003eデータアナリスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:29-53:126\"\u003eデータの集計・可視化を通じて、現状の把握や意思決定をサポートする\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:128-53:189\"\u003eデータ整理、レポート作成、KPIモニタリング\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:191-53:234\"\u003eダッシュボード、定量レポート\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"54:1-54:246\"\u003e\n\u003ctd data-sourcepos=\"54:2-54:20\"\u003eBIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:22-54:104\"\u003eデータの可視化やKPIの設計などを通じて、意思決定を支える\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:106-54:173\"\u003eダッシュボード設計、指標設計、データ品質管理\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:175-54:245\"\u003e可視化レポート、定期レポート、KPIダッシュボード\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"55:1-55:277\"\u003e\n\u003ctd data-sourcepos=\"55:2-55:36\"\u003eデータサイエンティスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:38-55:153\"\u003e機械学習や統計手法を使い、ビジネス課題を解決するための分析・モデル開発を行う\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:155-55:216\"\u003e仮説検証、予測モデル構築、アドホック分析\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:218-55:276\"\u003e分析レポート、予測モデル、プレゼン資料\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"56:1-56:224\"\u003e\n\u003ctd data-sourcepos=\"56:2-56:20\"\u003eMLエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"56:22-56:104\"\u003eモデルを実運用に耐える形に最適化し、システムに統合する\u003c/td\u003e\n\u003ctd data-sourcepos=\"56:106-56:172\"\u003eモデル設計・実装・最適化、CI/CD、モニタリング\u003c/td\u003e\n\u003ctd data-sourcepos=\"56:174-56:223\"\u003e本番環境モデル、API、推論システム\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"57:1-57:250\"\u003e\n\u003ctd data-sourcepos=\"57:2-57:23\"\u003eMLOpsエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"57:25-57:115\"\u003eMLモデルのライフサイクル全体を管理し、継続的な運用を実現する\u003c/td\u003e\n\u003ctd data-sourcepos=\"57:117-57:181\"\u003eパイプライン自動化、モデル監視、再学習基盤\u003c/td\u003e\n\u003ctd data-sourcepos=\"57:183-57:249\"\u003eML基盤、監視ダッシュボード、自動化スクリプト\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"58:1-58:242\"\u003e\n\u003ctd data-sourcepos=\"58:2-58:20\"\u003eAIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"58:22-58:103\"\u003eAIを実サービスに組み込み、運用できるシステムを構築する\u003c/td\u003e\n\u003ctd data-sourcepos=\"58:105-58:179\"\u003eAIモデル統合、API開発、クラウド運用、生成AI対応など\u003c/td\u003e\n\u003ctd data-sourcepos=\"58:181-58:241\"\u003eサービス実装されたAI機能、API、運用設計書\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"59:1-59:259\"\u003e\n\u003ctd data-sourcepos=\"59:2-59:30\"\u003eデータアーキテクト\u003c/td\u003e\n\u003ctd data-sourcepos=\"59:32-59:123\"\u003e全社視点でデータ戦略・設計を策定し、データ活用の基盤を整える\u003c/td\u003e\n\u003ctd data-sourcepos=\"59:125-59:195\"\u003eエンタープライズデータモデル、データフロー設計\u003c/td\u003e\n\u003ctd data-sourcepos=\"59:197-59:258\"\u003eアーキテクチャ図、データモデル、標準規約\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"60:1-60:268\"\u003e\n\u003ctd data-sourcepos=\"60:2-60:30\"\u003eデータスチュワード\u003c/td\u003e\n\u003ctd data-sourcepos=\"60:32-60:132\"\u003eデータの品質・整合性・ガバナンスを管理し、データの価値を最大化する\u003c/td\u003e\n\u003ctd data-sourcepos=\"60:134-60:201\"\u003eデータ品質管理、メタデータ管理、ポリシー策定\u003c/td\u003e\n\u003ctd data-sourcepos=\"60:203-60:267\"\u003eデータ辞書、品質レポート、ガバナンスルール\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"61:1-61:223\"\u003e\n\u003ctd data-sourcepos=\"61:2-61:30\"\u003eデータマネージャー\u003c/td\u003e\n\u003ctd data-sourcepos=\"61:32-61:108\"\u003eデータチームのマネジメントとプロジェクト推進を行う\u003c/td\u003e\n\u003ctd data-sourcepos=\"61:110-61:165\"\u003eチーム管理、プロジェクト推進、ROI管理\u003c/td\u003e\n\u003ctd data-sourcepos=\"61:167-61:222\"\u003eプロジェクト計画、チーム体制、KPI管理\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"62:1-62:223\"\u003e\n\u003ctd data-sourcepos=\"62:2-62:6\"\u003eCDO\u003c/td\u003e\n\u003ctd data-sourcepos=\"62:8-62:93\"\u003eデータ戦略の最高責任者として、全社のデータ活用を統括する\u003c/td\u003e\n\u003ctd data-sourcepos=\"62:95-62:168\"\u003eデータ戦略策定、ガバナンス体制構築、経営への活用\u003c/td\u003e\n\u003ctd data-sourcepos=\"62:170-62:222\"\u003eデータ戦略、組織体制、経営レポート\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr data-sourcepos=\"64:1-65:0\"\u003e\n\u003ch2 data-sourcepos=\"66:1-66:21\"\u003e\n\u003cspan id=\"実務現場系-1\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E5%8B%99%E7%8F%BE%E5%A0%B4%E7%B3%BB-1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実務・現場系\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"68:1-68:47\"\u003e\n\u003cspan id=\"データエンジニアdata-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2data-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータエンジニア（Data Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"70:1-70:84\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データ基盤を構築し、データを「使える状態」にする\u003c/p\u003e\n\u003cp data-sourcepos=\"72:1-72:336\"\u003eデータエンジニアは、データ分析基盤の設計・開発・運用を担当します。データはそのままでは分析できる状態ではないことが多く、データエンジニアが整理・加工することで、アナリストやサイエンティストがデータを活用できるようになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"74:1-74:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"75:1-79:0\"\u003e\n\u003cli data-sourcepos=\"75:1-75:45\"\u003eETL/ELTパイプラインの設計・開発\u003c/li\u003e\n\u003cli data-sourcepos=\"76:1-76:59\"\u003eデータウェアハウス・データレイクの構築\u003c/li\u003e\n\u003cli data-sourcepos=\"77:1-77:35\"\u003eデータ品質の監視・改善\u003c/li\u003e\n\u003cli data-sourcepos=\"78:1-79:0\"\u003eインフラ（クラウド、コンテナ）の運用\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"80:1-80:133\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: SQL、Python、クラウド（AWS/GCP/Azure）、Snowflake、Databricks、BigQuery、Airflow、Spark、dbtなど\u003c/p\u003e\n\u003cp data-sourcepos=\"82:1-82:26\"\u003e\u003cstrong\u003e他職種との違い\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable data-sourcepos=\"84:1-87:160\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"84:1-84:67\"\u003e\n\u003cth data-sourcepos=\"84:2-84:15\"\u003e比較対象\u003c/th\u003e\n\u003cth data-sourcepos=\"84:17-84:42\"\u003eデータエンジニア\u003c/th\u003e\n\u003cth data-sourcepos=\"84:44-84:66\"\u003e比較対象の役割\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"86:1-86:205\"\u003e\n\u003ctd data-sourcepos=\"86:2-86:39\"\u003eアナリティクスエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"86:41-86:117\"\u003eデータの収集・保存・パイプライン構築（上流〜中流）\u003c/td\u003e\n\u003ctd data-sourcepos=\"86:119-86:204\"\u003eデータの変換・モデリング・ドキュメント整備（中流〜下流）\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"87:1-87:160\"\u003e\n\u003ctd data-sourcepos=\"87:2-87:30\"\u003eデータアーキテクト\u003c/td\u003e\n\u003ctd data-sourcepos=\"87:32-87:93\"\u003e設計に基づいて基盤を構築・運用する実装者\u003c/td\u003e\n\u003ctd data-sourcepos=\"87:95-87:159\"\u003e全社視点でデータ戦略・設計を策定する設計者\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul data-sourcepos=\"89:1-91:0\"\u003e\n\u003cli data-sourcepos=\"89:1-89:125\"\u003eデータエンジニアとアナリティクスエンジニアは「データパイプライン」で接続される関係\u003c/li\u003e\n\u003cli data-sourcepos=\"90:1-91:0\"\u003e小規模な組織ではデータエンジニアがアーキテクトやアナリティクスエンジニアの役割も兼ねることが多い\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"92:1-92:248\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: アナリティクスエンジニア（パイプライン引き渡し）、データアーキテクト（設計レビュー）、データスチュワード（データ品質管理）、MLエンジニア（特徴量基盤）\u003c/p\u003e\n\u003chr data-sourcepos=\"94:1-95:0\"\u003e\n\u003ch3 data-sourcepos=\"96:1-96:64\"\u003e\n\u003cspan id=\"アナリティクスエンジニアanalytics-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2analytics-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eアナリティクスエンジニア（Analytics Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"98:1-98:75\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データアナリストとデータエンジニアの架け橋\u003c/p\u003e\n\u003cp data-sourcepos=\"100:1-100:321\"\u003eアナリティクスエンジニアは比較的新しい職種で、dbt（data build tool）などのツールの登場とともに確立されました。データエンジニアとデータアナリストの中間的な役割を担い、「分析しやすいデータ」を提供することに特化しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"102:1-102:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"103:1-108:0\"\u003e\n\u003cli data-sourcepos=\"103:1-103:47\"\u003edbtを使ったデータ変換処理の開発\u003c/li\u003e\n\u003cli data-sourcepos=\"104:1-104:56\"\u003eデータモデルの設計・ドキュメント整備\u003c/li\u003e\n\u003cli data-sourcepos=\"105:1-105:35\"\u003eデータ品質テストの実装\u003c/li\u003e\n\u003cli data-sourcepos=\"106:1-106:44\"\u003eセマンティックレイヤーの構築\u003c/li\u003e\n\u003cli data-sourcepos=\"107:1-108:0\"\u003eデータカタログ・メタデータ管理\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"109:1-109:96\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: SQL、dbt、Git、データモデリング、ビジネスドメイン知識\u003c/p\u003e\n\u003cp data-sourcepos=\"111:1-111:38\"\u003e\u003cstrong\u003eなぜ注目されているのか\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"112:1-115:0\"\u003e\n\u003cli data-sourcepos=\"112:1-112:116\"\u003eELTアーキテクチャの普及により、変換処理（Transform）がDWH内で行われるようになった\u003c/li\u003e\n\u003cli data-sourcepos=\"113:1-113:178\"\u003eソフトウェアエンジニアリングのベストプラクティス（バージョン管理、CI/CD、テスト）がデータ領域にも適用されるようになった\u003c/li\u003e\n\u003cli data-sourcepos=\"114:1-115:0\"\u003eLLM時代の到来により、メタデータ整備の重要性が増している\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"116:1-116:200\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データエンジニア（データソース連携）、データアナリスト（データ要件・メトリクス定義）、BIエンジニア（データマート設計）\u003c/p\u003e\n\u003chr data-sourcepos=\"118:1-119:0\"\u003e\n\u003ch3 data-sourcepos=\"120:1-120:46\"\u003e\n\u003cspan id=\"データアナリストdata-analyst\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%8A%E3%83%AA%E3%82%B9%E3%83%88data-analyst\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータアナリスト（Data Analyst）\u003c/h3\u003e\n\u003cp data-sourcepos=\"122:1-122:81\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データを分析し、ビジネスに活かす洞察を提供する\u003c/p\u003e\n\u003cp data-sourcepos=\"124:1-124:228\"\u003eデータアナリストはビジネスサイド寄りの職種です。既存データの探索・解析を行い、分析結果をレポートやダッシュボードにまとめ、ビジネス戦略の提案を行います。\u003c/p\u003e\n\u003cp data-sourcepos=\"126:1-126:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"127:1-131:0\"\u003e\n\u003cli data-sourcepos=\"127:1-127:53\"\u003eデータの可視化・ダッシュボード作成\u003c/li\u003e\n\u003cli data-sourcepos=\"128:1-128:35\"\u003eKPI分析・レポーティング\u003c/li\u003e\n\u003cli data-sourcepos=\"129:1-129:32\"\u003eA/Bテストの設計・分析\u003c/li\u003e\n\u003cli data-sourcepos=\"130:1-131:0\"\u003eビジネス課題に対する仮説検証\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"132:1-132:103\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: SQL、Excel、BIツール（Tableau、Looker、Power BI）、統計の基礎知識\u003c/p\u003e\n\u003cp data-sourcepos=\"134:1-134:26\"\u003e\u003cstrong\u003e他職種との違い\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable data-sourcepos=\"136:1-140:145\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"136:1-136:67\"\u003e\n\u003cth data-sourcepos=\"136:2-136:15\"\u003e比較対象\u003c/th\u003e\n\u003cth data-sourcepos=\"136:17-136:42\"\u003eデータアナリスト\u003c/th\u003e\n\u003cth data-sourcepos=\"136:44-136:66\"\u003e比較対象の役割\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"138:1-138:141\"\u003e\n\u003ctd data-sourcepos=\"138:2-138:20\"\u003eBIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"138:22-138:71\"\u003eデータを分析し、洞察・示唆を出す\u003c/td\u003e\n\u003ctd data-sourcepos=\"138:73-138:140\"\u003e可視化の仕組み・ダッシュボード基盤を構築する\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"139:1-139:172\"\u003e\n\u003ctd data-sourcepos=\"139:2-139:36\"\u003eデータサイエンティスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"139:38-139:99\"\u003e既存データの探索・可視化・レポーティング\u003c/td\u003e\n\u003ctd data-sourcepos=\"139:101-139:171\"\u003e統計・機械学習を用いた予測モデル構築・高度分析\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"140:1-140:145\"\u003e\n\u003ctd data-sourcepos=\"140:2-140:39\"\u003eアナリティクスエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"140:41-140:90\"\u003e整備されたデータを使って分析する\u003c/td\u003e\n\u003ctd data-sourcepos=\"140:92-140:144\"\u003e分析しやすいデータを整備・提供する\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul data-sourcepos=\"142:1-145:0\"\u003e\n\u003cli data-sourcepos=\"142:1-142:115\"\u003eデータアナリストは「分析結果を出す人」、BIエンジニアは「分析環境を整える人」\u003c/li\u003e\n\u003cli data-sourcepos=\"143:1-143:122\"\u003eデータサイエンティストとの違いは「統計・ML手法の深さ」と「予測 vs 現状把握」の違い\u003c/li\u003e\n\u003cli data-sourcepos=\"144:1-145:0\"\u003eアナリティクスエンジニアとは「データの提供者 vs 消費者」の関係\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"146:1-146:185\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: アナリティクスエンジニア（データ要件）、BIエンジニア（ダッシュボード作成）、ビジネスサイド（分析結果の活用）\u003c/p\u003e\n\u003chr data-sourcepos=\"148:1-149:0\"\u003e\n\u003ch3 data-sourcepos=\"150:1-150:38\"\u003e\n\u003cspan id=\"biエンジニアbi-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#bi%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2bi-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBIエンジニア（BI Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"152:1-152:72\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データの可視化とレポーティング基盤の構築\u003c/p\u003e\n\u003cp data-sourcepos=\"154:1-154:349\"\u003eBIエンジニアは、分析結果をビジュアル化し、ダッシュボードやレポートを通じてビジネスユーザーに提供します。データアナリストと役割が重なる部分もありますが、BIエンジニアはより技術寄りで、ツールの導入・運用やデータマートの設計も担当します。\u003c/p\u003e\n\u003cp data-sourcepos=\"156:1-156:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"157:1-161:0\"\u003e\n\u003cli data-sourcepos=\"157:1-157:40\"\u003eBIツールの導入・運用・管理\u003c/li\u003e\n\u003cli data-sourcepos=\"158:1-158:56\"\u003eダッシュボード・レポートの設計・開発\u003c/li\u003e\n\u003cli data-sourcepos=\"159:1-159:38\"\u003eデータマートの設計・実装\u003c/li\u003e\n\u003cli data-sourcepos=\"160:1-161:0\"\u003eビジネスユーザーへのトレーニング\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"162:1-162:109\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: SQL、BIツール（Tableau、Looker、Power BI、Metabase）、データモデリング\u003c/p\u003e\n\u003cp data-sourcepos=\"164:1-164:41\"\u003e\u003cstrong\u003eデータアナリストとの違い\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"165:1-167:0\"\u003e\n\u003cli data-sourcepos=\"165:1-165:77\"\u003eデータアナリストは「分析して洞察を出す」ことが主眼\u003c/li\u003e\n\u003cli data-sourcepos=\"166:1-167:0\"\u003eBIエンジニアは「可視化の仕組みを作る」ことが主眼\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"168:1-168:198\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データアナリスト（可視化要件）、アナリティクスエンジニア（データマート設計）、ビジネスサイド（ユーザートレーニング）\u003c/p\u003e\n\u003chr data-sourcepos=\"170:1-171:0\"\u003e\n\u003ch3 data-sourcepos=\"172:1-172:57\"\u003e\n\u003cspan id=\"データサイエンティストdata-scientist\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88data-scientist\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータサイエンティスト（Data Scientist）\u003c/h3\u003e\n\u003cp data-sourcepos=\"174:1-174:78\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: 統計・機械学習を用いた高度な分析とモデル構築\u003c/p\u003e\n\u003cp data-sourcepos=\"176:1-176:204\"\u003eデータサイエンティストは統計スキル寄りの職種です。ビッグデータの収集・加工、予測モデルの作成、機械学習アルゴリズムの開発などを行います。\u003c/p\u003e\n\u003cp data-sourcepos=\"178:1-178:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"179:1-183:0\"\u003e\n\u003cli data-sourcepos=\"179:1-179:56\"\u003e予測モデル・レコメンドエンジンの開発\u003c/li\u003e\n\u003cli data-sourcepos=\"180:1-180:50\"\u003e機械学習アルゴリズムの設計・実装\u003c/li\u003e\n\u003cli data-sourcepos=\"181:1-181:23\"\u003e統計的仮説検定\u003c/li\u003e\n\u003cli data-sourcepos=\"182:1-183:0\"\u003eビジネス課題の数理モデル化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"184:1-184:118\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: Python/R、統計学、機械学習、深層学習フレームワーク（TensorFlow、PyTorch）\u003c/p\u003e\n\u003cp data-sourcepos=\"186:1-186:191\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: MLエンジニア（モデル引き渡し）、データエンジニア（データ準備・特徴量基盤）、ビジネスサイド（要件定義・結果活用）\u003c/p\u003e\n\u003chr data-sourcepos=\"188:1-189:0\"\u003e\n\u003ch3 data-sourcepos=\"190:1-190:68\"\u003e\n\u003cspan id=\"mlエンジニア--機械学習エンジニアml-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#ml%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2--%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2ml-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eMLエンジニア / 機械学習エンジニア（ML Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"192:1-192:63\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: 機械学習モデルの実装とシステム統合\u003c/p\u003e\n\u003cp data-sourcepos=\"194:1-194:273\"\u003eMLエンジニア（Machine Learning Engineer）は、機械学習モデルを本番環境にデプロイし、実際に動くシステムとして統合します。データサイエンティストが作ったモデルを「動くプロダクト」にする役割です。\u003c/p\u003e\n\u003cblockquote data-sourcepos=\"196:1-196:166\"\u003e\n\u003cp data-sourcepos=\"196:3-196:166\"\u003e\u003cstrong\u003e補足\u003c/strong\u003e: 「MLエンジニア」と「機械学習エンジニア」は同じ職種を指します。ML = Machine Learning（機械学習）の頭文字です。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp data-sourcepos=\"198:1-198:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"199:1-203:0\"\u003e\n\u003cli data-sourcepos=\"199:1-199:41\"\u003e機械学習パイプラインの構築\u003c/li\u003e\n\u003cli data-sourcepos=\"200:1-200:35\"\u003eモデルのデプロイ・API化\u003c/li\u003e\n\u003cli data-sourcepos=\"201:1-201:29\"\u003eA/Bテスト基盤の構築\u003c/li\u003e\n\u003cli data-sourcepos=\"202:1-203:0\"\u003e推論システムの最適化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"204:1-204:84\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: Python、機械学習フレームワーク、Docker、API設計\u003c/p\u003e\n\u003cp data-sourcepos=\"206:1-206:26\"\u003e\u003cstrong\u003e他職種との違い\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable data-sourcepos=\"208:1-212:125\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"208:1-208:60\"\u003e\n\u003cth data-sourcepos=\"208:2-208:15\"\u003e比較対象\u003c/th\u003e\n\u003cth data-sourcepos=\"208:17-208:35\"\u003eMLエンジニア\u003c/th\u003e\n\u003cth data-sourcepos=\"208:37-208:59\"\u003e比較対象の役割\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"210:1-210:160\"\u003e\n\u003ctd data-sourcepos=\"210:2-210:36\"\u003eデータサイエンティスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"210:38-210:102\"\u003eモデルを本番環境で動かす（実装・デプロイ）\u003c/td\u003e\n\u003ctd data-sourcepos=\"210:104-210:159\"\u003eモデルを作る・研究する（分析・実験）\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"211:1-211:138\"\u003e\n\u003ctd data-sourcepos=\"211:2-211:23\"\u003eMLOpsエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"211:25-211:80\"\u003eモデルのデプロイ・API化・システム統合\u003c/td\u003e\n\u003ctd data-sourcepos=\"211:82-211:137\"\u003eモデルの継続運用・監視・再学習自動化\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"212:1-212:125\"\u003e\n\u003ctd data-sourcepos=\"212:2-212:20\"\u003eAIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"212:22-212:65\"\u003e機械学習モデルに特化した実装\u003c/td\u003e\n\u003ctd data-sourcepos=\"212:67-212:124\"\u003eLLM含むAI全般のシステム統合・アプリ開発\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul data-sourcepos=\"214:1-217:0\"\u003e\n\u003cli data-sourcepos=\"214:1-214:75\"\u003eデータサイエンティストとは「作る vs 動かす」の関係\u003c/li\u003e\n\u003cli data-sourcepos=\"215:1-215:77\"\u003eMLOpsエンジニアとは「初回デプロイ vs 継続運用」の関係\u003c/li\u003e\n\u003cli data-sourcepos=\"216:1-217:0\"\u003eAIエンジニアとは「ML特化 vs AI全般（LLM含む）」の範囲の違い\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"218:1-218:170\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データサイエンティスト（モデル受け取り）、MLOpsエンジニア（運用引き継ぎ）、SWEチーム（システム統合）\u003c/p\u003e\n\u003chr data-sourcepos=\"220:1-221:0\"\u003e\n\u003ch3 data-sourcepos=\"222:1-222:44\"\u003e\n\u003cspan id=\"mlopsエンジニアmlops-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#mlops%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2mlops-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eMLOpsエンジニア（MLOps Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"224:1-224:66\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: 機械学習モデルの継続的な運用を支える\u003c/p\u003e\n\u003cp data-sourcepos=\"226:1-226:215\"\u003eMLOpsエンジニアは、MLエンジニアの中でも特に運用（Operations）に特化した職種です。モデルのライフサイクル全体を管理し、継続的なデリバリーを実現します。\u003c/p\u003e\n\u003cp data-sourcepos=\"228:1-228:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"229:1-234:0\"\u003e\n\u003cli data-sourcepos=\"229:1-229:45\"\u003eMLパイプラインの自動化（CI/CD）\u003c/li\u003e\n\u003cli data-sourcepos=\"230:1-230:35\"\u003eモデルのバージョン管理\u003c/li\u003e\n\u003cli data-sourcepos=\"231:1-231:35\"\u003e推論基盤のスケーリング\u003c/li\u003e\n\u003cli data-sourcepos=\"232:1-232:41\"\u003eモデルドリフトの検知・対応\u003c/li\u003e\n\u003cli data-sourcepos=\"233:1-234:0\"\u003eモデルの再学習・更新の自動化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"235:1-235:92\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: Python、Docker、Kubernetes、MLflow、Kubeflow、クラウドML基盤\u003c/p\u003e\n\u003cp data-sourcepos=\"237:1-237:34\"\u003e\u003cstrong\u003eMLエンジニアとの違い\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"238:1-240:0\"\u003e\n\u003cli data-sourcepos=\"238:1-238:73\"\u003eMLエンジニアは「モデルをデプロイする」ことが主眼\u003c/li\u003e\n\u003cli data-sourcepos=\"239:1-240:0\"\u003eMLOpsエンジニアは「モデルを運用し続ける」ことが主眼\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"241:1-241:171\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: MLエンジニア（運用設計）、SRE/インフラチーム（インフラ連携）、データエンジニア（パイプライン自動化）\u003c/p\u003e\n\u003chr data-sourcepos=\"243:1-244:0\"\u003e\n\u003ch3 data-sourcepos=\"245:1-245:38\"\u003e\n\u003cspan id=\"aiエンジニアai-engineer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#ai%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2ai-engineer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eAIエンジニア（AI Engineer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"247:1-247:59\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: AI技術全般を活用したシステム開発\u003c/p\u003e\n\u003cp data-sourcepos=\"249:1-249:269\"\u003eAIエンジニアは、機械学習を含むAI（人工知能）全般を対象とした職種です。MLエンジニアよりも広い範囲をカバーし、LLM（大規模言語モデル）やコンピュータビジョンなど、多様なAI技術を扱います。\u003c/p\u003e\n\u003cp data-sourcepos=\"251:1-251:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"252:1-256:0\"\u003e\n\u003cli data-sourcepos=\"252:1-252:50\"\u003eLLMを活用したアプリケーション開発\u003c/li\u003e\n\u003cli data-sourcepos=\"253:1-253:50\"\u003eRAG（Retrieval-Augmented Generation）の実装\u003c/li\u003e\n\u003cli data-sourcepos=\"254:1-254:41\"\u003eプロンプトエンジニアリング\u003c/li\u003e\n\u003cli data-sourcepos=\"255:1-256:0\"\u003eAIサービスのAPI統合\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"257:1-257:108\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: Python、LLM API（OpenAI、Claude、Gemini）、ベクトルDB、プロンプト設計\u003c/p\u003e\n\u003cp data-sourcepos=\"259:1-260:311\"\u003e\u003cstrong\u003e2025-2026年のトレンド\u003c/strong\u003e:\u003cbr\u003e\nLLMの普及により、AIエンジニアの役割は大きく変化しています。従来の機械学習モデル開発に加え、LLMを活用したアプリケーション開発が主要な業務になりつつあります。「LLMOpsエンジニア」という新たな専門職も登場しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"262:1-262:175\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: MLエンジニア（ML技術連携）、プロダクトマネージャー（プロダクト要件）、SWEチーム（API設計・システム統合）\u003c/p\u003e\n\u003chr data-sourcepos=\"264:1-265:0\"\u003e\n\u003ch2 data-sourcepos=\"266:1-266:36\"\u003e\n\u003cspan id=\"設計アーキテクチャ系-1\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A8%AD%E8%A8%88%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E7%B3%BB-1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e設計・アーキテクチャ系\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"268:1-268:51\"\u003e\n\u003cspan id=\"データアーキテクトdata-architect\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88data-architect\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータアーキテクト（Data Architect）\u003c/h3\u003e\n\u003cp data-sourcepos=\"270:1-270:72\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データ基盤の全体設計とアーキテクチャ策定\u003c/p\u003e\n\u003cp data-sourcepos=\"272:1-272:279\"\u003eデータアーキテクトは、ビジネス要件やデータ戦略に基づいて全体的なデータアーキテクチャを設計します。DMBOK2では「データアーキテクチャとデータ統合を担当する上級アナリスト」と定義されています。\u003c/p\u003e\n\u003cp data-sourcepos=\"274:1-274:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"275:1-280:0\"\u003e\n\u003cli data-sourcepos=\"275:1-275:53\"\u003eエンタープライズデータモデルの作成\u003c/li\u003e\n\u003cli data-sourcepos=\"276:1-276:44\"\u003eシステム間のデータフロー設計\u003c/li\u003e\n\u003cli data-sourcepos=\"277:1-277:53\"\u003eデータモデリングのルール・標準策定\u003c/li\u003e\n\u003cli data-sourcepos=\"278:1-278:38\"\u003e用語・ドメイン一覧の整備\u003c/li\u003e\n\u003cli data-sourcepos=\"279:1-280:0\"\u003eデータ統合戦略の策定\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"281:1-281:123\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: データモデリング、システムアーキテクチャ、クラウド基盤、ビジネス理解\u003c/p\u003e\n\u003cp data-sourcepos=\"283:1-283:41\"\u003e\u003cstrong\u003eデータエンジニアとの違い\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable data-sourcepos=\"285:1-290:88\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"285:1-285:67\"\u003e\n\u003cth data-sourcepos=\"285:2-285:9\"\u003e観点\u003c/th\u003e\n\u003cth data-sourcepos=\"285:11-285:36\"\u003eデータエンジニア\u003c/th\u003e\n\u003cth data-sourcepos=\"285:38-285:66\"\u003eデータアーキテクト\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"287:1-287:91\"\u003e\n\u003ctd data-sourcepos=\"287:2-287:9\"\u003e視点\u003c/td\u003e\n\u003ctd data-sourcepos=\"287:11-287:48\"\u003eプロジェクト・チーム単位\u003c/td\u003e\n\u003ctd data-sourcepos=\"287:50-287:90\"\u003e全社・エンタープライズ単位\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"288:1-288:130\"\u003e\n\u003ctd data-sourcepos=\"288:2-288:18\"\u003e主な成果物\u003c/td\u003e\n\u003ctd data-sourcepos=\"288:20-288:66\"\u003eパイプライン、DWH、データマート\u003c/td\u003e\n\u003ctd data-sourcepos=\"288:68-288:129\"\u003eアーキテクチャ図、データモデル、標準規約\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"289:1-289:76\"\u003e\n\u003ctd data-sourcepos=\"289:2-289:18\"\u003e関わる期間\u003c/td\u003e\n\u003ctd data-sourcepos=\"289:20-289:48\"\u003e継続的な開発・運用\u003c/td\u003e\n\u003ctd data-sourcepos=\"289:50-289:75\"\u003e設計フェーズ中心\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"290:1-290:88\"\u003e\n\u003ctd data-sourcepos=\"290:2-290:18\"\u003eスキル重心\u003c/td\u003e\n\u003ctd data-sourcepos=\"290:20-290:48\"\u003e実装・コーディング\u003c/td\u003e\n\u003ctd data-sourcepos=\"290:50-290:87\"\u003e設計・ドキュメント・調整\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"292:1-292:204\"\u003e小〜中規模の組織ではデータエンジニアがアーキテクトを兼任することも多く、大規模な組織になると専任のアーキテクトが置かれる傾向があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"294:1-294:168\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データエンジニア（設計レビュー・実装指示）、データスチュワード（ガバナンス連携）、CDO（戦略策定）\u003c/p\u003e\n\u003chr data-sourcepos=\"296:1-297:0\"\u003e\n\u003ch2 data-sourcepos=\"298:1-298:42\"\u003e\n\u003cspan id=\"ガバナンスマネジメント系-1\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AC%E3%83%90%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E7%B3%BB-1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eガバナンス・マネジメント系\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"300:1-300:49\"\u003e\n\u003cspan id=\"データスチュワードdata-steward\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%81%E3%83%A5%E3%83%AF%E3%83%BC%E3%83%89data-steward\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータスチュワード（Data Steward）\u003c/h3\u003e\n\u003cp data-sourcepos=\"302:1-302:75\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データの品質・整合性・ガバナンスを管理する\u003c/p\u003e\n\u003cp data-sourcepos=\"304:1-304:297\"\u003eデータスチュワードは、特定のデータソースやデータ領域に対して責任を持ち、データの品質と整合性を管理します。データの価値を最大化するために、メタデータ、ドキュメント、利用ルール・ポリシーを管理します。\u003c/p\u003e\n\u003cp data-sourcepos=\"306:1-306:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"307:1-312:0\"\u003e\n\u003cli data-sourcepos=\"307:1-307:35\"\u003eデータ品質の監視・改善\u003c/li\u003e\n\u003cli data-sourcepos=\"308:1-308:44\"\u003eメタデータ・データ辞書の管理\u003c/li\u003e\n\u003cli data-sourcepos=\"309:1-309:47\"\u003eデータ利用ポリシーの策定・運用\u003c/li\u003e\n\u003cli data-sourcepos=\"310:1-310:50\"\u003eデータ活用者からの要件ヒアリング\u003c/li\u003e\n\u003cli data-sourcepos=\"311:1-312:0\"\u003e部門間のデータ要件の調整\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"313:1-313:99\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: 業務ドメイン知識、データ品質管理、コミュニケーション\u003c/p\u003e\n\u003cp data-sourcepos=\"315:1-316:264\"\u003e\u003cstrong\u003e日本での現状\u003c/strong\u003e:\u003cbr\u003e\n日本ではデータスチュワードシップへの関心は比較的低く、本来なら複数のデータスチュワードが分担すべき役割を、データエンジニアやデータアーキテクトが兼任していることが多い状況です。\u003c/p\u003e\n\u003cp data-sourcepos=\"318:1-318:159\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データエンジニア（品質管理）、データアーキテクト（ガバナンス連携）、各事業部門（要件調整）\u003c/p\u003e\n\u003chr data-sourcepos=\"320:1-321:0\"\u003e\n\u003ch3 data-sourcepos=\"322:1-322:49\"\u003e\n\u003cspan id=\"データマネージャーdata-manager\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BCdata-manager\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータマネージャー（Data Manager）\u003c/h3\u003e\n\u003cp data-sourcepos=\"324:1-324:78\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データチームのマネジメントとプロジェクト推進\u003c/p\u003e\n\u003cp data-sourcepos=\"326:1-326:192\"\u003eデータマネージャーは、データ関連のプロジェクトやチームを管理する役職です。技術と経営の橋渡しを行い、データ活用の推進を担います。\u003c/p\u003e\n\u003cp data-sourcepos=\"328:1-328:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"329:1-334:0\"\u003e\n\u003cli data-sourcepos=\"329:1-329:41\"\u003eデータチームのマネジメント\u003c/li\u003e\n\u003cli data-sourcepos=\"330:1-330:47\"\u003eデータプロジェクトの計画・推進\u003c/li\u003e\n\u003cli data-sourcepos=\"331:1-331:38\"\u003eステークホルダーとの調整\u003c/li\u003e\n\u003cli data-sourcepos=\"332:1-332:29\"\u003eデータ活用のROI管理\u003c/li\u003e\n\u003cli data-sourcepos=\"333:1-334:0\"\u003e採用・育成\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"335:1-335:144\"\u003e\u003cstrong\u003e必要スキル\u003c/strong\u003e: プロジェクトマネジメント、チームマネジメント、データリテラシー、コミュニケーション\u003c/p\u003e\n\u003cp data-sourcepos=\"337:1-337:156\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: 全データ職種（チーム運営）、経営層（リソース確保）、ステークホルダー（プロジェクト調整）\u003c/p\u003e\n\u003chr data-sourcepos=\"339:1-340:0\"\u003e\n\u003ch3 data-sourcepos=\"341:1-341:31\"\u003e\n\u003cspan id=\"cdochief-data-officer\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#cdochief-data-officer\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eCDO（Chief Data Officer）\u003c/h3\u003e\n\u003cp data-sourcepos=\"343:1-343:45\"\u003e\u003cstrong\u003e役割\u003c/strong\u003e: データ戦略の最高責任者\u003c/p\u003e\n\u003cp data-sourcepos=\"345:1-345:300\"\u003eCDO（Chief Data Officer：最高データ責任者）は、企業データから最大のビジネス価値を得ることを担う経営幹部です。データ戦略を策定し、データガバナンス、データ品質、データ分析、データセキュリティなどを統括します。\u003c/p\u003e\n\u003cblockquote data-sourcepos=\"347:1-347:179\"\u003e\n\u003cp data-sourcepos=\"347:3-347:179\"\u003e\u003cstrong\u003e注意\u003c/strong\u003e: CDOには「Chief Digital Officer（最高デジタル責任者）」という別の役職もあります。本記事では「Chief Data Officer」を指します。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp data-sourcepos=\"349:1-349:17\"\u003e\u003cstrong\u003e主な業務\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"350:1-355:0\"\u003e\n\u003cli data-sourcepos=\"350:1-350:32\"\u003e全社データ戦略の策定\u003c/li\u003e\n\u003cli data-sourcepos=\"351:1-351:41\"\u003eデータガバナンス体制の構築\u003c/li\u003e\n\u003cli data-sourcepos=\"352:1-352:41\"\u003eデータ活用による収益化推進\u003c/li\u003e\n\u003cli data-sourcepos=\"353:1-353:44\"\u003e経営の意思決定へのデータ活用\u003c/li\u003e\n\u003cli data-sourcepos=\"354:1-355:0\"\u003eデータ人材の育成・組織構築\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"356:1-356:35\"\u003e\u003cstrong\u003e日本企業での設置状況\u003c/strong\u003e:\u003c/p\u003e\n\u003cul data-sourcepos=\"357:1-360:0\"\u003e\n\u003cli data-sourcepos=\"357:1-357:113\"\u003eCDO Club Japanの調査によると、日本国内のCDO設置率は「専任」で16％、「兼任」で26％\u003c/li\u003e\n\u003cli data-sourcepos=\"358:1-358:63\"\u003e役員レベルで採用している企業は3.3%に留まる\u003c/li\u003e\n\u003cli data-sourcepos=\"359:1-360:0\"\u003e欧米に比べて設置率は低いが、DX推進の流れで増加傾向\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"361:1-362:218\"\u003e\u003cstrong\u003eAI時代のCDOの進化\u003c/strong\u003e:\u003cbr\u003e\n近年、CDOの役割は「Chief Data \u0026amp; Analytics Officer（CDAO）」へと拡張されつつあります。さらに、AI戦略を担う「CAIO（Chief AI Officer）」を設置する動きも出始めています。\u003c/p\u003e\n\u003cp data-sourcepos=\"364:1-364:147\"\u003e\u003cstrong\u003e協業する職種\u003c/strong\u003e: データマネージャー（組織運営）、データアーキテクト（戦略実行）、経営層（意思決定）\u003c/p\u003e\n\u003chr data-sourcepos=\"366:1-367:0\"\u003e\n\u003ch2 data-sourcepos=\"368:1-368:30\"\u003e\n\u003cspan id=\"2025-2026年のトレンド\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#2025-2026%E5%B9%B4%E3%81%AE%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e2025-2026年のトレンド\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"370:1-370:34\"\u003e\n\u003cspan id=\"1-職種の境界が曖昧に\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#1-%E8%81%B7%E7%A8%AE%E3%81%AE%E5%A2%83%E7%95%8C%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e1. 職種の境界が曖昧に\u003c/h3\u003e\n\u003cp data-sourcepos=\"372:1-372:284\"\u003eAI技術の進化に伴い、各職種の役割は統合的になりつつあります。データサイエンティストがパイプライン構築まで行ったり、データエンジニアがモデルデプロイを担当したりと、境界線は曖昧になっています。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"374:1-374:22\"\u003e\n\u003cspan id=\"2-llmopsの台頭\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#2-llmops%E3%81%AE%E5%8F%B0%E9%A0%AD\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e2. LLMOpsの台頭\u003c/h3\u003e\n\u003cp data-sourcepos=\"376:1-376:114\"\u003e大規模言語モデル（LLM）の普及により、従来のMLOpsとは異なる課題が生まれています:\u003c/p\u003e\n\u003cul data-sourcepos=\"377:1-381:0\"\u003e\n\u003cli data-sourcepos=\"377:1-377:86\"\u003eプロンプトエンジニアリング / コンテキストエンジニアリング\u003c/li\u003e\n\u003cli data-sourcepos=\"378:1-378:62\"\u003eRAG（Retrieval-Augmented Generation）アーキテクチャ\u003c/li\u003e\n\u003cli data-sourcepos=\"379:1-379:32\"\u003eハルシネーション対策\u003c/li\u003e\n\u003cli data-sourcepos=\"380:1-381:0\"\u003e推論コストの最適化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"382:1-382:99\"\u003eこれに対応する「LLMOpsエンジニア」という新たな役割も登場しています。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"384:1-384:58\"\u003e\n\u003cspan id=\"3-アナリティクスエンジニアの需要拡大\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#3-%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E9%9C%80%E8%A6%81%E6%8B%A1%E5%A4%A7\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e3. アナリティクスエンジニアの需要拡大\u003c/h3\u003e\n\u003cp data-sourcepos=\"386:1-386:147\"\u003edbtを中心としたModern Data Stackの普及により、アナリティクスエンジニアの需要は急速に拡大しています。特に:\u003c/p\u003e\n\u003cul data-sourcepos=\"387:1-390:0\"\u003e\n\u003cli data-sourcepos=\"387:1-387:53\"\u003eデータ品質・信頼性への関心の高まり\u003c/li\u003e\n\u003cli data-sourcepos=\"388:1-388:58\"\u003eセルフサービスBI実現のためのデータ整備\u003c/li\u003e\n\u003cli data-sourcepos=\"389:1-390:0\"\u003eLLM活用のためのメタデータ整備\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"391:1-391:61\"\u003e\n\u003cspan id=\"4-ビジネスサイドのデータリテラシー向上\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#4-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%83%86%E3%83%A9%E3%82%B7%E3%83%BC%E5%90%91%E4%B8%8A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e4. ビジネスサイドのデータリテラシー向上\u003c/h3\u003e\n\u003cp data-sourcepos=\"393:1-393:221\"\u003eLLMの登場により、データサイエンティストだけでなく、ビジネスチームやプロダクトマネージャーがAI駆動アプリケーションに積極的に関わるようになっています。\u003c/p\u003e\n\u003chr data-sourcepos=\"395:1-396:0\"\u003e\n\u003ch2 data-sourcepos=\"397:1-397:30\"\u003e\n\u003cspan id=\"キャリア選択の指針\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2%E9%81%B8%E6%8A%9E%E3%81%AE%E6%8C%87%E9%87%9D\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eキャリア選択の指針\u003c/h2\u003e\n\u003cp data-sourcepos=\"399:1-399:88\"\u003eどの職種を選ぶべきかは、自分の興味や強みによって異なります:\u003c/p\u003e\n\u003ctable data-sourcepos=\"401:1-413:88\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"401:1-401:40\"\u003e\n\u003cth data-sourcepos=\"401:2-401:18\"\u003e興味・志向\u003c/th\u003e\n\u003cth data-sourcepos=\"401:20-401:39\"\u003eおすすめ職種\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"403:1-403:76\"\u003e\n\u003ctd data-sourcepos=\"403:2-403:48\"\u003eデータ基盤・インフラを作りたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"403:50-403:75\"\u003eデータエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"404:1-404:88\"\u003e\n\u003ctd data-sourcepos=\"404:2-404:48\"\u003e分析しやすいデータを整備したい\u003c/td\u003e\n\u003ctd data-sourcepos=\"404:50-404:87\"\u003eアナリティクスエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"405:1-405:76\"\u003e\n\u003ctd data-sourcepos=\"405:2-405:48\"\u003eビジネス課題を分析で解決したい\u003c/td\u003e\n\u003ctd data-sourcepos=\"405:50-405:75\"\u003eデータアナリスト\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"406:1-406:72\"\u003e\n\u003ctd data-sourcepos=\"406:2-406:51\"\u003eダッシュボード・可視化を極めたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"406:53-406:71\"\u003eBIエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"407:1-407:82\"\u003e\n\u003ctd data-sourcepos=\"407:2-407:45\"\u003e予測モデル・統計分析をしたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"407:47-407:81\"\u003eデータサイエンティスト\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"408:1-408:65\"\u003e\n\u003ctd data-sourcepos=\"408:2-408:44\"\u003eMLモデルをプロダクトにしたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"408:46-408:64\"\u003eMLエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"409:1-409:65\"\u003e\n\u003ctd data-sourcepos=\"409:2-409:41\"\u003eMLの運用・自動化を極めたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"409:43-409:64\"\u003eMLOpsエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"410:1-410:53\"\u003e\n\u003ctd data-sourcepos=\"410:2-410:32\"\u003eLLM・AI全般を扱いたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"410:34-410:52\"\u003eAIエンジニア\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"411:1-411:85\"\u003e\n\u003ctd data-sourcepos=\"411:2-411:54\"\u003e全体設計・アーキテクチャを担いたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"411:56-411:84\"\u003eデータアーキテクト\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"412:1-412:82\"\u003e\n\u003ctd data-sourcepos=\"412:2-412:51\"\u003eデータ品質・ガバナンスを担いたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"412:53-412:81\"\u003eデータスチュワード\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"413:1-413:88\"\u003e\n\u003ctd data-sourcepos=\"413:2-413:51\"\u003eチーム・組織をマネジメントしたい\u003c/td\u003e\n\u003ctd data-sourcepos=\"413:53-413:87\"\u003eデータマネージャー / CDO\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr data-sourcepos=\"415:1-416:0\"\u003e\n\u003ch2 data-sourcepos=\"417:1-417:30\"\u003e\n\u003cspan id=\"職種間の協業マップ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%81%B7%E7%A8%AE%E9%96%93%E3%81%AE%E5%8D%94%E6%A5%AD%E3%83%9E%E3%83%83%E3%83%97\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e職種間の協業マップ\u003c/h2\u003e\n\u003cp data-sourcepos=\"419:1-419:84\"\u003e各職種がどの職種と協業しやすいかを一覧表にまとめました。\u003c/p\u003e\n\u003ctable data-sourcepos=\"421:1-434:124\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"421:1-421:58\"\u003e\n\u003cth data-sourcepos=\"421:2-421:9\"\u003e職種\u003c/th\u003e\n\u003cth data-sourcepos=\"421:11-421:30\"\u003e主な協業相手\u003c/th\u003e\n\u003cth data-sourcepos=\"421:32-421:57\"\u003e協業の内容・場面\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"423:1-423:203\"\u003e\n\u003ctd data-sourcepos=\"423:2-423:27\"\u003eデータエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"423:29-423:112\"\u003eAE、データアーキテクト、データスチュワード、MLエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"423:114-423:202\"\u003eパイプライン引き渡し、設計レビュー、データ品質、特徴量基盤\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"424:1-424:170\"\u003e\n\u003ctd data-sourcepos=\"424:2-424:39\"\u003eアナリティクスエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"424:41-424:91\"\u003eDE、データアナリスト、BIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"424:93-424:169\"\u003eデータソース連携、メトリクス定義、データマート設計\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"425:1-425:143\"\u003e\n\u003ctd data-sourcepos=\"425:2-425:27\"\u003eデータアナリスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"425:29-425:76\"\u003eAE、BIエンジニア、ビジネスサイド\u003c/td\u003e\n\u003ctd data-sourcepos=\"425:78-425:142\"\u003eデータ要件、ダッシュボード、分析結果の活用\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"426:1-426:155\"\u003e\n\u003ctd data-sourcepos=\"426:2-426:20\"\u003eBIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"426:22-426:76\"\u003eデータアナリスト、AE、ビジネスサイド\u003c/td\u003e\n\u003ctd data-sourcepos=\"426:78-426:154\"\u003e可視化要件、データマート設計、ユーザートレーニング\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"427:1-427:143\"\u003e\n\u003ctd data-sourcepos=\"427:2-427:36\"\u003eデータサイエンティスト\u003c/td\u003e\n\u003ctd data-sourcepos=\"427:38-427:85\"\u003eMLエンジニア、DE、ビジネスサイド\u003c/td\u003e\n\u003ctd data-sourcepos=\"427:87-427:142\"\u003eモデル引き渡し、データ準備、要件定義\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"428:1-428:130\"\u003e\n\u003ctd data-sourcepos=\"428:2-428:20\"\u003eMLエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"428:22-428:63\"\u003eDS、MLOpsエンジニア、SWEチーム\u003c/td\u003e\n\u003ctd data-sourcepos=\"428:65-428:129\"\u003eモデル受け取り、運用引き継ぎ、システム統合\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"429:1-429:134\"\u003e\n\u003ctd data-sourcepos=\"429:2-429:23\"\u003eMLOpsエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"429:25-429:67\"\u003eMLエンジニア、SRE/インフラ、DE\u003c/td\u003e\n\u003ctd data-sourcepos=\"429:69-429:133\"\u003e運用設計、インフラ連携、パイプライン自動化\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"430:1-430:114\"\u003e\n\u003ctd data-sourcepos=\"430:2-430:20\"\u003eAIエンジニア\u003c/td\u003e\n\u003ctd data-sourcepos=\"430:22-430:60\"\u003eMLエンジニア、PM、SWEチーム\u003c/td\u003e\n\u003ctd data-sourcepos=\"430:62-430:113\"\u003eML技術連携、プロダクト要件、API設計\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"431:1-431:132\"\u003e\n\u003ctd data-sourcepos=\"431:2-431:30\"\u003eデータアーキテクト\u003c/td\u003e\n\u003ctd data-sourcepos=\"431:32-431:71\"\u003eDE、データスチュワード、CDO\u003c/td\u003e\n\u003ctd data-sourcepos=\"431:73-431:131\"\u003e設計レビュー、ガバナンス連携、戦略策定\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"432:1-432:138\"\u003e\n\u003ctd data-sourcepos=\"432:2-432:30\"\u003eデータスチュワード\u003c/td\u003e\n\u003ctd data-sourcepos=\"432:32-432:83\"\u003eDE、データアーキテクト、各事業部門\u003c/td\u003e\n\u003ctd data-sourcepos=\"432:85-432:137\"\u003e品質管理、ガバナンス連携、要件調整\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"433:1-433:157\"\u003e\n\u003ctd data-sourcepos=\"433:2-433:30\"\u003eデータマネージャー\u003c/td\u003e\n\u003ctd data-sourcepos=\"433:32-433:90\"\u003e全データ職種、経営層、ステークホルダー\u003c/td\u003e\n\u003ctd data-sourcepos=\"433:92-433:156\"\u003eチーム運営、リソース確保、プロジェクト調整\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"434:1-434:124\"\u003e\n\u003ctd data-sourcepos=\"434:2-434:6\"\u003eCDO\u003c/td\u003e\n\u003ctd data-sourcepos=\"434:8-434:78\"\u003eデータマネージャー、データアーキテクト、経営層\u003c/td\u003e\n\u003ctd data-sourcepos=\"434:80-434:123\"\u003e組織運営、戦略実行、意思決定\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp data-sourcepos=\"436:1-436:198\"\u003e※略称: DE=データエンジニア、AE=アナリティクスエンジニア、DS=データサイエンティスト、PM=プロダクトマネージャー、SWE=ソフトウェアエンジニア\u003c/p\u003e\n\u003chr data-sourcepos=\"438:1-439:0\"\u003e\n\u003ch2 data-sourcepos=\"440:1-440:12\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h2\u003e\n\u003cul data-sourcepos=\"442:1-449:0\"\u003e\n\u003cli data-sourcepos=\"442:1-442:120\"\u003eデータエンジニア、データアナリスト、データサイエンティストは従来からある3大職種\u003c/li\u003e\n\u003cli data-sourcepos=\"443:1-443:146\"\u003eアナリティクスエンジニアはdbtの登場とともに確立された比較的新しい職種で、急速に需要が拡大している\u003c/li\u003e\n\u003cli data-sourcepos=\"444:1-444:121\"\u003eMLエンジニア（機械学習エンジニア）、MLOpsエンジニア、AIエンジニアはML/AI領域の専門職\u003c/li\u003e\n\u003cli data-sourcepos=\"445:1-445:80\"\u003eデータアーキテクトは設計・アーキテクチャを担う上級職\u003c/li\u003e\n\u003cli data-sourcepos=\"446:1-446:116\"\u003eデータスチュワード、データマネージャー、CDOはガバナンス・マネジメント系の職種\u003c/li\u003e\n\u003cli data-sourcepos=\"447:1-447:101\"\u003e職種間の境界は曖昧になりつつあり、複合的なスキルが求められる時代に\u003c/li\u003e\n\u003cli data-sourcepos=\"448:1-449:0\"\u003e自分の興味・強みに合わせてキャリアを選択することが重要\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr data-sourcepos=\"450:1-451:0\"\u003e\n\u003ch2 data-sourcepos=\"452:1-452:9\"\u003e\n\u003cspan id=\"余談\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BD%99%E8%AB%87\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e余談\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"454:1-454:37\"\u003e\n\u003cspan id=\"筆者のバックグラウンド\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%AD%86%E8%80%85%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e筆者のバックグラウンド\u003c/h3\u003e\n\u003cp data-sourcepos=\"456:1-457:210\"\u003eまず、私自身のバックグラウンドは、データサイエンティストから入り(といってもテーブルデータ中心の経験が主で、広く薄くです)、がっつりデータエンジニア/データアーキテクト、部分的にデータアナリストって感じです。\u003cbr\u003e\n2社目ではdbtもゴリゴリ(Claude Codeと一緒に)触り、ML系、MLOps、LLMOpsとかもしています。いわゆる器用貧乏ってやつですね。秀でていないのがいつも辛いです。\u003c/p\u003e\n\u003cp data-sourcepos=\"459:1-459:427\"\u003eアルアル？なのかもしれないのですが、データがあるからなんか出してくれって感じでデータサイエンティストを始めて(今思えば、入り方おかしいですよね...)、データがめちゃくちゃなのに絶望してデータエンジニアリングしたって経歴です(アルアルだと信じているので、共感してくだされば、いいねください笑)。\u003c/p\u003e\n\u003cp data-sourcepos=\"461:1-461:603\"\u003e各ロールに対して、合う合わないがあると思っているんですが、性格的にはデータエンジニアとか結構カッチリしていて性には合っていると思っています。ただ、これって、データエンジニアに限らず自分がそういう性格なのかもしれない？という気持ちはあります。一昔前はjupyter notebookでグリグリ実験してなんか出た！っていうのがどうしても許せなくて、データサイエンティスト(今思えば視野が狭すぎる)向いていないなーと思っていました。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"463:1-463:58\"\u003e\n\u003cspan id=\"他のロールとの協業について思うこと\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BB%96%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AE%E5%8D%94%E6%A5%AD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e他のロールとの協業について、思うこと\u003c/h3\u003e\n\u003cp data-sourcepos=\"465:1-468:349\"\u003e他ロールとの協業ですが、自身がデータエンジニアとして、データアナリストとやりとりしたり、データサイエンティストとしてデータエンジニアとやりとりをしたことはありますが、自分が器用貧乏職人極めているので、コミュニケーションで困ったことはありませんでした。\u003cbr\u003e\n似たような職種だから、相手の気持ちもわかることが多かったです。\u003cbr\u003e\nもっと大きい組織や細分化された中で働いてみるのもいい経験なのかな、と自分の経歴の弱さに不安に思うこともあります...\u003cbr\u003e\nそういう意味では、ビジネスサイドとのコミュニケーションは下手くそ過ぎて、辛い思いをしたことは何度もあります。難しいこと、余計なことを言ってしまったり、逆に説明不足すぎて、後々認識の齟齬があったり。これは永遠の課題だなと思っています...!\u003c/p\u003e\n\u003ch3 data-sourcepos=\"470:1-470:67\"\u003e\n\u003cspan id=\"これからのデータ系ロールについて思うこと\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E7%B3%BB%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこれからのデータ系ロールについて、思うこと\u003c/h3\u003e\n\u003cp data-sourcepos=\"472:1-473:165\"\u003eここからは完全にポエムです。\u003cbr\u003e\n薄く広く経験したデータ系の仕事に少しでも恩返ししたいなって気持ちはありまして、個人的に情報を整理してみました。\u003c/p\u003e\n\u003cp data-sourcepos=\"475:1-477:138\"\u003e生成AI、LLMの台頭で、データ系のロールの重要性や変化は益々生じると思っています。\u003cbr\u003e\nデータスチュワードやデータマネージャーの役割は多くなり、作業に重きのあるロールは、これらに吸収されるかもしれません。\u003cbr\u003e\nまた、LLMOpsエンジニアや、LLM関連のロールは技術やツール、仕組みの発展から生じるかもしれません。\u003c/p\u003e\n\u003cp data-sourcepos=\"479:1-479:204\"\u003e個人的には器用貧乏ながら、弱い部分はLLMで補いやすくなった環境はワクワクすることが多いです。過渡期なので、瞬間的な楽しさかもしれませんが...\u003c/p\u003e\n\u003ch3 data-sourcepos=\"481:1-481:34\"\u003e\n\u003cspan id=\"読んでくださった方へ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%A3%E3%81%9F%E6%96%B9%E3%81%B8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e読んでくださった方へ\u003c/h3\u003e\n\u003cp data-sourcepos=\"483:1-483:231\"\u003eもし、こんなロール知っている！や経験している！がありましたら、後学のためにご教示くださいますと幸いです。内容の訂正もありましたら、遠慮なく教えてください。\u003c/p\u003e\n\u003chr data-sourcepos=\"485:1-486:0\"\u003e\n\u003ch2 data-sourcepos=\"487:1-487:18\"\u003e\n\u003cspan id=\"参考リンク\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e参考リンク\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"489:1-489:16\"\u003e\n\u003cspan id=\"職種全般\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%81%B7%E7%A8%AE%E5%85%A8%E8%88%AC\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e職種全般\u003c/h3\u003e\n\u003cul data-sourcepos=\"490:1-492:0\"\u003e\n\u003cli data-sourcepos=\"490:1-490:172\"\u003e\n\u003ca href=\"https://www.engineer-factory.com/media/working/5584/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータエンジニアが解説！今知っておきたい「データ職種」7つの違いと役割\u003c/a\u003e 2025/05/02\u003c/li\u003e\n\u003cli data-sourcepos=\"491:1-492:0\"\u003e\u003ca href=\"http://www.dataarch.co.jp/participantsinDM.html\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータ関連人材定義 - データアーキテクト\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"493:1-493:40\"\u003e\n\u003cspan id=\"アナリティクスエンジニア\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eアナリティクスエンジニア\u003c/h3\u003e\n\u003cul data-sourcepos=\"494:1-498:0\"\u003e\n\u003cli data-sourcepos=\"494:1-494:145\"\u003e\n\u003ca href=\"https://dev.classmethod.jp/articles/decade-analytics-engineer/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eアナリティクスエンジニアとは - クラスメソッド\u003c/a\u003e 2021/10/12\u003c/li\u003e\n\u003cli data-sourcepos=\"495:1-495:151\"\u003e\n\u003ca href=\"https://blog.recruit.co.jp/data/articles/analytics_engineer_introduction/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eリクルート アナリティクスエンジニアの募集\u003c/a\u003e 2022/09/28\u003c/li\u003e\n\u003cli data-sourcepos=\"496:1-496:226\"\u003e\n\u003ca href=\"https://staff.persol-xtech.co.jp/corporate/security/article.html?id=338\" rel=\"nofollow noopener\" target=\"_blank\"\u003eアナリティクスエンジニアとは？概要やメリット、デメリットを解説！ - パーソルクロステクノロジー\u003c/a\u003e 2025/05/28\u003c/li\u003e\n\u003cli data-sourcepos=\"497:1-498:0\"\u003e\n\u003ca href=\"https://zenn.dev/analytics_eng/articles/6f468479e9537a\" rel=\"nofollow noopener\" target=\"_blank\"\u003eアナリティクスエンジニアの仕事はどこにあるか - Zenn\u003c/a\u003e 2024/02/28\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"499:1-499:51\"\u003e\n\u003cspan id=\"mlエンジニア--機械学習エンジニア\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#ml%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2--%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eMLエンジニア / 機械学習エンジニア\u003c/h3\u003e\n\u003cul data-sourcepos=\"500:1-504:0\"\u003e\n\u003cli data-sourcepos=\"500:1-500:216\"\u003e\u003ca href=\"https://www.michaelpage.co.jp/advice/%E8%81%B7%E7%A8%AE%E7%B4%B9%E4%BB%8B/it/ml%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%EF%BC%88%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%EF%BC%89%E3%81%A8%E3%81%AF%EF%BC%9F%E6%A5%AD%E5%8B%99%E3%82%84%E5%B9%B4%E5%8F%8E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" rel=\"nofollow noopener\" target=\"_blank\"\u003eMLエンジニア（機械学習エンジニア）とは - Michael Page\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"501:1-501:105\"\u003e\n\u003ca href=\"https://www.bigdata-navi.com/aidrops/1086/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e機械学習エンジニアとは？ - AIdrops\u003c/a\u003e 2019/08/08\u003c/li\u003e\n\u003cli data-sourcepos=\"502:1-502:180\"\u003e\n\u003ca href=\"https://skillup-aigent.com/media/career-expertise/machine-learning-engineer-job-change/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e機械学習エンジニアの年収と転職市場2025 - クラキャリ AI\u003c/a\u003e 2025/07/01\u003c/li\u003e\n\u003cli data-sourcepos=\"503:1-504:0\"\u003e\n\u003ca href=\"https://plus-web3.com/media/ml-engineer-data-scientist/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eMLエンジニアとデータサイエンティストの未来！進化する役割と求められるスキル - Plus Web3\u003c/a\u003e 2025/02/20\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"505:1-505:18\"\u003e\n\u003cspan id=\"mlops--llmops\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#mlops--llmops\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eMLOps / LLMOps\u003c/h3\u003e\n\u003cul data-sourcepos=\"506:1-510:0\"\u003e\n\u003cli data-sourcepos=\"506:1-506:82\"\u003e\n\u003ca href=\"https://reinforz.co.jp/bizmedia/54732/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e2025年以降のMLOps革命\u003c/a\u003e 2025/05/16\u003c/li\u003e\n\u003cli data-sourcepos=\"507:1-507:145\"\u003e\n\u003ca href=\"https://www.cloudera.com/blog/technical/the-evolution-of-llmops--adapting-mlops-for-genai.html\" rel=\"nofollow noopener\" target=\"_blank\"\u003eThe Evolution of LLMOps - Cloudera\u003c/a\u003e 2024/10/22\u003c/li\u003e\n\u003cli data-sourcepos=\"508:1-508:195\"\u003e\n\u003ca href=\"https://medium.com/@sanjeebmeister/the-complete-mlops-llmops-roadmap-for-2026-building-production-grade-ai-systems-bdcca5ed2771\" rel=\"nofollow noopener\" target=\"_blank\"\u003eThe Complete MLOps/LLMOps Roadmap for 2026 - Medium\u003c/a\u003e 2026/01/07\u003c/li\u003e\n\u003cli data-sourcepos=\"509:1-510:0\"\u003e\n\u003ca href=\"https://reinforz.co.jp/bizmedia/54746/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e2025年以降のMLOps戦略：AIによる持続的イノベーションの鍵 - Reinforz Insight\u003c/a\u003e 2025/05/15\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"511:1-511:61\"\u003e\n\u003cspan id=\"データアーキテクト--データスチュワード\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88--%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%81%E3%83%A5%E3%83%AF%E3%83%BC%E3%83%89\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータアーキテクト / データスチュワード\u003c/h3\u003e\n\u003cul data-sourcepos=\"512:1-517:0\"\u003e\n\u003cli data-sourcepos=\"512:1-512:155\"\u003e\n\u003ca href=\"https://opsizm.com/data-owner-steward-architect/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータオーナー、データスチュワード、データアーキテクトの違い\u003c/a\u003e 2023/09/07\u003c/li\u003e\n\u003cli data-sourcepos=\"513:1-513:106\"\u003e\n\u003ca href=\"https://blog.trocco.io/glossary/data-steward\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータスチュワードとは？ - TROCCO\u003c/a\u003e 2023/06/29\u003c/li\u003e\n\u003cli data-sourcepos=\"514:1-514:110\"\u003e\n\u003ca href=\"https://metafind.jp/2023/11/30/data-architect/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータアーキテクトとは？ - Metafind\u003c/a\u003e 2023/11/30\u003c/li\u003e\n\u003cli data-sourcepos=\"515:1-515:149\"\u003e\n\u003ca href=\"https://metafind.jp/2024/03/28/datasteward/\" rel=\"nofollow noopener\" target=\"_blank\"\u003eデータスチュワードは、データ利活用のとりまとめ役？！ - Metafind\u003c/a\u003e 2024/03/28\u003c/li\u003e\n\u003cli data-sourcepos=\"516:1-517:0\"\u003e\n\u003ca href=\"https://bookplus.nikkei.com/atcl/column/032900009/071000640/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e『データスチュワードシップ』書籍紹介 - 日経BOOKプラス\u003c/a\u003e 2024/07/18\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 data-sourcepos=\"518:1-518:7\"\u003e\n\u003cspan id=\"cdo\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#cdo\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eCDO\u003c/h3\u003e\n\u003cul data-sourcepos=\"519:1-521:128\"\u003e\n\u003cli data-sourcepos=\"519:1-519:128\"\u003e\n\u003ca href=\"https://data.wingarc.com/data-on-cdo-49880\" rel=\"nofollow noopener\" target=\"_blank\"\u003eCDOとは？求められる理由やスキル - データのじかん\u003c/a\u003e 2024/07/27\u003c/li\u003e\n\u003cli data-sourcepos=\"520:1-520:121\"\u003e\n\u003ca href=\"https://sento.group/news/2025/02/revolution-cdo-japan/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e日本企業におけるCDOの進化 - sento.group\u003c/a\u003e 2025/02/28\u003c/li\u003e\n\u003cli data-sourcepos=\"521:1-521:128\"\u003e\n\u003ca href=\"https://prtimes.jp/main/html/rd/p/000000022.000070879.html\" rel=\"nofollow noopener\" target=\"_blank\"\u003eJapan CDO of The Year 2025 受賞者決定 - PR TIMES\u003c/a\u003e 2025/12/17\u003c/li\u003e\n\u003c/ul\u003e\n","body":"\n## 導入\n\n「データエンジニアとデータサイエンティストって何が違うの？」「アナリティクスエンジニアって最近よく聞くけど何？」\n\nデータ領域で働いていると、こうした質問を会社の他部署の人からよく受けます。実際、職種の境界は曖昧になりつつあり、会社によって定義も異なります。あと、名前は一つだけど兼任になっているってことも大いにあると思います！\n\nこの記事では、2026年1月上旬現在のデータ職種について整理し、それぞれの役割(筆者の偏見アリ)と今後のトレンドをなんとなくまとめます。筆者も生成AIと調べながらまとめており、間違いも多く含んでいると思います。ご教示のほど何卒よろしくお願いいたしますm(__)m\n\n※ 文章や内容はもちろん、参考リンクの中身は全て確認しています。\n\n---\n\n## データ職種の全体マップ\n\n以下の図は、データ関連職種を役割ごとに5つのグループに分類したものです。\n\n![データ職種の全体像：役割と関係性がわかるマップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786011/fad4ed82-81f1-491f-b76d-0330aba95366.png)\n\n---\n\n## 職種一覧\n\n本記事で扱うデータ関連職種の一覧です。\n※他にもデータに関する職種があれば、教えてください！\n\n### 実務・現場系\n1. [データエンジニア（Data Engineer）](#データエンジニアdata-engineer)\n2. [アナリティクスエンジニア（Analytics Engineer）](#アナリティクスエンジニアanalytics-engineer)\n3. [データアナリスト（Data Analyst）](#データアナリストdata-analyst)\n4. [BIエンジニア（BI Engineer）](#biエンジニアbi-engineer)\n5. [データサイエンティスト（Data Scientist）](#データサイエンティストdata-scientist)\n6. [MLエンジニア / 機械学習エンジニア（ML Engineer）](#mlエンジニア--機械学習エンジニアml-engineer)\n7. [MLOpsエンジニア（MLOps Engineer）](#mlopsエンジニアmlops-engineer)\n8. [AIエンジニア（AI Engineer）](#aiエンジニアai-engineer)\n\n### 設計・アーキテクチャ系\n9. [データアーキテクト（Data Architect）](#データアーキテクトdata-architect)\n\n### ガバナンス・マネジメント系\n10. [データスチュワード（Data Steward）](#データスチュワードdata-steward)\n11. [データマネージャー（Data Manager）](#データマネージャーdata-manager)\n12. [CDO（Chief Data Officer）](#cdochief-data-officer)\n\n---\n\n## 職種比較表\n\n| 職種 | 主な役割 | 注力する領域 | 主な成果物 |\n|------|----------|-------------|-----------|\n| データエンジニア | データの収集・保存・変換など、活用基盤の整備を行う | ETL/ELT、データパイプライン構築、データ提供 | 整形済みのデータ基盤、データ連携仕様、パイプライン構成図 |\n| アナリティクスエンジニア | 分析者が扱いやすい形でデータを整形・モデリングし、環境を整える | データモデリング、SQL変換、パイプライン自動化 | データマート、データモデル、ドキュメント |\n| データアナリスト | データの集計・可視化を通じて、現状の把握や意思決定をサポートする | データ整理、レポート作成、KPIモニタリング | ダッシュボード、定量レポート |\n| BIエンジニア | データの可視化やKPIの設計などを通じて、意思決定を支える | ダッシュボード設計、指標設計、データ品質管理 | 可視化レポート、定期レポート、KPIダッシュボード |\n| データサイエンティスト | 機械学習や統計手法を使い、ビジネス課題を解決するための分析・モデル開発を行う | 仮説検証、予測モデル構築、アドホック分析 | 分析レポート、予測モデル、プレゼン資料 |\n| MLエンジニア | モデルを実運用に耐える形に最適化し、システムに統合する | モデル設計・実装・最適化、CI/CD、モニタリング | 本番環境モデル、API、推論システム |\n| MLOpsエンジニア | MLモデルのライフサイクル全体を管理し、継続的な運用を実現する | パイプライン自動化、モデル監視、再学習基盤 | ML基盤、監視ダッシュボード、自動化スクリプト |\n| AIエンジニア | AIを実サービスに組み込み、運用できるシステムを構築する | AIモデル統合、API開発、クラウド運用、生成AI対応など | サービス実装されたAI機能、API、運用設計書 |\n| データアーキテクト | 全社視点でデータ戦略・設計を策定し、データ活用の基盤を整える | エンタープライズデータモデル、データフロー設計 | アーキテクチャ図、データモデル、標準規約 |\n| データスチュワード | データの品質・整合性・ガバナンスを管理し、データの価値を最大化する | データ品質管理、メタデータ管理、ポリシー策定 | データ辞書、品質レポート、ガバナンスルール |\n| データマネージャー | データチームのマネジメントとプロジェクト推進を行う | チーム管理、プロジェクト推進、ROI管理 | プロジェクト計画、チーム体制、KPI管理 |\n| CDO | データ戦略の最高責任者として、全社のデータ活用を統括する | データ戦略策定、ガバナンス体制構築、経営への活用 | データ戦略、組織体制、経営レポート |\n\n---\n\n## 実務・現場系\n\n### データエンジニア（Data Engineer）\n\n**役割**: データ基盤を構築し、データを「使える状態」にする\n\nデータエンジニアは、データ分析基盤の設計・開発・運用を担当します。データはそのままでは分析できる状態ではないことが多く、データエンジニアが整理・加工することで、アナリストやサイエンティストがデータを活用できるようになります。\n\n**主な業務**:\n- ETL/ELTパイプラインの設計・開発\n- データウェアハウス・データレイクの構築\n- データ品質の監視・改善\n- インフラ（クラウド、コンテナ）の運用\n\n**必要スキル**: SQL、Python、クラウド（AWS/GCP/Azure）、Snowflake、Databricks、BigQuery、Airflow、Spark、dbtなど\n\n**他職種との違い**:\n\n| 比較対象 | データエンジニア | 比較対象の役割 |\n|---------|------------------|---------------|\n| アナリティクスエンジニア | データの収集・保存・パイプライン構築（上流〜中流） | データの変換・モデリング・ドキュメント整備（中流〜下流） |\n| データアーキテクト | 設計に基づいて基盤を構築・運用する実装者 | 全社視点でデータ戦略・設計を策定する設計者 |\n\n- データエンジニアとアナリティクスエンジニアは「データパイプライン」で接続される関係\n- 小規模な組織ではデータエンジニアがアーキテクトやアナリティクスエンジニアの役割も兼ねることが多い\n\n**協業する職種**: アナリティクスエンジニア（パイプライン引き渡し）、データアーキテクト（設計レビュー）、データスチュワード（データ品質管理）、MLエンジニア（特徴量基盤）\n\n---\n\n### アナリティクスエンジニア（Analytics Engineer）\n\n**役割**: データアナリストとデータエンジニアの架け橋\n\nアナリティクスエンジニアは比較的新しい職種で、dbt（data build tool）などのツールの登場とともに確立されました。データエンジニアとデータアナリストの中間的な役割を担い、「分析しやすいデータ」を提供することに特化しています。\n\n**主な業務**:\n- dbtを使ったデータ変換処理の開発\n- データモデルの設計・ドキュメント整備\n- データ品質テストの実装\n- セマンティックレイヤーの構築\n- データカタログ・メタデータ管理\n\n**必要スキル**: SQL、dbt、Git、データモデリング、ビジネスドメイン知識\n\n**なぜ注目されているのか**:\n- ELTアーキテクチャの普及により、変換処理（Transform）がDWH内で行われるようになった\n- ソフトウェアエンジニアリングのベストプラクティス（バージョン管理、CI/CD、テスト）がデータ領域にも適用されるようになった\n- LLM時代の到来により、メタデータ整備の重要性が増している\n\n**協業する職種**: データエンジニア（データソース連携）、データアナリスト（データ要件・メトリクス定義）、BIエンジニア（データマート設計）\n\n---\n\n### データアナリスト（Data Analyst）\n\n**役割**: データを分析し、ビジネスに活かす洞察を提供する\n\nデータアナリストはビジネスサイド寄りの職種です。既存データの探索・解析を行い、分析結果をレポートやダッシュボードにまとめ、ビジネス戦略の提案を行います。\n\n**主な業務**:\n- データの可視化・ダッシュボード作成\n- KPI分析・レポーティング\n- A/Bテストの設計・分析\n- ビジネス課題に対する仮説検証\n\n**必要スキル**: SQL、Excel、BIツール（Tableau、Looker、Power BI）、統計の基礎知識\n\n**他職種との違い**:\n\n| 比較対象 | データアナリスト | 比較対象の役割 |\n|---------|------------------|---------------|\n| BIエンジニア | データを分析し、洞察・示唆を出す | 可視化の仕組み・ダッシュボード基盤を構築する |\n| データサイエンティスト | 既存データの探索・可視化・レポーティング | 統計・機械学習を用いた予測モデル構築・高度分析 |\n| アナリティクスエンジニア | 整備されたデータを使って分析する | 分析しやすいデータを整備・提供する |\n\n- データアナリストは「分析結果を出す人」、BIエンジニアは「分析環境を整える人」\n- データサイエンティストとの違いは「統計・ML手法の深さ」と「予測 vs 現状把握」の違い\n- アナリティクスエンジニアとは「データの提供者 vs 消費者」の関係\n\n**協業する職種**: アナリティクスエンジニア（データ要件）、BIエンジニア（ダッシュボード作成）、ビジネスサイド（分析結果の活用）\n\n---\n\n### BIエンジニア（BI Engineer）\n\n**役割**: データの可視化とレポーティング基盤の構築\n\nBIエンジニアは、分析結果をビジュアル化し、ダッシュボードやレポートを通じてビジネスユーザーに提供します。データアナリストと役割が重なる部分もありますが、BIエンジニアはより技術寄りで、ツールの導入・運用やデータマートの設計も担当します。\n\n**主な業務**:\n- BIツールの導入・運用・管理\n- ダッシュボード・レポートの設計・開発\n- データマートの設計・実装\n- ビジネスユーザーへのトレーニング\n\n**必要スキル**: SQL、BIツール（Tableau、Looker、Power BI、Metabase）、データモデリング\n\n**データアナリストとの違い**:\n- データアナリストは「分析して洞察を出す」ことが主眼\n- BIエンジニアは「可視化の仕組みを作る」ことが主眼\n\n**協業する職種**: データアナリスト（可視化要件）、アナリティクスエンジニア（データマート設計）、ビジネスサイド（ユーザートレーニング）\n\n---\n\n### データサイエンティスト（Data Scientist）\n\n**役割**: 統計・機械学習を用いた高度な分析とモデル構築\n\nデータサイエンティストは統計スキル寄りの職種です。ビッグデータの収集・加工、予測モデルの作成、機械学習アルゴリズムの開発などを行います。\n\n**主な業務**:\n- 予測モデル・レコメンドエンジンの開発\n- 機械学習アルゴリズムの設計・実装\n- 統計的仮説検定\n- ビジネス課題の数理モデル化\n\n**必要スキル**: Python/R、統計学、機械学習、深層学習フレームワーク（TensorFlow、PyTorch）\n\n**協業する職種**: MLエンジニア（モデル引き渡し）、データエンジニア（データ準備・特徴量基盤）、ビジネスサイド（要件定義・結果活用）\n\n---\n\n### MLエンジニア / 機械学習エンジニア（ML Engineer）\n\n**役割**: 機械学習モデルの実装とシステム統合\n\nMLエンジニア（Machine Learning Engineer）は、機械学習モデルを本番環境にデプロイし、実際に動くシステムとして統合します。データサイエンティストが作ったモデルを「動くプロダクト」にする役割です。\n\n\u003e **補足**: 「MLエンジニア」と「機械学習エンジニア」は同じ職種を指します。ML = Machine Learning（機械学習）の頭文字です。\n\n**主な業務**:\n- 機械学習パイプラインの構築\n- モデルのデプロイ・API化\n- A/Bテスト基盤の構築\n- 推論システムの最適化\n\n**必要スキル**: Python、機械学習フレームワーク、Docker、API設計\n\n**他職種との違い**:\n\n| 比較対象 | MLエンジニア | 比較対象の役割 |\n|---------|--------------|---------------|\n| データサイエンティスト | モデルを本番環境で動かす（実装・デプロイ） | モデルを作る・研究する（分析・実験） |\n| MLOpsエンジニア | モデルのデプロイ・API化・システム統合 | モデルの継続運用・監視・再学習自動化 |\n| AIエンジニア | 機械学習モデルに特化した実装 | LLM含むAI全般のシステム統合・アプリ開発 |\n\n- データサイエンティストとは「作る vs 動かす」の関係\n- MLOpsエンジニアとは「初回デプロイ vs 継続運用」の関係\n- AIエンジニアとは「ML特化 vs AI全般（LLM含む）」の範囲の違い\n\n**協業する職種**: データサイエンティスト（モデル受け取り）、MLOpsエンジニア（運用引き継ぎ）、SWEチーム（システム統合）\n\n---\n\n### MLOpsエンジニア（MLOps Engineer）\n\n**役割**: 機械学習モデルの継続的な運用を支える\n\nMLOpsエンジニアは、MLエンジニアの中でも特に運用（Operations）に特化した職種です。モデルのライフサイクル全体を管理し、継続的なデリバリーを実現します。\n\n**主な業務**:\n- MLパイプラインの自動化（CI/CD）\n- モデルのバージョン管理\n- 推論基盤のスケーリング\n- モデルドリフトの検知・対応\n- モデルの再学習・更新の自動化\n\n**必要スキル**: Python、Docker、Kubernetes、MLflow、Kubeflow、クラウドML基盤\n\n**MLエンジニアとの違い**:\n- MLエンジニアは「モデルをデプロイする」ことが主眼\n- MLOpsエンジニアは「モデルを運用し続ける」ことが主眼\n\n**協業する職種**: MLエンジニア（運用設計）、SRE/インフラチーム（インフラ連携）、データエンジニア（パイプライン自動化）\n\n---\n\n### AIエンジニア（AI Engineer）\n\n**役割**: AI技術全般を活用したシステム開発\n\nAIエンジニアは、機械学習を含むAI（人工知能）全般を対象とした職種です。MLエンジニアよりも広い範囲をカバーし、LLM（大規模言語モデル）やコンピュータビジョンなど、多様なAI技術を扱います。\n\n**主な業務**:\n- LLMを活用したアプリケーション開発\n- RAG（Retrieval-Augmented Generation）の実装\n- プロンプトエンジニアリング\n- AIサービスのAPI統合\n\n**必要スキル**: Python、LLM API（OpenAI、Claude、Gemini）、ベクトルDB、プロンプト設計\n\n**2025-2026年のトレンド**:\nLLMの普及により、AIエンジニアの役割は大きく変化しています。従来の機械学習モデル開発に加え、LLMを活用したアプリケーション開発が主要な業務になりつつあります。「LLMOpsエンジニア」という新たな専門職も登場しています。\n\n**協業する職種**: MLエンジニア（ML技術連携）、プロダクトマネージャー（プロダクト要件）、SWEチーム（API設計・システム統合）\n\n---\n\n## 設計・アーキテクチャ系\n\n### データアーキテクト（Data Architect）\n\n**役割**: データ基盤の全体設計とアーキテクチャ策定\n\nデータアーキテクトは、ビジネス要件やデータ戦略に基づいて全体的なデータアーキテクチャを設計します。DMBOK2では「データアーキテクチャとデータ統合を担当する上級アナリスト」と定義されています。\n\n**主な業務**:\n- エンタープライズデータモデルの作成\n- システム間のデータフロー設計\n- データモデリングのルール・標準策定\n- 用語・ドメイン一覧の整備\n- データ統合戦略の策定\n\n**必要スキル**: データモデリング、システムアーキテクチャ、クラウド基盤、ビジネス理解\n\n**データエンジニアとの違い**:\n\n| 観点 | データエンジニア | データアーキテクト |\n|------|------------------|-------------------|\n| 視点 | プロジェクト・チーム単位 | 全社・エンタープライズ単位 |\n| 主な成果物 | パイプライン、DWH、データマート | アーキテクチャ図、データモデル、標準規約 |\n| 関わる期間 | 継続的な開発・運用 | 設計フェーズ中心 |\n| スキル重心 | 実装・コーディング | 設計・ドキュメント・調整 |\n\n小〜中規模の組織ではデータエンジニアがアーキテクトを兼任することも多く、大規模な組織になると専任のアーキテクトが置かれる傾向があります。\n\n**協業する職種**: データエンジニア（設計レビュー・実装指示）、データスチュワード（ガバナンス連携）、CDO（戦略策定）\n\n---\n\n## ガバナンス・マネジメント系\n\n### データスチュワード（Data Steward）\n\n**役割**: データの品質・整合性・ガバナンスを管理する\n\nデータスチュワードは、特定のデータソースやデータ領域に対して責任を持ち、データの品質と整合性を管理します。データの価値を最大化するために、メタデータ、ドキュメント、利用ルール・ポリシーを管理します。\n\n**主な業務**:\n- データ品質の監視・改善\n- メタデータ・データ辞書の管理\n- データ利用ポリシーの策定・運用\n- データ活用者からの要件ヒアリング\n- 部門間のデータ要件の調整\n\n**必要スキル**: 業務ドメイン知識、データ品質管理、コミュニケーション\n\n**日本での現状**:\n日本ではデータスチュワードシップへの関心は比較的低く、本来なら複数のデータスチュワードが分担すべき役割を、データエンジニアやデータアーキテクトが兼任していることが多い状況です。\n\n**協業する職種**: データエンジニア（品質管理）、データアーキテクト（ガバナンス連携）、各事業部門（要件調整）\n\n---\n\n### データマネージャー（Data Manager）\n\n**役割**: データチームのマネジメントとプロジェクト推進\n\nデータマネージャーは、データ関連のプロジェクトやチームを管理する役職です。技術と経営の橋渡しを行い、データ活用の推進を担います。\n\n**主な業務**:\n- データチームのマネジメント\n- データプロジェクトの計画・推進\n- ステークホルダーとの調整\n- データ活用のROI管理\n- 採用・育成\n\n**必要スキル**: プロジェクトマネジメント、チームマネジメント、データリテラシー、コミュニケーション\n\n**協業する職種**: 全データ職種（チーム運営）、経営層（リソース確保）、ステークホルダー（プロジェクト調整）\n\n---\n\n### CDO（Chief Data Officer）\n\n**役割**: データ戦略の最高責任者\n\nCDO（Chief Data Officer：最高データ責任者）は、企業データから最大のビジネス価値を得ることを担う経営幹部です。データ戦略を策定し、データガバナンス、データ品質、データ分析、データセキュリティなどを統括します。\n\n\u003e **注意**: CDOには「Chief Digital Officer（最高デジタル責任者）」という別の役職もあります。本記事では「Chief Data Officer」を指します。\n\n**主な業務**:\n- 全社データ戦略の策定\n- データガバナンス体制の構築\n- データ活用による収益化推進\n- 経営の意思決定へのデータ活用\n- データ人材の育成・組織構築\n\n**日本企業での設置状況**:\n- CDO Club Japanの調査によると、日本国内のCDO設置率は「専任」で16％、「兼任」で26％\n- 役員レベルで採用している企業は3.3%に留まる\n- 欧米に比べて設置率は低いが、DX推進の流れで増加傾向\n\n**AI時代のCDOの進化**:\n近年、CDOの役割は「Chief Data \u0026 Analytics Officer（CDAO）」へと拡張されつつあります。さらに、AI戦略を担う「CAIO（Chief AI Officer）」を設置する動きも出始めています。\n\n**協業する職種**: データマネージャー（組織運営）、データアーキテクト（戦略実行）、経営層（意思決定）\n\n---\n\n## 2025-2026年のトレンド\n\n### 1. 職種の境界が曖昧に\n\nAI技術の進化に伴い、各職種の役割は統合的になりつつあります。データサイエンティストがパイプライン構築まで行ったり、データエンジニアがモデルデプロイを担当したりと、境界線は曖昧になっています。\n\n### 2. LLMOpsの台頭\n\n大規模言語モデル（LLM）の普及により、従来のMLOpsとは異なる課題が生まれています:\n- プロンプトエンジニアリング / コンテキストエンジニアリング\n- RAG（Retrieval-Augmented Generation）アーキテクチャ\n- ハルシネーション対策\n- 推論コストの最適化\n\nこれに対応する「LLMOpsエンジニア」という新たな役割も登場しています。\n\n### 3. アナリティクスエンジニアの需要拡大\n\ndbtを中心としたModern Data Stackの普及により、アナリティクスエンジニアの需要は急速に拡大しています。特に:\n- データ品質・信頼性への関心の高まり\n- セルフサービスBI実現のためのデータ整備\n- LLM活用のためのメタデータ整備\n\n### 4. ビジネスサイドのデータリテラシー向上\n\nLLMの登場により、データサイエンティストだけでなく、ビジネスチームやプロダクトマネージャーがAI駆動アプリケーションに積極的に関わるようになっています。\n\n---\n\n## キャリア選択の指針\n\nどの職種を選ぶべきかは、自分の興味や強みによって異なります:\n\n| 興味・志向 | おすすめ職種 |\n|-----------|-------------|\n| データ基盤・インフラを作りたい | データエンジニア |\n| 分析しやすいデータを整備したい | アナリティクスエンジニア |\n| ビジネス課題を分析で解決したい | データアナリスト |\n| ダッシュボード・可視化を極めたい | BIエンジニア |\n| 予測モデル・統計分析をしたい | データサイエンティスト |\n| MLモデルをプロダクトにしたい | MLエンジニア |\n| MLの運用・自動化を極めたい | MLOpsエンジニア |\n| LLM・AI全般を扱いたい | AIエンジニア |\n| 全体設計・アーキテクチャを担いたい | データアーキテクト |\n| データ品質・ガバナンスを担いたい | データスチュワード |\n| チーム・組織をマネジメントしたい | データマネージャー / CDO |\n\n---\n\n## 職種間の協業マップ\n\n各職種がどの職種と協業しやすいかを一覧表にまとめました。\n\n| 職種 | 主な協業相手 | 協業の内容・場面 |\n|------|-------------|-----------------|\n| データエンジニア | AE、データアーキテクト、データスチュワード、MLエンジニア | パイプライン引き渡し、設計レビュー、データ品質、特徴量基盤 |\n| アナリティクスエンジニア | DE、データアナリスト、BIエンジニア | データソース連携、メトリクス定義、データマート設計 |\n| データアナリスト | AE、BIエンジニア、ビジネスサイド | データ要件、ダッシュボード、分析結果の活用 |\n| BIエンジニア | データアナリスト、AE、ビジネスサイド | 可視化要件、データマート設計、ユーザートレーニング |\n| データサイエンティスト | MLエンジニア、DE、ビジネスサイド | モデル引き渡し、データ準備、要件定義 |\n| MLエンジニア | DS、MLOpsエンジニア、SWEチーム | モデル受け取り、運用引き継ぎ、システム統合 |\n| MLOpsエンジニア | MLエンジニア、SRE/インフラ、DE | 運用設計、インフラ連携、パイプライン自動化 |\n| AIエンジニア | MLエンジニア、PM、SWEチーム | ML技術連携、プロダクト要件、API設計 |\n| データアーキテクト | DE、データスチュワード、CDO | 設計レビュー、ガバナンス連携、戦略策定 |\n| データスチュワード | DE、データアーキテクト、各事業部門 | 品質管理、ガバナンス連携、要件調整 |\n| データマネージャー | 全データ職種、経営層、ステークホルダー | チーム運営、リソース確保、プロジェクト調整 |\n| CDO | データマネージャー、データアーキテクト、経営層 | 組織運営、戦略実行、意思決定 |\n\n※略称: DE=データエンジニア、AE=アナリティクスエンジニア、DS=データサイエンティスト、PM=プロダクトマネージャー、SWE=ソフトウェアエンジニア\n\n---\n\n## まとめ\n\n- データエンジニア、データアナリスト、データサイエンティストは従来からある3大職種\n- アナリティクスエンジニアはdbtの登場とともに確立された比較的新しい職種で、急速に需要が拡大している\n- MLエンジニア（機械学習エンジニア）、MLOpsエンジニア、AIエンジニアはML/AI領域の専門職\n- データアーキテクトは設計・アーキテクチャを担う上級職\n- データスチュワード、データマネージャー、CDOはガバナンス・マネジメント系の職種\n- 職種間の境界は曖昧になりつつあり、複合的なスキルが求められる時代に\n- 自分の興味・強みに合わせてキャリアを選択することが重要\n\n---\n\n## 余談\n\n### 筆者のバックグラウンド\n\nまず、私自身のバックグラウンドは、データサイエンティストから入り(といってもテーブルデータ中心の経験が主で、広く薄くです)、がっつりデータエンジニア/データアーキテクト、部分的にデータアナリストって感じです。\n2社目ではdbtもゴリゴリ(Claude Codeと一緒に)触り、ML系、MLOps、LLMOpsとかもしています。いわゆる器用貧乏ってやつですね。秀でていないのがいつも辛いです。\n\nアルアル？なのかもしれないのですが、データがあるからなんか出してくれって感じでデータサイエンティストを始めて(今思えば、入り方おかしいですよね...)、データがめちゃくちゃなのに絶望してデータエンジニアリングしたって経歴です(アルアルだと信じているので、共感してくだされば、いいねください笑)。\n\n各ロールに対して、合う合わないがあると思っているんですが、性格的にはデータエンジニアとか結構カッチリしていて性には合っていると思っています。ただ、これって、データエンジニアに限らず自分がそういう性格なのかもしれない？という気持ちはあります。一昔前はjupyter notebookでグリグリ実験してなんか出た！っていうのがどうしても許せなくて、データサイエンティスト(今思えば視野が狭すぎる)向いていないなーと思っていました。\n\n### 他のロールとの協業について、思うこと\n\n他ロールとの協業ですが、自身がデータエンジニアとして、データアナリストとやりとりしたり、データサイエンティストとしてデータエンジニアとやりとりをしたことはありますが、自分が器用貧乏職人極めているので、コミュニケーションで困ったことはありませんでした。\n似たような職種だから、相手の気持ちもわかることが多かったです。\nもっと大きい組織や細分化された中で働いてみるのもいい経験なのかな、と自分の経歴の弱さに不安に思うこともあります...\nそういう意味では、ビジネスサイドとのコミュニケーションは下手くそ過ぎて、辛い思いをしたことは何度もあります。難しいこと、余計なことを言ってしまったり、逆に説明不足すぎて、後々認識の齟齬があったり。これは永遠の課題だなと思っています...!\n\n### これからのデータ系ロールについて、思うこと\n\nここからは完全にポエムです。\n薄く広く経験したデータ系の仕事に少しでも恩返ししたいなって気持ちはありまして、個人的に情報を整理してみました。\n\n生成AI、LLMの台頭で、データ系のロールの重要性や変化は益々生じると思っています。\nデータスチュワードやデータマネージャーの役割は多くなり、作業に重きのあるロールは、これらに吸収されるかもしれません。\nまた、LLMOpsエンジニアや、LLM関連のロールは技術やツール、仕組みの発展から生じるかもしれません。\n\n個人的には器用貧乏ながら、弱い部分はLLMで補いやすくなった環境はワクワクすることが多いです。過渡期なので、瞬間的な楽しさかもしれませんが...\n\n### 読んでくださった方へ\n\nもし、こんなロール知っている！や経験している！がありましたら、後学のためにご教示くださいますと幸いです。内容の訂正もありましたら、遠慮なく教えてください。\n\n---\n\n## 参考リンク\n\n### 職種全般\n- [データエンジニアが解説！今知っておきたい「データ職種」7つの違いと役割](https://www.engineer-factory.com/media/working/5584/) 2025/05/02\n- [データ関連人材定義 - データアーキテクト](http://www.dataarch.co.jp/participantsinDM.html)\n\n### アナリティクスエンジニア\n- [アナリティクスエンジニアとは - クラスメソッド](https://dev.classmethod.jp/articles/decade-analytics-engineer/) 2021/10/12\n- [リクルート アナリティクスエンジニアの募集](https://blog.recruit.co.jp/data/articles/analytics_engineer_introduction/) 2022/09/28\n- [アナリティクスエンジニアとは？概要やメリット、デメリットを解説！ - パーソルクロステクノロジー](https://staff.persol-xtech.co.jp/corporate/security/article.html?id=338) 2025/05/28\n- [アナリティクスエンジニアの仕事はどこにあるか - Zenn](https://zenn.dev/analytics_eng/articles/6f468479e9537a) 2024/02/28\n\n### MLエンジニア / 機械学習エンジニア\n- [MLエンジニア（機械学習エンジニア）とは - Michael Page](https://www.michaelpage.co.jp/advice/職種紹介/it/mlエンジニア（機械学習エンジニア）とは？業務や年収について)\n- [機械学習エンジニアとは？ - AIdrops](https://www.bigdata-navi.com/aidrops/1086/) 2019/08/08\n- [機械学習エンジニアの年収と転職市場2025 - クラキャリ AI](https://skillup-aigent.com/media/career-expertise/machine-learning-engineer-job-change/) 2025/07/01\n- [MLエンジニアとデータサイエンティストの未来！進化する役割と求められるスキル - Plus Web3](https://plus-web3.com/media/ml-engineer-data-scientist/) 2025/02/20\n\n### MLOps / LLMOps\n- [2025年以降のMLOps革命](https://reinforz.co.jp/bizmedia/54732/) 2025/05/16\n- [The Evolution of LLMOps - Cloudera](https://www.cloudera.com/blog/technical/the-evolution-of-llmops--adapting-mlops-for-genai.html) 2024/10/22\n- [The Complete MLOps/LLMOps Roadmap for 2026 - Medium](https://medium.com/@sanjeebmeister/the-complete-mlops-llmops-roadmap-for-2026-building-production-grade-ai-systems-bdcca5ed2771) 2026/01/07\n- [2025年以降のMLOps戦略：AIによる持続的イノベーションの鍵 - Reinforz Insight](https://reinforz.co.jp/bizmedia/54746/) 2025/05/15\n\n### データアーキテクト / データスチュワード\n- [データオーナー、データスチュワード、データアーキテクトの違い](https://opsizm.com/data-owner-steward-architect/) 2023/09/07\n- [データスチュワードとは？ - TROCCO](https://blog.trocco.io/glossary/data-steward) 2023/06/29\n- [データアーキテクトとは？ - Metafind](https://metafind.jp/2023/11/30/data-architect/) 2023/11/30\n- [データスチュワードは、データ利活用のとりまとめ役？！ - Metafind](https://metafind.jp/2024/03/28/datasteward/) 2024/03/28\n- [『データスチュワードシップ』書籍紹介 - 日経BOOKプラス](https://bookplus.nikkei.com/atcl/column/032900009/071000640/) 2024/07/18\n\n### CDO\n- [CDOとは？求められる理由やスキル - データのじかん](https://data.wingarc.com/data-on-cdo-49880) 2024/07/27\n- [日本企業におけるCDOの進化 - sento.group](https://sento.group/news/2025/02/revolution-cdo-japan/) 2025/02/28\n- [Japan CDO of The Year 2025 受賞者決定 - PR TIMES](https://prtimes.jp/main/html/rd/p/000000022.000070879.html) 2025/12/17\n","coediting":false,"comments_count":0,"created_at":"2026-01-11T20:39:57+09:00","group":null,"id":"93dc53af3096184ec368","likes_count":12,"private":false,"reactions_count":0,"stocks_count":10,"tags":[{"name":"データ分析","versions":[]},{"name":"キャリア","versions":[]},{"name":"データサイエンティスト","versions":[]},{"name":"データエンジニア","versions":[]}],"title":"データを扱う職種について in 2026/01","updated_at":"2026-01-11T20:43:25+09:00","url":"https://qiita.com/masukai/items/93dc53af3096184ec368","user":{"description":"Ph.D. in Agriculture | Now in Data \u0026 AI\r\n\r\n農学博士 → データとAI\r\n\r\nデータ基盤構築、データ分析、データサイエンスからAI活用まで🚀","facebook_id":"","followees_count":7,"followers_count":2,"github_login_name":"masukai","id":"masukai","items_count":3,"linkedin_id":"%E5%87%B1%E6%96%97-%E5%A2%97%E7%94%B0-a636193a2","location":"京都","name":"K Masuda","organization":"株式会社SceneLive","permanent_id":786011,"profile_image_url":"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786011/profile-images/1773782127","team_only":false,"twitter_screen_name":"poyo010_","website_url":"https://masukai.github.io/portfolio/"},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:188\"\u003eAI活用にあたって重要とされるものの1つにRAGがありますが、これはBigQueryなどのDWHでもできるようになり、身近なものになってきています。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:50\"\u003e\u003ciframe id=\"qiita-embed-content__ee1f3c913a89f6e64c63c153f1387e4c\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__ee1f3c913a89f6e64c63c153f1387e4c\" data-content=\"https%3A%2F%2Fzenn.dev%2Fwataru777%2Farticles%2Fb219caa12c16e1\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:190\"\u003eただ、小規模であれば全然コストはかからないであろうとはいえ、DWHで行うのは少し怖いものがあります。そこで便利なのが、S3 Vectorsです。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:46\"\u003e\u003ciframe id=\"qiita-embed-content__1d5174807ba49facfb87fe15a5183ec7\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__1d5174807ba49facfb87fe15a5183ec7\" data-content=\"https%3A%2F%2Faws.amazon.com%2Fjp%2Fs3%2Ffeatures%2Fvectors%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"11:1-11:96\"\u003eこれを使うと、ベクトルの保管と検索が激安で行えるようになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-13:223\"\u003e一方で、S3 Vectors自体の機能は保管と検索に限られるため、検索をかけるベースとするドキュメントに対しては、適切にデータを管理する必要がでてきます。そこで、\u003c/p\u003e\n\u003cul data-sourcepos=\"15:1-17:0\"\u003e\n\u003cli data-sourcepos=\"15:1-15:122\"\u003e検索のベースとするドキュメントのデータをデータパイプラインのバッチ処理で管理する\u003c/li\u003e\n\u003cli data-sourcepos=\"16:1-17:0\"\u003e検索対象を指定したベクトル検索をリアルタイムで行えるようにする\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"18:1-18:132\"\u003eという仕組みを考えてみました。コードも公開しているので、よろしければ参考にしてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"20:1-20:43\"\u003e\u003ciframe id=\"qiita-embed-content__026b54c918c3ebd8fa137e30e8e24242\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__026b54c918c3ebd8fa137e30e8e24242\" data-content=\"https%3A%2F%2Fgithub.com%2FSoySoySoyB%2Fvector-search\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch1 data-sourcepos=\"22:1-22:14\"\u003e\n\u003cspan id=\"全体構成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e全体構成\u003c/h1\u003e\n\u003cp data-sourcepos=\"24:1-24:39\"\u003e全体構成は以下の通りです。\u003c/p\u003e\n\u003ciframe id=\"qiita-embed-content__111a041b936fd6f9adf8f7174d3856ac\" src=\"https://qiita.com/embed-contents/mermaid#qiita-embed-content__111a041b936fd6f9adf8f7174d3856ac\" style=\"width:100%;\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" data-content='{\"data\":\"flowchart LR\\n subgraph Data Management Flow\\n ss[Supported\u0026lt;br/\u0026gt;Source]\\n ccca[Custom Connector\u0026lt;br/\u0026gt;Compatible API]\\n subgraph DWH\\n rd[Raw\u0026lt;br/\u0026gt;Documents]\\n ed[Embedded\u0026lt;br/\u0026gt;Documents]\\n iv[Ingested\u0026lt;br/\u0026gt;Vectors]\\n end\\n end\\n subgraph Search Flow\\n u[User]\\n ui[UI\u0026lt;br/\u0026gt;（Google Apps Script）]\\n end\\n subgraph API Gateway\\n mapi[Management API\u0026lt;br/\u0026gt;- /indexes/list\u0026lt;br/\u0026gt;- /vectors/upsert\u0026lt;br/\u0026gt;- /vectors/list\u0026lt;br/\u0026gt;- /vectors/delete]\\n sapi[Search API\u0026lt;br/\u0026gt;- /vectors/search]\\n end\\n lambda[Lambda]\\n subgraph S3 Vectors\\n subgraph Vector Bucket\\n subgraph i[Index]\\n v[Vectors]\\n end\\n end\\n end\\n ea[Embedding API]\\n s3[Amazon S3]\\n\\n ss--\u0026gt;|TROCCO\u0026lt;br/\u0026gt;Native Connector|rd\\n ccca--\u0026gt;|TROCCO\u0026lt;br/\u0026gt;Source Custom Connector|rd\\n rd--\u0026gt;|TROCCO Datamart\u0026lt;br/\u0026gt;with\u0026lt;br/\u0026gt;Embedding Function|ed\\n ed--\u0026gt;|TROCCO\u0026lt;br/\u0026gt;Destination Custom Connector\u0026lt;br/\u0026gt;with\u0026lt;br/\u0026gt;API Key\u0026lt;br/\u0026gt;Authentication\u0026lt;br/\u0026gt;+ IP Restriction|mapi\\n mapi--\u0026gt;|TROCCO\u0026lt;br/\u0026gt;Source Custom Connector\u0026lt;br/\u0026gt;with\u0026lt;br/\u0026gt;API Key\u0026lt;br/\u0026gt;Authentication\u0026lt;br/\u0026gt;+ IP Restriction|iv\\n mapi--\u0026gt;lambda\\n u--\u0026gt;|User\u0026lt;br/\u0026gt;Authentication\u0026lt;br/\u0026gt;（email or domain）|ui\\n ui--\u0026gt;|API Key\u0026lt;br/\u0026gt;Authentication|sapi\\n sapi--\u0026gt;lambda\\n lambda--\u0026gt;|list|i\\n lambda--\u0026gt;|upsert|v\\n lambda--\u0026gt;|list|v\\n lambda--\u0026gt;|delete|v\\n lambda--\u0026gt;|search|v\\n lambda--\u0026gt;|Embedding\u0026lt;br/\u0026gt;Search Keyword\u0026lt;br/\u0026gt;（if search）|ea\\n lambda--\u0026gt;|Request / Response\u0026lt;br/\u0026gt;Store\u0026lt;br/\u0026gt;（if search）|s3\",\"key\":\"49412e79fc9c97b7f137179aca6fda2e\"}'\u003e\n\u003c/iframe\u003e\n\n\u003cul data-sourcepos=\"74:1-84:0\"\u003e\n\u003cli data-sourcepos=\"74:1-76:117\"\u003eS3 Vectorsとのデータのやり取りはAPI Gateway + Lambdaの構成とする\n\u003cul data-sourcepos=\"75:3-76:117\"\u003e\n\u003cli data-sourcepos=\"75:3-75:101\"\u003eエンドポイントとしてIndex List、Vectors List / Upsert / Delete / Searchを用意する\u003c/li\u003e\n\u003cli data-sourcepos=\"76:3-76:117\"\u003eSearchの際には、EmbeddingのAPIで検索文言のベクトル化を行い、検索結果はS3に保存する\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"77:1-82:86\"\u003eデータ管理は以下のように行う\n\u003cul data-sourcepos=\"78:3-82:86\"\u003e\n\u003cli data-sourcepos=\"78:3-79:108\"\u003eソースシステムからのデータの取得をTROCCOで行う\n\u003cul data-sourcepos=\"79:5-79:108\"\u003e\n\u003cli data-sourcepos=\"79:5-79:108\"\u003e対応していればそのコネクタで、非対応のAPIはカスタムコネクタで連携する\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"80:3-81:56\"\u003eベクトル化はDWHの関数で実行する\n\u003cul data-sourcepos=\"81:5-81:56\"\u003e\n\u003cli data-sourcepos=\"81:5-81:56\"\u003eIDと更新日時ベースで差分更新とする\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"82:3-82:86\"\u003eTROCCOの転送先カスタムコネクタでS3 VectorsにデータをUpsertする\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"83:1-84:0\"\u003e検索UIの1つとしてGoogle Apps Scriptで画面を用意する\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"85:1-85:168\"\u003e以下の事例ではQiitaのTROCCOに関連する記事をS3 Vectorsに取り込んでおり、検索をすると以下のように検索結果が表示されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"87:1-87:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9b4c3964-7de4-4fc8-aeb2-3ffe39676549.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7292ec61e8bb118958c7c9e739342574\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9b4c3964-7de4-4fc8-aeb2-3ffe39676549.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7292ec61e8bb118958c7c9e739342574\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9b4c3964-7de4-4fc8-aeb2-3ffe39676549.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=26f1be745268f7e82077d9beec12ddef 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9b4c3964-7de4-4fc8-aeb2-3ffe39676549.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"89:1-89:187\"\u003e今回は簡易な検証のためUIでの検索としていますが、もちろんAIエージェントから検索させて、情報を返してあげることもできるでしょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"91:1-91:66\"\u003eそれでは、ここから簡単に紹介をしていきます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"93:1-93:38\"\u003e\n\u003cspan id=\"そもそもベクトル検索とは\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%81%A8%E3%81%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eそもそもベクトル検索とは\u003c/h1\u003e\n\u003cp data-sourcepos=\"95:1-95:24\"\u003eベクトル検索は、\u003c/p\u003e\n\u003cul data-sourcepos=\"97:1-101:0\"\u003e\n\u003cli data-sourcepos=\"97:1-97:89\"\u003e検索のベースとするデータを事前にベクトルとして変換しておく\u003c/li\u003e\n\u003cli data-sourcepos=\"98:1-98:38\"\u003e検索対象をベクトル化する\u003c/li\u003e\n\u003cli data-sourcepos=\"99:1-99:35\"\u003e両者の類似度を算出する\u003c/li\u003e\n\u003cli data-sourcepos=\"100:1-101:0\"\u003e類似度をもとに上位N件を抽出する\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"102:1-102:36\"\u003eといった流れを取ります。\u003c/p\u003e\n\u003cp data-sourcepos=\"104:1-104:325\"\u003eこれは冒頭で紹介した\u003ca href=\"https://zenn.dev/wataru777/articles/b219caa12c16e1\" rel=\"nofollow noopener\" target=\"_blank\"\u003e「BigQueryでRAGを構築してみた」\u003c/a\u003eの記事をなぞっていただくとよくわかるのですが、いずれにせよ（今回の設定では）記事のテキストをベクトル＝768次元のfloatの配列に変換します。\u003c/p\u003e\n\u003cp data-sourcepos=\"106:1-106:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb446c9a2-54dc-4296-ab4d-63f1eb22f4dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=18d4e9058c7a35bc0978a171a0c2b5d4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb446c9a2-54dc-4296-ab4d-63f1eb22f4dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=18d4e9058c7a35bc0978a171a0c2b5d4\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb446c9a2-54dc-4296-ab4d-63f1eb22f4dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2324b348111542bd3bc602f24e0fbdf8 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b446c9a2-54dc-4296-ab4d-63f1eb22f4dc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"108:1-108:199\"\u003e検索する文字列についても同様にベクトルを生成することで、N次元ベクトル間の距離を数学的に算出し、類似度を判定できるようになっています。\u003c/p\u003e\n\u003cp data-sourcepos=\"110:1-110:36\"\u003eこのとき、変数としては、\u003c/p\u003e\n\u003cul data-sourcepos=\"112:1-116:0\"\u003e\n\u003cli data-sourcepos=\"112:1-113:67\"\u003eどのモデルで変換するか\n\u003cul data-sourcepos=\"113:3-113:67\"\u003e\n\u003cli data-sourcepos=\"113:3-113:67\"\u003e今回は\u003ccode\u003etext-multilingual-embedding-002\u003c/code\u003eを利用している\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"114:1-116:0\"\u003e変換の処理方法をどうするか\n\u003cul data-sourcepos=\"115:3-116:0\"\u003e\n\u003cli data-sourcepos=\"115:3-116:0\"\u003e今回の方法では、Task Typeという設定があり、情報検索、類似度判定、分類などの目的によって処理方法が調整できるようになっている\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"117:1-117:86\"\u003e\u003ciframe id=\"qiita-embed-content__9396e7041697c936959328d8f3d4de17\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__9396e7041697c936959328d8f3d4de17\" data-content=\"https%3A%2F%2Fdocs.cloud.google.com%2Fvertex-ai%2Fgenerative-ai%2Fdocs%2Fembeddings%2Ftask-types%3Fhl%3Dja\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cul data-sourcepos=\"119:1-121:0\"\u003e\n\u003cli data-sourcepos=\"119:1-121:0\"\u003e何次元のベクトルに変換するか\n\u003cul data-sourcepos=\"120:3-121:0\"\u003e\n\u003cli data-sourcepos=\"120:3-121:0\"\u003e今回は768次元としている\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"122:1-122:48\"\u003eというものがあり、検索の際には、\u003c/p\u003e\n\u003cul data-sourcepos=\"124:1-126:0\"\u003e\n\u003cli data-sourcepos=\"124:1-124:50\"\u003e利用するモデルや次元は上記と共通\u003c/li\u003e\n\u003cli data-sourcepos=\"125:1-126:0\"\u003e処理方法は上記に合わせたもの\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"127:1-127:27\"\u003eとして処理を行い、\u003c/p\u003e\n\u003cul data-sourcepos=\"129:1-132:0\"\u003e\n\u003cli data-sourcepos=\"129:1-130:109\"\u003e類似度判定のロジックをどうするか\n\u003cul data-sourcepos=\"130:3-130:109\"\u003e\n\u003cli data-sourcepos=\"130:3-130:109\"\u003e今回はコサイン類似度を利用しているが、ほかにユークリッド距離などもある\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"131:1-132:0\"\u003e類似度の上位いくつをレスポンスとして返すか\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"133:1-133:108\"\u003eといったところが出てきます。処理の流れに沿って整理すると以下の通りです。\u003c/p\u003e\n\u003ciframe id=\"qiita-embed-content__ce9c9ad0df266fc8d13e2cf5cb8d746f\" src=\"https://qiita.com/embed-contents/mermaid#qiita-embed-content__ce9c9ad0df266fc8d13e2cf5cb8d746f\" style=\"width:100%;\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" data-content='{\"data\":\"flowchart LR\\n base[ベースとなる\u0026lt;br/\u0026gt;データ]\\n embedded_base[ベクトル化された\u0026lt;br/\u0026gt;データ]\\n subgraph s3[S3 Vectors]\\n vdb[ベクトルDB]\\n sc[類似度計算\u0026lt;br/\u0026gt;- コサイン類似度\u0026lt;br/\u0026gt;- ユークリッド距離\u0026lt;br/\u0026gt;など]\\n topk[Top K抽出]\\n end\\n q[検索データ]\\n embedded_q[ベクトル化された\u0026lt;br/\u0026gt;検索データ]\\n res[レスポンス]\\n\\n base--\u0026gt;|- モデル\u0026lt;br/\u0026gt;- 処理方法\u0026lt;br/\u0026gt;- 次元\u0026lt;br/\u0026gt;を設定|embedded_base\\n embedded_base--\u0026gt;|格納|vdb\\n vdb---sc\\n q--\u0026gt;|- モデル\u0026lt;br/\u0026gt;- 処理方法\u0026lt;br/\u0026gt;- 次元\u0026lt;br/\u0026gt;を設定|embedded_q\\n embedded_q---sc\\n sc--\u0026gt;|フィルター条件\u0026lt;br/\u0026gt;も可能|topk\\n topk--\u0026gt;res\",\"key\":\"08d18a16ea3195a0d372f1ac81c6df28\"}'\u003e\n\u003c/iframe\u003e\n\n\u003cp data-sourcepos=\"157:1-157:174\"\u003eレスポンスをどうRAGとして処理するかは別途出てくるのですが、それは今回の実装外なので、末尾で改めて触れるようにします。\u003c/p\u003e\n\u003cp data-sourcepos=\"159:1-159:114\"\u003eさて、仕組みとしてはこのようなものなので、実装内容を簡単に紹介していきます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"161:1-161:14\"\u003e\n\u003cspan id=\"各種実装\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%90%84%E7%A8%AE%E5%AE%9F%E8%A3%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e各種実装\u003c/h1\u003e\n\u003cp data-sourcepos=\"163:1-163:123\"\u003eここから、各種実装の概要を紹介します。詳細についてはリポジトリを確認してください。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"165:1-165:18\"\u003e\n\u003cspan id=\"lambdaの実装\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#lambda%E3%81%AE%E5%AE%9F%E8%A3%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eLambdaの実装\u003c/h2\u003e\n\u003cp data-sourcepos=\"167:1-167:320\"\u003eAPI Gatewayからリクエストを受け取って、S3 Vectors APIとやり取りをするシンプルな構成です。Search APIからのリクエストのみ、テキストが入力された場合はVertex AI APIでEmbeddingを行い、S3にリクエスト／レスポンスを保存するようにしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"169:1-169:95\"\u003e\u003ciframe id=\"qiita-embed-content__5f22ec594bc4cc990f967aa3919a89aa\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__5f22ec594bc4cc990f967aa3919a89aa\" data-content=\"https%3A%2F%2Fdocs.cloud.google.com%2Fvertex-ai%2Fgenerative-ai%2Fdocs%2Fembeddings%2Fget-text-embeddings%3Fhl%3Dja\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"171:1-171:226\"\u003e余談ですが、リクエストのバリデーションのために初めてPydanticを利用してみて、非常に便利でした。型が適切に処理できるのはAIを利用する上ではかなり助かります。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"173:1-173:21\"\u003e\n\u003cspan id=\"terraformの実装\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#terraform%E3%81%AE%E5%AE%9F%E8%A3%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTerraformの実装\u003c/h2\u003e\n\u003cp data-sourcepos=\"175:1-175:116\"\u003eベクトルバケットやインデックス、API Gateway、Lambda等をTerraformでデプロイしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"177:1-177:168\"\u003eベクトルバケットとインデックスをTerraform管理に寄せて、個々のベクトルデータはAPI経由で操作するという形にしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"179:1-179:197\"\u003eデータ管理のためのAPIについては、アクセス元をTROCCOのグローバルIPのみに制限することで、APIキーと合わせてセキュアなアクセスにしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"181:1-181:194\"\u003e検索APIはGoogle Apps Script経由なので、IPが固定できずキー認証のみという課題はありますが、簡易な検証目的なので今回はこの構成としています。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"183:1-183:18\"\u003e\n\u003cspan id=\"troccoの実装\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#trocco%E3%81%AE%E5%AE%9F%E8%A3%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTROCCOの実装\u003c/h2\u003e\n\u003cp data-sourcepos=\"185:1-185:18\"\u003e次のように、\u003c/p\u003e\n\u003cul data-sourcepos=\"187:1-191:0\"\u003e\n\u003cli data-sourcepos=\"187:1-187:62\"\u003eソースシステムからドキュメントを取得する\u003c/li\u003e\n\u003cli data-sourcepos=\"188:1-188:88\"\u003eIDと更新日時をキーにEmbeddingしたドキュメントをDelete \u0026amp; Insertする\u003c/li\u003e\n\u003cli data-sourcepos=\"189:1-189:41\"\u003eS3 VectorsにIDをキーにUpsertする\u003c/li\u003e\n\u003cli data-sourcepos=\"190:1-191:0\"\u003eUpsertしたレコードをIDベースで転送済にする\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"192:1-192:39\"\u003eという流れを取っています。\u003c/p\u003e\n\u003cp data-sourcepos=\"194:1-194:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe0bee1aa-8c4f-41ee-90b2-1d1992018abb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b9be72fb7d90df03a92b8172191c56ef\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe0bee1aa-8c4f-41ee-90b2-1d1992018abb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b9be72fb7d90df03a92b8172191c56ef\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe0bee1aa-8c4f-41ee-90b2-1d1992018abb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a95d063fbbef711442ade4583dffd92c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e0bee1aa-8c4f-41ee-90b2-1d1992018abb.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"196:1-196:105\"\u003eベクトル化はBigQuery MLの\u003ccode\u003eml.generate_text_embedding\u003c/code\u003e関数を利用して処理しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"198:1-198:73\"\u003e\u003ciframe id=\"qiita-embed-content__e3f19c3ef2c670570ba1f2d8e8f82602\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__e3f19c3ef2c670570ba1f2d8e8f82602\" data-content=\"https%3A%2F%2Fdocs.cloud.google.com%2Fbigquery%2Fdocs%2Fgenerate-text-embedding%3Fhl%3Dja\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"200:1-200:287\"\u003eいちいちクエリを書くのが面倒なので、この処理をUDTFでいい感じにできないかと思ったものの、\u003ccode\u003eml.generate_text_embedding\u003c/code\u003e関数が動的なパラメータを受け付けないため、中途半端な処理になってしまったのは課題です。\u003c/p\u003e\n\u003cp data-sourcepos=\"202:1-202:277\"\u003eまた、転送先カスタムコネクタでデータを連携する際のリクエストテンプレートは次の通りです。これによってDWH上で各カラムとして保持していたデータをリクエストに必要なJSON形式に変換してくれます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"204:1-226:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"vectorBucketName\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"vector-search-********\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"indexName\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"qiita-items-trocco\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"vectors\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"key\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.id }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"data\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nl\"\u003e\"float32\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow.text_embedding_str\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}]},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"metadata\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"url\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.url }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.title }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"source_created_at\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.source_created_at }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"source_updated_at\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.source_updated_at }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"embedding_provider\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.embedding_provider }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"embedding_model\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.embedding_model }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text_embedded_at\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.text_embedded_at }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eunless\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eforloop.last\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e},{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendunless\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"228:1-228:102\"\u003e転送先カスタムコネクタの詳細については次の記事を参考にしてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"230:1-230:55\"\u003e\u003ciframe id=\"qiita-embed-content__9c3a0f0088ba2c83497ba7ec1cad377b\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__9c3a0f0088ba2c83497ba7ec1cad377b\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F8987b5938e2a499053c7\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch2 data-sourcepos=\"232:1-232:30\"\u003e\n\u003cspan id=\"google-apps-scriptの実装\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#google-apps-script%E3%81%AE%E5%AE%9F%E8%A3%85\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eGoogle Apps Scriptの実装\u003c/h2\u003e\n\u003cp data-sourcepos=\"234:1-234:396\"\u003e基本的にはAPI Gatewayの検索APIにリクエストを送って、レスポンスを表示するだけのシンプルな仕組みです。Webアプリとして公開してユーザーの権限で実行するため、メールアドレスおよびドメインでアクセス制限をかけて、利用者を限定するとともにそのIDをS3に保存するように連携しています。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"236:1-236:9\"\u003e\n\u003cspan id=\"備考\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%82%99%E8%80%83\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e備考\u003c/h2\u003e\n\u003cp data-sourcepos=\"238:1-238:289\"\u003eTROCCOからS3 Vectors APIへ直接アクセスさせていないのは、一定の処理を入れるためというのもありますが、認証にSigV4というヘッダーが固定にならない認証方法を取る必要があり、SDK経由にするしかなかったからです。\u003c/p\u003e\n\u003cp data-sourcepos=\"240:1-240:68\"\u003e\u003ciframe id=\"qiita-embed-content__b53ac854b238f89186f34f459b343271\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__b53ac854b238f89186f34f459b343271\" data-content=\"https%3A%2F%2Fdocs.aws.amazon.com%2FIAM%2Flatest%2FUserGuide%2Freference_sigv.html\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"242:1-242:85\"\u003e\u003ciframe id=\"qiita-embed-content__3698f9421e6aadedf705b573e6ca32ab\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__3698f9421e6aadedf705b573e6ca32ab\" data-content=\"https%3A%2F%2Fdocs.aws.amazon.com%2FAmazonS3%2Flatest%2FAPI%2FAPI_Operations_Amazon_S3_Vectors.html\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"244:1-244:427\"\u003eまた、Vertex AI APIの利用にあたってはサービスアカウントキーをSSMに保存することで対応していますが、この処理でそろそろTerraformのEphemeral Resources（Stateに保存せずにクレデンシャルを取り扱える）の出番では・・・？と思ったものの、まだ外部連携には対応していませんでした。そろそろ対応して欲しいところです。\u003c/p\u003e\n\u003cp data-sourcepos=\"246:1-246:108\"\u003e\u003ciframe id=\"qiita-embed-content__107a471a1dbf767e052a1aa0add91e5f\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__107a471a1dbf767e052a1aa0add91e5f\" data-content=\"https%3A%2F%2Fregistry.terraform.io%2Fproviders%2Fhashicorp%2Fgoogle%2Flatest%2Fdocs%2Fephemeral-resources%2Fservice_account_key\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cblockquote data-sourcepos=\"248:1-248:208\"\u003e\n\u003cp data-sourcepos=\"248:3-248:208\"\u003eIn future, when write-only arguments are added to resources in the Google provider, ephemeral resources such as google_service_account_key could be used to set field values when creating managed resources.`\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp data-sourcepos=\"250:1-250:64\"\u003eEphemeral Resourcesについてはこちらを参考までに。\u003c/p\u003e\n\u003cp data-sourcepos=\"252:1-252:50\"\u003e\u003ciframe id=\"qiita-embed-content__328417db97b2714f2e220863dc603b66\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__328417db97b2714f2e220863dc603b66\" data-content=\"https%3A%2F%2Fzenn.dev%2Ftaromurata%2Farticles%2Fterraform_110\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"254:1-254:139\"\u003eなお、本番運用時はWorkload Identity Federationのキーレス認証の方がいいというのは言うまでもないですが。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"256:1-256:29\"\u003e\n\u003cspan id=\"拡張に向けての論点\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8B%A1%E5%BC%B5%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6%E3%81%AE%E8%AB%96%E7%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e拡張に向けての論点\u003c/h1\u003e\n\u003cp data-sourcepos=\"258:1-258:315\"\u003eここまでで、データの更新およびベクトル検索を安価に行う仕組みを紹介してきました。データパイプラインに乗っかってベースのドキュメントを更新しつつ、簡易な仕組みを構築するという意味では使えそうな構成に思っています。\u003c/p\u003e\n\u003cp data-sourcepos=\"260:1-260:230\"\u003e一方で、AIで利用するRAGシステムとしてはまだまだ検討の余地があります。何を目的として、そのために何を素材としてどう使うかというユースケースをベースにしつつ、\u003c/p\u003e\n\u003cul data-sourcepos=\"262:1-276:0\"\u003e\n\u003cli data-sourcepos=\"262:1-266:177\"\u003eDWHにデータを取り込みするまでの前処理\n\u003cul data-sourcepos=\"263:3-266:177\"\u003e\n\u003cli data-sourcepos=\"263:3-263:109\"\u003e例えばHTMLをMarkdownに変換するなど、ソースのデータ形式に応じた共通化の処理\u003c/li\u003e\n\u003cli data-sourcepos=\"264:3-266:177\"\u003eテキストをどう処理するか\n\u003cul data-sourcepos=\"265:5-266:177\"\u003e\n\u003cli data-sourcepos=\"265:5-265:93\"\u003e長文テキストの場合、そのまま突っ込んでも取り回しが悪くなる\u003c/li\u003e\n\u003cli data-sourcepos=\"266:5-266:177\"\u003eそこで、チャンク化（テキストの分割）をするわけだが、これをどういう単位で切って、チャンク間での重複を持たせるかなど\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"267:1-268:67\"\u003eどうベクトル化するか\n\u003cul data-sourcepos=\"268:3-268:67\"\u003e\n\u003cli data-sourcepos=\"268:3-268:67\"\u003e前述したような、モデル、処理方法、次元数等\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"269:1-270:49\"\u003eどう検索するか\n\u003cul data-sourcepos=\"270:3-270:49\"\u003e\n\u003cli data-sourcepos=\"270:3-270:49\"\u003e検索対象の入れ方、フィルタ条件\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"271:1-273:112\"\u003e検索結果をどう後処理するか\n\u003cul data-sourcepos=\"272:3-273:112\"\u003e\n\u003cli data-sourcepos=\"272:3-272:124\"\u003eチャンク化したときの周辺コンテキストの取扱い（周辺の文章も合わせて処理するなど）\u003c/li\u003e\n\u003cli data-sourcepos=\"273:3-273:112\"\u003e更新日などの別指標や、全文検索など別の検索結果も組み合わせたリランキング\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"274:1-276:0\"\u003e評価と改善\n\u003cul data-sourcepos=\"275:3-276:0\"\u003e\n\u003cli data-sourcepos=\"275:3-276:0\"\u003e処理の適切性をどういった指標で評価し、数多くある変数のどこを調整して改善していくか\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"277:1-277:129\"\u003eといった点が論点として挙がってきます。前掲していた図を拡張すると、次のようになります。\u003c/p\u003e\n\u003ciframe id=\"qiita-embed-content__0c259e53d7cf2fff41fbf6bf01ad4e6e\" src=\"https://qiita.com/embed-contents/mermaid#qiita-embed-content__0c259e53d7cf2fff41fbf6bf01ad4e6e\" style=\"width:100%;\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" data-content='{\"data\":\"flowchart LR\\n base[ベースとなる\u0026lt;br/\u0026gt;データ]\\n prep_base[前処理された\u0026lt;br/\u0026gt;データ]\\n embedded_base[ベクトル化された\u0026lt;br/\u0026gt;データ]\\n subgraph s3[S3 Vectors]\\n vdb[ベクトルDB]\\n sc[類似度計算\u0026lt;br/\u0026gt;- コサイン類似度\u0026lt;br/\u0026gt;- ユークリッド距離\u0026lt;br/\u0026gt;など]\\n topk[Top K抽出]\\n end\\n q[検索データ]\\n embedded_q[ベクトル化された\u0026lt;br/\u0026gt;検索データ]\\n os[全文検索など]\\n post_process[後処理\u0026lt;br/\u0026gt;- 関連ドキュメント取得\u0026lt;br/\u0026gt;- リランキング]\\n res[レスポンス]\\n\\n base--\u0026gt;|- 形式変換\u0026lt;br/\u0026gt;- チャンク化\u0026lt;br/\u0026gt;など|prep_base\\n prep_base--\u0026gt;|- モデル\u0026lt;br/\u0026gt;- 処理方法\u0026lt;br/\u0026gt;- 次元\u0026lt;br/\u0026gt;を設定|embedded_base\\n embedded_base--\u0026gt;|格納|vdb\\n vdb---sc\\n q--\u0026gt;|- モデル\u0026lt;br/\u0026gt;- 処理方法\u0026lt;br/\u0026gt;- 次元\u0026lt;br/\u0026gt;を設定|embedded_q\\n embedded_q---sc\\n sc--\u0026gt;|フィルター条件\u0026lt;br/\u0026gt;も可能|topk\\n topk--\u0026gt;post_process\\n os--\u0026gt;post_process\\n post_process--\u0026gt;res\",\"key\":\"9d1104435453d8620a9f0ad3a33ddfce\"}'\u003e\n\u003c/iframe\u003e\n\n\u003cp data-sourcepos=\"307:1-307:156\"\u003eこのあたりはちょうど以下の記事が公開されていました。チューニングしていくのがやはり大変そうですね・・・。\u003c/p\u003e\n\u003cp data-sourcepos=\"309:1-309:49\"\u003e\u003ciframe id=\"qiita-embed-content__d533b77159656d5ff799db6697ecdd83\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__d533b77159656d5ff799db6697ecdd83\" data-content=\"https%3A%2F%2Fzenn.dev%2Foharu121%2Farticles%2Fefd3d038afc6da\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch1 data-sourcepos=\"311:1-311:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"313:1-313:342\"\u003e実装が簡単でありコードを見てもらった方が早そうなので、記事としては短くまとめています。いずれにせよシンプルながら使えそうに思いますし、ベクトル検索の仕組みを理解する上でも非常に勉強になったので、参考にしていただけると嬉しいです！\u003c/p\u003e\n","body":"# はじめに\n\nAI活用にあたって重要とされるものの1つにRAGがありますが、これはBigQueryなどのDWHでもできるようになり、身近なものになってきています。\n\nhttps://zenn.dev/wataru777/articles/b219caa12c16e1\n\nただ、小規模であれば全然コストはかからないであろうとはいえ、DWHで行うのは少し怖いものがあります。そこで便利なのが、S3 Vectorsです。\n\nhttps://aws.amazon.com/jp/s3/features/vectors/\n\nこれを使うと、ベクトルの保管と検索が激安で行えるようになります。\n\n一方で、S3 Vectors自体の機能は保管と検索に限られるため、検索をかけるベースとするドキュメントに対しては、適切にデータを管理する必要がでてきます。そこで、\n\n- 検索のベースとするドキュメントのデータをデータパイプラインのバッチ処理で管理する\n- 検索対象を指定したベクトル検索をリアルタイムで行えるようにする\n\nという仕組みを考えてみました。コードも公開しているので、よろしければ参考にしてください。\n\nhttps://github.com/SoySoySoyB/vector-search\n\n# 全体構成\n\n全体構成は以下の通りです。\n\n```mermaid\nflowchart LR\n  subgraph Data Management Flow\n    ss[Supported\u003cbr/\u003eSource]\n    ccca[Custom Connector\u003cbr/\u003eCompatible API]\n    subgraph DWH\n      rd[Raw\u003cbr/\u003eDocuments]\n      ed[Embedded\u003cbr/\u003eDocuments]\n      iv[Ingested\u003cbr/\u003eVectors]\n    end\n  end\n  subgraph Search Flow\n    u[User]\n    ui[UI\u003cbr/\u003e（Google Apps Script）]\n  end\n  subgraph API Gateway\n    mapi[Management API\u003cbr/\u003e- /indexes/list\u003cbr/\u003e- /vectors/upsert\u003cbr/\u003e- /vectors/list\u003cbr/\u003e- /vectors/delete]\n    sapi[Search API\u003cbr/\u003e- /vectors/search]\n  end\n  lambda[Lambda]\n  subgraph S3 Vectors\n    subgraph Vector Bucket\n      subgraph i[Index]\n        v[Vectors]\n      end\n    end\n  end\n  ea[Embedding API]\n  s3[Amazon S3]\n\n  ss--\u003e|TROCCO\u003cbr/\u003eNative Connector|rd\n  ccca--\u003e|TROCCO\u003cbr/\u003eSource Custom Connector|rd\n  rd--\u003e|TROCCO Datamart\u003cbr/\u003ewith\u003cbr/\u003eEmbedding Function|ed\n  ed--\u003e|TROCCO\u003cbr/\u003eDestination Custom Connector\u003cbr/\u003ewith\u003cbr/\u003eAPI Key\u003cbr/\u003eAuthentication\u003cbr/\u003e+ IP Restriction|mapi\n  mapi--\u003e|TROCCO\u003cbr/\u003eSource Custom Connector\u003cbr/\u003ewith\u003cbr/\u003eAPI Key\u003cbr/\u003eAuthentication\u003cbr/\u003e+ IP Restriction|iv\n  mapi--\u003elambda\n  u--\u003e|User\u003cbr/\u003eAuthentication\u003cbr/\u003e（email or domain）|ui\n  ui--\u003e|API Key\u003cbr/\u003eAuthentication|sapi\n  sapi--\u003elambda\n  lambda--\u003e|list|i\n  lambda--\u003e|upsert|v\n  lambda--\u003e|list|v\n  lambda--\u003e|delete|v\n  lambda--\u003e|search|v\n  lambda--\u003e|Embedding\u003cbr/\u003eSearch Keyword\u003cbr/\u003e（if search）|ea\n  lambda--\u003e|Request / Response\u003cbr/\u003eStore\u003cbr/\u003e（if search）|s3\n```\n\n- S3 Vectorsとのデータのやり取りはAPI Gateway + Lambdaの構成とする\n  - エンドポイントとしてIndex List、Vectors List / Upsert / Delete / Searchを用意する\n  - Searchの際には、EmbeddingのAPIで検索文言のベクトル化を行い、検索結果はS3に保存する\n- データ管理は以下のように行う\n  - ソースシステムからのデータの取得をTROCCOで行う\n    - 対応していればそのコネクタで、非対応のAPIはカスタムコネクタで連携する\n  - ベクトル化はDWHの関数で実行する\n    - IDと更新日時ベースで差分更新とする\n  - TROCCOの転送先カスタムコネクタでS3 VectorsにデータをUpsertする\n- 検索UIの1つとしてGoogle Apps Scriptで画面を用意する\n\n以下の事例ではQiitaのTROCCOに関連する記事をS3 Vectorsに取り込んでおり、検索をすると以下のように検索結果が表示されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9b4c3964-7de4-4fc8-aeb2-3ffe39676549.png)\n\n今回は簡易な検証のためUIでの検索としていますが、もちろんAIエージェントから検索させて、情報を返してあげることもできるでしょう。\n\nそれでは、ここから簡単に紹介をしていきます。\n\n# そもそもベクトル検索とは\n\nベクトル検索は、\n\n- 検索のベースとするデータを事前にベクトルとして変換しておく\n- 検索対象をベクトル化する\n- 両者の類似度を算出する\n- 類似度をもとに上位N件を抽出する\n\nといった流れを取ります。\n\nこれは冒頭で紹介した[「BigQueryでRAGを構築してみた」](https://zenn.dev/wataru777/articles/b219caa12c16e1)の記事をなぞっていただくとよくわかるのですが、いずれにせよ（今回の設定では）記事のテキストをベクトル＝768次元のfloatの配列に変換します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b446c9a2-54dc-4296-ab4d-63f1eb22f4dc.png)\n\n検索する文字列についても同様にベクトルを生成することで、N次元ベクトル間の距離を数学的に算出し、類似度を判定できるようになっています。\n\nこのとき、変数としては、\n\n- どのモデルで変換するか\n  - 今回は`text-multilingual-embedding-002`を利用している\n- 変換の処理方法をどうするか\n  - 今回の方法では、Task Typeという設定があり、情報検索、類似度判定、分類などの目的によって処理方法が調整できるようになっている\n\nhttps://docs.cloud.google.com/vertex-ai/generative-ai/docs/embeddings/task-types?hl=ja\n\n- 何次元のベクトルに変換するか\n  - 今回は768次元としている\n\nというものがあり、検索の際には、\n\n- 利用するモデルや次元は上記と共通\n- 処理方法は上記に合わせたもの\n\nとして処理を行い、\n\n- 類似度判定のロジックをどうするか\n  - 今回はコサイン類似度を利用しているが、ほかにユークリッド距離などもある\n- 類似度の上位いくつをレスポンスとして返すか\n\nといったところが出てきます。処理の流れに沿って整理すると以下の通りです。\n\n```mermaid\nflowchart LR\n  base[ベースとなる\u003cbr/\u003eデータ]\n  embedded_base[ベクトル化された\u003cbr/\u003eデータ]\n  subgraph s3[S3 Vectors]\n    vdb[ベクトルDB]\n    sc[類似度計算\u003cbr/\u003e- コサイン類似度\u003cbr/\u003e- ユークリッド距離\u003cbr/\u003eなど]\n    topk[Top K抽出]\n  end\n  q[検索データ]\n  embedded_q[ベクトル化された\u003cbr/\u003e検索データ]\n  res[レスポンス]\n\n  base--\u003e|- モデル\u003cbr/\u003e- 処理方法\u003cbr/\u003e- 次元\u003cbr/\u003eを設定|embedded_base\n  embedded_base--\u003e|格納|vdb\n  vdb---sc\n  q--\u003e|- モデル\u003cbr/\u003e- 処理方法\u003cbr/\u003e- 次元\u003cbr/\u003eを設定|embedded_q\n  embedded_q---sc\n  sc--\u003e|フィルター条件\u003cbr/\u003eも可能|topk\n  topk--\u003eres\n```\n\nレスポンスをどうRAGとして処理するかは別途出てくるのですが、それは今回の実装外なので、末尾で改めて触れるようにします。\n\nさて、仕組みとしてはこのようなものなので、実装内容を簡単に紹介していきます。\n\n# 各種実装\n\nここから、各種実装の概要を紹介します。詳細についてはリポジトリを確認してください。\n\n## Lambdaの実装\n\nAPI Gatewayからリクエストを受け取って、S3 Vectors APIとやり取りをするシンプルな構成です。Search APIからのリクエストのみ、テキストが入力された場合はVertex AI APIでEmbeddingを行い、S3にリクエスト／レスポンスを保存するようにしています。\n\nhttps://docs.cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings?hl=ja\n\n余談ですが、リクエストのバリデーションのために初めてPydanticを利用してみて、非常に便利でした。型が適切に処理できるのはAIを利用する上ではかなり助かります。\n\n## Terraformの実装\n\nベクトルバケットやインデックス、API Gateway、Lambda等をTerraformでデプロイしています。\n\nベクトルバケットとインデックスをTerraform管理に寄せて、個々のベクトルデータはAPI経由で操作するという形にしています。\n\nデータ管理のためのAPIについては、アクセス元をTROCCOのグローバルIPのみに制限することで、APIキーと合わせてセキュアなアクセスにしています。\n\n検索APIはGoogle Apps Script経由なので、IPが固定できずキー認証のみという課題はありますが、簡易な検証目的なので今回はこの構成としています。\n\n## TROCCOの実装\n\n次のように、\n\n- ソースシステムからドキュメントを取得する\n- IDと更新日時をキーにEmbeddingしたドキュメントをDelete \u0026 Insertする\n- S3 VectorsにIDをキーにUpsertする\n- UpsertしたレコードをIDベースで転送済にする\n\nという流れを取っています。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e0bee1aa-8c4f-41ee-90b2-1d1992018abb.png)\n\nベクトル化はBigQuery MLの`ml.generate_text_embedding`関数を利用して処理しています。\n\nhttps://docs.cloud.google.com/bigquery/docs/generate-text-embedding?hl=ja\n\nいちいちクエリを書くのが面倒なので、この処理をUDTFでいい感じにできないかと思ったものの、`ml.generate_text_embedding`関数が動的なパラメータを受け付けないため、中途半端な処理になってしまったのは課題です。\n\nまた、転送先カスタムコネクタでデータを連携する際のリクエストテンプレートは次の通りです。これによってDWH上で各カラムとして保持していたデータをリクエストに必要なJSON形式に変換してくれます。\n\n```json\n{\n  \"vectorBucketName\": \"vector-search-********\",\n  \"indexName\": \"qiita-items-trocco\",\n  \"vectors\": [\n    {%- for row in rows %}\n    {\n      \"key\": \"{{ row.id }}\",\n      \"data\": {\"float32\": [{{ row.text_embedding_str }}]},\n      \"metadata\": {\n        \"url\": \"{{ row.url }}\",\n        \"title\": \"{{ row.title }}\",\n        \"source_created_at\": \"{{ row.source_created_at }}\",\n        \"source_updated_at\": \"{{ row.source_updated_at }}\",\n        \"embedding_provider\": \"{{ row.embedding_provider }}\",\n        \"embedding_model\": \"{{ row.embedding_model }}\",\n        \"text_embedded_at\": \"{{ row.text_embedded_at }}\"\n      }\n    } {%- unless forloop.last -%},{%- endunless -%}\n    {%- endfor %}\n  ]\n}\n```\n\n転送先カスタムコネクタの詳細については次の記事を参考にしてください。\n\nhttps://qiita.com/SoySoySoyB/items/8987b5938e2a499053c7\n\n## Google Apps Scriptの実装\n\n基本的にはAPI Gatewayの検索APIにリクエストを送って、レスポンスを表示するだけのシンプルな仕組みです。Webアプリとして公開してユーザーの権限で実行するため、メールアドレスおよびドメインでアクセス制限をかけて、利用者を限定するとともにそのIDをS3に保存するように連携しています。\n\n## 備考\n\nTROCCOからS3 Vectors APIへ直接アクセスさせていないのは、一定の処理を入れるためというのもありますが、認証にSigV4というヘッダーが固定にならない認証方法を取る必要があり、SDK経由にするしかなかったからです。\n\nhttps://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html\n\nhttps://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations_Amazon_S3_Vectors.html\n\nまた、Vertex AI APIの利用にあたってはサービスアカウントキーをSSMに保存することで対応していますが、この処理でそろそろTerraformのEphemeral Resources（Stateに保存せずにクレデンシャルを取り扱える）の出番では・・・？と思ったものの、まだ外部連携には対応していませんでした。そろそろ対応して欲しいところです。\n\nhttps://registry.terraform.io/providers/hashicorp/google/latest/docs/ephemeral-resources/service_account_key\n\n\u003e In future, when write-only arguments are added to resources in the Google provider, ephemeral resources such as google_service_account_key could be used to set field values when creating managed resources.`\n\nEphemeral Resourcesについてはこちらを参考までに。\n\nhttps://zenn.dev/taromurata/articles/terraform_110\n\nなお、本番運用時はWorkload Identity Federationのキーレス認証の方がいいというのは言うまでもないですが。\n\n# 拡張に向けての論点\n\nここまでで、データの更新およびベクトル検索を安価に行う仕組みを紹介してきました。データパイプラインに乗っかってベースのドキュメントを更新しつつ、簡易な仕組みを構築するという意味では使えそうな構成に思っています。\n\n一方で、AIで利用するRAGシステムとしてはまだまだ検討の余地があります。何を目的として、そのために何を素材としてどう使うかというユースケースをベースにしつつ、\n\n- DWHにデータを取り込みするまでの前処理\n  - 例えばHTMLをMarkdownに変換するなど、ソースのデータ形式に応じた共通化の処理\n  - テキストをどう処理するか\n    - 長文テキストの場合、そのまま突っ込んでも取り回しが悪くなる\n    - そこで、チャンク化（テキストの分割）をするわけだが、これをどういう単位で切って、チャンク間での重複を持たせるかなど\n- どうベクトル化するか\n  - 前述したような、モデル、処理方法、次元数等\n- どう検索するか\n  - 検索対象の入れ方、フィルタ条件\n- 検索結果をどう後処理するか\n  - チャンク化したときの周辺コンテキストの取扱い（周辺の文章も合わせて処理するなど）\n  - 更新日などの別指標や、全文検索など別の検索結果も組み合わせたリランキング\n- 評価と改善\n  - 処理の適切性をどういった指標で評価し、数多くある変数のどこを調整して改善していくか\n\nといった点が論点として挙がってきます。前掲していた図を拡張すると、次のようになります。\n\n```mermaid\nflowchart LR\n  base[ベースとなる\u003cbr/\u003eデータ]\n  prep_base[前処理された\u003cbr/\u003eデータ]\n  embedded_base[ベクトル化された\u003cbr/\u003eデータ]\n  subgraph s3[S3 Vectors]\n    vdb[ベクトルDB]\n    sc[類似度計算\u003cbr/\u003e- コサイン類似度\u003cbr/\u003e- ユークリッド距離\u003cbr/\u003eなど]\n    topk[Top K抽出]\n  end\n  q[検索データ]\n  embedded_q[ベクトル化された\u003cbr/\u003e検索データ]\n  os[全文検索など]\n  post_process[後処理\u003cbr/\u003e- 関連ドキュメント取得\u003cbr/\u003e- リランキング]\n  res[レスポンス]\n\n  base--\u003e|- 形式変換\u003cbr/\u003e- チャンク化\u003cbr/\u003eなど|prep_base\n  prep_base--\u003e|- モデル\u003cbr/\u003e- 処理方法\u003cbr/\u003e- 次元\u003cbr/\u003eを設定|embedded_base\n  embedded_base--\u003e|格納|vdb\n  vdb---sc\n  q--\u003e|- モデル\u003cbr/\u003e- 処理方法\u003cbr/\u003e- 次元\u003cbr/\u003eを設定|embedded_q\n  embedded_q---sc\n  sc--\u003e|フィルター条件\u003cbr/\u003eも可能|topk\n  topk--\u003epost_process\n  os--\u003epost_process\n  post_process--\u003eres\n```\n\nこのあたりはちょうど以下の記事が公開されていました。チューニングしていくのがやはり大変そうですね・・・。\n\nhttps://zenn.dev/oharu121/articles/efd3d038afc6da\n\n# おわりに\n\n実装が簡単でありコードを見てもらった方が早そうなので、記事としては短くまとめています。いずれにせよシンプルながら使えそうに思いますし、ベクトル検索の仕組みを理解する上でも非常に勉強になったので、参考にしていただけると嬉しいです！\n","coediting":false,"comments_count":0,"created_at":"2026-01-04T21:20:28+09:00","group":null,"id":"eeb5c3b4d725f89c8be9","likes_count":2,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"rag","versions":[]},{"name":"trocco","versions":[]},{"name":"データパイプライン","versions":[]},{"name":"ベクトル検索","versions":[]},{"name":"S3Vectors","versions":[]}],"title":"S3 Vectorsによる激安RAG環境をデータパイプラインに組み込もうとしてみる","updated_at":"2026-01-04T21:20:28+09:00","url":"https://qiita.com/SoySoySoyB/items/eeb5c3b4d725f89c8be9","user":{"description":"データ基盤運用SaaSのPMM｜SnowPro Core/Google Certified Professional Data Engineer資格保持｜関心はデータサイエンス/データエンジニアリング/学術/教育/人材育成など","facebook_id":"","followees_count":0,"followers_count":41,"github_login_name":null,"id":"SoySoySoyB","items_count":59,"linkedin_id":"","location":"","name":"D","organization":"primeNumber Inc.","permanent_id":3492462,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3492462/e25cd3e19152b991613ccced5875eed607083730/x_large.png?1687963044","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003cp data-sourcepos=\"1:1-2:246\"\u003eこの記事は TROCCO® Advent Calendar 2025 15日目 の記事を、12日遅れの12/27に投稿しています。\u003cbr\u003e\n記載内容は個人の見解であり、所属する組織の公式見解ではありません。内容は検証・導入の中で得た知見に基づき記載していますが、誤り等が含まれていましたらご指摘ください。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"4:1-4:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"5:1-7:103\"\u003eSAP、と言っても本記事で扱うのは、SMB向けの”SAP Business ByDesign”です。ECC6.0やS/4HANAOnPremise、S/4HANACloudではないので、日本では参考になる読者少なめのマニアック記事です。何卒ご容赦を。\u003cbr\u003e\nそのSAP Business ByDesignからTROCCOを使ってデータを取得します。\u003cbr\u003e\nまたBlog初心者で、だらだらとしたものに仕上がっております。悪しからず。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"9:1-9:44\"\u003e\n\u003cspan id=\"そもそもsap-business-bydesignって\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82sap-business-bydesign%E3%81%A3%E3%81%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eそもそもSAP Business ByDesignって？\u003c/h1\u003e\n\u003cp data-sourcepos=\"10:1-13:260\"\u003eSMB向けのCloud型ERPソリューションです。通称”ByD”と呼びます。\u003cbr\u003e\n\u003ca href=\"https://www.sap.com/documents/2017/06/b4e1765d-c37c-0010-82c7-eda71af511fa.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.sap.com/documents/2017/06/b4e1765d-c37c-0010-82c7-eda71af511fa.html\u003c/a\u003e\u003cbr\u003e\n多くの方はSAP＝S/4HANA（SAP＝ECC6.0の方は移行頑張ってください）かと思いますが、SMB向けにコンパクトなCloudERPとして提供されています。（数年後にEOLのうわさもあったりなかったり、、、）\u003cbr\u003e\nSAPユーザおなじみのSAPGUIの選択肢はなく、ほぼ100%ブラウザベースです。（機能によっては標準でExcelアドインが提供されているなど、ブラウザ以外のUIもちょこっとあります。でもGUIはなし。）\u003c/p\u003e\n\u003ch1 data-sourcepos=\"15:1-15:23\"\u003e\n\u003cspan id=\"検証のきっかけ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%A4%9C%E8%A8%BC%E3%81%AE%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e検証のきっかけ\u003c/h1\u003e\n\u003cp data-sourcepos=\"16:1-19:43\"\u003e2023年から在庫・売上管理などなど基幹システムとしてByDを利用してます。自社はSMBの中でも非エンジニアのITチームしかないのでIFの自社開発は難しくて、SIerさんに委託してIFなどを構築してもらってます。\u003cbr\u003e\nので改修や新規構築にはコストと時間が、、、、でも基幹システムのデータはデータレイクに貯めてもっと色々活用したい！と思いながら早2年、、、\u003cbr\u003e\nそんな時にS/4HANA向けコネクターがリリースされたらしいと。\u003cbr\u003e\n\u003ca href=\"https://primenumber.com/blog/sap_erp_trocco\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://primenumber.com/blog/sap_erp_trocco\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"21:1-21:119\"\u003e\u003cstrong\u003e\"S/4ではないけど、ByDも同じODataでデータは取得できるし、なんかいけそうじゃない？\"\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"23:1-24:38\"\u003eということでCustomerSuccessの方にお願いして、AdvancedPlanではS/4コネクタは使えないので、ProfessionalPlanを期間を区切ってPoCさせてもらうことに。\u003cbr\u003e\n\u003ca href=\"https://primenumber.com/trocco/pricing\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://primenumber.com/trocco/pricing\u003c/a\u003e\u003c/p\u003e\n\u003ch1 data-sourcepos=\"26:1-26:8\"\u003e\n\u003cspan id=\"検証\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%A4%9C%E8%A8%BC\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e検証\u003c/h1\u003e\n\u003ch2 data-sourcepos=\"27:1-27:36\"\u003e\n\u003cspan id=\"まずはsapコネクターから\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%9A%E3%81%AFsap%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%8B%E3%82%89\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまずはSAPコネクターから\u003c/h2\u003e\n\u003cp data-sourcepos=\"28:1-33:54\"\u003e結論、一応データ取れました。S/4でなくてもODataであればいけますね。\u003cbr\u003e\nマニアックな設定もないし、1つつまずきポイントがありましたが、それ込みで実質3hくらいでデータ取得まで出来ました！\u003cbr\u003e\n良かった良かった。でも実運用には乗れなかったんです。。。\u003cbr\u003e\n設定フローは以下のpNさんのBLOGに詳細あるので、かい摘んでご説明しつつ、実運用には乗れなかったあたりを含めて解説です。\u003cbr\u003e\n\u003ca href=\"https://documents.trocco.io/docs/connection-configuration-sap-odata\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://documents.trocco.io/docs/connection-configuration-sap-odata\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://documents.trocco.io/docs/data-source-sap-odata\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://documents.trocco.io/docs/data-source-sap-odata\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"35:1-39:162\"\u003e\u003cstrong\u003e1. 接続情報を設定\u003c/strong\u003e\u003cbr\u003e\nホスト名、クライアント番号（ByDの場合は不要）、認証方式、ユーザ名＋パスワード　もしくは　APIキー。\u003cbr\u003e\nここで迷うことは特になかったです。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F3246aac0-f141-40dd-8de7-46b613fa97a5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=19a175a15c2d11c75a3b4010280c54cf\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F3246aac0-f141-40dd-8de7-46b613fa97a5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=19a175a15c2d11c75a3b4010280c54cf\" alt=\"スクリーンショット 2025-12-02 120551.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F3246aac0-f141-40dd-8de7-46b613fa97a5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2d23246e875b10a6b0227893bee5594b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/3246aac0-f141-40dd-8de7-46b613fa97a5.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F4a828c59-49ec-4ef4-9926-e77ef0ca24ab.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bab881e42436191de0e4119c0d4537dd\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F4a828c59-49ec-4ef4-9926-e77ef0ca24ab.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bab881e42436191de0e4119c0d4537dd\" alt=\"スクリーンショット 2025-12-02 120605.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F4a828c59-49ec-4ef4-9926-e77ef0ca24ab.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=1fb66d2bb488cc1e7c18fc84aefa430e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/4a828c59-49ec-4ef4-9926-e77ef0ca24ab.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"41:1-48:162\"\u003e\u003cstrong\u003e2. データ転送設定\u003c/strong\u003e\u003cbr\u003e\nデータ転送設定で、FROMにS/4を、ToにBQをセットします。\u003cbr\u003e\nサービスパス、エンティティ名、選択フィールドをセットします。\u003cbr\u003e\n迷うとしたらここかもしれません。でもODataはURIベースでデータ取得をしてくる仕組みなので、そこの前提が押さえられていれば、あとはデータ取得のためのURIを分解して、TROCCOの各設定項目にセットしていくだけという感じです。\u003cbr\u003e\nS/4に合わせてTROCCOの方で丁寧に設定項目を用意してくれているので、SAP＋ODataのナレッジがあればいけそうです。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F13b8b74f-49ce-4322-9daf-b032d88e96bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=fafa5cdab4a61f3b6490a801ee32f77e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F13b8b74f-49ce-4322-9daf-b032d88e96bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=fafa5cdab4a61f3b6490a801ee32f77e\" alt=\"スクリーンショット 2025-11-11 152243.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F13b8b74f-49ce-4322-9daf-b032d88e96bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6028d3a8b0d4c740092acb31dc3fa17e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/13b8b74f-49ce-4322-9daf-b032d88e96bc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F2653ac2d-7ef2-445f-93aa-3ec6e5b21b50.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=34bb9b483ba59349aafd7f64a50dff81\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F2653ac2d-7ef2-445f-93aa-3ec6e5b21b50.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=34bb9b483ba59349aafd7f64a50dff81\" alt=\"スクリーンショット 2025-11-11 152251.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F2653ac2d-7ef2-445f-93aa-3ec6e5b21b50.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=72161340e0cb8a791759701f6dedeefe 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/2653ac2d-7ef2-445f-93aa-3ec6e5b21b50.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F0bf4a2cb-ac86-4230-a534-e9c1ed44efb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=8f776ab767828a3c3fe4283325d044bb\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F0bf4a2cb-ac86-4230-a534-e9c1ed44efb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=8f776ab767828a3c3fe4283325d044bb\" alt=\"スクリーンショット 2025-11-11 152259.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F0bf4a2cb-ac86-4230-a534-e9c1ed44efb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=86a5887ae5019b0fad969ab9079d3294 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/0bf4a2cb-ac86-4230-a534-e9c1ed44efb3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"50:1-51:168\"\u003eここまでは順調。BQ側の設定（\u003ca href=\"https://documents.trocco.io/docs/data-destination-bigquery?highlight=BIGQUERY%EF%BC%89\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://documents.trocco.io/docs/data-destination-bigquery?highlight=BIGQUERY）\u003c/a\u003e\u003cbr\u003e\nはサクッと済ませて、\u003cstrong\u003e\"まあ細かい設定はあとでやろう”\u003c/strong\u003e　ということではやる気持ちを押さえられずにTESTRUNしてみます。\u003c/p\u003e\n\u003cp data-sourcepos=\"53:1-57:162\"\u003eが、ここでつまづき①\u003cbr\u003e\nこれはS/4、BYDともに起こりえそうですが、読込Timeoutのエラーが出ました。\u003cbr\u003e\nエラーログを見ながら、接続／読込タイムアウトの時間などもちょこちょこ調整していきます。\u003cbr\u003e\nBYDはパフォーマンスの問題もあり、以下の通り、かなり長めの設定にしました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F278f075d-6068-4425-b199-48b697e7d3b0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=caf1b57469ec3e983be019d63076434b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F278f075d-6068-4425-b199-48b697e7d3b0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=caf1b57469ec3e983be019d63076434b\" alt=\"スクリーンショット 2025-11-11 152319.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F278f075d-6068-4425-b199-48b697e7d3b0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c9e01882500130fb29aaa102588cc207 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/278f075d-6068-4425-b199-48b697e7d3b0.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"59:1-62:162\"\u003e\u003cstrong\u003e\"ふー無事解決。今度こそ！”\u003c/strong\u003e\u003cbr\u003e\n再度TESTRUNしたら無事にデータ取得出来ました！\u003cbr\u003e\nこの瞬間結構好きなんです、取れたぜ！みたいな。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F53da6710-df14-4c72-ab7e-9e8f7a560822.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f11b62b18374736c422e2f5acd12e37\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F53da6710-df14-4c72-ab7e-9e8f7a560822.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f11b62b18374736c422e2f5acd12e37\" alt=\"スクリーンショット 2025-12-02 124951.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F53da6710-df14-4c72-ab7e-9e8f7a560822.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=dff6081fd8cdf50f042ecbe6eacd36ae 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/53da6710-df14-4c72-ab7e-9e8f7a560822.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"64:1-66:45\"\u003eと思ったものの、\u003cbr\u003e\n\u003cstrong\u003e\"あれ？なぜレコード数が50件？もっとあるでしょ？”\u003c/strong\u003e\u003cbr\u003e\n細かいところで落とし穴が、、、\u003c/p\u003e\n\u003cp data-sourcepos=\"68:1-72:69\"\u003eこれはSAP ByDesign側の仕様でデフォルトの取得件数が50件のようでした。\u003cbr\u003e\nかつこれは私の力不足で原因不明のままですが、ページネーションによる取得がうまく動かず。\u003cbr\u003e\nなので一回のリクエストで取得しないといけないようです。\u003cbr\u003e\nということでやむなく、明示的に取得件数を増やします。\u003cbr\u003e\n上限値を思い切って10,000件くらいにしてしまおう！\u003c/p\u003e\n\u003cp data-sourcepos=\"74:1-75:87\"\u003eと思ったものの、今度はTROCCO側の仕様で、1回のリクエストの取得上限値は1,000件までのよう。\u003cbr\u003e\nと、この辺りで挫折しました。なかなかうまくいかないですね。\u003c/p\u003e\n\u003cp data-sourcepos=\"77:1-81:77\"\u003e\u003cstrong\u003e結果\u003c/strong\u003e\u003cbr\u003e\n\u003cstrong\u003eSAP S/4HANAコネクターを使ってByDesignからデータ取得は出来た！\u003cbr\u003e\nが、MAX1000レコードまで。。。。\u003cbr\u003e\n件数のものすごい少ないマスタデータとかなら使えるかも。\u003cbr\u003e\nもっとうまくやっている方いたらぜひご共有ください。\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"84:1-84:41\"\u003e\n\u003cspan id=\"一周回ってhttpsコネクターに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%B8%80%E5%91%A8%E5%9B%9E%E3%81%A3%E3%81%A6https%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e一周回ってHTTPSコネクターに\u003c/h2\u003e\n\u003cp data-sourcepos=\"85:1-87:51\"\u003e\u003cstrong\u003e\"他社さんはHTTTPコネクターでBasic認証させて取得しているみたいですよ？\"\u003c/strong\u003e\u003cbr\u003e\nS/4HANAコネクターで壁にぶつかり、CSさんに助けを乞うたら、上記のアドバイス。たしかにODataでデータ取得しているならHTTPでいけるのか。\u003cbr\u003e\n盲点でした。早速トライしてみます。\u003c/p\u003e\n\u003cp data-sourcepos=\"89:1-93:162\"\u003e\u003cstrong\u003eデータ転送設定\u003c/strong\u003e\u003cbr\u003e\nURLはS/4HANAコネクターと同じなのでさくっとセット。\u003cbr\u003e\nユーザエージェントは当初空欄から始めて、TESTRUNでエラーに当たり、Geminiに助けてもらいながら値をセットしていきました。\u003cbr\u003e\nAI様様。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F1d1120ad-54d8-4e68-b689-3d9cb4f62a2d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0c7607193d77fe1e3e18e3df5e8152a7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F1d1120ad-54d8-4e68-b689-3d9cb4f62a2d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0c7607193d77fe1e3e18e3df5e8152a7\" alt=\"スクリーンショット 2025-12-26 174602.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2F1d1120ad-54d8-4e68-b689-3d9cb4f62a2d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=8b081b25912ee990a9a0643d7a5ddbd6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/1d1120ad-54d8-4e68-b689-3d9cb4f62a2d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"95:1-97:162\"\u003eページング設定は基本デフォルト値をそのまま採用していきました。\u003cbr\u003e\nHTTPSコネクタはリクエストごとに取得データ件数上限がないので10000件をセットしちゃいます。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fe692bf55-346c-4d17-ad95-5783cfd20574.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a2366ed2fbc03228ca11e443aebdd0f3\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fe692bf55-346c-4d17-ad95-5783cfd20574.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a2366ed2fbc03228ca11e443aebdd0f3\" alt=\"スクリーンショット 2025-12-26 183049.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fe692bf55-346c-4d17-ad95-5783cfd20574.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=f7f5c05ec5b3111cd71ec77233f9aa3a 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/e692bf55-346c-4d17-ad95-5783cfd20574.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"100:1-101:162\"\u003eパラメータやHTTPSヘッダーの項目は、ODataを扱えればそれほど難しくないですね。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fc375cff6-f6df-4a75-b254-a543e56e673b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=528f33f259dd6f4a2e46e9834cb40250\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fc375cff6-f6df-4a75-b254-a543e56e673b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=528f33f259dd6f4a2e46e9834cb40250\" alt=\"スクリーンショット 2025-12-26 174628.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2602424%2Fc375cff6-f6df-4a75-b254-a543e56e673b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=65472564c51e44a64ddd9069bf985183 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/c375cff6-f6df-4a75-b254-a543e56e673b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"103:1-104:52\"\u003e認証周りはエンコードで凡ミスして少し苦戦したものの、\u003cbr\u003e\n\u003cstrong\u003e晴れてデータが取得出来ました！！\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"106:1-106:146\"\u003eエンコードの凡ミスなんてしない方であれば、こちらも実質3hくらいでデータ取得まで出来るかと思います。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"108:1-108:11\"\u003e\n\u003cspan id=\"現在地\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%8F%BE%E5%9C%A8%E5%9C%B0\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e現在地\u003c/h1\u003e\n\u003cp data-sourcepos=\"109:1-110:359\"\u003e一度データが取れたらこちらのものです。\u003cbr\u003e\n売上、在庫をはじめとしたトランザクションデータはもちろん、得意先、倉庫、予算などのマスターデータもどんどんTROCCOでBQに流して、同じくTROCCOのデータマート定義でどんどんJOBを回して、データ生成・集計が劇的に変わり始めております。さらば表計算ツール！\u003c/p\u003e\n\u003ch1 data-sourcepos=\"113:1-113:14\"\u003e\n\u003cspan id=\"さいごに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eさいごに\u003c/h1\u003e\n\u003cp data-sourcepos=\"114:1-116:75\"\u003e長きにわたってテクニカルなサポートくださったCSのNさん、Kさん、トライアルの為にプランを調整してくださった営業のMさん本当にありがとうございました！\u003cbr\u003e\nもしTROCCOユーザかつBYDユーザの方がいらしたら、ぜひぜひコメントお待ちしております。\u003cbr\u003e\nマニアックなシステムなので情報交換させてください。\u003c/p\u003e\n","body":"この記事は TROCCO® Advent Calendar 2025 15日目 の記事を、12日遅れの12/27に投稿しています。\n記載内容は個人の見解であり、所属する組織の公式見解ではありません。内容は検証・導入の中で得た知見に基づき記載していますが、誤り等が含まれていましたらご指摘ください。\n\n# はじめに\nSAP、と言っても本記事で扱うのは、SMB向けの”SAP Business ByDesign”です。ECC6.0やS/4HANAOnPremise、S/4HANACloudではないので、日本では参考になる読者少なめのマニアック記事です。何卒ご容赦を。\nそのSAP Business ByDesignからTROCCOを使ってデータを取得します。\nまたBlog初心者で、だらだらとしたものに仕上がっております。悪しからず。\n\n# そもそもSAP Business ByDesignって？\nSMB向けのCloud型ERPソリューションです。通称”ByD”と呼びます。\nhttps://www.sap.com/documents/2017/06/b4e1765d-c37c-0010-82c7-eda71af511fa.html\n多くの方はSAP＝S/4HANA（SAP＝ECC6.0の方は移行頑張ってください）かと思いますが、SMB向けにコンパクトなCloudERPとして提供されています。（数年後にEOLのうわさもあったりなかったり、、、）\nSAPユーザおなじみのSAPGUIの選択肢はなく、ほぼ100%ブラウザベースです。（機能によっては標準でExcelアドインが提供されているなど、ブラウザ以外のUIもちょこっとあります。でもGUIはなし。）\n\n# 検証のきっかけ\n2023年から在庫・売上管理などなど基幹システムとしてByDを利用してます。自社はSMBの中でも非エンジニアのITチームしかないのでIFの自社開発は難しくて、SIerさんに委託してIFなどを構築してもらってます。\nので改修や新規構築にはコストと時間が、、、、でも基幹システムのデータはデータレイクに貯めてもっと色々活用したい！と思いながら早2年、、、\nそんな時にS/4HANA向けコネクターがリリースされたらしいと。\nhttps://primenumber.com/blog/sap_erp_trocco\n\n**\"S/4ではないけど、ByDも同じODataでデータは取得できるし、なんかいけそうじゃない？\"**\n\nということでCustomerSuccessの方にお願いして、AdvancedPlanではS/4コネクタは使えないので、ProfessionalPlanを期間を区切ってPoCさせてもらうことに。\nhttps://primenumber.com/trocco/pricing\n\n# 検証\n## まずはSAPコネクターから\n結論、一応データ取れました。S/4でなくてもODataであればいけますね。\nマニアックな設定もないし、1つつまずきポイントがありましたが、それ込みで実質3hくらいでデータ取得まで出来ました！\n良かった良かった。でも実運用には乗れなかったんです。。。\n設定フローは以下のpNさんのBLOGに詳細あるので、かい摘んでご説明しつつ、実運用には乗れなかったあたりを含めて解説です。\nhttps://documents.trocco.io/docs/connection-configuration-sap-odata\nhttps://documents.trocco.io/docs/data-source-sap-odata\n\n**1. 接続情報を設定**\n    ホスト名、クライアント番号（ByDの場合は不要）、認証方式、ユーザ名＋パスワード　もしくは　APIキー。\n    ここで迷うことは特になかったです。\n    ![スクリーンショット 2025-12-02 120551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/3246aac0-f141-40dd-8de7-46b613fa97a5.png)\n![スクリーンショット 2025-12-02 120605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/4a828c59-49ec-4ef4-9926-e77ef0ca24ab.png)\n\n**2. データ転送設定**\nデータ転送設定で、FROMにS/4を、ToにBQをセットします。\nサービスパス、エンティティ名、選択フィールドをセットします。\n迷うとしたらここかもしれません。でもODataはURIベースでデータ取得をしてくる仕組みなので、そこの前提が押さえられていれば、あとはデータ取得のためのURIを分解して、TROCCOの各設定項目にセットしていくだけという感じです。\nS/4に合わせてTROCCOの方で丁寧に設定項目を用意してくれているので、SAP＋ODataのナレッジがあればいけそうです。\n![スクリーンショット 2025-11-11 152243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/13b8b74f-49ce-4322-9daf-b032d88e96bc.png)\n![スクリーンショット 2025-11-11 152251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/2653ac2d-7ef2-445f-93aa-3ec6e5b21b50.png)\n![スクリーンショット 2025-11-11 152259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/0bf4a2cb-ac86-4230-a534-e9c1ed44efb3.png)\n\nここまでは順調。BQ側の設定（https://documents.trocco.io/docs/data-destination-bigquery?highlight=BIGQUERY）\nはサクッと済ませて、**\"まあ細かい設定はあとでやろう”**　ということではやる気持ちを押さえられずにTESTRUNしてみます。\n\nが、ここでつまづき①\nこれはS/4、BYDともに起こりえそうですが、読込Timeoutのエラーが出ました。\nエラーログを見ながら、接続／読込タイムアウトの時間などもちょこちょこ調整していきます。\nBYDはパフォーマンスの問題もあり、以下の通り、かなり長めの設定にしました。\n![スクリーンショット 2025-11-11 152319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/278f075d-6068-4425-b199-48b697e7d3b0.png)\n\n**\"ふー無事解決。今度こそ！”**\n再度TESTRUNしたら無事にデータ取得出来ました！\nこの瞬間結構好きなんです、取れたぜ！みたいな。\n![スクリーンショット 2025-12-02 124951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/53da6710-df14-4c72-ab7e-9e8f7a560822.png)\n\nと思ったものの、\n**\"あれ？なぜレコード数が50件？もっとあるでしょ？”**\n細かいところで落とし穴が、、、\n\nこれはSAP ByDesign側の仕様でデフォルトの取得件数が50件のようでした。\nかつこれは私の力不足で原因不明のままですが、ページネーションによる取得がうまく動かず。\nなので一回のリクエストで取得しないといけないようです。\nということでやむなく、明示的に取得件数を増やします。\n上限値を思い切って10,000件くらいにしてしまおう！\n\nと思ったものの、今度はTROCCO側の仕様で、1回のリクエストの取得上限値は1,000件までのよう。\nと、この辺りで挫折しました。なかなかうまくいかないですね。\n\n**結果**\n**SAP S/4HANAコネクターを使ってByDesignからデータ取得は出来た！\nが、MAX1000レコードまで。。。。\n件数のものすごい少ないマスタデータとかなら使えるかも。\nもっとうまくやっている方いたらぜひご共有ください。**\n\n\n## 一周回ってHTTPSコネクターに\n**\"他社さんはHTTTPコネクターでBasic認証させて取得しているみたいですよ？\"**\nS/4HANAコネクターで壁にぶつかり、CSさんに助けを乞うたら、上記のアドバイス。たしかにODataでデータ取得しているならHTTPでいけるのか。\n盲点でした。早速トライしてみます。\n\n**データ転送設定**\nURLはS/4HANAコネクターと同じなのでさくっとセット。\nユーザエージェントは当初空欄から始めて、TESTRUNでエラーに当たり、Geminiに助けてもらいながら値をセットしていきました。\nAI様様。\n![スクリーンショット 2025-12-26 174602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/1d1120ad-54d8-4e68-b689-3d9cb4f62a2d.png)\n\nページング設定は基本デフォルト値をそのまま採用していきました。\nHTTPSコネクタはリクエストごとに取得データ件数上限がないので10000件をセットしちゃいます。\n![スクリーンショット 2025-12-26 183049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/e692bf55-346c-4d17-ad95-5783cfd20574.png)\n\n\nパラメータやHTTPSヘッダーの項目は、ODataを扱えればそれほど難しくないですね。\n![スクリーンショット 2025-12-26 174628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/c375cff6-f6df-4a75-b254-a543e56e673b.png)\n\n認証周りはエンコードで凡ミスして少し苦戦したものの、\n**晴れてデータが取得出来ました！！**\n\nエンコードの凡ミスなんてしない方であれば、こちらも実質3hくらいでデータ取得まで出来るかと思います。\n\n# 現在地\n一度データが取れたらこちらのものです。\n売上、在庫をはじめとしたトランザクションデータはもちろん、得意先、倉庫、予算などのマスターデータもどんどんTROCCOでBQに流して、同じくTROCCOのデータマート定義でどんどんJOBを回して、データ生成・集計が劇的に変わり始めております。さらば表計算ツール！\n\n\n# さいごに\n長きにわたってテクニカルなサポートくださったCSのNさん、Kさん、トライアルの為にプランを調整してくださった営業のMさん本当にありがとうございました！\nもしTROCCOユーザかつBYDユーザの方がいらしたら、ぜひぜひコメントお待ちしております。\nマニアックなシステムなので情報交換させてください。\n","coediting":false,"comments_count":0,"created_at":"2025-12-27T17:09:30+09:00","group":null,"id":"7dbf8e9547b3bed108f9","likes_count":3,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"SAP","versions":[]},{"name":"SaaS","versions":[]},{"name":"ERP","versions":[]},{"name":"trocco","versions":[]},{"name":"ByDesign","versions":[]}],"title":"TROCCOでSAPのデータをどうにか取得したい","updated_at":"2025-12-27T23:49:52+09:00","url":"https://qiita.com/mdfqg542/items/7dbf8e9547b3bed108f9","user":{"description":"文系の非プログラマーです。新卒でたまたま情シス部門へ。以来情シス畑で10年近く、、、\r\nプログラムを書けないことがコンプレックスです。代わりにPMを学びました。ノーコード、ローコードツールのブーム大歓迎です。\r\n社内SEとして、各種SaaS導入・運用の勘所を中心にシェアしていきます。","facebook_id":"","followees_count":3,"followers_count":0,"github_login_name":null,"id":"mdfqg542","items_count":2,"linkedin_id":"","location":"Tokyo","name":"ktr m","organization":"","permanent_id":2602424,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/2602424/c81986cc39a27af70bd30c5ed7130fbc82bd41ce/x_large.png?1659016814","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003cp data-sourcepos=\"1:1-2:58\"\u003e本日気になった注意喚起情報（12/23）\u003cbr\u003e\n\u003ca href=\"https://foxsecurity.hatenablog.com/entry/2025/12/23/064255\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://foxsecurity.hatenablog.com/entry/2025/12/23/064255\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"4:1-5:36\"\u003eDigiEver製NVRの脆弱性悪用に注意 - 米CISAが警告(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.security-next.com/178868\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.security-next.com/178868\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-8:64\"\u003eReactの深刻な脆弱性「React2Shell」の悪用事例　Google脅威インテリジェンス部門が報告(12/23)\u003cbr\u003e\n\u003ca href=\"https://atmarkit.itmedia.co.jp/ait/articles/2512/23/news055.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://atmarkit.itmedia.co.jp/ait/articles/2512/23/news055.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"10:1-11:60\"\u003eバンダイチャンネルへの不正アクセス、最大 136.6 万件の会員情報漏えいの可能性(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.excite.co.jp/news/article/Scannetsecurity_54309/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.excite.co.jp/news/article/Scannetsecurity_54309/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-14:60\"\u003eFortinet製品に“認証バイパス”の死角　管理者権限を奪われる「深刻な脆弱性」の正体(12/22)\u003cbr\u003e\n\u003ca href=\"https://techtarget.itmedia.co.jp/tt/news/2512/22/news11.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://techtarget.itmedia.co.jp/tt/news/2512/22/news11.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"16:1-17:125\"\u003eMakop ランサムウェア：インド企業への攻撃における GuLoader と特権昇格(12/22)\u003cbr\u003e\n\u003ca href=\"https://www.acronis.com/ja/tru/posts/makop-ransomware-guloader-and-privilege-escalation-in-attacks-against-indian-businesses/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.acronis.com/ja/tru/posts/makop-ransomware-guloader-and-privilege-escalation-in-attacks-against-indian-businesses/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"19:1-20:42\"\u003eエレコム、イカロス モバイルセキュリティを終了　影響を受けるユーザーは？(12/23)\u003cbr\u003e\n\u003ca href=\"https://ascii.jp/elem/000/004/362/4362310/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://ascii.jp/elem/000/004/362/4362310/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"22:1-23:45\"\u003eThales AI Security Fabricを発表(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.nikkan.co.jp/releases/view/207838\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.nikkan.co.jp/releases/view/207838\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"25:1-26:57\"\u003e2025年ガートナー マジック・クアドラント 電子メールセキュリティ分野でマイクロソフトがリーダーに選出(12/23)\u003cbr\u003e\n\u003ca href=\"https://s.netsecurity.ne.jp/article/2025/12/23/54300.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://s.netsecurity.ne.jp/article/2025/12/23/54300.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"28:1-29:43\"\u003eハウス食品グループ、AWS環境に「CloudFastener」を導入し運用体制を強化(12/23)\u003cbr\u003e\n\u003ca href=\"https://enterprisezine.jp/news/detail/23426\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://enterprisezine.jp/news/detail/23426\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"31:1-32:46\"\u003eWatchGuard製Fireboxのikedにおける境界外書き込みの脆弱性（CVE-2025-14733）に関する注意喚起(12/22)\u003cbr\u003e\n\u003ca href=\"https://www.jpcert.or.jp/at/2025/at250027.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.jpcert.or.jp/at/2025/at250027.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"34:1-35:45\"\u003eAndroidセキュリティ更新、サポート外の「12」以前は重大な脅威に直面(12/22)\u003cbr\u003e\n\u003ca href=\"https://forbesjapan.com/articles/detail/87769\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://forbesjapan.com/articles/detail/87769\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"37:1-38:40\"\u003e不正アクセス受けトップページ改ざん被害│東京反訳株式会社(12/23)\u003cbr\u003e\n\u003ca href=\"https://cybersecurity-jp.com/news/111833\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://cybersecurity-jp.com/news/111833\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"40:1-41:60\"\u003eCentral Dogma にオープンリダイレクトの脆弱性(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.excite.co.jp/news/article/Scannetsecurity_54301/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.excite.co.jp/news/article/Scannetsecurity_54301/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"43:1-44:67\"\u003e「Windows Update」で問題が発生したときのためのMicrosoftの切り札「KIR」ってなんだ？(12/23)\u003cbr\u003e\n\u003ca href=\"https://forest.watch.impress.co.jp/docs/serial/yajiuma/2073615.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://forest.watch.impress.co.jp/docs/serial/yajiuma/2073615.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"46:1-47:46\"\u003eSTORESにおけるTROCCOの導入と活用事例(12/23)\u003cbr\u003e\n\u003ca href=\"https://product.st.inc/entry/2025/12/23/170927\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://product.st.inc/entry/2025/12/23/170927\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"49:1-50:37\"\u003e就活イベントへの参加申込など…1200人分、3700件の学生の氏名やメールアドレス、学校名など　個人情報が企業3社に漏えい　ふるさとしまね定住財団(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.jp/i/1376136030054285874\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.jp/i/1376136030054285874\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"52:1-53:57\"\u003eテーオーシーのネットワークに不正アクセス、業績予想に及ぼす影響については精査中(12/23)\u003cbr\u003e\n\u003ca href=\"https://s.netsecurity.ne.jp/article/2025/12/23/54305.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://s.netsecurity.ne.jp/article/2025/12/23/54305.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"55:1-56:74\"\u003eAIブラウザ「ChatGPT Atlas」では「勝手に辞職メールを送信」など有害な攻撃を次々に編み出す自動ハッキングAIを使ってセキュリティが強化されている(12/23)\u003cbr\u003e\n\u003ca href=\"https://gigazine.net/news/20251223-chatgpt-atlas-prompt-injection-attacks/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://gigazine.net/news/20251223-chatgpt-atlas-prompt-injection-attacks/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"58:1-59:77\"\u003e年末年始｢システム停止招くサイバー攻撃｣に注意(12/23)\u003cbr\u003e\n\u003ca href=\"https://topics.smt.docomo.ne.jp/article/toyokeizai/business/toyokeizai-924414\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://topics.smt.docomo.ne.jp/article/toyokeizai/business/toyokeizai-924414\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"61:1-62:78\"\u003e韓国政府、SIMカード購入時に顔認証を義務付けへ(12/23)\u003cbr\u003e\n\u003ca href=\"https://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43190/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43190/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"64:1-65:32\"\u003eメディアプレーヤ MP-01における重要な機能に対する認証の欠如の脆弱性(12/23)\u003cbr\u003e\n\u003ca href=\"https://jvn.jp/vu/JVNVU96231218/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://jvn.jp/vu/JVNVU96231218/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"67:1-68:61\"\u003e米国シリコンバレー目線で見る -\u0026gt; 日本のIT成熟度の低さと「セキュリティの空白」(12/23)\u003cbr\u003e\n\u003ca href=\"https://blogs.itmedia.co.jp/serial/2025/12/_-_it.html?ref=rss\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://blogs.itmedia.co.jp/serial/2025/12/_-_it.html?ref=rss\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"70:1-71:57\"\u003e【注意喚起】当社関係者を装った不審メールにご注意ください。(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.upr-net.co.jp/articles/news/company/20251223/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.upr-net.co.jp/articles/news/company/20251223/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"73:1-74:81\"\u003e高市政権が示す新サイバー戦略――AI悪用が広げる国家関与型サイバー攻撃に、能動的防御で抑止を強化(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.yahoo.co.jp/expert/articles/b165befcf0cb6993d34eab8a9e97c3c861213dcc\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.yahoo.co.jp/expert/articles/b165befcf0cb6993d34eab8a9e97c3c861213dcc\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"76:1-77:67\"\u003e「Void Rabisu」の侵入活動に類似した手口を用い、複数業界を標的とする「SHADOW-VOID-042」(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.trendmicro.com/ja_jp/research/25/l/shadow-void-042.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.trendmicro.com/ja_jp/research/25/l/shadow-void-042.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"79:1-80:57\"\u003e日産自動車、委託先のRed Hatサーバが不正アクセス受け顧客情報流出(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.mynavi.jp/techplus/article/20251223-3860466/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.mynavi.jp/techplus/article/20251223-3860466/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"82:1-83:65\"\u003e少なくとも60台のAI搭載監視カメラがライブストリーミングされてネットに無防備な状態で公開されていたことが発覚(12/23)\u003cbr\u003e\n\u003ca href=\"https://gigazine.net/news/20251223-flock-security-camera-exposed/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://gigazine.net/news/20251223-flock-security-camera-exposed/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"85:1-86:40\"\u003e海外出張中に個人情報記録パソコン盗まれるも、遠隔操作で削除│定量生命科学研究所(12/23)\u003cbr\u003e\n\u003ca href=\"https://cybersecurity-jp.com/news/111836\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://cybersecurity-jp.com/news/111836\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"88:1-89:33\"\u003eサイバー被害の責任を「ITベンダーとの契約」でどう変えるか？日本政府が顧客企業との役割分担巡りITベンダーの責任強化を求めるガイドライン策定へ(12/23)\u003cbr\u003e\n\u003ca href=\"https://nikkeimatome.com/?p=70419\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://nikkeimatome.com/?p=70419\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"91:1-92:36\"\u003e「n8n」に深刻なRCE脆弱性 - 乗っ取りや情報漏洩など広く影響(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.security-next.com/178863\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.security-next.com/178863\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"94:1-95:41\"\u003eOpenAI、GPT-5.2-Codexをリリース、サイバーセキュリティ能力を大幅強化しプロレベルの脆弱性発見を実現(12/23)\u003cbr\u003e\n\u003ca href=\"https://ai-market.jp/news/openai-gpt-5-2/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://ai-market.jp/news/openai-gpt-5-2/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"97:1-98:77\"\u003e米国 FBI 犯罪活動を助長する仮想通貨マネーロンダリングサービスを摘発 (2025.12.17)(12/23)\u003cbr\u003e\n\u003ca href=\"http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/12/post-96d143.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttp://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/12/post-96d143.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"100:1-101:46\"\u003eホリデーシーズンを狙うサイバー犯罪に注意！(12/23)\u003cbr\u003e\n\u003ca href=\"https://ascii.jp/elem/000/004/361/4361997/?rss\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://ascii.jp/elem/000/004/361/4361997/?rss\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"103:1-104:33\"\u003eSC企業の3割でセキュリティー改善課題、VLC調査(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.logi-today.com/893387\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.logi-today.com/893387\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"106:1-107:78\"\u003e英政府、「サイバーインシデント」について調査中と認める(12/23)\u003cbr\u003e\n\u003ca href=\"https://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43185/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43185/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"109:1-110:67\"\u003e日産顧客2万人の情報流出　福岡販売店に不正アクセス(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.sankei.com/article/20251223-AHV7VGPVMZMU5BDJ7EAX4FV3DI/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.sankei.com/article/20251223-AHV7VGPVMZMU5BDJ7EAX4FV3DI/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"112:1-113:40\"\u003eサイバー新戦略、能動的防御明記　政府、今後５年で脅威を抑止(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.sanyonews.jp/article/1847704\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.sanyonews.jp/article/1847704\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"115:1-116:63\"\u003eAIを「どう使うか」から、「どう守るか」へ──専門家が語るAIセキュリティ対策とは(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.scsk.jp/sp/itpnavi/article/2025/12/ai_security.html\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.scsk.jp/sp/itpnavi/article/2025/12/ai_security.html\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"118:1-119:56\"\u003e脆弱性対応の疲弊から脱却せよ - 国産ツール「FutureVuls」が実現する、攻めの自動化とサプライチェーンリスク管理(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.mynavi.jp/techplus/kikaku/20251223-3827305/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.mynavi.jp/techplus/kikaku/20251223-3827305/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"121:1-122:60\"\u003eはなさく生命、顧客情報など漏洩の恐れ　委託先に不正アクセス(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.nikkei.com/article/DGXZQOUB238ZB0T21C25A2000000/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.nikkei.com/article/DGXZQOUB238ZB0T21C25A2000000/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"124:1-125:60\"\u003eLINE公式アカウントで誤表示による情報漏えい ～ バグバウンティプログラム参加者が発見(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.excite.co.jp/news/article/Scannetsecurity_54307/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.excite.co.jp/news/article/Scannetsecurity_54307/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"127:1-128:74\"\u003e富山県立高で８３人情報流出恐れ　不正アクセス受け、氏名やアドレス(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.yahoo.co.jp/articles/d1442827f08fbc68d50562394e377d997579919c\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.yahoo.co.jp/articles/d1442827f08fbc68d50562394e377d997579919c\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"130:1-131:40\"\u003e2026年のサイバー脅威やAIの悪用・利点、グーグルが予測(12/23)\u003cbr\u003e\n\u003ca href=\"https://japan.cnet.com/article/35241907/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://japan.cnet.com/article/35241907/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"133:1-134:46\"\u003e年末セールへ向けて不在通知を装った「フィッシング詐欺」に警戒　NordVPN調査(12/23)\u003cbr\u003e\n\u003ca href=\"https://ecnomikata.com/ecnews/marketing/49093/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://ecnomikata.com/ecnews/marketing/49093/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"136:1-137:54\"\u003e「手作業でやってきた部分ほど自動化しづらい」 MIXI社「インフラAI活用」の“泥臭い” 実践(12/23)\u003cbr\u003e\n\u003ca href=\"https://levtech.jp/media/article/interview/detail_774/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://levtech.jp/media/article/interview/detail_774/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"139:1-140:33\"\u003eランサムウェア攻撃で「バックアップも標的」が常識に – 長期潜伏でデータを汚染する手口と、自社データを守る現実的な対策について解説(12/23)\u003cbr\u003e\n\u003ca href=\"https://nikkeimatome.com/?p=70397\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://nikkeimatome.com/?p=70397\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"142:1-143:176\"\u003e2026年に変わる欧州の自動車ルール総覧：Euro 6e/Euro 7、運転支援義務化、免許証切替とAI・NIS2(12/22)\u003cbr\u003e\n\u003ca href=\"https://speedme.ru/ja/posts/id20608-2026nian-noou-zhou-zi-dong-che-gui-zhi-matome-euro7toyun-zhuan-zhi-yuan-yi-wu-hua-mian-xu-qie-ti-aibiao-shi-yi-wu-yanis2made-che-di-jie-shuo\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://speedme.ru/ja/posts/id20608-2026nian-noou-zhou-zi-dong-che-gui-zhi-matome-euro7toyun-zhuan-zhi-yuan-yi-wu-hua-mian-xu-qie-ti-aibiao-shi-yi-wu-yanis2made-che-di-jie-shuo\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"145:1-146:54\"\u003e当社名および当社代表者名を騙った迷惑メール（なりすましメール）にご注意下さい(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.swedenhouse.co.jp/press/detail.php?seq=286\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.swedenhouse.co.jp/press/detail.php?seq=286\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"148:1-149:65\"\u003eメールを開いただけなのに企業が止まる？TD SYNNEXが提案する、相次ぐランサムウェア被害に備えた多層防御(12/23)\u003cbr\u003e\n\u003ca href=\"https://japan.zdnet.com/pickup/tdsynnex_broadcom_202512/35241552/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://japan.zdnet.com/pickup/tdsynnex_broadcom_202512/35241552/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"151:1-152:40\"\u003e年末年始のサイバー攻撃に備えよ 緊張する国際情勢で｢深刻なシステム停止を招く｣DDoS攻撃のリスクが高まる!？ 《昨年は金融や航空が被害に》(12/23)\u003cbr\u003e\n\u003ca href=\"https://toyokeizai.net/articles/-/924414\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://toyokeizai.net/articles/-/924414\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"154:1-155:60\"\u003e給与計算クラウドをネタにメール訓練実施 → サービス元がフィッシング注意喚起を発令(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.excite.co.jp/news/article/Scannetsecurity_54308/\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.excite.co.jp/news/article/Scannetsecurity_54308/\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"157:1-158:27\"\u003e【Laravel入門】認証機能を実装してログイン・アカウント登録を作ろう(12/23)\u003cbr\u003e\n\u003ca href=\"https://liginc.co.jp/668649\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://liginc.co.jp/668649\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"160:1-161:60\"\u003e弊社を装った「なりすましメール」に関する注意喚起(12/23)\u003cbr\u003e\n\u003ca href=\"https://www.noile-immune.com/media/announce/webalert_fromNIB\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://www.noile-immune.com/media/announce/webalert_fromNIB\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"163:1-164:122\"\u003eプロダクション レディな AI Security Foundation の構築(12/23)\u003cbr\u003e\n\u003ca href=\"https://cloud.google.com/blog/ja/topics/developers-practitioners/building-a-production-ready-ai-security-foundation/?hl=ja\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://cloud.google.com/blog/ja/topics/developers-practitioners/building-a-production-ready-ai-security-foundation/?hl=ja\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"166:1-167:81\"\u003e人はなぜ確認を怠るのか　設定ミスと情報漏えいの心理学(12/23)\u003cbr\u003e\n\u003ca href=\"https://news.yahoo.co.jp/expert/articles/9ca1d62b2a850639358dbc09288c5241e09c8df8\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://news.yahoo.co.jp/expert/articles/9ca1d62b2a850639358dbc09288c5241e09c8df8\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"169:1-170:46\"\u003e韓国カード大手で情報流出　加盟店代表者の携帯番号など１９万件(12/23)\u003cbr\u003e\n\u003ca href=\"https://jp.yna.co.kr/view/AJP20251223001800882\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://jp.yna.co.kr/view/AJP20251223001800882\u003c/a\u003e\u003c/p\u003e\n","body":"本日気になった注意喚起情報（12/23）\nhttps://foxsecurity.hatenablog.com/entry/2025/12/23/064255\n\nDigiEver製NVRの脆弱性悪用に注意 - 米CISAが警告(12/23)\nhttps://www.security-next.com/178868\n\nReactの深刻な脆弱性「React2Shell」の悪用事例　Google脅威インテリジェンス部門が報告(12/23)\nhttps://atmarkit.itmedia.co.jp/ait/articles/2512/23/news055.html\n\nバンダイチャンネルへの不正アクセス、最大 136.6 万件の会員情報漏えいの可能性(12/23)\nhttps://www.excite.co.jp/news/article/Scannetsecurity_54309/\n\nFortinet製品に“認証バイパス”の死角　管理者権限を奪われる「深刻な脆弱性」の正体(12/22)\nhttps://techtarget.itmedia.co.jp/tt/news/2512/22/news11.html\n\nMakop ランサムウェア：インド企業への攻撃における GuLoader と特権昇格(12/22)\nhttps://www.acronis.com/ja/tru/posts/makop-ransomware-guloader-and-privilege-escalation-in-attacks-against-indian-businesses/\n\nエレコム、イカロス モバイルセキュリティを終了　影響を受けるユーザーは？(12/23)\nhttps://ascii.jp/elem/000/004/362/4362310/\n\nThales AI Security Fabricを発表(12/23)\nhttps://www.nikkan.co.jp/releases/view/207838\n\n2025年ガートナー マジック・クアドラント 電子メールセキュリティ分野でマイクロソフトがリーダーに選出(12/23)\nhttps://s.netsecurity.ne.jp/article/2025/12/23/54300.html\n\nハウス食品グループ、AWS環境に「CloudFastener」を導入し運用体制を強化(12/23)\nhttps://enterprisezine.jp/news/detail/23426\n\nWatchGuard製Fireboxのikedにおける境界外書き込みの脆弱性（CVE-2025-14733）に関する注意喚起(12/22)\nhttps://www.jpcert.or.jp/at/2025/at250027.html\n\nAndroidセキュリティ更新、サポート外の「12」以前は重大な脅威に直面(12/22)\nhttps://forbesjapan.com/articles/detail/87769\n\n不正アクセス受けトップページ改ざん被害│東京反訳株式会社(12/23)\nhttps://cybersecurity-jp.com/news/111833\n\nCentral Dogma にオープンリダイレクトの脆弱性(12/23)\nhttps://www.excite.co.jp/news/article/Scannetsecurity_54301/\n\n「Windows Update」で問題が発生したときのためのMicrosoftの切り札「KIR」ってなんだ？(12/23)\nhttps://forest.watch.impress.co.jp/docs/serial/yajiuma/2073615.html\n\nSTORESにおけるTROCCOの導入と活用事例(12/23)\nhttps://product.st.inc/entry/2025/12/23/170927\n\n就活イベントへの参加申込など…1200人分、3700件の学生の氏名やメールアドレス、学校名など　個人情報が企業3社に漏えい　ふるさとしまね定住財団(12/23)\nhttps://news.jp/i/1376136030054285874\n\nテーオーシーのネットワークに不正アクセス、業績予想に及ぼす影響については精査中(12/23)\nhttps://s.netsecurity.ne.jp/article/2025/12/23/54305.html\n\nAIブラウザ「ChatGPT Atlas」では「勝手に辞職メールを送信」など有害な攻撃を次々に編み出す自動ハッキングAIを使ってセキュリティが強化されている(12/23)\nhttps://gigazine.net/news/20251223-chatgpt-atlas-prompt-injection-attacks/\n\n年末年始｢システム停止招くサイバー攻撃｣に注意(12/23)\nhttps://topics.smt.docomo.ne.jp/article/toyokeizai/business/toyokeizai-924414\n\n韓国政府、SIMカード購入時に顔認証を義務付けへ(12/23)\nhttps://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43190/\n\nメディアプレーヤ MP-01における重要な機能に対する認証の欠如の脆弱性(12/23)\nhttps://jvn.jp/vu/JVNVU96231218/\n\n米国シリコンバレー目線で見る -\u003e 日本のIT成熟度の低さと「セキュリティの空白」(12/23)\nhttps://blogs.itmedia.co.jp/serial/2025/12/_-_it.html?ref=rss\n\n【注意喚起】当社関係者を装った不審メールにご注意ください。(12/23)\nhttps://www.upr-net.co.jp/articles/news/company/20251223/\n\n高市政権が示す新サイバー戦略――AI悪用が広げる国家関与型サイバー攻撃に、能動的防御で抑止を強化(12/23)\nhttps://news.yahoo.co.jp/expert/articles/b165befcf0cb6993d34eab8a9e97c3c861213dcc\n\n「Void Rabisu」の侵入活動に類似した手口を用い、複数業界を標的とする「SHADOW-VOID-042」(12/23)\nhttps://www.trendmicro.com/ja_jp/research/25/l/shadow-void-042.html\n\n日産自動車、委託先のRed Hatサーバが不正アクセス受け顧客情報流出(12/23)\nhttps://news.mynavi.jp/techplus/article/20251223-3860466/\n\n少なくとも60台のAI搭載監視カメラがライブストリーミングされてネットに無防備な状態で公開されていたことが発覚(12/23)\nhttps://gigazine.net/news/20251223-flock-security-camera-exposed/\n\n海外出張中に個人情報記録パソコン盗まれるも、遠隔操作で削除│定量生命科学研究所(12/23)\nhttps://cybersecurity-jp.com/news/111836\n\nサイバー被害の責任を「ITベンダーとの契約」でどう変えるか？日本政府が顧客企業との役割分担巡りITベンダーの責任強化を求めるガイドライン策定へ(12/23)\nhttps://nikkeimatome.com/?p=70419\n\n「n8n」に深刻なRCE脆弱性 - 乗っ取りや情報漏洩など広く影響(12/23)\nhttps://www.security-next.com/178863\n\nOpenAI、GPT-5.2-Codexをリリース、サイバーセキュリティ能力を大幅強化しプロレベルの脆弱性発見を実現(12/23)\nhttps://ai-market.jp/news/openai-gpt-5-2/\n\n米国 FBI 犯罪活動を助長する仮想通貨マネーロンダリングサービスを摘発 (2025.12.17)(12/23)\nhttp://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/12/post-96d143.html\n\nホリデーシーズンを狙うサイバー犯罪に注意！(12/23)\nhttps://ascii.jp/elem/000/004/361/4361997/?rss\n\nSC企業の3割でセキュリティー改善課題、VLC調査(12/23)\nhttps://www.logi-today.com/893387\n\n英政府、「サイバーインシデント」について調査中と認める(12/23)\nhttps://codebook.machinarecord.com/threatreport/silobreaker-cyber-alert/43185/\n\n日産顧客2万人の情報流出　福岡販売店に不正アクセス(12/23)\nhttps://www.sankei.com/article/20251223-AHV7VGPVMZMU5BDJ7EAX4FV3DI/\n\nサイバー新戦略、能動的防御明記　政府、今後５年で脅威を抑止(12/23)\nhttps://www.sanyonews.jp/article/1847704\n\nAIを「どう使うか」から、「どう守るか」へ──専門家が語るAIセキュリティ対策とは(12/23)\nhttps://www.scsk.jp/sp/itpnavi/article/2025/12/ai_security.html\n\n脆弱性対応の疲弊から脱却せよ - 国産ツール「FutureVuls」が実現する、攻めの自動化とサプライチェーンリスク管理(12/23)\nhttps://news.mynavi.jp/techplus/kikaku/20251223-3827305/\n\nはなさく生命、顧客情報など漏洩の恐れ　委託先に不正アクセス(12/23)\nhttps://www.nikkei.com/article/DGXZQOUB238ZB0T21C25A2000000/\n\nLINE公式アカウントで誤表示による情報漏えい ～ バグバウンティプログラム参加者が発見(12/23)\nhttps://www.excite.co.jp/news/article/Scannetsecurity_54307/\n\n富山県立高で８３人情報流出恐れ　不正アクセス受け、氏名やアドレス(12/23)\nhttps://news.yahoo.co.jp/articles/d1442827f08fbc68d50562394e377d997579919c\n\n2026年のサイバー脅威やAIの悪用・利点、グーグルが予測(12/23)\nhttps://japan.cnet.com/article/35241907/\n\n年末セールへ向けて不在通知を装った「フィッシング詐欺」に警戒　NordVPN調査(12/23)\nhttps://ecnomikata.com/ecnews/marketing/49093/\n\n「手作業でやってきた部分ほど自動化しづらい」 MIXI社「インフラAI活用」の“泥臭い” 実践(12/23)\nhttps://levtech.jp/media/article/interview/detail_774/\n\nランサムウェア攻撃で「バックアップも標的」が常識に – 長期潜伏でデータを汚染する手口と、自社データを守る現実的な対策について解説(12/23)\nhttps://nikkeimatome.com/?p=70397\n\n2026年に変わる欧州の自動車ルール総覧：Euro 6e/Euro 7、運転支援義務化、免許証切替とAI・NIS2(12/22)\nhttps://speedme.ru/ja/posts/id20608-2026nian-noou-zhou-zi-dong-che-gui-zhi-matome-euro7toyun-zhuan-zhi-yuan-yi-wu-hua-mian-xu-qie-ti-aibiao-shi-yi-wu-yanis2made-che-di-jie-shuo\n\n当社名および当社代表者名を騙った迷惑メール（なりすましメール）にご注意下さい(12/23)\nhttps://www.swedenhouse.co.jp/press/detail.php?seq=286\n\nメールを開いただけなのに企業が止まる？TD SYNNEXが提案する、相次ぐランサムウェア被害に備えた多層防御(12/23)\nhttps://japan.zdnet.com/pickup/tdsynnex_broadcom_202512/35241552/\n\n年末年始のサイバー攻撃に備えよ 緊張する国際情勢で｢深刻なシステム停止を招く｣DDoS攻撃のリスクが高まる!？ 《昨年は金融や航空が被害に》(12/23)\nhttps://toyokeizai.net/articles/-/924414\n\n給与計算クラウドをネタにメール訓練実施 → サービス元がフィッシング注意喚起を発令(12/23)\nhttps://www.excite.co.jp/news/article/Scannetsecurity_54308/\n\n【Laravel入門】認証機能を実装してログイン・アカウント登録を作ろう(12/23)\nhttps://liginc.co.jp/668649\n\n弊社を装った「なりすましメール」に関する注意喚起(12/23)\nhttps://www.noile-immune.com/media/announce/webalert_fromNIB\n\nプロダクション レディな AI Security Foundation の構築(12/23)\nhttps://cloud.google.com/blog/ja/topics/developers-practitioners/building-a-production-ready-ai-security-foundation/?hl=ja\n\n人はなぜ確認を怠るのか　設定ミスと情報漏えいの心理学(12/23)\nhttps://news.yahoo.co.jp/expert/articles/9ca1d62b2a850639358dbc09288c5241e09c8df8\n\n韓国カード大手で情報流出　加盟店代表者の携帯番号など１９万件(12/23)\nhttps://jp.yna.co.kr/view/AJP20251223001800882\n","coediting":false,"comments_count":0,"created_at":"2025-12-25T04:57:59+09:00","group":null,"id":"8d01a43025a77deb56f8","likes_count":0,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"Security","versions":[]},{"name":"ニュース","versions":[]}],"title":"2025/12/25主にITとかセキュリティの記事","updated_at":"2025-12-25T04:57:59+09:00","url":"https://qiita.com/pitopito/items/8d01a43025a77deb56f8","user":{"description":"","facebook_id":"","followees_count":0,"followers_count":95,"github_login_name":null,"id":"pitopito","items_count":1560,"linkedin_id":"","location":"","name":"浩 釜本","organization":"","permanent_id":2490887,"profile_image_url":"https://secure.gravatar.com/avatar/d301ec427285245483cff6d1c8f4fb3c","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:58\"\u003e\n\u003cspan id=\"qiita新規作成タグレポート20251214---20\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#qiita%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%82%BF%E3%82%B0%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%8820251214---20\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eQiita新規作成タグレポート（2025/12/14 - 20）\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:204\"\u003e一週間のうちに新しく作成されたタグをまとめています。余計な記号（\u003ccode\u003e#\u003c/code\u003eや\u003ccode\u003e,\u003c/code\u003eなど）が付いていると思われるタグには「\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e」をマークしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:188\"\u003e\u003cimg alt=\":star:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/2b50-fe0f.png\" title=\":star:\" width=\"20\" loading=\"lazy\"\u003e 【最近Qiitaへの投稿を始めた方へ】下記の記事で、Qiitaにおけるタグの有意義な使い方が紹介されています。参考にしてみてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:55\"\u003e\u003ciframe id=\"qiita-embed-content__db05447bda14218c427ba3e06cdae134\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__db05447bda14218c427ba3e06cdae134\" data-content=\"https%3A%2F%2Fqiita.com%2Fshiracamus%2Fitems%2Ffd309513d54c68694bc2\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:72\"\u003e\u003cimg alt=\":arrow_backward:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/25c0-fe0f.png\" title=\":arrow_backward:\" width=\"20\" loading=\"lazy\"\u003e 前週（2025/12/07 - 13）のレポートはコチラ:\u003c/p\u003e\n\u003cp data-sourcepos=\"11:1-11:49\"\u003e\u003ciframe id=\"qiita-embed-content__d5735b8221dc44a773bdc4a9ec886e58\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__d5735b8221dc44a773bdc4a9ec886e58\" data-content=\"https%3A%2F%2Fqiita.com%2Fnkay%2Fitems%2F61a8d69a1ac43090aa12\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-13:103\"\u003e※ データ取得時刻の関係で、下記データは現在とは異なる場合があります。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"15:1-15:13\"\u003e\n\u003cspan id=\"12月14日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8814%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月14日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"17:1-71:116\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"17:1-17:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"17:2-17:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"17:9-17:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"17:19-17:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"19:1-19:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"19:2-19:56\"\u003e\u003ca href=\"https://qiita.com/tags/cargo-compete\"\u003e\u003ccode\u003ecargo-compete\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"19:58-19:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"19:60-19:68\"\u003e\u003ca href=\"/slow-cat\" class=\"user-mention js-hovercard\" title=\"slow-cat\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"slow-cat\"\u003e@slow-cat\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"20:1-20:52\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"20:2-20:40\"\u003e\u003ca href=\"https://qiita.com/tags/cuOpt\"\u003e\u003ccode\u003ecuOpt\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"20:42-20:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"20:44-20:51\"\u003e\u003ca href=\"/nukipei\" class=\"user-mention js-hovercard\" title=\"nukipei\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nukipei\"\u003e@nukipei\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"21:1-21:120\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"21:2-21:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%AE%E6%AD%A3\"\u003e\u003ccode\u003eファイル修正\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"21:104-21:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"21:106-21:119\"\u003e\u003ca href=\"/Atsumoripress\" class=\"user-mention js-hovercard\" title=\"Atsumoripress\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Atsumoripress\"\u003e@Atsumoripress\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"22:1-22:92\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"22:2-22:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%B1%8B%E5%86%85%E5%9C%B0%E5%9B%B3\"\u003e\u003ccode\u003e屋内地図\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"22:80-22:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"22:82-22:91\"\u003e\u003ca href=\"/shi-works\" class=\"user-mention js-hovercard\" title=\"shi-works\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shi-works\"\u003e@shi-works\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"23:1-23:95\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"23:2-23:82\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E5%AF%BE%E8%A9%B1%E3%83%AD%E3%82%B0\"\u003e\u003ccode\u003eAI対話ログ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"23:84-23:84\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"23:86-23:94\"\u003e\u003ca href=\"/RyuGotoo\" class=\"user-mention js-hovercard\" title=\"RyuGotoo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"RyuGotoo\"\u003e@RyuGotoo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"24:1-24:54\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"24:2-24:38\"\u003e\u003ca href=\"https://qiita.com/tags/Xyce\"\u003e\u003ccode\u003eXyce\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"24:40-24:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"24:42-24:53\"\u003e\u003ca href=\"/yoshiki9636\" class=\"user-mention js-hovercard\" title=\"yoshiki9636\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yoshiki9636\"\u003e@yoshiki9636\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"25:1-25:114\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"25:2-25:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B3%E3%82%B9%E3%83%88\"\u003e\u003ccode\u003eデータコスト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"25:104-25:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"25:106-25:113\"\u003e\u003ca href=\"/mar1213\" class=\"user-mention js-hovercard\" title=\"mar1213\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mar1213\"\u003e@mar1213\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"26:1-26:90\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"26:2-26:52\"\u003e\u003ca href=\"https://qiita.com/tags/React2Shell\"\u003e\u003ccode\u003eReact2Shell\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"26:54-26:54\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"26:56-26:89\"\u003e\n\u003ca href=\"/GeneLab_999\" class=\"user-mention js-hovercard\" title=\"GeneLab_999\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeneLab_999\"\u003e@GeneLab_999\u003c/a\u003e, \u003ca href=\"/Higemal\" class=\"user-mention js-hovercard\" title=\"Higemal\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Higemal\"\u003e@Higemal\u003c/a\u003e, \u003ca href=\"/Kengo2003\" class=\"user-mention js-hovercard\" title=\"Kengo2003\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Kengo2003\"\u003e@Kengo2003\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"27:1-27:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:2-27:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%B6%85%E6%BC%A2%E5%AD%97\"\u003e\u003ccode\u003e超漢字\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"27:68-27:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"27:70-27:78\"\u003e\u003ca href=\"/shiozaki\" class=\"user-mention js-hovercard\" title=\"shiozaki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shiozaki\"\u003e@shiozaki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"28:1-28:159\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:2-28:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9\"\u003e\u003ccode\u003eインフォマティクス\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"28:140-28:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"28:142-28:158\"\u003e\u003ca href=\"/Seine_A_Shintani\" class=\"user-mention js-hovercard\" title=\"Seine_A_Shintani\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Seine_A_Shintani\"\u003e@Seine_A_Shintani\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"29:1-29:138\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:2-29:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%A4%A7%E5%96%9C%E5%88%A9\"\u003e\u003ccode\u003eエンジニア大喜利\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"29:128-29:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"29:130-29:137\"\u003e\u003ca href=\"/EgaSaQA\" class=\"user-mention js-hovercard\" title=\"EgaSaQA\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"EgaSaQA\"\u003e@EgaSaQA\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"30:1-30:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:2-30:46\"\u003e\u003ca href=\"https://qiita.com/tags/hackason\"\u003e\u003ccode\u003ehackason\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"30:48-30:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"30:50-30:57\"\u003e\u003ca href=\"/Hir0_IC\" class=\"user-mention js-hovercard\" title=\"Hir0_IC\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Hir0_IC\"\u003e@Hir0_IC\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"31:1-31:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:2-31:42\"\u003e\u003ca href=\"https://qiita.com/tags/NICTER\"\u003e\u003ccode\u003eNICTER\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"31:44-31:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"31:46-31:52\"\u003e\u003ca href=\"/Chisho\" class=\"user-mention js-hovercard\" title=\"Chisho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Chisho\"\u003e@Chisho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"32:1-32:49\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"32:2-32:38\"\u003e\u003ca href=\"https://qiita.com/tags/NCSC\"\u003e\u003ccode\u003eNCSC\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"32:40-32:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"32:42-32:48\"\u003e\u003ca href=\"/Chisho\" class=\"user-mention js-hovercard\" title=\"Chisho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Chisho\"\u003e@Chisho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"33:1-33:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"33:2-33:72\"\u003e\u003ca href=\"https://qiita.com/tags/AtCoderConference2025\"\u003e\u003ccode\u003eAtCoderConference2025\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"33:74-33:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"33:76-33:82\"\u003e\u003ca href=\"/take37\" class=\"user-mention js-hovercard\" title=\"take37\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"take37\"\u003e@take37\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"34:1-34:111\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"34:2-34:94\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E3%83%A2%E3%83%87%E3%83%AB%E7%AE%A1%E7%90%86\"\u003e\u003ccode\u003eAIモデル管理\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"34:96-34:96\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"34:98-34:110\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"35:1-35:148\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"35:2-35:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E8%A9%95%E4%BE%A1\"\u003e\u003ccode\u003eユーザビリティ評価\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"35:140-35:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"35:142-35:147\"\u003e\u003ca href=\"/NNobu\" class=\"user-mention js-hovercard\" title=\"NNobu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"NNobu\"\u003e@NNobu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"36:1-36:151\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"36:2-36:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89\"\u003e\u003ccode\u003eプロジェクトコード\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"36:140-36:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"36:142-36:150\"\u003e\u003ca href=\"/guppi524\" class=\"user-mention js-hovercard\" title=\"guppi524\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"guppi524\"\u003e@guppi524\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"37:1-37:103\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"37:2-37:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%98%A0%E5%83%8F%E7%AC%A6%E5%8F%B7%E5%8C%96\"\u003e\u003ccode\u003e映像符号化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"37:92-37:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"37:94-37:102\"\u003e\u003ca href=\"/Cis_1075\" class=\"user-mention js-hovercard\" title=\"Cis_1075\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Cis_1075\"\u003e@Cis_1075\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"38:1-38:139\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:2-38:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB\"\u003e\u003ccode\u003eマイクロカーネル\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"38:128-38:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"38:130-38:138\"\u003e\u003ca href=\"/maru3745\" class=\"user-mention js-hovercard\" title=\"maru3745\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"maru3745\"\u003e@maru3745\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"39:1-39:120\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:2-39:104\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E3%83%92%E3%83%A5%E3%83%83%E3%82%B1%E3%83%AB\"\u003e\u003ccode\u003e#ヒュッケル\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"39:106-39:106\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"39:108-39:119\"\u003e\u003ca href=\"/suzuka_0602\" class=\"user-mention js-hovercard\" title=\"suzuka_0602\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"suzuka_0602\"\u003e@suzuka_0602\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"40:1-40:103\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:2-40:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%AA%A4%E6%93%8D%E4%BD%9C%E5%AF%BE%E7%AD%96\"\u003e\u003ccode\u003e誤操作対策\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"40:92-40:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"40:94-40:102\"\u003e\u003ca href=\"/yuri_777\" class=\"user-mention js-hovercard\" title=\"yuri_777\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuri_777\"\u003e@yuri_777\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"41:1-41:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:2-41:60\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23stac2025\"\u003e\u003ccode\u003e#stac2025\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"41:62-41:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"41:64-41:76\"\u003e\u003ca href=\"/orfevre_love\" class=\"user-mention js-hovercard\" title=\"orfevre_love\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"orfevre_love\"\u003e@orfevre_love\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"42:1-42:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"42:2-42:56\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/--onedir\"\u003e\u003ccode\u003e--onedir\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"42:58-42:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"42:60-42:68\"\u003e\u003ca href=\"/yuri_777\" class=\"user-mention js-hovercard\" title=\"yuri_777\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuri_777\"\u003e@yuri_777\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"43:1-43:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"43:2-43:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E6%8E%A5%E7%B6%9A\"\u003e\u003ccode\u003eシリアル接続\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"43:104-43:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"43:106-43:114\"\u003e\u003ca href=\"/yuri_777\" class=\"user-mention js-hovercard\" title=\"yuri_777\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuri_777\"\u003e@yuri_777\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"44:1-44:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"44:2-44:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%96%B9%E6%B3%95\"\u003e\u003ccode\u003eログイン方法\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"44:104-44:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"44:106-44:114\"\u003e\u003ca href=\"/yuri_777\" class=\"user-mention js-hovercard\" title=\"yuri_777\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuri_777\"\u003e@yuri_777\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"45:1-45:94\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"45:2-45:80\"\u003e\u003ca href=\"https://qiita.com/tags/AdvancedArchitectingonAWS\"\u003e\u003ccode\u003eAdvancedArchitectingonAWS\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"45:82-45:82\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"45:84-45:93\"\u003e\u003ca href=\"/Michinoku\" class=\"user-mention js-hovercard\" title=\"Michinoku\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Michinoku\"\u003e@Michinoku\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"46:1-46:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"46:2-46:50\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23PQC\"\u003e\u003ccode\u003e#PQC\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"46:52-46:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"46:54-46:62\"\u003e\u003ca href=\"/shu_koma\" class=\"user-mention js-hovercard\" title=\"shu_koma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shu_koma\"\u003e@shu_koma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"47:1-47:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"47:2-47:50\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23QKD\"\u003e\u003ccode\u003e#QKD\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"47:52-47:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"47:54-47:62\"\u003e\u003ca href=\"/shu_koma\" class=\"user-mention js-hovercard\" title=\"shu_koma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shu_koma\"\u003e@shu_koma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"48:1-48:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"48:2-48:46\"\u003e\u003ca href=\"https://qiita.com/tags/mustknow\"\u003e\u003ccode\u003emustknow\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"48:48-48:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"48:50-48:58\"\u003e\u003ca href=\"/softbase\" class=\"user-mention js-hovercard\" title=\"softbase\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"softbase\"\u003e@softbase\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"49:1-49:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"49:2-49:44\"\u003e\u003ca href=\"https://qiita.com/tags/5%E4%BB%B6\"\u003e\u003ccode\u003e5件\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"49:46-49:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"49:48-49:57\"\u003e\u003ca href=\"/JaJaThree\" class=\"user-mention js-hovercard\" title=\"JaJaThree\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"JaJaThree\"\u003e@JaJaThree\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"50:1-50:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"50:2-50:60\"\u003e\u003ca href=\"https://qiita.com/tags/LangGraphStudio\"\u003e\u003ccode\u003eLangGraphStudio\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"50:62-50:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"50:64-50:70\"\u003e\u003ca href=\"/chiaoi\" class=\"user-mention js-hovercard\" title=\"chiaoi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"chiaoi\"\u003e@chiaoi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"51:1-51:82\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"51:2-51:72\"\u003e\u003ca href=\"https://qiita.com/tags/2025JapanAWSJr.Champi\"\u003e\u003ccode\u003e2025JapanAWSJr.Champi\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"51:74-51:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"51:76-51:81\"\u003e\u003ca href=\"/shj_m\" class=\"user-mention js-hovercard\" title=\"shj_m\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shj_m\"\u003e@shj_m\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"52:1-52:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"52:2-52:46\"\u003e\u003ca href=\"https://qiita.com/tags/Haiku4.5\"\u003e\u003ccode\u003eHaiku4.5\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"52:48-52:48\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"52:50-52:72\"\u003e\n\u003ca href=\"/buchi_org\" class=\"user-mention js-hovercard\" title=\"buchi_org\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"buchi_org\"\u003e@buchi_org\u003c/a\u003e, \u003ca href=\"/nahiro_tus\" class=\"user-mention js-hovercard\" title=\"nahiro_tus\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nahiro_tus\"\u003e@nahiro_tus\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"53:1-53:118\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"53:2-53:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%AE%A1%E7%90%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89\"\u003e\u003ccode\u003e管理コマンド\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"53:104-53:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"53:106-53:117\"\u003e\u003ca href=\"/jojo__xxxxx\" class=\"user-mention js-hovercard\" title=\"jojo__xxxxx\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jojo__xxxxx\"\u003e@jojo__xxxxx\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"54:1-54:276\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"54:2-54:258\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A6%E3%82%A7%E3%83%96%E9%96%8B%E7%99%BA%E3%82%92%E5%AD%A6%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4\"\u003e\u003ccode\u003eウェブ開発を学ぶためのおすすめオンライ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"54:260-54:260\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"54:262-54:275\"\u003e\u003ca href=\"/Sandip-Bhujel\" class=\"user-mention js-hovercard\" title=\"Sandip-Bhujel\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Sandip-Bhujel\"\u003e@Sandip-Bhujel\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"55:1-55:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"55:2-55:46\"\u003e\u003ca href=\"https://qiita.com/tags/StrapiV5\"\u003e\u003ccode\u003eStrapiV5\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"55:48-55:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"55:50-55:60\"\u003e\u003ca href=\"/kensuto_tv\" class=\"user-mention js-hovercard\" title=\"kensuto_tv\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kensuto_tv\"\u003e@kensuto_tv\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"56:1-56:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"56:2-56:64\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23MultiAgent\"\u003e\u003ccode\u003e#MultiAgent\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"56:66-56:66\"\u003e5\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"56:68-56:82\"\u003e\u003ca href=\"/ryouta_takaoka\" class=\"user-mention js-hovercard\" title=\"ryouta_takaoka\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ryouta_takaoka\"\u003e@ryouta_takaoka\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"57:1-57:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"57:2-57:58\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23HandsOn\"\u003e\u003ccode\u003e#HandsOn\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"57:60-57:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"57:62-57:76\"\u003e\u003ca href=\"/ryouta_takaoka\" class=\"user-mention js-hovercard\" title=\"ryouta_takaoka\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ryouta_takaoka\"\u003e@ryouta_takaoka\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"58:1-58:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"58:2-58:78\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23CloudArchitecture\"\u003e\u003ccode\u003e#CloudArchitecture\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"58:80-58:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"58:82-58:96\"\u003e\u003ca href=\"/ryouta_takaoka\" class=\"user-mention js-hovercard\" title=\"ryouta_takaoka\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ryouta_takaoka\"\u003e@ryouta_takaoka\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"59:1-59:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"59:2-59:52\"\u003e\u003ca href=\"https://qiita.com/tags/clobalFiled\"\u003e\u003ccode\u003eclobalFiled\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"59:54-59:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"59:56-59:66\"\u003e\u003ca href=\"/n_hideyuki\" class=\"user-mention js-hovercard\" title=\"n_hideyuki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"n_hideyuki\"\u003e@n_hideyuki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"60:1-60:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"60:2-60:52\"\u003e\u003ca href=\"https://qiita.com/tags/ArduinnoIDE\"\u003e\u003ccode\u003eArduinnoIDE\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"60:54-60:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"60:56-60:62\"\u003e\u003ca href=\"/_Moony\" class=\"user-mention js-hovercard\" title=\"_Moony\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"_Moony\"\u003e@_Moony\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"61:1-61:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"61:2-61:66\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%60Azure%60%2C\"\u003e\u003ccode\u003e`Azure`,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"61:68-61:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"61:70-61:82\"\u003e\u003ca href=\"/banquet_kuma\" class=\"user-mention js-hovercard\" title=\"banquet_kuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"banquet_kuma\"\u003e@banquet_kuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"62:1-62:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"62:2-62:62\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%60RAG%60%2C\"\u003e\u003ccode\u003e`RAG`,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"62:64-62:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"62:66-62:78\"\u003e\u003ca href=\"/banquet_kuma\" class=\"user-mention js-hovercard\" title=\"banquet_kuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"banquet_kuma\"\u003e@banquet_kuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"63:1-63:85\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"63:2-63:68\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%60OpenAI%60%2C\"\u003e\u003ccode\u003e`OpenAI`,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"63:70-63:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"63:72-63:84\"\u003e\u003ca href=\"/banquet_kuma\" class=\"user-mention js-hovercard\" title=\"banquet_kuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"banquet_kuma\"\u003e@banquet_kuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"64:1-64:101\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"64:2-64:84\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%60AzureFunctions%60%2C\"\u003e\u003ccode\u003e`AzureFunctions`,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"64:86-64:86\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"64:88-64:100\"\u003e\u003ca href=\"/banquet_kuma\" class=\"user-mention js-hovercard\" title=\"banquet_kuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"banquet_kuma\"\u003e@banquet_kuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"65:1-65:113\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"65:2-65:96\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%60ServerlessArchitecture%60\"\u003e\u003ccode\u003e`ServerlessArchitecture`\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"65:98-65:98\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"65:100-65:112\"\u003e\u003ca href=\"/banquet_kuma\" class=\"user-mention js-hovercard\" title=\"banquet_kuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"banquet_kuma\"\u003e@banquet_kuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"66:1-66:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"66:2-66:50\"\u003e\u003ca href=\"https://qiita.com/tags/SnapCenter\"\u003e\u003ccode\u003eSnapCenter\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"66:52-66:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"66:54-66:67\"\u003e\u003ca href=\"/curryboy_ex01\" class=\"user-mention js-hovercard\" title=\"curryboy_ex01\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"curryboy_ex01\"\u003e@curryboy_ex01\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"67:1-67:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"67:2-67:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23CASB\"\u003e\u003ccode\u003e#CASB\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"67:54-67:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"67:56-67:68\"\u003e\u003ca href=\"/hyper-yosuke\" class=\"user-mention js-hovercard\" title=\"hyper-yosuke\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hyper-yosuke\"\u003e@hyper-yosuke\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"68:1-68:72\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"68:2-68:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%89%B2%E7%AC%A6\"\u003e\u003ccode\u003e割符\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"68:56-68:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"68:58-68:71\"\u003e\u003ca href=\"/sapi_kawahara\" class=\"user-mention js-hovercard\" title=\"sapi_kawahara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"sapi_kawahara\"\u003e@sapi_kawahara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"69:1-69:108\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"69:2-69:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%81%A5%E5%BA%B7%E4%BF%9D%E9%99%BA%E8%A8%BC\"\u003e\u003ccode\u003e健康保険証\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"69:92-69:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"69:94-69:107\"\u003e\u003ca href=\"/sapi_kawahara\" class=\"user-mention js-hovercard\" title=\"sapi_kawahara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"sapi_kawahara\"\u003e@sapi_kawahara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"70:1-70:106\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"70:2-70:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AC%E3%82%AF%E3%83%81%E3%82%AB\"\u003e\u003ccode\u003eガクチカ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"70:80-70:80\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"70:82-70:105\"\u003e\n\u003ca href=\"/Riochin\" class=\"user-mention js-hovercard\" title=\"Riochin\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Riochin\"\u003e@Riochin\u003c/a\u003e, \u003ca href=\"/Shotaro-Akehi\" class=\"user-mention js-hovercard\" title=\"Shotaro-Akehi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Shotaro-Akehi\"\u003e@Shotaro-Akehi\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"71:1-71:116\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"71:2-71:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A8%AD%E8%A8%88%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC\"\u003e\u003ccode\u003e設計レビュー\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"71:104-71:104\"\u003e4\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"71:106-71:115\"\u003e\u003ca href=\"/asurawill\" class=\"user-mention js-hovercard\" title=\"asurawill\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"asurawill\"\u003e@asurawill\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"73:1-73:13\"\u003e\n\u003cspan id=\"12月15日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8815%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月15日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"75:1-149:143\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"75:1-75:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"75:2-75:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"75:9-75:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"75:19-75:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"77:1-77:105\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"77:2-77:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B9%E3%82%AF%E3%83%AF%E3%83%83%E3%83%88\"\u003e\u003ccode\u003eスクワット\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"77:92-77:92\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"77:94-77:104\"\u003e\u003ca href=\"/100dFitApp\" class=\"user-mention js-hovercard\" title=\"100dFitApp\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"100dFitApp\"\u003e@100dFitApp\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"78:1-78:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"78:2-78:44\"\u003e\u003ca href=\"https://qiita.com/tags/oilnvim\"\u003e\u003ccode\u003eoilnvim\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"78:46-78:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"78:48-78:56\"\u003e\u003ca href=\"/kosments\" class=\"user-mention js-hovercard\" title=\"kosments\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kosments\"\u003e@kosments\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"79:1-79:105\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"79:2-79:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8D%B3%E5%B8%AD%E3%83%81%E3%83%BC%E3%83%A0\"\u003e\u003ccode\u003e即席チーム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"79:92-79:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"79:94-79:104\"\u003e\u003ca href=\"/c0a2212903\" class=\"user-mention js-hovercard\" title=\"c0a2212903\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"c0a2212903\"\u003e@c0a2212903\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"80:1-80:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"80:2-80:44\"\u003e\u003ca href=\"https://qiita.com/tags/azooKey\"\u003e\u003ccode\u003eazooKey\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"80:46-80:46\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"80:48-80:57\"\u003e\u003ca href=\"/inugamine\" class=\"user-mention js-hovercard\" title=\"inugamine\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"inugamine\"\u003e@inugamine\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"81:1-81:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"81:2-81:38\"\u003e\u003ca href=\"https://qiita.com/tags/CIMD\"\u003e\u003ccode\u003eCIMD\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"81:40-81:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"81:42-81:58\"\u003e\u003ca href=\"/TakahikoKawasaki\" class=\"user-mention js-hovercard\" title=\"TakahikoKawasaki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TakahikoKawasaki\"\u003e@TakahikoKawasaki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"82:1-82:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"82:2-82:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B7%E3%82%A7%E3%82%A4%E3%83%97%E3%82%AD%E3%83%BC\"\u003e\u003ccode\u003eシェイプキー\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"82:104-82:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"82:106-82:114\"\u003e\u003ca href=\"/tsukino_\" class=\"user-mention js-hovercard\" title=\"tsukino_\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tsukino_\"\u003e@tsukino_\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"83:1-83:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"83:2-83:42\"\u003e\u003ca href=\"https://qiita.com/tags/Fleets\"\u003e\u003ccode\u003eFleets\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"83:44-83:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"83:46-83:56\"\u003e\u003ca href=\"/Riku_Nitta\" class=\"user-mention js-hovercard\" title=\"Riku_Nitta\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Riku_Nitta\"\u003e@Riku_Nitta\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"84:1-84:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"84:2-84:52\"\u003e\u003ca href=\"https://qiita.com/tags/MainToolbar\"\u003e\u003ccode\u003eMainToolbar\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"84:54-84:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"84:56-84:68\"\u003e\u003ca href=\"/ScreenPocket\" class=\"user-mention js-hovercard\" title=\"ScreenPocket\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ScreenPocket\"\u003e@ScreenPocket\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"85:1-85:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"85:2-85:48\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/mq%2C\"\u003e\u003ccode\u003emq,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"85:50-85:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"85:52-85:60\"\u003e\u003ca href=\"/hrhtonda\" class=\"user-mention js-hovercard\" title=\"hrhtonda\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hrhtonda\"\u003e@hrhtonda\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"86:1-86:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"86:2-86:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/MQ%2C%2C\"\u003e\u003ccode\u003eMQ,,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"86:54-86:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"86:56-86:64\"\u003e\u003ca href=\"/hrhtonda\" class=\"user-mention js-hovercard\" title=\"hrhtonda\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hrhtonda\"\u003e@hrhtonda\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"87:1-87:49\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"87:2-87:36\"\u003e\u003ca href=\"https://qiita.com/tags/MAZ\"\u003e\u003ccode\u003eMAZ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"87:38-87:38\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"87:40-87:48\"\u003e\u003ca href=\"/hrhtonda\" class=\"user-mention js-hovercard\" title=\"hrhtonda\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hrhtonda\"\u003e@hrhtonda\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"88:1-88:198\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"88:2-88:186\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%81%8D%E3%82%89%E3%82%8A%E3%82%93%E2%98%86%E3%83%AC%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003eきらりん☆レボリューション\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"88:188-88:188\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"88:190-88:197\"\u003e\u003ca href=\"/inovue3\" class=\"user-mention js-hovercard\" title=\"inovue3\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"inovue3\"\u003e@inovue3\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"89:1-89:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"89:2-89:52\"\u003e\u003ca href=\"https://qiita.com/tags/JakartaData\"\u003e\u003ccode\u003eJakartaData\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"89:54-89:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"89:56-89:70\"\u003e\u003ca href=\"/noritaka-kagei\" class=\"user-mention js-hovercard\" title=\"noritaka-kagei\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"noritaka-kagei\"\u003e@noritaka-kagei\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"90:1-90:124\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"90:2-90:104\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E5%AD%A6%E4%BC%9A%E3%82%B3%E3%83%B3%E3%83%9A\"\u003e\u003ccode\u003e#学会コンペ\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"90:106-90:106\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"90:108-90:123\"\u003e\u003ca href=\"/ShunsukeKikuchi\" class=\"user-mention js-hovercard\" title=\"ShunsukeKikuchi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ShunsukeKikuchi\"\u003e@ShunsukeKikuchi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"91:1-91:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"91:2-91:58\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%40esp32c5\"\u003e\u003ccode\u003e@esp32c5\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"91:60-91:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"91:62-91:66\"\u003e\u003ca href=\"/MikH\" class=\"user-mention js-hovercard\" title=\"MikH\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"MikH\"\u003e@MikH\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"92:1-92:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"92:2-92:62\"\u003e\u003ca href=\"https://qiita.com/tags/ExternalLocation\"\u003e\u003ccode\u003eExternalLocation\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"92:64-92:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"92:66-92:78\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"93:1-93:81\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"93:2-93:64\"\u003e\u003ca href=\"https://qiita.com/tags/StorageCredential\"\u003e\u003ccode\u003eStorageCredential\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"93:66-93:66\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"93:68-93:80\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"94:1-94:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"94:2-94:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E8%A8%AD%E8%A8%88\"\u003e\u003ccode\u003eシナリオ設計\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"94:104-94:104\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"94:106-94:118\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"95:1-95:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"95:2-95:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%A5%AD%E5%8B%99%E3%83%95%E3%83%AD%E3%83%BC%E5%AE%9A%E7%BE%A9\"\u003e\u003ccode\u003e業務フロー定義\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"95:116-95:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"95:118-95:130\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"96:1-96:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"96:2-96:54\"\u003e\u003ca href=\"https://qiita.com/tags/EbhancedOpne\"\u003e\u003ccode\u003eEbhancedOpne\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"96:56-96:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"96:58-96:72\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"97:1-97:51\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"97:2-97:40\"\u003e\u003ca href=\"https://qiita.com/tags/Xwiki\"\u003e\u003ccode\u003eXwiki\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"97:42-97:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"97:44-97:50\"\u003e\u003ca href=\"/Brutus\" class=\"user-mention js-hovercard\" title=\"Brutus\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Brutus\"\u003e@Brutus\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"98:1-98:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"98:2-98:48\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23TS\"\u003e\u003ccode\u003e#TS\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"98:50-98:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"98:52-98:61\"\u003e\u003ca href=\"/rykmryoke\" class=\"user-mention js-hovercard\" title=\"rykmryoke\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"rykmryoke\"\u003e@rykmryoke\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"99:1-99:301\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"99:2-99:282\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%B8%AD%E5%B0%8F%E4%BC%81%E6%A5%AD%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3\"\u003e\u003ccode\u003e中小企業の情報セキュリティ対策ガイドライン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"99:284-99:284\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"99:286-99:300\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"100:1-100:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"100:2-100:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%87%AA%E5%B7%B1%E5%AE%A3%E8%A8%80\"\u003e\u003ccode\u003e自己宣言\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"100:80-100:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"100:82-100:96\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"101:1-101:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"101:2-101:42\"\u003e\u003ca href=\"https://qiita.com/tags/GPT5.2\"\u003e\u003ccode\u003eGPT5.2\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"101:44-101:44\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"101:46-101:69\"\u003e\n\u003ca href=\"/lenali070411\" class=\"user-mention js-hovercard\" title=\"lenali070411\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lenali070411\"\u003e@lenali070411\u003c/a\u003e, \u003ca href=\"/tai_niwa\" class=\"user-mention js-hovercard\" title=\"tai_niwa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tai_niwa\"\u003e@tai_niwa\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"102:1-102:154\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"102:2-102:140\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/CARLA%2CROS%2CJetson%2CWSL2%2C%E8%87%AA%E5%8B%95%E9%81%8B%E8%BB%A2\"\u003e\u003ccode\u003eCARLA,ROS,Jetson,WSL2,自動運転\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"102:142-102:142\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"102:144-102:153\"\u003e\u003ca href=\"/nnnnanana\" class=\"user-mention js-hovercard\" title=\"nnnnanana\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nnnnanana\"\u003e@nnnnanana\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"103:1-103:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"103:2-103:46\"\u003e\u003ca href=\"https://qiita.com/tags/Deepgram\"\u003e\u003ccode\u003eDeepgram\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"103:48-103:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"103:50-103:59\"\u003e\u003ca href=\"/kuma_3838\" class=\"user-mention js-hovercard\" title=\"kuma_3838\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kuma_3838\"\u003e@kuma_3838\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"104:1-104:144\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"104:2-104:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%AD%E3%82%A4%E3%83%A4%E3%83%AB%E3%83%86%E3%82%A3%E5%90%91%E4%B8%8A\"\u003e\u003ccode\u003eロイヤルティ向上\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"104:128-104:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"104:130-104:143\"\u003e\u003ca href=\"/handakazunori\" class=\"user-mention js-hovercard\" title=\"handakazunori\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"handakazunori\"\u003e@handakazunori\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"105:1-105:52\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"105:2-105:40\"\u003e\u003ca href=\"https://qiita.com/tags/Tavus\"\u003e\u003ccode\u003eTavus\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"105:42-105:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"105:44-105:51\"\u003e\u003ca href=\"/f-kaito\" class=\"user-mention js-hovercard\" title=\"f-kaito\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"f-kaito\"\u003e@f-kaito\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"106:1-106:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"106:2-106:42\"\u003e\u003ca href=\"https://qiita.com/tags/subdiv\"\u003e\u003ccode\u003esubdiv\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"106:44-106:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"106:46-106:55\"\u003e\u003ca href=\"/hextomino\" class=\"user-mention js-hovercard\" title=\"hextomino\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hextomino\"\u003e@hextomino\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"107:1-107:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"107:2-107:44\"\u003e\u003ca href=\"https://qiita.com/tags/JDBCAPI\"\u003e\u003ccode\u003eJDBCAPI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"107:46-107:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"107:48-107:60\"\u003e\u003ca href=\"/kanfutrooper\" class=\"user-mention js-hovercard\" title=\"kanfutrooper\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kanfutrooper\"\u003e@kanfutrooper\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"108:1-108:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"108:2-108:62\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%40PowerApps\"\u003e\u003ccode\u003e@PowerApps\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"108:64-108:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"108:66-108:78\"\u003e\u003ca href=\"/bruce-ip-gxp\" class=\"user-mention js-hovercard\" title=\"bruce-ip-gxp\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"bruce-ip-gxp\"\u003e@bruce-ip-gxp\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"109:1-109:157\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"109:2-109:140\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%40%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB\"\u003e\u003ccode\u003e@ローコードツール\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"109:142-109:142\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"109:144-109:156\"\u003e\u003ca href=\"/bruce-ip-gxp\" class=\"user-mention js-hovercard\" title=\"bruce-ip-gxp\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"bruce-ip-gxp\"\u003e@bruce-ip-gxp\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"110:1-110:55\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"110:2-110:38\"\u003e\u003ca href=\"https://qiita.com/tags/AIIP\"\u003e\u003ccode\u003eAIIP\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"110:40-110:40\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"110:42-110:54\"\u003e\u003ca href=\"/tetsuko_room\" class=\"user-mention js-hovercard\" title=\"tetsuko_room\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tetsuko_room\"\u003e@tetsuko_room\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"111:1-111:155\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"111:2-111:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%AE%87%E5%AE%99%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88\"\u003e\u003ccode\u003e宇宙インターネット\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"111:140-111:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"111:142-111:154\"\u003e\u003ca href=\"/tetsuko_room\" class=\"user-mention js-hovercard\" title=\"tetsuko_room\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tetsuko_room\"\u003e@tetsuko_room\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"112:1-112:116\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"112:2-112:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%AA%E3%83%83%E3%83%88%E3%83%AA%E3%83%B3%E3%82%AF\"\u003e\u003ccode\u003eリットリンク\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"112:104-112:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"112:106-112:115\"\u003e\u003ca href=\"/mrbirddev\" class=\"user-mention js-hovercard\" title=\"mrbirddev\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mrbirddev\"\u003e@mrbirddev\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"113:1-113:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"113:2-113:80\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E9%80%A3%E9%8E%96%E7%8E%87\"\u003e\u003ccode\u003e#連鎖率\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"113:82-113:82\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"113:84-113:96\"\u003e\u003ca href=\"/yasunari0421\" class=\"user-mention js-hovercard\" title=\"yasunari0421\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yasunari0421\"\u003e@yasunari0421\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"114:1-114:78\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"114:2-114:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%A7%98%E5%8C%BF%E6%80%A7\"\u003e\u003ccode\u003e秘匿性\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"114:68-114:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"114:70-114:77\"\u003e\u003ca href=\"/yam_dev\" class=\"user-mention js-hovercard\" title=\"yam_dev\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yam_dev\"\u003e@yam_dev\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"115:1-115:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"115:2-115:52\"\u003e\u003ca href=\"https://qiita.com/tags/RdmineJapan\"\u003e\u003ccode\u003eRdmineJapan\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"115:54-115:54\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"115:56-115:65\"\u003e\u003ca href=\"/yam_asaki\" class=\"user-mention js-hovercard\" title=\"yam_asaki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yam_asaki\"\u003e@yam_asaki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"116:1-116:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"116:2-116:52\"\u003e\u003ca href=\"https://qiita.com/tags/NVIDIAGB200\"\u003e\u003ccode\u003eNVIDIAGB200\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"116:54-116:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"116:56-116:68\"\u003e\u003ca href=\"/Walmate_Tech\" class=\"user-mention js-hovercard\" title=\"Walmate_Tech\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Walmate_Tech\"\u003e@Walmate_Tech\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"117:1-117:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"117:2-117:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%B0%B4%E5%86%B7%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88\"\u003e\u003ccode\u003e水冷プレート\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"117:104-117:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"117:106-117:118\"\u003e\u003ca href=\"/Walmate_Tech\" class=\"user-mention js-hovercard\" title=\"Walmate_Tech\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Walmate_Tech\"\u003e@Walmate_Tech\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"118:1-118:121\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"118:2-118:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E7%92%B0%E5%A2%83\"\u003e\u003ccode\u003e仮想通貨環境\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"118:104-118:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"118:106-118:120\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"119:1-119:169\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"119:2-119:150\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003eクリプトジャッキング\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"119:152-119:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"119:154-119:168\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"120:1-120:193\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"120:2-120:174\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0\"\u003e\u003ccode\u003e分散データベースシステム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"120:176-120:176\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"120:178-120:192\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"121:1-121:189\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"121:2-121:174\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%AA%E3%82%B9%E3%83%88%E9%80%A3%E6%90%BA\"\u003e\u003ccode\u003eオーディエンスリスト連携\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"121:176-121:176\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"121:178-121:188\"\u003e\u003ca href=\"/SoySoySoyB\" class=\"user-mention js-hovercard\" title=\"SoySoySoyB\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"SoySoySoyB\"\u003e@SoySoySoyB\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"122:1-122:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"122:2-122:52\"\u003e\u003ca href=\"https://qiita.com/tags/Ray-banMeta\"\u003e\u003ccode\u003eRay-banMeta\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"122:54-122:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"122:56-122:64\"\u003e\u003ca href=\"/vent0908\" class=\"user-mention js-hovercard\" title=\"vent0908\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"vent0908\"\u003e@vent0908\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"123:1-123:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"123:2-123:56\"\u003e\u003ca href=\"https://qiita.com/tags/Muti-Protocol\"\u003e\u003ccode\u003eMuti-Protocol\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"123:58-123:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"123:60-123:66\"\u003e\u003ca href=\"/kuze_k\" class=\"user-mention js-hovercard\" title=\"kuze_k\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kuze_k\"\u003e@kuze_k\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"124:1-124:187\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"124:2-124:162\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%98%E3%83%B4%E3%82%A3%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%E9%9A%8E%E6%AE%B5%E9%96%A2%E6%95%B0\"\u003e\u003ccode\u003eヘヴィサイドの階段関数\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"124:164-124:164\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"124:166-124:186\"\u003e\u003ca href=\"/mytube_algo_discover\" class=\"user-mention js-hovercard\" title=\"mytube_algo_discover\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mytube_algo_discover\"\u003e@mytube_algo_discover\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"125:1-125:152\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"125:2-125:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3\"\u003e\u003ccode\u003e初めてのハッカソン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"125:140-125:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"125:142-125:151\"\u003e\u003ca href=\"/TAK0-wasa\" class=\"user-mention js-hovercard\" title=\"TAK0-wasa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TAK0-wasa\"\u003e@TAK0-wasa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"126:1-126:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"126:2-126:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23grot\"\u003e\u003ccode\u003e#grot\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"126:54-126:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"126:56-126:68\"\u003e\u003ca href=\"/LeaNagashima\" class=\"user-mention js-hovercard\" title=\"LeaNagashima\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"LeaNagashima\"\u003e@LeaNagashima\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"127:1-127:55\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"127:2-127:44\"\u003e\u003ca href=\"https://qiita.com/tags/crafty4\"\u003e\u003ccode\u003ecrafty4\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"127:46-127:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"127:48-127:54\"\u003e\u003ca href=\"/harunn\" class=\"user-mention js-hovercard\" title=\"harunn\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"harunn\"\u003e@harunn\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"128:1-128:90\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"128:2-128:74\"\u003e\u003ca href=\"https://qiita.com/tags/CloudMonitoringConsole\"\u003e\u003ccode\u003eCloudMonitoringConsole\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"128:76-128:76\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"128:78-128:89\"\u003e\u003ca href=\"/torippy1024\" class=\"user-mention js-hovercard\" title=\"torippy1024\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"torippy1024\"\u003e@torippy1024\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"129:1-129:118\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"129:2-129:106\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E3%82%A6%E3%82%A9%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003eAIウォッシング\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"129:108-129:108\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"129:110-129:117\"\u003e\u003ca href=\"/Dataiku\" class=\"user-mention js-hovercard\" title=\"Dataiku\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Dataiku\"\u003e@Dataiku\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"130:1-130:101\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"130:2-130:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97\"\u003e\u003ccode\u003eパウリ行列\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"130:92-130:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"130:94-130:100\"\u003e\u003ca href=\"/osawat\" class=\"user-mention js-hovercard\" title=\"osawat\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"osawat\"\u003e@osawat\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"131:1-131:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"131:2-131:52\"\u003e\u003ca href=\"https://qiita.com/tags/next-themes\"\u003e\u003ccode\u003enext-themes\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"131:54-131:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"131:56-131:66\"\u003e\u003ca href=\"/yuki_saito\" class=\"user-mention js-hovercard\" title=\"yuki_saito\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuki_saito\"\u003e@yuki_saito\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"132:1-132:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"132:2-132:48\"\u003e\u003ca href=\"https://qiita.com/tags/kiropower\"\u003e\u003ccode\u003ekiropower\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"132:50-132:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"132:52-132:62\"\u003e\u003ca href=\"/ec2_on_aws\" class=\"user-mention js-hovercard\" title=\"ec2_on_aws\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ec2_on_aws\"\u003e@ec2_on_aws\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"133:1-133:87\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"133:2-133:74\"\u003e\u003ca href=\"https://qiita.com/tags/coworkingspaceinIndore\"\u003e\u003ccode\u003ecoworkingspaceinIndore\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"133:76-133:76\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"133:78-133:86\"\u003e\u003ca href=\"/flexihub\" class=\"user-mention js-hovercard\" title=\"flexihub\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"flexihub\"\u003e@flexihub\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"134:1-134:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"134:2-134:54\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/XPath%2C\"\u003e\u003ccode\u003eXPath,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"134:56-134:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"134:58-134:67\"\u003e\u003ca href=\"/fujitsuna\" class=\"user-mention js-hovercard\" title=\"fujitsuna\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"fujitsuna\"\u003e@fujitsuna\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"135:1-135:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"135:2-135:60\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/Resonite%2C\"\u003e\u003ccode\u003eResonite,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"135:62-135:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"135:64-135:72\"\u003e\u003ca href=\"/rabbuttz\" class=\"user-mention js-hovercard\" title=\"rabbuttz\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"rabbuttz\"\u003e@rabbuttz\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"136:1-136:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"136:2-136:50\"\u003e\u003ca href=\"https://qiita.com/tags/SECCON2025\"\u003e\u003ccode\u003eSECCON2025\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"136:52-136:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"136:54-136:62\"\u003e\u003ca href=\"/Saku0512\" class=\"user-mention js-hovercard\" title=\"Saku0512\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Saku0512\"\u003e@Saku0512\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"137:1-137:95\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"137:2-137:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%A5%9D%E6%97%A5%E5%AF%BE%E5%BF%9C\"\u003e\u003ccode\u003e祝日対応\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"137:80-137:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"137:82-137:94\"\u003e\u003ca href=\"/return_chiba\" class=\"user-mention js-hovercard\" title=\"return_chiba\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"return_chiba\"\u003e@return_chiba\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"138:1-138:189\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"138:2-138:174\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0\"\u003e\u003ccode\u003eアーキテクチャメカニズム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"138:176-138:176\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"138:178-138:188\"\u003e\u003ca href=\"/Kudo_panda\" class=\"user-mention js-hovercard\" title=\"Kudo_panda\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Kudo_panda\"\u003e@Kudo_panda\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"139:1-139:47\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"139:2-139:38\"\u003e\u003ca href=\"https://qiita.com/tags/DSPM\"\u003e\u003ccode\u003eDSPM\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"139:40-139:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"139:42-139:46\"\u003e\u003ca href=\"/yren\" class=\"user-mention js-hovercard\" title=\"yren\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yren\"\u003e@yren\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"140:1-140:64\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"140:2-140:54\"\u003e\u003ca href=\"https://qiita.com/tags/GoogleSkills\"\u003e\u003ccode\u003eGoogleSkills\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"140:56-140:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"140:58-140:63\"\u003e\u003ca href=\"/nkmrt\" class=\"user-mention js-hovercard\" title=\"nkmrt\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nkmrt\"\u003e@nkmrt\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"141:1-141:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"141:2-141:52\"\u003e\u003ca href=\"https://qiita.com/tags/ShokoServer\"\u003e\u003ccode\u003eShokoServer\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"141:54-141:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"141:56-141:59\"\u003e\u003ca href=\"/nab\" class=\"user-mention js-hovercard\" title=\"nab\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nab\"\u003e@nab\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"142:1-142:55\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"142:2-142:40\"\u003e\u003ca href=\"https://qiita.com/tags/Lenny\"\u003e\u003ccode\u003eLenny\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"142:42-142:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"142:44-142:54\"\u003e\u003ca href=\"/penguin425\" class=\"user-mention js-hovercard\" title=\"penguin425\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"penguin425\"\u003e@penguin425\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"143:1-143:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"143:2-143:42\"\u003e\u003ca href=\"https://qiita.com/tags/ScoreP\"\u003e\u003ccode\u003eScoreP\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"143:44-143:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"143:46-143:55\"\u003e\u003ca href=\"/kamet0703\" class=\"user-mention js-hovercard\" title=\"kamet0703\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kamet0703\"\u003e@kamet0703\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"144:1-144:52\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"144:2-144:38\"\u003e\u003ca href=\"https://qiita.com/tags/OTF2\"\u003e\u003ccode\u003eOTF2\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"144:40-144:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"144:42-144:51\"\u003e\u003ca href=\"/kamet0703\" class=\"user-mention js-hovercard\" title=\"kamet0703\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kamet0703\"\u003e@kamet0703\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"145:1-145:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"145:2-145:52\"\u003e\u003ca href=\"https://qiita.com/tags/sasakure.uk\"\u003e\u003ccode\u003esasakure.uk\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"145:54-145:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"145:56-145:68\"\u003e\u003ca href=\"/mob_engineer\" class=\"user-mention js-hovercard\" title=\"mob_engineer\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mob_engineer\"\u003e@mob_engineer\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"146:1-146:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"146:2-146:48\"\u003e\u003ca href=\"https://qiita.com/tags/vtable.el\"\u003e\u003ccode\u003evtable.el\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"146:50-146:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"146:52-146:59\"\u003e\u003ca href=\"/gemmaro\" class=\"user-mention js-hovercard\" title=\"gemmaro\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gemmaro\"\u003e@gemmaro\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"147:1-147:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"147:2-147:46\"\u003e\u003ca href=\"https://qiita.com/tags/LocalASR\"\u003e\u003ccode\u003eLocalASR\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"147:48-147:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"147:50-147:59\"\u003e\u003ca href=\"/Dongagent\" class=\"user-mention js-hovercard\" title=\"Dongagent\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Dongagent\"\u003e@Dongagent\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"148:1-148:84\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"148:2-148:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%87%BA%E6%88%BB%E3%82%8A\"\u003e\u003ccode\u003e出戻り\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"148:68-148:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"148:70-148:83\"\u003e\u003ca href=\"/starfy_starfy\" class=\"user-mention js-hovercard\" title=\"starfy_starfy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"starfy_starfy\"\u003e@starfy_starfy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"149:1-149:143\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"149:2-149:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A6%8B%E3%81%AA%E3%81%84%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84\"\u003e\u003ccode\u003e見ないでください\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"149:128-149:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"149:130-149:142\"\u003e\u003ca href=\"/tamachan_DXQ\" class=\"user-mention js-hovercard\" title=\"tamachan_DXQ\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tamachan_DXQ\"\u003e@tamachan_DXQ\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"151:1-151:13\"\u003e\n\u003cspan id=\"12月16日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8816%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月16日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"153:1-226:73\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"153:1-153:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"153:2-153:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"153:9-153:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"153:19-153:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"155:1-155:116\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"155:2-155:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F\"\u003e\u003ccode\u003eつくってみた\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"155:104-155:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"155:106-155:115\"\u003e\u003ca href=\"/tech_tuna\" class=\"user-mention js-hovercard\" title=\"tech_tuna\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tech_tuna\"\u003e@tech_tuna\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"156:1-156:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"156:2-156:58\"\u003e\u003ca href=\"https://qiita.com/tags/StagingStorage\"\u003e\u003ccode\u003eStagingStorage\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"156:60-156:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"156:62-156:70\"\u003e\u003ca href=\"/baku2san\" class=\"user-mention js-hovercard\" title=\"baku2san\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"baku2san\"\u003e@baku2san\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"157:1-157:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"157:2-157:46\"\u003e\u003ca href=\"https://qiita.com/tags/ocrmypdf\"\u003e\u003ccode\u003eocrmypdf\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"157:48-157:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"157:50-157:58\"\u003e\u003ca href=\"/H-goto16\" class=\"user-mention js-hovercard\" title=\"H-goto16\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"H-goto16\"\u003e@H-goto16\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"158:1-158:45\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"158:2-158:36\"\u003e\u003ca href=\"https://qiita.com/tags/LBE\"\u003e\u003ccode\u003eLBE\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"158:38-158:38\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"158:40-158:44\"\u003e\u003ca href=\"/afjk\" class=\"user-mention js-hovercard\" title=\"afjk\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"afjk\"\u003e@afjk\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"159:1-159:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"159:2-159:46\"\u003e\u003ca href=\"https://qiita.com/tags/MaprayJS\"\u003e\u003ccode\u003eMaprayJS\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"159:48-159:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"159:50-159:56\"\u003e\u003ca href=\"/darshu\" class=\"user-mention js-hovercard\" title=\"darshu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"darshu\"\u003e@darshu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"160:1-160:201\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"160:2-160:186\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B3%E3%83%A2%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89%E3%83%81%E3%83%A7%E3%83%BC%E3%82%AF%E3%82%B3%E3%82%A4%E3%83%AB\"\u003e\u003ccode\u003eコモンモードチョークコイル\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"160:188-160:188\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"160:190-160:200\"\u003e\u003ca href=\"/YuTanakaaa\" class=\"user-mention js-hovercard\" title=\"YuTanakaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YuTanakaaa\"\u003e@YuTanakaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"161:1-161:105\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"161:2-161:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BC%9D%E5%B0%8E%E3%83%8E%E3%82%A4%E3%82%BA\"\u003e\u003ccode\u003e伝導ノイズ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"161:92-161:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"161:94-161:104\"\u003e\u003ca href=\"/YuTanakaaa\" class=\"user-mention js-hovercard\" title=\"YuTanakaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YuTanakaaa\"\u003e@YuTanakaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"162:1-162:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"162:2-162:52\"\u003e\u003ca href=\"https://qiita.com/tags/CPPModule02\"\u003e\u003ccode\u003eCPPModule02\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"162:54-162:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"162:56-162:64\"\u003e\u003ca href=\"/moppy626\" class=\"user-mention js-hovercard\" title=\"moppy626\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"moppy626\"\u003e@moppy626\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"163:1-163:81\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"163:2-163:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%9B%B4%E5%8B%95%E5%BC%8F\"\u003e\u003ccode\u003e直動式\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"163:68-163:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"163:70-163:80\"\u003e\u003ca href=\"/YuTanakaaa\" class=\"user-mention js-hovercard\" title=\"YuTanakaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YuTanakaaa\"\u003e@YuTanakaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"164:1-164:117\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"164:2-164:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%91%E3%82%A4%E3%83%AD%E3%83%83%E3%83%88%E5%BC%8F\"\u003e\u003ccode\u003eパイロット式\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"164:104-164:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"164:106-164:116\"\u003e\u003ca href=\"/YuTanakaaa\" class=\"user-mention js-hovercard\" title=\"YuTanakaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YuTanakaaa\"\u003e@YuTanakaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"165:1-165:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"165:2-165:56\"\u003e\u003ca href=\"https://qiita.com/tags/p%E9%80%B2%E6%95%B0\"\u003e\u003ccode\u003ep進数\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"165:58-165:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"165:60-165:70\"\u003e\u003ca href=\"/taisei0418\" class=\"user-mention js-hovercard\" title=\"taisei0418\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"taisei0418\"\u003e@taisei0418\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"166:1-166:166\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"166:2-166:150\"\u003e\u003ca href=\"https://qiita.com/tags/%EF%BC%93%E6%AC%A1%E5%85%83%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003e３次元アニメーション\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"166:152-166:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"166:154-166:165\"\u003e\u003ca href=\"/hiroaki2702\" class=\"user-mention js-hovercard\" title=\"hiroaki2702\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hiroaki2702\"\u003e@hiroaki2702\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"167:1-167:98\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"167:2-167:70\"\u003e\u003ca href=\"https://qiita.com/tags/OA%E9%AB%98%E5%BA%A6%E5%8C%96\"\u003e\u003ccode\u003eOA高度化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"167:72-167:72\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"167:74-167:97\"\u003e\u003ca href=\"/NTTDkyushu_CRM_CyberSec\" class=\"user-mention js-hovercard\" title=\"NTTDkyushu_CRM_CyberSec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"NTTDkyushu_CRM_CyberSec\"\u003e@NTTDkyushu_CRM_CyberSec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"168:1-168:92\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"168:2-168:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A1%80%E7%B8%81%E8%A1%8C%E5%88%97\"\u003e\u003ccode\u003e血縁行列\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"168:80-168:80\"\u003e4\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"168:82-168:91\"\u003e\u003ca href=\"/KimuraSoh\" class=\"user-mention js-hovercard\" title=\"KimuraSoh\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"KimuraSoh\"\u003e@KimuraSoh\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"169:1-169:187\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"169:2-169:174\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E6%93%AC%E4%BA%BA%E5%8C%96%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B\"\u003e\u003ccode\u003eメモリを擬人化で理解する\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"169:176-169:176\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"169:178-169:186\"\u003e\u003ca href=\"/RyuGotoo\" class=\"user-mention js-hovercard\" title=\"RyuGotoo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"RyuGotoo\"\u003e@RyuGotoo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"170:1-170:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"170:2-170:46\"\u003e\u003ca href=\"https://qiita.com/tags/AIMemory\"\u003e\u003ccode\u003eAIMemory\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"170:48-170:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"170:50-170:56\"\u003e\u003ca href=\"/fe2030\" class=\"user-mention js-hovercard\" title=\"fe2030\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"fe2030\"\u003e@fe2030\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"171:1-171:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"171:2-171:54\"\u003e\u003ca href=\"https://qiita.com/tags/JankyBorders\"\u003e\u003ccode\u003eJankyBorders\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"171:56-171:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"171:58-171:65\"\u003e\u003ca href=\"/tyPhoon\" class=\"user-mention js-hovercard\" title=\"tyPhoon\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tyPhoon\"\u003e@tyPhoon\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"172:1-172:113\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"172:2-172:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A9%E3%82%A4%E3%83%84%E3%82%A2%E3%82%A6%E3%83%88\"\u003e\u003ccode\u003eライツアウト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"172:104-172:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"172:106-172:112\"\u003e\u003ca href=\"/tami7f\" class=\"user-mention js-hovercard\" title=\"tami7f\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tami7f\"\u003e@tami7f\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"173:1-173:121\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"173:2-173:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%80%E3%83%BC%E3%82%AF%E3%83%8D%E3%83%83%E3%83%88\"\u003e\u003ccode\u003eダークネット\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"173:104-173:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"173:106-173:120\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"174:1-174:133\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"174:2-174:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%82%A6%E3%82%A7%E3%83%96\"\u003e\u003ccode\u003eディープウェブ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"174:116-174:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"174:118-174:132\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"175:1-175:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"175:2-175:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%A0%B9%E5%9B%9E%E3%81%97\"\u003e\u003ccode\u003e根回し\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"175:68-175:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"175:70-175:82\"\u003e\u003ca href=\"/piyonakajima\" class=\"user-mention js-hovercard\" title=\"piyonakajima\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"piyonakajima\"\u003e@piyonakajima\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"176:1-176:265\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"176:2-176:246\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E7%B5%8C%E5%96%B6%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3\"\u003e\u003ccode\u003eサイバーセキュリティ経営ガイドライン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"176:248-176:248\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"176:250-176:264\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"177:1-177:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"177:2-177:38\"\u003e\u003ca href=\"https://qiita.com/tags/vico\"\u003e\u003ccode\u003evico\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"177:40-177:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"177:42-177:52\"\u003e\u003ca href=\"/t_hiro2626\" class=\"user-mention js-hovercard\" title=\"t_hiro2626\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"t_hiro2626\"\u003e@t_hiro2626\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"178:1-178:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"178:2-178:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%B9%B9%E4%BA%8B\"\u003e\u003ccode\u003e幹事\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"178:56-178:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"178:58-178:68\"\u003e\u003ca href=\"/mamoru-ngy\" class=\"user-mention js-hovercard\" title=\"mamoru-ngy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mamoru-ngy\"\u003e@mamoru-ngy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"179:1-179:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"179:2-179:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%81%E3%83%A3%E3%83%AC%E3%82%AD%E3%83%A3%E3%83%A9\"\u003e\u003ccode\u003eチャレキャラ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"179:104-179:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"179:106-179:114\"\u003e\u003ca href=\"/kuroda50\" class=\"user-mention js-hovercard\" title=\"kuroda50\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kuroda50\"\u003e@kuroda50\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"180:1-180:64\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"180:2-180:42\"\u003e\u003ca href=\"https://qiita.com/tags/ESP32c\"\u003e\u003ccode\u003eESP32c\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"180:44-180:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"180:46-180:63\"\u003e\u003ca href=\"/hayato_sakaida_rh\" class=\"user-mention js-hovercard\" title=\"hayato_sakaida_rh\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hayato_sakaida_rh\"\u003e@hayato_sakaida_rh\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"181:1-181:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"181:2-181:52\"\u003e\u003ca href=\"https://qiita.com/tags/GitWorktree\"\u003e\u003ccode\u003eGitWorktree\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"181:54-181:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"181:56-181:62\"\u003e\u003ca href=\"/bhkbb2\" class=\"user-mention js-hovercard\" title=\"bhkbb2\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"bhkbb2\"\u003e@bhkbb2\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"182:1-182:172\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"182:2-182:162\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9\"\u003e\u003ccode\u003eベクターグラフィックス\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"182:164-182:164\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"182:166-182:171\"\u003e\u003ca href=\"/YaHey\" class=\"user-mention js-hovercard\" title=\"YaHey\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YaHey\"\u003e@YaHey\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"183:1-183:101\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"183:2-183:92\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E9%A1%A7%E5%AE%A2%E4%BE%A1%E5%80%A4\"\u003e\u003ccode\u003e#顧客価値\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"183:94-183:94\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"183:96-183:100\"\u003e\u003ca href=\"/4mdy\" class=\"user-mention js-hovercard\" title=\"4mdy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"4mdy\"\u003e@4mdy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"184:1-184:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"184:2-184:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%BB%8C%E9%81%93%E8%A7%92%E9%81%8B%E5%8B%95%E9%87%8F\"\u003e\u003ccode\u003e軌道角運動量\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"184:104-184:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"184:106-184:118\"\u003e\u003ca href=\"/Takeshi_Baba\" class=\"user-mention js-hovercard\" title=\"Takeshi_Baba\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Takeshi_Baba\"\u003e@Takeshi_Baba\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"185:1-185:167\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"185:2-185:150\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A9%E3%82%B2%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A6%E3%82%B9%E3%83%93%E3%83%BC%E3%83%A0\"\u003e\u003ccode\u003eラゲールガウスビーム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"185:152-185:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"185:154-185:166\"\u003e\u003ca href=\"/Takeshi_Baba\" class=\"user-mention js-hovercard\" title=\"Takeshi_Baba\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Takeshi_Baba\"\u003e@Takeshi_Baba\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"186:1-186:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"186:2-186:48\"\u003e\u003ca href=\"https://qiita.com/tags/MXMaster4\"\u003e\u003ccode\u003eMXMaster4\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"186:50-186:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"186:52-186:65\"\u003e\u003ca href=\"/check50045366\" class=\"user-mention js-hovercard\" title=\"check50045366\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"check50045366\"\u003e@check50045366\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"187:1-187:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"187:2-187:46\"\u003e\u003ca href=\"https://qiita.com/tags/PngImage\"\u003e\u003ccode\u003ePngImage\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"187:48-187:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"187:50-187:56\"\u003e\u003ca href=\"/p_kato\" class=\"user-mention js-hovercard\" title=\"p_kato\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"p_kato\"\u003e@p_kato\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"188:1-188:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"188:2-188:58\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E9%80%9A%E4%BF%A1\"\u003e\u003ccode\u003eAI通信\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"188:60-188:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"188:62-188:74\"\u003e\u003ca href=\"/tetsuko_room\" class=\"user-mention js-hovercard\" title=\"tetsuko_room\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tetsuko_room\"\u003e@tetsuko_room\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"189:1-189:413\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"189:2-189:400\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%E3%82%AC%E3%83%AA%E3%83%AC%E3%82%AA%E3%80%81%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%80%81%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%80%81%E3%83%AF%E3%82%A4%E3%83%B3%E3%83%90%E3%83%BC%E3%82%B0%E3%80%81%E3%82%AA%E3%82%A4%E3%83%A9\"\u003e\u003ccode\u003eガリレオ、ニュートン、アインシュタイン、ワインバーグ、オイラ\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"189:402-189:402\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"189:404-189:412\"\u003e\u003ca href=\"/profkubo\" class=\"user-mention js-hovercard\" title=\"profkubo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"profkubo\"\u003e@profkubo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"190:1-190:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"190:2-190:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BB%A5%E4%B8%8A\"\u003e\u003ccode\u003e以上\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"190:56-190:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"190:58-190:66\"\u003e\u003ca href=\"/shinyama\" class=\"user-mention js-hovercard\" title=\"shinyama\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shinyama\"\u003e@shinyama\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"191:1-191:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"191:2-191:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BB%A5%E9%99%8D\"\u003e\u003ccode\u003e以降\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"191:56-191:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"191:58-191:66\"\u003e\u003ca href=\"/shinyama\" class=\"user-mention js-hovercard\" title=\"shinyama\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shinyama\"\u003e@shinyama\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"192:1-192:134\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"192:2-192:120\"\u003e\u003ca href=\"https://qiita.com/tags/AWS%E8%AA%8D%E5%AE%9A%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88\"\u003e\u003ccode\u003eAWS認定アカウント\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"192:122-192:122\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"192:124-192:133\"\u003e\u003ca href=\"/Fujiden70\" class=\"user-mention js-hovercard\" title=\"Fujiden70\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Fujiden70\"\u003e@Fujiden70\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"193:1-193:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"193:2-193:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%9B%B4%E6%9B%B4%E6%96%B0\"\u003e\u003ccode\u003e更更新\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"193:68-193:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"193:70-193:78\"\u003e\u003ca href=\"/CodeLeaf\" class=\"user-mention js-hovercard\" title=\"CodeLeaf\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"CodeLeaf\"\u003e@CodeLeaf\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"194:1-194:103\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"194:2-194:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%83%A8%E5%88%86%E6%9B%B4%E6%9B%B4%E6%96%B0\"\u003e\u003ccode\u003e部分更更新\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"194:92-194:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"194:94-194:102\"\u003e\u003ca href=\"/CodeLeaf\" class=\"user-mention js-hovercard\" title=\"CodeLeaf\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"CodeLeaf\"\u003e@CodeLeaf\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"195:1-195:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"195:2-195:46\"\u003e\u003ca href=\"https://qiita.com/tags/OfficeQA\"\u003e\u003ccode\u003eOfficeQA\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"195:48-195:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"195:50-195:60\"\u003e\u003ca href=\"/taka_yayoi\" class=\"user-mention js-hovercard\" title=\"taka_yayoi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"taka_yayoi\"\u003e@taka_yayoi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"196:1-196:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"196:2-196:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E5%90%8D%E5%89%8D\"\u003e\u003ccode\u003e名前を変名前\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"196:104-196:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"196:106-196:114\"\u003e\u003ca href=\"/CodeLeaf\" class=\"user-mention js-hovercard\" title=\"CodeLeaf\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"CodeLeaf\"\u003e@CodeLeaf\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"197:1-197:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"197:2-197:44\"\u003e\u003ca href=\"https://qiita.com/tags/Ruby4.0\"\u003e\u003ccode\u003eRuby4.0\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"197:46-197:46\"\u003e6\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"197:48-197:55\"\u003e\u003ca href=\"/scivola\" class=\"user-mention js-hovercard\" title=\"scivola\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"scivola\"\u003e@scivola\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"198:1-198:145\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"198:2-198:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E8%A6%81%E4%BB%B6%E5%88%86%E6%9E%90\"\u003e\u003ccode\u003eビジネス要件分析\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"198:128-198:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"198:130-198:144\"\u003e\u003ca href=\"/angel_high_low\" class=\"user-mention js-hovercard\" title=\"angel_high_low\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"angel_high_low\"\u003e@angel_high_low\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"199:1-199:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"199:2-199:50\"\u003e\u003ca href=\"https://qiita.com/tags/Robotiq.ai\"\u003e\u003ccode\u003eRobotiq.ai\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"199:52-199:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"199:54-199:66\"\u003e\u003ca href=\"/nakamura_bvt\" class=\"user-mention js-hovercard\" title=\"nakamura_bvt\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nakamura_bvt\"\u003e@nakamura_bvt\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"200:1-200:106\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"200:2-200:94\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEAIEngine\"\u003e\u003ccode\u003eさくらのAIEngine\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"200:96-200:96\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"200:98-200:105\"\u003e\u003ca href=\"/y4s2hol\" class=\"user-mention js-hovercard\" title=\"y4s2hol\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"y4s2hol\"\u003e@y4s2hol\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"201:1-201:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"201:2-201:50\"\u003e\u003ca href=\"https://qiita.com/tags/HealthTech\"\u003e\u003ccode\u003eHealthTech\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"201:52-201:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"201:54-201:70\"\u003e\u003ca href=\"/paridhipurohit02\" class=\"user-mention js-hovercard\" title=\"paridhipurohit02\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"paridhipurohit02\"\u003e@paridhipurohit02\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"202:1-202:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"202:2-202:44\"\u003e\u003ca href=\"https://qiita.com/tags/Rincoin\"\u003e\u003ccode\u003eRincoin\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"202:46-202:46\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"202:48-202:55\"\u003e\u003ca href=\"/ysmreg1\" class=\"user-mention js-hovercard\" title=\"ysmreg1\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ysmreg1\"\u003e@ysmreg1\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"203:1-203:114\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"203:2-203:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%86%85%E9%83%A8%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8\"\u003e\u003ccode\u003e内部ステージ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"203:104-203:104\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"203:106-203:113\"\u003e\u003ca href=\"/coco_co\" class=\"user-mention js-hovercard\" title=\"coco_co\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"coco_co\"\u003e@coco_co\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"204:1-204:86\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"204:2-204:72\"\u003e\u003ca href=\"https://qiita.com/tags/MetadataAccessControl\"\u003e\u003ccode\u003eMetadataAccessControl\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"204:74-204:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"204:76-204:85\"\u003e\u003ca href=\"/nickqinsc\" class=\"user-mention js-hovercard\" title=\"nickqinsc\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nickqinsc\"\u003e@nickqinsc\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"205:1-205:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"205:2-205:44\"\u003e\u003ca href=\"https://qiita.com/tags/devCamp\"\u003e\u003ccode\u003edevCamp\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"205:46-205:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"205:48-205:57\"\u003e\u003ca href=\"/gababy_00\" class=\"user-mention js-hovercard\" title=\"gababy_00\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gababy_00\"\u003e@gababy_00\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"206:1-206:139\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"206:2-206:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%88%91%E3%80%85%E3%81%8C%E7%9B%AE%E6%8C%87%E3%81%99%E3%82%82%E3%81%AE\"\u003e\u003ccode\u003e我々が目指すもの\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"206:128-206:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"206:130-206:138\"\u003e\u003ca href=\"/soga_slj\" class=\"user-mention js-hovercard\" title=\"soga_slj\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"soga_slj\"\u003e@soga_slj\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"207:1-207:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"207:2-207:46\"\u003e\u003ca href=\"https://qiita.com/tags/OpenJava\"\u003e\u003ccode\u003eOpenJava\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"207:48-207:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"207:50-207:57\"\u003e\u003ca href=\"/TSA2019\" class=\"user-mention js-hovercard\" title=\"TSA2019\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TSA2019\"\u003e@TSA2019\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"208:1-208:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"208:2-208:44\"\u003e\u003ca href=\"https://qiita.com/tags/picocom\"\u003e\u003ccode\u003epicocom\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"208:46-208:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"208:48-208:59\"\u003e\u003ca href=\"/mnishiguchi\" class=\"user-mention js-hovercard\" title=\"mnishiguchi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mnishiguchi\"\u003e@mnishiguchi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"209:1-209:140\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"209:2-209:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%85%88%E8%A1%8C\"\u003e\u003ccode\u003eコーディング先行\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"209:128-209:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"209:130-209:139\"\u003e\u003ca href=\"/dice_rice\" class=\"user-mention js-hovercard\" title=\"dice_rice\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"dice_rice\"\u003e@dice_rice\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"210:1-210:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"210:2-210:48\"\u003e\u003ca href=\"https://qiita.com/tags/CSSDesign\"\u003e\u003ccode\u003eCSSDesign\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"210:50-210:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"210:52-210:60\"\u003e\u003ca href=\"/akiy2009\" class=\"user-mention js-hovercard\" title=\"akiy2009\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"akiy2009\"\u003e@akiy2009\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"211:1-211:51\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"211:2-211:38\"\u003e\u003ca href=\"https://qiita.com/tags/ADTO\"\u003e\u003ccode\u003eADTO\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"211:40-211:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"211:42-211:50\"\u003e\u003ca href=\"/akiy2009\" class=\"user-mention js-hovercard\" title=\"akiy2009\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"akiy2009\"\u003e@akiy2009\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"212:1-212:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"212:2-212:50\"\u003e\u003ca href=\"https://qiita.com/tags/AutoDesign\"\u003e\u003ccode\u003eAutoDesign\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"212:52-212:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"212:54-212:62\"\u003e\u003ca href=\"/akiy2009\" class=\"user-mention js-hovercard\" title=\"akiy2009\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"akiy2009\"\u003e@akiy2009\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"213:1-213:118\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"213:2-213:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E5%9C%B0%E7%8D%84\"\u003e\u003ccode\u003e依存関係地獄\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"213:104-213:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"213:106-213:117\"\u003e\u003ca href=\"/GeneLab_999\" class=\"user-mention js-hovercard\" title=\"GeneLab_999\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeneLab_999\"\u003e@GeneLab_999\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"214:1-214:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"214:2-214:56\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/Nerves%2C\"\u003e\u003ccode\u003eNerves,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"214:58-214:58\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"214:60-214:69\"\u003e\u003ca href=\"/MickeyOoh\" class=\"user-mention js-hovercard\" title=\"MickeyOoh\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"MickeyOoh\"\u003e@MickeyOoh\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"215:1-215:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"215:2-215:48\"\u003e\u003ca href=\"https://qiita.com/tags/PIC16F747\"\u003e\u003ccode\u003ePIC16F747\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"215:50-215:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"215:52-215:56\"\u003e\u003ca href=\"/y2ru\" class=\"user-mention js-hovercard\" title=\"y2ru\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"y2ru\"\u003e@y2ru\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"216:1-216:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"216:2-216:48\"\u003e\u003ca href=\"https://qiita.com/tags/MPLABXIDE\"\u003e\u003ccode\u003eMPLABXIDE\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"216:50-216:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"216:52-216:56\"\u003e\u003ca href=\"/y2ru\" class=\"user-mention js-hovercard\" title=\"y2ru\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"y2ru\"\u003e@y2ru\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"217:1-217:175\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"217:2-217:162\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%8E%E3%83%BC%E3%83%89%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003eノードスクリプティング\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"217:164-217:164\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"217:166-217:174\"\u003e\u003ca href=\"/tsune2ne\" class=\"user-mention js-hovercard\" title=\"tsune2ne\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tsune2ne\"\u003e@tsune2ne\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"218:1-218:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"218:2-218:48\"\u003e\u003ca href=\"https://qiita.com/tags/Persistnt\"\u003e\u003ccode\u003ePersistnt\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"218:50-218:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"218:52-218:60\"\u003e\u003ca href=\"/flathill\" class=\"user-mention js-hovercard\" title=\"flathill\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"flathill\"\u003e@flathill\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"219:1-219:91\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"219:2-219:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%80%A3%E6%89%93%E5%AF%BE%E7%AD%96\"\u003e\u003ccode\u003e連打対策\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"219:80-219:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"219:82-219:90\"\u003e\u003ca href=\"/softbase\" class=\"user-mention js-hovercard\" title=\"softbase\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"softbase\"\u003e@softbase\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"220:1-220:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"220:2-220:36\"\u003e\u003ca href=\"https://qiita.com/tags/eza\"\u003e\u003ccode\u003eeza\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"220:38-220:38\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"220:40-220:52\"\u003e\u003ca href=\"/msredcomet06\" class=\"user-mention js-hovercard\" title=\"msredcomet06\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"msredcomet06\"\u003e@msredcomet06\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"221:1-221:106\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"221:2-221:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%AB%E8%A8%AD%E8%A8%88\"\u003e\u003ccode\u003eモデル設計\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"221:92-221:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"221:94-221:105\"\u003e\u003ca href=\"/jojo__xxxxx\" class=\"user-mention js-hovercard\" title=\"jojo__xxxxx\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jojo__xxxxx\"\u003e@jojo__xxxxx\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"222:1-222:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"222:2-222:72\"\u003e\u003ca href=\"https://qiita.com/tags/DefenderforContainers\"\u003e\u003ccode\u003eDefenderforContainers\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"222:74-222:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"222:76-222:82\"\u003e\u003ca href=\"/yama-s\" class=\"user-mention js-hovercard\" title=\"yama-s\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yama-s\"\u003e@yama-s\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"223:1-223:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"223:2-223:60\"\u003e\u003ca href=\"https://qiita.com/tags/TsukinoEventBus\"\u003e\u003ccode\u003eTsukinoEventBus\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"223:62-223:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"223:64-223:72\"\u003e\u003ca href=\"/tsukino_\" class=\"user-mention js-hovercard\" title=\"tsukino_\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tsukino_\"\u003e@tsukino_\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"224:1-224:47\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"224:2-224:36\"\u003e\u003ca href=\"https://qiita.com/tags/WGU\"\u003e\u003ccode\u003eWGU\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"224:38-224:38\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"224:40-224:46\"\u003e\u003ca href=\"/liligi\" class=\"user-mention js-hovercard\" title=\"liligi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"liligi\"\u003e@liligi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"225:1-225:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"225:2-225:56\"\u003e\u003ca href=\"https://qiita.com/tags/ReAct-Pattern\"\u003e\u003ccode\u003eReAct-Pattern\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"225:58-225:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"225:60-225:68\"\u003e\u003ca href=\"/baku2san\" class=\"user-mention js-hovercard\" title=\"baku2san\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"baku2san\"\u003e@baku2san\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"226:1-226:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"226:2-226:58\"\u003e\u003ca href=\"https://qiita.com/tags/CVE-2021-38757\"\u003e\u003ccode\u003eCVE-2021-38757\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"226:60-226:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"226:62-226:72\"\u003e\u003ca href=\"/nozomi2025\" class=\"user-mention js-hovercard\" title=\"nozomi2025\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nozomi2025\"\u003e@nozomi2025\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"228:1-228:13\"\u003e\n\u003cspan id=\"12月17日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8817%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月17日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"230:1-308:115\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"230:1-230:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"230:2-230:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"230:9-230:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"230:19-230:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"232:1-232:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"232:2-232:46\"\u003e\u003ca href=\"https://qiita.com/tags/Enabling\"\u003e\u003ccode\u003eEnabling\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"232:48-232:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"232:50-232:61\"\u003e\u003ca href=\"/future_kame\" class=\"user-mention js-hovercard\" title=\"future_kame\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"future_kame\"\u003e@future_kame\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"233:1-233:93\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"233:2-233:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%B8%89%E6%B4%8B%E9%9B%BB%E6%A9%9F\"\u003e\u003ccode\u003e三洋電機\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"233:80-233:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"233:82-233:92\"\u003e\u003ca href=\"/YuTanakaaa\" class=\"user-mention js-hovercard\" title=\"YuTanakaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YuTanakaaa\"\u003e@YuTanakaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"234:1-234:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"234:2-234:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7\"\u003e\u003ccode\u003eリリース一覧\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"234:104-234:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"234:106-234:114\"\u003e\u003ca href=\"/mucho243\" class=\"user-mention js-hovercard\" title=\"mucho243\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mucho243\"\u003e@mucho243\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"235:1-235:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"235:2-235:42\"\u003e\u003ca href=\"https://qiita.com/tags/WYSIWD\"\u003e\u003ccode\u003eWYSIWD\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"235:44-235:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"235:46-235:52\"\u003e\u003ca href=\"/koriym\" class=\"user-mention js-hovercard\" title=\"koriym\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"koriym\"\u003e@koriym\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"236:1-236:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"236:2-236:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8B%A4%E6%80%A0%E9%80%A3%E7%B5%A1\"\u003e\u003ccode\u003e勤怠連絡\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"236:80-236:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"236:82-236:96\"\u003e\u003ca href=\"/hagiwara_akira\" class=\"user-mention js-hovercard\" title=\"hagiwara_akira\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hagiwara_akira\"\u003e@hagiwara_akira\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"237:1-237:54\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"237:2-237:42\"\u003e\u003ca href=\"https://qiita.com/tags/ENARSI\"\u003e\u003ccode\u003eENARSI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"237:44-237:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"237:46-237:53\"\u003e\u003ca href=\"/ma_dash\" class=\"user-mention js-hovercard\" title=\"ma_dash\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ma_dash\"\u003e@ma_dash\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"238:1-238:150\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"238:2-238:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003eセルフホスティング\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"238:140-238:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"238:142-238:149\"\u003e\u003ca href=\"/shngmsw\" class=\"user-mention js-hovercard\" title=\"shngmsw\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shngmsw\"\u003e@shngmsw\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"239:1-239:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"239:2-239:56\"\u003e\u003ca href=\"https://qiita.com/tags/ServiceBridge\"\u003e\u003ccode\u003eServiceBridge\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"239:58-239:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"239:60-239:69\"\u003e\u003ca href=\"/iamicchan\" class=\"user-mention js-hovercard\" title=\"iamicchan\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"iamicchan\"\u003e@iamicchan\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"240:1-240:90\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"240:2-240:76\"\u003e\u003ca href=\"https://qiita.com/tags/InstanceDataReplication\"\u003e\u003ccode\u003eInstanceDataReplication\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"240:78-240:78\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"240:80-240:89\"\u003e\u003ca href=\"/iamicchan\" class=\"user-mention js-hovercard\" title=\"iamicchan\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"iamicchan\"\u003e@iamicchan\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"241:1-241:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"241:2-241:46\"\u003e\u003ca href=\"https://qiita.com/tags/IMAPsync\"\u003e\u003ccode\u003eIMAPsync\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"241:48-241:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"241:50-241:55\"\u003e\u003ca href=\"/You_I\" class=\"user-mention js-hovercard\" title=\"You_I\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"You_I\"\u003e@You_I\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"242:1-242:127\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"242:2-242:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AA%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88\"\u003e\u003ccode\u003eオオブジェクト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"242:116-242:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"242:118-242:126\"\u003e\u003ca href=\"/CodeLeaf\" class=\"user-mention js-hovercard\" title=\"CodeLeaf\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"CodeLeaf\"\u003e@CodeLeaf\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"243:1-243:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"243:2-243:58\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23Airbyte\"\u003e\u003ccode\u003e#Airbyte\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"243:60-243:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"243:62-243:74\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"244:1-244:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"244:2-244:50\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23ELT\"\u003e\u003ccode\u003e#ELT\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"244:52-244:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"244:54-244:66\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"245:1-245:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"245:2-245:60\"\u003e\u003ca href=\"https://qiita.com/tags/AccessConnector\"\u003e\u003ccode\u003eAccessConnector\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"245:62-245:62\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"245:64-245:76\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"246:1-246:109\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"246:2-246:96\"\u003e\u003ca href=\"https://qiita.com/tags/NTT%E6%8A%80%E8%A1%93%E5%8F%B2%E6%96%99%E9%A4%A8\"\u003e\u003ccode\u003eNTT技術史料館\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"246:98-246:98\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"246:100-246:108\"\u003e\u003ca href=\"/e99h2121\" class=\"user-mention js-hovercard\" title=\"e99h2121\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"e99h2121\"\u003e@e99h2121\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"247:1-247:89\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"247:2-247:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%B0%91%E4%B8%BB%E4%B8%BB%E7%BE%A9\"\u003e\u003ccode\u003e民主主義\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"247:80-247:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"247:82-247:88\"\u003e\u003ca href=\"/Chisho\" class=\"user-mention js-hovercard\" title=\"Chisho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Chisho\"\u003e@Chisho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"248:1-248:129\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"248:2-248:110\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%85%B1%E9%80%9A%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A02007\"\u003e\u003ccode\u003e共通フレーム2007\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"248:112-248:112\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"248:114-248:128\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"249:1-249:129\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"249:2-249:110\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%85%B1%E9%80%9A%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A02013\"\u003e\u003ccode\u003e共通フレーム2013\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"249:112-249:112\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"249:114-249:128\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"250:1-250:224\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"250:2-250:208\"\u003e\u003ca href=\"https://qiita.com/tags/Slack%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%86%E6%9E%90\"\u003e\u003ccode\u003eSlackデータコミュニケーション分析\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"250:210-250:210\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"250:212-250:223\"\u003e\u003ca href=\"/kim_dongock\" class=\"user-mention js-hovercard\" title=\"kim_dongock\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kim_dongock\"\u003e@kim_dongock\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"251:1-251:108\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"251:2-251:92\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%E8%A1%8C%E5%8B%95%E8%A8%88%E7%94%BB%2C\"\u003e\u003ccode\u003e行動計画,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"251:94-251:94\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"251:96-251:107\"\u003e\u003ca href=\"/pons_cawaii\" class=\"user-mention js-hovercard\" title=\"pons_cawaii\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"pons_cawaii\"\u003e@pons_cawaii\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"252:1-252:120\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"252:2-252:104\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%2C\"\u003e\u003ccode\u003eミッション,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"252:106-252:106\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"252:108-252:119\"\u003e\u003ca href=\"/pons_cawaii\" class=\"user-mention js-hovercard\" title=\"pons_cawaii\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"pons_cawaii\"\u003e@pons_cawaii\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"253:1-253:88\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"253:2-253:56\"\u003e\u003ca href=\"https://qiita.com/tags/gpt-image-1.5\"\u003e\u003ccode\u003egpt-image-1.5\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"253:58-253:58\"\u003e6\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"253:60-253:87\"\u003e\n\u003ca href=\"/7mpy\" class=\"user-mention js-hovercard\" title=\"7mpy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"7mpy\"\u003e@7mpy\u003c/a\u003e, \u003ca href=\"/Peanuts05\" class=\"user-mention js-hovercard\" title=\"Peanuts05\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Peanuts05\"\u003e@Peanuts05\u003c/a\u003e, \u003ca href=\"/kabumira\" class=\"user-mention js-hovercard\" title=\"kabumira\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kabumira\"\u003e@kabumira\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"254:1-254:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"254:2-254:118\"\u003e\u003ca href=\"https://qiita.com/tags/UI%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003eUIアニメーション\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"254:120-254:120\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"254:122-254:130\"\u003e\u003ca href=\"/albatrus\" class=\"user-mention js-hovercard\" title=\"albatrus\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"albatrus\"\u003e@albatrus\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"255:1-255:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"255:2-255:52\"\u003e\u003ca href=\"https://qiita.com/tags/BinaryNinja\"\u003e\u003ccode\u003eBinaryNinja\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"255:54-255:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"255:56-255:70\"\u003e\u003ca href=\"/schectman-hell\" class=\"user-mention js-hovercard\" title=\"schectman-hell\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"schectman-hell\"\u003e@schectman-hell\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"256:1-256:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"256:2-256:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/.agent\"\u003e\u003ccode\u003e.agent\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"256:54-256:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"256:56-256:66\"\u003e\u003ca href=\"/gurigurico\" class=\"user-mention js-hovercard\" title=\"gurigurico\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gurigurico\"\u003e@gurigurico\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"257:1-257:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"257:2-257:72\"\u003e\u003ca href=\"https://qiita.com/tags/360%E3%82%A2%E3%83%97%E3%83%AA\"\u003e\u003ccode\u003e360アプリ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"257:74-257:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"257:76-257:82\"\u003e\u003ca href=\"/eishii\" class=\"user-mention js-hovercard\" title=\"eishii\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"eishii\"\u003e@eishii\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"258:1-258:89\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"258:2-258:74\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/ChromeExtension%2C\"\u003e\u003ccode\u003eChromeExtension,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"258:76-258:76\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"258:78-258:88\"\u003e\u003ca href=\"/gurigurico\" class=\"user-mention js-hovercard\" title=\"gurigurico\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gurigurico\"\u003e@gurigurico\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"259:1-259:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"259:2-259:68\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/Productivity%2C\"\u003e\u003ccode\u003eProductivity,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"259:70-259:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"259:72-259:82\"\u003e\u003ca href=\"/gurigurico\" class=\"user-mention js-hovercard\" title=\"gurigurico\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gurigurico\"\u003e@gurigurico\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"260:1-260:64\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"260:2-260:46\"\u003e\u003ca href=\"https://qiita.com/tags/Mixboard\"\u003e\u003ccode\u003eMixboard\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"260:48-260:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"260:50-260:63\"\u003e\u003ca href=\"/nao_manabitan\" class=\"user-mention js-hovercard\" title=\"nao_manabitan\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nao_manabitan\"\u003e@nao_manabitan\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"261:1-261:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"261:2-261:46\"\u003e\u003ca href=\"https://qiita.com/tags/SECCON14\"\u003e\u003ccode\u003eSECCON14\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"261:48-261:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"261:50-261:59\"\u003e\u003ca href=\"/Liesegang\" class=\"user-mention js-hovercard\" title=\"Liesegang\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Liesegang\"\u003e@Liesegang\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"262:1-262:132\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"262:2-262:120\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23AI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003e#AIコーディング\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"262:122-262:122\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"262:124-262:131\"\u003e\u003ca href=\"/NestRec\" class=\"user-mention js-hovercard\" title=\"NestRec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"NestRec\"\u003e@NestRec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"263:1-263:52\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"263:2-263:38\"\u003e\u003ca href=\"https://qiita.com/tags/OSSJ\"\u003e\u003ccode\u003eOSSJ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"263:40-263:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"263:42-263:51\"\u003e\u003ca href=\"/shu-mutow\" class=\"user-mention js-hovercard\" title=\"shu-mutow\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shu-mutow\"\u003e@shu-mutow\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"264:1-264:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"264:2-264:46\"\u003e\u003ca href=\"https://qiita.com/tags/tiberCAD\"\u003e\u003ccode\u003etiberCAD\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"264:48-264:48\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"264:50-264:62\"\u003e\u003ca href=\"/Takeshi_Baba\" class=\"user-mention js-hovercard\" title=\"Takeshi_Baba\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Takeshi_Baba\"\u003e@Takeshi_Baba\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"265:1-265:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"265:2-265:106\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1%E3%83%AD%E3%82%B0\"\u003e\u003ccode\u003eAIとの対話ログ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"265:108-265:108\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"265:110-265:118\"\u003e\u003ca href=\"/RyuGotoo\" class=\"user-mention js-hovercard\" title=\"RyuGotoo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"RyuGotoo\"\u003e@RyuGotoo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"266:1-266:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"266:2-266:52\"\u003e\u003ca href=\"https://qiita.com/tags/DownlinkAPI\"\u003e\u003ccode\u003eDownlinkAPI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"266:54-266:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"266:56-266:65\"\u003e\u003ca href=\"/yukataoka\" class=\"user-mention js-hovercard\" title=\"yukataoka\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yukataoka\"\u003e@yukataoka\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"267:1-267:114\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"267:2-267:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%86%E3%82%B9%E3%83%88\"\u003e\u003ccode\u003e継続的テスト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"267:104-267:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"267:106-267:113\"\u003e\u003ca href=\"/rymetry\" class=\"user-mention js-hovercard\" title=\"rymetry\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"rymetry\"\u003e@rymetry\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"268:1-268:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"268:2-268:40\"\u003e\u003ca href=\"https://qiita.com/tags/Nutjs\"\u003e\u003ccode\u003eNutjs\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"268:42-268:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"268:44-268:52\"\u003e\u003ca href=\"/n0bisuke\" class=\"user-mention js-hovercard\" title=\"n0bisuke\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"n0bisuke\"\u003e@n0bisuke\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"269:1-269:104\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"269:2-269:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A2%E3%82%A6%E3%83%88%E3%82%AB%E3%83%A0\"\u003e\u003ccode\u003eアウトカム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"269:92-269:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"269:94-269:103\"\u003e\u003ca href=\"/ryo_beppu\" class=\"user-mention js-hovercard\" title=\"ryo_beppu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ryo_beppu\"\u003e@ryo_beppu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"270:1-270:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"270:2-270:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%AF%9D%E3%82%8D\"\u003e\u003ccode\u003e寝ろ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"270:56-270:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"270:58-270:67\"\u003e\u003ca href=\"/zazen_inu\" class=\"user-mention js-hovercard\" title=\"zazen_inu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"zazen_inu\"\u003e@zazen_inu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"271:1-271:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"271:2-271:50\"\u003e\u003ca href=\"https://qiita.com/tags/SitetoSite\"\u003e\u003ccode\u003eSitetoSite\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"271:52-271:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"271:54-271:60\"\u003e\u003ca href=\"/air789\" class=\"user-mention js-hovercard\" title=\"air789\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"air789\"\u003e@air789\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"272:1-272:153\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"272:2-272:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%B6%88%E8%B2%BB%E8%80%85%E3%83%9B%E3%83%83%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3\"\u003e\u003ccode\u003e消費者ホットライン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"272:140-272:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"272:142-272:152\"\u003e\u003ca href=\"/ekzemplaro\" class=\"user-mention js-hovercard\" title=\"ekzemplaro\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ekzemplaro\"\u003e@ekzemplaro\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"273:1-273:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"273:2-273:50\"\u003e\u003ca href=\"https://qiita.com/tags/TanstackAI\"\u003e\u003ccode\u003eTanstackAI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"273:52-273:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"273:54-273:68\"\u003e\u003ca href=\"/gorilla_garden\" class=\"user-mention js-hovercard\" title=\"gorilla_garden\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gorilla_garden\"\u003e@gorilla_garden\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"274:1-274:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"274:2-274:42\"\u003e\u003ca href=\"https://qiita.com/tags/PearOS\"\u003e\u003ccode\u003ePearOS\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"274:44-274:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"274:46-274:58\"\u003e\u003ca href=\"/Kanade147359\" class=\"user-mention js-hovercard\" title=\"Kanade147359\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Kanade147359\"\u003e@Kanade147359\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"275:1-275:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"275:2-275:56\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23toggle\"\u003e\u003ccode\u003e#toggle\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"275:58-275:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"275:60-275:67\"\u003e\u003ca href=\"/hhibara\" class=\"user-mention js-hovercard\" title=\"hhibara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hhibara\"\u003e@hhibara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"276:1-276:80\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"276:2-276:68\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23projectLINKS\"\u003e\u003ccode\u003e#projectLINKS\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"276:70-276:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"276:72-276:79\"\u003e\u003ca href=\"/hhibara\" class=\"user-mention js-hovercard\" title=\"hhibara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hhibara\"\u003e@hhibara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"277:1-277:64\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"277:2-277:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23MLIT\"\u003e\u003ccode\u003e#MLIT\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"277:54-277:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"277:56-277:63\"\u003e\u003ca href=\"/hhibara\" class=\"user-mention js-hovercard\" title=\"hhibara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hhibara\"\u003e@hhibara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"278:1-278:96\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"278:2-278:84\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E3%81%A4%E3%81%8F%E3%82%8BAI\"\u003e\u003ccode\u003e#つくるAI\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"278:86-278:86\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"278:88-278:95\"\u003e\u003ca href=\"/hhibara\" class=\"user-mention js-hovercard\" title=\"hhibara\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hhibara\"\u003e@hhibara\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"279:1-279:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"279:2-279:46\"\u003e\u003ca href=\"https://qiita.com/tags/Quickwit\"\u003e\u003ccode\u003eQuickwit\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"279:48-279:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"279:50-279:57\"\u003e\u003ca href=\"/melktzk\" class=\"user-mention js-hovercard\" title=\"melktzk\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"melktzk\"\u003e@melktzk\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"280:1-280:113\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"280:2-280:100\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/Productionautomationsoftware%2C\"\u003e\u003ccode\u003eProductionautomationsoftware,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"280:102-280:102\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"280:104-280:112\"\u003e\u003ca href=\"/itsybizz\" class=\"user-mention js-hovercard\" title=\"itsybizz\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"itsybizz\"\u003e@itsybizz\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"281:1-281:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"281:2-281:66\"\u003e\u003ca href=\"https://qiita.com/tags/automationsoftware\"\u003e\u003ccode\u003eautomationsoftware\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"281:68-281:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"281:70-281:78\"\u003e\u003ca href=\"/itsybizz\" class=\"user-mention js-hovercard\" title=\"itsybizz\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"itsybizz\"\u003e@itsybizz\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"282:1-282:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"282:2-282:48\"\u003e\u003ca href=\"https://qiita.com/tags/Vectorpea\"\u003e\u003ccode\u003eVectorpea\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"282:50-282:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"282:52-282:58\"\u003e\u003ca href=\"/a-nemo\" class=\"user-mention js-hovercard\" title=\"a-nemo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"a-nemo\"\u003e@a-nemo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"283:1-283:107\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"283:2-283:92\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E5%86%85%E9%83%A8%E4%B8%8D%E6%AD%A3\"\u003e\u003ccode\u003e#内部不正\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"283:94-283:94\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"283:96-283:106\"\u003e\u003ca href=\"/yamada_sec\" class=\"user-mention js-hovercard\" title=\"yamada_sec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yamada_sec\"\u003e@yamada_sec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"284:1-284:167\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"284:2-284:152\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%BF%83%E7%90%86%E5%AD%A6\"\u003e\u003ccode\u003e#セキュリティ心理学\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"284:154-284:154\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"284:156-284:166\"\u003e\u003ca href=\"/yamada_sec\" class=\"user-mention js-hovercard\" title=\"yamada_sec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yamada_sec\"\u003e@yamada_sec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"285:1-285:107\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"285:2-285:92\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E6%8A%91%E6%AD%A2%E8%A8%AD%E8%A8%88\"\u003e\u003ccode\u003e#抑止設計\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"285:94-285:94\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"285:96-285:106\"\u003e\u003ca href=\"/yamada_sec\" class=\"user-mention js-hovercard\" title=\"yamada_sec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yamada_sec\"\u003e@yamada_sec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"286:1-286:81\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"286:2-286:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%AB%98%E7%B2%BE%E5%BA%A6\"\u003e\u003ccode\u003e高精度\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"286:68-286:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"286:70-286:80\"\u003e\u003ca href=\"/nozomi2025\" class=\"user-mention js-hovercard\" title=\"nozomi2025\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nozomi2025\"\u003e@nozomi2025\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"287:1-287:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"287:2-287:108\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23AI%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003e#AIモデリング\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"287:110-287:110\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"287:112-287:118\"\u003e\u003ca href=\"/Etsuoo\" class=\"user-mention js-hovercard\" title=\"Etsuoo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Etsuoo\"\u003e@Etsuoo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"288:1-288:224\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"288:2-288:208\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%E6%9B%B8%E7%B1%8D%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%AA%AD%E3%82%80%E6%8A%80%E8%A1%93%E3%80%8D\"\u003e\u003ccode\u003e書籍「プログラムを読む技術」\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"288:210-288:210\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"288:212-288:223\"\u003e\u003ca href=\"/lighttobrca\" class=\"user-mention js-hovercard\" title=\"lighttobrca\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lighttobrca\"\u003e@lighttobrca\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"289:1-289:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"289:2-289:46\"\u003e\u003ca href=\"https://qiita.com/tags/tweening\"\u003e\u003ccode\u003etweening\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"289:48-289:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"289:50-289:58\"\u003e\u003ca href=\"/malo21st\" class=\"user-mention js-hovercard\" title=\"malo21st\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"malo21st\"\u003e@malo21st\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"290:1-290:153\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"290:2-290:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88\"\u003e\u003ccode\u003eプロダクトサポート\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"290:140-290:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"290:142-290:152\"\u003e\u003ca href=\"/yuyasasaki\" class=\"user-mention js-hovercard\" title=\"yuyasasaki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuyasasaki\"\u003e@yuyasasaki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"291:1-291:152\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"291:2-291:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A7%8B%E6%88%90%E5%9B%B3\"\u003e\u003ccode\u003eネットワーク構成図\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"291:140-291:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"291:142-291:151\"\u003e\u003ca href=\"/to-nagano\" class=\"user-mention js-hovercard\" title=\"to-nagano\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"to-nagano\"\u003e@to-nagano\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"292:1-292:132\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"292:2-292:118\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E8%A8%AD%E8%A8%88\"\u003e\u003ccode\u003eAIファースト設計\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"292:120-292:120\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"292:122-292:131\"\u003e\u003ca href=\"/___nix___\" class=\"user-mention js-hovercard\" title=\"___nix___\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"___nix___\"\u003e@___nix___\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"293:1-293:128\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"293:2-293:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A8%AD%E8%A8%88%E6%9B%B8%E3%81%AE%E5%86%8D%E5%AE%9A%E7%BE%A9\"\u003e\u003ccode\u003e設計書の再定義\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"293:116-293:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"293:118-293:127\"\u003e\u003ca href=\"/___nix___\" class=\"user-mention js-hovercard\" title=\"___nix___\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"___nix___\"\u003e@___nix___\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"294:1-294:144\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"294:2-294:130\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BA%BA%E9%96%93%E3%81%A8AI%E3%81%AE%E5%BD%B9%E5%89%B2%E5%88%86%E6%8B%85\"\u003e\u003ccode\u003e人間とAIの役割分担\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"294:132-294:132\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"294:134-294:143\"\u003e\u003ca href=\"/___nix___\" class=\"user-mention js-hovercard\" title=\"___nix___\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"___nix___\"\u003e@___nix___\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"295:1-295:51\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"295:2-295:38\"\u003e\u003ca href=\"https://qiita.com/tags/EUCC\"\u003e\u003ccode\u003eEUCC\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"295:40-295:40\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"295:42-295:50\"\u003e\u003ca href=\"/satokan3\" class=\"user-mention js-hovercard\" title=\"satokan3\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"satokan3\"\u003e@satokan3\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"296:1-296:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"296:2-296:46\"\u003e\u003ca href=\"https://qiita.com/tags/CEA-Leti\"\u003e\u003ccode\u003eCEA-Leti\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"296:48-296:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"296:50-296:58\"\u003e\u003ca href=\"/satokan3\" class=\"user-mention js-hovercard\" title=\"satokan3\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"satokan3\"\u003e@satokan3\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"297:1-297:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"297:2-297:40\"\u003e\u003ca href=\"https://qiita.com/tags/CESTI\"\u003e\u003ccode\u003eCESTI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"297:42-297:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"297:44-297:52\"\u003e\u003ca href=\"/satokan3\" class=\"user-mention js-hovercard\" title=\"satokan3\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"satokan3\"\u003e@satokan3\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"298:1-298:106\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"298:2-298:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%8A%E3%82%A4%E3%82%BA\"\u003e\u003ccode\u003eモデナイズ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"298:92-298:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"298:94-298:105\"\u003e\u003ca href=\"/keitakei777\" class=\"user-mention js-hovercard\" title=\"keitakei777\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"keitakei777\"\u003e@keitakei777\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"299:1-299:89\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"299:2-299:74\"\u003e\u003ca href=\"https://qiita.com/tags/DatabricksAssetBundles\"\u003e\u003ccode\u003eDatabricksAssetBundles\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"299:76-299:76\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"299:78-299:88\"\u003e\u003ca href=\"/taka_yayoi\" class=\"user-mention js-hovercard\" title=\"taka_yayoi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"taka_yayoi\"\u003e@taka_yayoi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"300:1-300:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"300:2-300:48\"\u003e\u003ca href=\"https://qiita.com/tags/UserVoice\"\u003e\u003ccode\u003eUserVoice\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"300:50-300:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"300:52-300:60\"\u003e\u003ca href=\"/baku2san\" class=\"user-mention js-hovercard\" title=\"baku2san\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"baku2san\"\u003e@baku2san\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"301:1-301:94\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"301:2-301:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%80%E3%83%83%E3%82%B3%E3%83%95\"\u003e\u003ccode\u003eダッコフ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"301:80-301:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"301:82-301:93\"\u003e\u003ca href=\"/ShiinaNekko\" class=\"user-mention js-hovercard\" title=\"ShiinaNekko\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ShiinaNekko\"\u003e@ShiinaNekko\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"302:1-302:120\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"302:2-302:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC\"\u003e\u003ccode\u003eモデレーター\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"302:104-302:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"302:106-302:119\"\u003e\u003ca href=\"/beajourneyman\" class=\"user-mention js-hovercard\" title=\"beajourneyman\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"beajourneyman\"\u003e@beajourneyman\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"303:1-303:180\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"303:2-303:162\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8F%82%E5%8A%A0%E5%9E%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003e参加型トークセッション\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"303:164-303:164\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"303:166-303:179\"\u003e\u003ca href=\"/beajourneyman\" class=\"user-mention js-hovercard\" title=\"beajourneyman\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"beajourneyman\"\u003e@beajourneyman\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"304:1-304:82\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"304:2-304:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%AD%94%E6%96%B9%E9%99%A3\"\u003e\u003ccode\u003e魔方陣\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"304:68-304:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"304:70-304:81\"\u003e\u003ca href=\"/Joe75792433\" class=\"user-mention js-hovercard\" title=\"Joe75792433\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Joe75792433\"\u003e@Joe75792433\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"305:1-305:127\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"305:2-305:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%90%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9\"\u003e\u003ccode\u003eバックトレース\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"305:116-305:116\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"305:118-305:126\"\u003e\u003ca href=\"/namn1125\" class=\"user-mention js-hovercard\" title=\"namn1125\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"namn1125\"\u003e@namn1125\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"306:1-306:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"306:2-306:48\"\u003e\u003ca href=\"https://qiita.com/tags/ICM-42688\"\u003e\u003ccode\u003eICM-42688\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"306:50-306:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"306:52-306:61\"\u003e\u003ca href=\"/RamTuckey\" class=\"user-mention js-hovercard\" title=\"RamTuckey\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"RamTuckey\"\u003e@RamTuckey\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"307:1-307:125\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"307:2-307:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%96%A2%E8%A5%BF%E6%98%A5%E3%83%AD%E3%83%9C%E3%82%B3%E3%83%B3\"\u003e\u003ccode\u003e関西春ロボコン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"307:116-307:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"307:118-307:124\"\u003e\u003ca href=\"/kadoya\" class=\"user-mention js-hovercard\" title=\"kadoya\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kadoya\"\u003e@kadoya\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"308:1-308:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"308:2-308:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%8D%E3%81%86%E3%83%BB%E9%9B%A3%E8%81%B4%E8%80%85\"\u003e\u003ccode\u003eろう・難聴者\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"308:104-308:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"308:106-308:114\"\u003e\u003ca href=\"/fujiemon\" class=\"user-mention js-hovercard\" title=\"fujiemon\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"fujiemon\"\u003e@fujiemon\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"310:1-310:13\"\u003e\n\u003cspan id=\"12月18日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8818%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月18日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"312:1-369:91\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"312:1-312:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"312:2-312:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"312:9-312:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"312:19-312:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"314:1-314:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"314:2-314:52\"\u003e\u003ca href=\"https://qiita.com/tags/GPTImage1.5\"\u003e\u003ccode\u003eGPTImage1.5\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"314:54-314:54\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"314:56-314:62\"\u003e\u003ca href=\"/youtoy\" class=\"user-mention js-hovercard\" title=\"youtoy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"youtoy\"\u003e@youtoy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"315:1-315:87\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"315:2-315:44\"\u003e\u003ca href=\"https://qiita.com/tags/AIP-C01\"\u003e\u003ccode\u003eAIP-C01\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"315:46-315:46\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"315:48-315:86\"\u003e\n\u003ca href=\"/e52yamada\" class=\"user-mention js-hovercard\" title=\"e52yamada\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"e52yamada\"\u003e@e52yamada\u003c/a\u003e, \u003ca href=\"/ry-harada\" class=\"user-mention js-hovercard\" title=\"ry-harada\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ry-harada\"\u003e@ry-harada\u003c/a\u003e, \u003ca href=\"/sense_of_unity\" class=\"user-mention js-hovercard\" title=\"sense_of_unity\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"sense_of_unity\"\u003e@sense_of_unity\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"316:1-316:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"316:2-316:52\"\u003e\u003ca href=\"https://qiita.com/tags/realtimekit\"\u003e\u003ccode\u003erealtimekit\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"316:54-316:54\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"316:56-316:62\"\u003e\u003ca href=\"/toreis\" class=\"user-mention js-hovercard\" title=\"toreis\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"toreis\"\u003e@toreis\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"317:1-317:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"317:2-317:46\"\u003e\u003ca href=\"https://qiita.com/tags/ml-sharp\"\u003e\u003ccode\u003eml-sharp\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"317:48-317:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"317:50-317:59\"\u003e\u003ca href=\"/kongo-jun\" class=\"user-mention js-hovercard\" title=\"kongo-jun\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kongo-jun\"\u003e@kongo-jun\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"318:1-318:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"318:2-318:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23Axon\"\u003e\u003ccode\u003e#Axon\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"318:54-318:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"318:56-318:68\"\u003e\u003ca href=\"/koyo52611798\" class=\"user-mention js-hovercard\" title=\"koyo52611798\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"koyo52611798\"\u003e@koyo52611798\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"319:1-319:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"319:2-319:48\"\u003e\u003ca href=\"https://qiita.com/tags/AGENTS.md\"\u003e\u003ccode\u003eAGENTS.md\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"319:50-319:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"319:52-319:62\"\u003e\u003ca href=\"/kitfactory\" class=\"user-mention js-hovercard\" title=\"kitfactory\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kitfactory\"\u003e@kitfactory\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"320:1-320:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"320:2-320:48\"\u003e\u003ca href=\"https://qiita.com/tags/Skills.md\"\u003e\u003ccode\u003eSkills.md\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"320:50-320:50\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"320:52-320:78\"\u003e\n\u003ca href=\"/autotaker1984\" class=\"user-mention js-hovercard\" title=\"autotaker1984\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"autotaker1984\"\u003e@autotaker1984\u003c/a\u003e, \u003ca href=\"/kitfactory\" class=\"user-mention js-hovercard\" title=\"kitfactory\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kitfactory\"\u003e@kitfactory\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"321:1-321:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"321:2-321:44\"\u003e\u003ca href=\"https://qiita.com/tags/Seafile\"\u003e\u003ccode\u003eSeafile\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"321:46-321:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"321:48-321:57\"\u003e\u003ca href=\"/niimi_ToB\" class=\"user-mention js-hovercard\" title=\"niimi_ToB\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"niimi_ToB\"\u003e@niimi_ToB\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"322:1-322:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"322:2-322:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E7%AB%B6%E5%90%88\"\u003e\u003ccode\u003eデバイス競合\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"322:104-322:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"322:106-322:118\"\u003e\u003ca href=\"/nisepan_nono\" class=\"user-mention js-hovercard\" title=\"nisepan_nono\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nisepan_nono\"\u003e@nisepan_nono\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"323:1-323:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"323:2-323:42\"\u003e\u003ca href=\"https://qiita.com/tags/Raygun\"\u003e\u003ccode\u003eRaygun\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"323:44-323:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"323:46-323:55\"\u003e\u003ca href=\"/jsakamoto\" class=\"user-mention js-hovercard\" title=\"jsakamoto\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jsakamoto\"\u003e@jsakamoto\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"324:1-324:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"324:2-324:62\"\u003e\u003ca href=\"https://qiita.com/tags/gemini-3.0-flash\"\u003e\u003ccode\u003egemini-3.0-flash\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"324:64-324:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"324:66-324:70\"\u003e\u003ca href=\"/7mpy\" class=\"user-mention js-hovercard\" title=\"7mpy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"7mpy\"\u003e@7mpy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"325:1-325:83\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"325:2-325:66\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23HULFTSquare\"\u003e\u003ccode\u003e#HULFTSquare\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"325:68-325:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"325:70-325:82\"\u003e\u003ca href=\"/kyohei_tsuno\" class=\"user-mention js-hovercard\" title=\"kyohei_tsuno\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kyohei_tsuno\"\u003e@kyohei_tsuno\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"326:1-326:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"326:2-326:44\"\u003e\u003ca href=\"https://qiita.com/tags/AP1-C01\"\u003e\u003ccode\u003eAP1-C01\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"326:46-326:46\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"326:48-326:76\"\u003e\n\u003ca href=\"/sense_of_unity\" class=\"user-mention js-hovercard\" title=\"sense_of_unity\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"sense_of_unity\"\u003e@sense_of_unity\u003c/a\u003e, \u003ca href=\"/taro-yamada\" class=\"user-mention js-hovercard\" title=\"taro-yamada\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"taro-yamada\"\u003e@taro-yamada\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"327:1-327:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"327:2-327:96\"\u003e\u003ca href=\"https://qiita.com/tags/DNS%E6%B0%B4%E8%B2%AC%E3%82%81%E6%94%BB%E6%92%83\"\u003e\u003ccode\u003eDNS水責め攻撃\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"327:98-327:98\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"327:100-327:114\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"328:1-328:193\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"328:2-328:174\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%B5%E3%83%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E6%94%BB%E6%92%83\"\u003e\u003ccode\u003eランダムサブドメイン攻撃\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"328:176-328:176\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"328:178-328:192\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"329:1-329:103\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"329:2-329:84\"\u003e\u003ca href=\"https://qiita.com/tags/SOA%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89\"\u003e\u003ccode\u003eSOAレコード\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"329:86-329:86\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"329:88-329:102\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"330:1-330:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"330:2-330:44\"\u003e\u003ca href=\"https://qiita.com/tags/NTAG215\"\u003e\u003ccode\u003eNTAG215\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"330:46-330:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"330:48-330:59\"\u003e\u003ca href=\"/TakumiSaito\" class=\"user-mention js-hovercard\" title=\"TakumiSaito\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TakumiSaito\"\u003e@TakumiSaito\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"331:1-331:78\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"331:2-331:62\"\u003e\u003ca href=\"https://qiita.com/tags/NFCForumType2Tag\"\u003e\u003ccode\u003eNFCForumType2Tag\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"331:64-331:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"331:66-331:77\"\u003e\u003ca href=\"/TakumiSaito\" class=\"user-mention js-hovercard\" title=\"TakumiSaito\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TakumiSaito\"\u003e@TakumiSaito\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"332:1-332:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"332:2-332:58\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23AIREADI\"\u003e\u003ccode\u003e#AIREADI\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"332:60-332:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"332:62-332:69\"\u003e\u003ca href=\"/Pyonaya\" class=\"user-mention js-hovercard\" title=\"Pyonaya\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Pyonaya\"\u003e@Pyonaya\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"333:1-333:74\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"333:2-333:60\"\u003e\u003ca href=\"https://qiita.com/tags/Web-LLM-attacks\"\u003e\u003ccode\u003eWeb-LLM-attacks\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"333:62-333:62\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"333:64-333:73\"\u003e\u003ca href=\"/yna020311\" class=\"user-mention js-hovercard\" title=\"yna020311\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yna020311\"\u003e@yna020311\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"334:1-334:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"334:2-334:42\"\u003e\u003ca href=\"https://qiita.com/tags/MUSUBI\"\u003e\u003ccode\u003eMUSUBI\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"334:44-334:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"334:46-334:52\"\u003e\u003ca href=\"/hisaho\" class=\"user-mention js-hovercard\" title=\"hisaho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hisaho\"\u003e@hisaho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"335:1-335:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"335:2-335:84\"\u003e\u003ca href=\"https://qiita.com/tags/DrawMeshInstancedProcedural\"\u003e\u003ccode\u003eDrawMeshInstancedProcedural\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"335:86-335:86\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"335:88-335:96\"\u003e\u003ca href=\"/kaki_ice\" class=\"user-mention js-hovercard\" title=\"kaki_ice\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kaki_ice\"\u003e@kaki_ice\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"336:1-336:141\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"336:2-336:120\"\u003e\u003ca href=\"https://qiita.com/tags/Box%E8%AA%8D%E5%AE%9A%E7%AE%A1%E7%90%86%E8%80%85%E8%A9%A6%E9%A8%93\"\u003e\u003ccode\u003eBox認定管理者試験\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"336:122-336:122\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"336:124-336:140\"\u003e\u003ca href=\"/ctc-tm-kobayashi\" class=\"user-mention js-hovercard\" title=\"ctc-tm-kobayashi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ctc-tm-kobayashi\"\u003e@ctc-tm-kobayashi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"337:1-337:46\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"337:2-337:36\"\u003e\u003ca href=\"https://qiita.com/tags/CIP\"\u003e\u003ccode\u003eCIP\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"337:38-337:38\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"337:40-337:45\"\u003e\u003ca href=\"/llbxg\" class=\"user-mention js-hovercard\" title=\"llbxg\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"llbxg\"\u003e@llbxg\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"338:1-338:196\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"338:2-338:176\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/OST%E3%81%8B%E3%82%89PDF%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC%2C\"\u003e\u003ccode\u003eOSTからPDFへのコンバーター,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"338:178-338:178\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"338:180-338:195\"\u003e\u003ca href=\"/jackdaniel1990y\" class=\"user-mention js-hovercard\" title=\"jackdaniel1990y\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jackdaniel1990y\"\u003e@jackdaniel1990y\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"339:1-339:124\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"339:2-339:104\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/ost%E3%82%92pdf%E3%81%AB%E5%A4%89%E6%8F%9B%2C\"\u003e\u003ccode\u003eostをpdfに変換,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"339:106-339:106\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"339:108-339:123\"\u003e\u003ca href=\"/jackdaniel1990y\" class=\"user-mention js-hovercard\" title=\"jackdaniel1990y\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jackdaniel1990y\"\u003e@jackdaniel1990y\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"340:1-340:134\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"340:2-340:114\"\u003e\u003ca href=\"https://qiita.com/tags/ost%E3%82%92pdf%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B\"\u003e\u003ccode\u003eostをpdfに変換する\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"340:116-340:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"340:118-340:133\"\u003e\u003ca href=\"/jackdaniel1990y\" class=\"user-mention js-hovercard\" title=\"jackdaniel1990y\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"jackdaniel1990y\"\u003e@jackdaniel1990y\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"341:1-341:150\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"341:2-341:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB\"\u003e\u003ccode\u003eテストコントロール\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"341:140-341:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"341:142-341:149\"\u003e\u003ca href=\"/EgaSaQA\" class=\"user-mention js-hovercard\" title=\"EgaSaQA\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"EgaSaQA\"\u003e@EgaSaQA\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"342:1-342:112\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"342:2-342:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%96%B6%E6%A5%AD%E8%87%AA%E5%8B%95%E5%8C%96\"\u003e\u003ccode\u003e営業自動化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"342:92-342:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"342:94-342:111\"\u003e\u003ca href=\"/ai_to_chienoakari\" class=\"user-mention js-hovercard\" title=\"ai_to_chienoakari\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ai_to_chienoakari\"\u003e@ai_to_chienoakari\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"343:1-343:172\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"343:2-343:150\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E8%87%AA%E5%8B%95%E5%8C%96\"\u003e\u003ccode\u003eマーケティング自動化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"343:152-343:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"343:154-343:171\"\u003e\u003ca href=\"/ai_to_chienoakari\" class=\"user-mention js-hovercard\" title=\"ai_to_chienoakari\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ai_to_chienoakari\"\u003e@ai_to_chienoakari\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"344:1-344:126\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"344:2-344:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%A4%96%E9%83%A8%E3%82%BD%E3%83%BC%E3%82%B9%E9%80%A3%E6%90%BA\"\u003e\u003ccode\u003e外部ソース連携\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"344:116-344:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"344:118-344:125\"\u003e\u003ca href=\"/Kajiita\" class=\"user-mention js-hovercard\" title=\"Kajiita\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Kajiita\"\u003e@Kajiita\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"345:1-345:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"345:2-345:60\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23Agent365\"\u003e\u003ccode\u003e#Agent365\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"345:62-345:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"345:64-345:74\"\u003e\u003ca href=\"/yamada_sec\" class=\"user-mention js-hovercard\" title=\"yamada_sec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yamada_sec\"\u003e@yamada_sec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"346:1-346:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"346:2-346:68\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E8%BB%8A%E8%BC%89\"\u003e\u003ccode\u003e#車載\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"346:70-346:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"346:72-346:78\"\u003e\u003ca href=\"/tanami\" class=\"user-mention js-hovercard\" title=\"tanami\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tanami\"\u003e@tanami\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"347:1-347:127\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"347:2-347:116\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B9%E3%82%BF%E3%83%BC\"\u003e\u003ccode\u003e#ロードスター\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"347:118-347:118\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"347:120-347:126\"\u003e\u003ca href=\"/tanami\" class=\"user-mention js-hovercard\" title=\"tanami\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tanami\"\u003e@tanami\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"348:1-348:91\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"348:2-348:80\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23ReverseEngineering\"\u003e\u003ccode\u003e#ReverseEngineering\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"348:82-348:82\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"348:84-348:90\"\u003e\u003ca href=\"/tanami\" class=\"user-mention js-hovercard\" title=\"tanami\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tanami\"\u003e@tanami\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"349:1-349:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"349:2-349:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8C%A0Method\"\u003e\u003ccode\u003e匠Method\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"349:56-349:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"349:58-349:72\"\u003e\u003ca href=\"/dsol_dtakeuchi\" class=\"user-mention js-hovercard\" title=\"dsol_dtakeuchi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"dsol_dtakeuchi\"\u003e@dsol_dtakeuchi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"350:1-350:329\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"350:2-350:312\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8B%E3%82%89SRE%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%A6%E6%84%9F%E3%81%98%E3%81%9F%E3%81%93%E3%81%A8\"\u003e\u003ccode\u003eインフラエンジニアからSREチームに入って感じたこと\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"350:314-350:314\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"350:316-350:328\"\u003e\u003ca href=\"/kawada-masah\" class=\"user-mention js-hovercard\" title=\"kawada-masah\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kawada-masah\"\u003e@kawada-masah\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"351:1-351:116\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"351:2-351:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%86%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3\"\u003e\u003ccode\u003eゆるデザイン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"351:104-351:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"351:106-351:115\"\u003e\u003ca href=\"/Ryuki4648\" class=\"user-mention js-hovercard\" title=\"Ryuki4648\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Ryuki4648\"\u003e@Ryuki4648\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"352:1-352:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"352:2-352:116\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E5%86%85%E9%83%A8%E4%B8%8D%E6%AD%A3%E5%AF%BE%E7%AD%96\"\u003e\u003ccode\u003e#内部不正対策\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"352:118-352:118\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"352:120-352:130\"\u003e\u003ca href=\"/yamada_sec\" class=\"user-mention js-hovercard\" title=\"yamada_sec\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yamada_sec\"\u003e@yamada_sec\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"353:1-353:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"353:2-353:64\"\u003e\u003ca href=\"https://qiita.com/tags/securitydashboard\"\u003e\u003ccode\u003esecuritydashboard\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"353:66-353:66\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"353:68-353:74\"\u003e\u003ca href=\"/kuze_k\" class=\"user-mention js-hovercard\" title=\"kuze_k\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kuze_k\"\u003e@kuze_k\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"354:1-354:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"354:2-354:52\"\u003e\u003ca href=\"https://qiita.com/tags/GeminiPaper\"\u003e\u003ccode\u003eGeminiPaper\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"354:54-354:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"354:56-354:67\"\u003e\u003ca href=\"/GeminiPaper\" class=\"user-mention js-hovercard\" title=\"GeminiPaper\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeminiPaper\"\u003e@GeminiPaper\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"355:1-355:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"355:2-355:62\"\u003e\u003ca href=\"https://qiita.com/tags/REST%E6%8E%A8%E8%AB%96\"\u003e\u003ccode\u003eREST推論\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"355:64-355:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"355:66-355:78\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"356:1-356:179\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"356:2-356:162\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E8%A7%A6%E3%81%A3%E3%81%A6%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F\"\u003e\u003ccode\u003eゼロから触ってわかった\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"356:164-356:164\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"356:166-356:178\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"357:1-357:153\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"357:2-357:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B7%E3%83%A5%E3%83%AF%E3%83%AB%E3%83%84%E3%82%B7%E3%83%AB%E3%83%88%E8%A7%A3\"\u003e\u003ccode\u003eシュワルツシルト解\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"357:140-357:140\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"357:142-357:152\"\u003e\u003ca href=\"/cosmosnori\" class=\"user-mention js-hovercard\" title=\"cosmosnori\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"cosmosnori\"\u003e@cosmosnori\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"358:1-358:102\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"358:2-358:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%8D%E3%82%BF%E3%82%A2%E3%83%97%E3%83%AA\"\u003e\u003ccode\u003eネタアプリ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"358:92-358:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"358:94-358:101\"\u003e\u003ca href=\"/easegis\" class=\"user-mention js-hovercard\" title=\"easegis\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"easegis\"\u003e@easegis\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"359:1-359:127\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"359:2-359:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E9%BA%BB%E9%9B%80\"\u003e\u003ccode\u003eオンライン麻雀\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"359:116-359:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"359:118-359:126\"\u003e\u003ca href=\"/satokan3\" class=\"user-mention js-hovercard\" title=\"satokan3\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"satokan3\"\u003e@satokan3\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"360:1-360:92\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"360:2-360:82\"\u003e\u003ca href=\"https://qiita.com/tags/PD%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3\"\u003e\u003ccode\u003ePDデザイン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"360:84-360:84\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"360:86-360:91\"\u003e\u003ca href=\"/dsk-f\" class=\"user-mention js-hovercard\" title=\"dsk-f\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"dsk-f\"\u003e@dsk-f\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"361:1-361:129\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"361:2-361:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%A2%E3%82%A4%E3%83%AA%E3%82%B9%E3%82%A2%E3%82%A6%E3%83%88\"\u003e\u003ccode\u003eアイリスアウト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"361:116-361:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"361:118-361:128\"\u003e\u003ca href=\"/Tatami0926\" class=\"user-mention js-hovercard\" title=\"Tatami0926\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Tatami0926\"\u003e@Tatami0926\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"362:1-362:81\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"362:2-362:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%81%8A%E3%82%8F%E3%82%8A\"\u003e\u003ccode\u003eおわり\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"362:68-362:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"362:70-362:80\"\u003e\u003ca href=\"/Tatami0926\" class=\"user-mention js-hovercard\" title=\"Tatami0926\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Tatami0926\"\u003e@Tatami0926\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"363:1-363:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"363:2-363:54\"\u003e\u003ca href=\"https://qiita.com/tags/AIGirlfriend\"\u003e\u003ccode\u003eAIGirlfriend\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"363:56-363:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"363:58-363:70\"\u003e\u003ca href=\"/sweetdreamai\" class=\"user-mention js-hovercard\" title=\"sweetdreamai\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"sweetdreamai\"\u003e@sweetdreamai\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"364:1-364:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"364:2-364:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/iRIC%2C\"\u003e\u003ccode\u003eiRIC,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"364:54-364:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"364:56-364:64\"\u003e\u003ca href=\"/yasu6888\" class=\"user-mention js-hovercard\" title=\"yasu6888\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yasu6888\"\u003e@yasu6888\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"365:1-365:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"365:2-365:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/SRTM%2C\"\u003e\u003ccode\u003eSRTM,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"365:54-365:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"365:56-365:64\"\u003e\u003ca href=\"/yasu6888\" class=\"user-mention js-hovercard\" title=\"yasu6888\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yasu6888\"\u003e@yasu6888\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"366:1-366:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"366:2-366:56\"\u003e\u003ca href=\"https://qiita.com/tags/CloudNativePG\"\u003e\u003ccode\u003eCloudNativePG\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"366:58-366:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"366:60-366:69\"\u003e\u003ca href=\"/YoheiZuho\" class=\"user-mention js-hovercard\" title=\"YoheiZuho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"YoheiZuho\"\u003e@YoheiZuho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"367:1-367:105\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"367:2-367:92\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E\"\u003e\u003ccode\u003e#自然言語\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"367:94-367:94\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"367:96-367:104\"\u003e\u003ca href=\"/chattori\" class=\"user-mention js-hovercard\" title=\"chattori\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"chattori\"\u003e@chattori\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"368:1-368:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"368:2-368:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%BF%B7%E8%B5%B0\"\u003e\u003ccode\u003e迷走\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"368:56-368:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"368:58-368:70\"\u003e\u003ca href=\"/Amatarou-SUN\" class=\"user-mention js-hovercard\" title=\"Amatarou-SUN\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Amatarou-SUN\"\u003e@Amatarou-SUN\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"369:1-369:91\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"369:2-369:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8D%98%E7%9C%BC%E6%B7%B1%E5%BA%A6\"\u003e\u003ccode\u003e単眼深度\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"369:80-369:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"369:82-369:90\"\u003e\u003ca href=\"/gin_ta24\" class=\"user-mention js-hovercard\" title=\"gin_ta24\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"gin_ta24\"\u003e@gin_ta24\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"371:1-371:13\"\u003e\n\u003cspan id=\"12月19日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8819%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月19日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"373:1-427:77\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"373:1-373:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"373:2-373:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"373:9-373:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"373:19-373:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"375:1-375:118\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"375:2-375:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E8%A3%9C%E5%AE%8C\"\u003e\u003ccode\u003eフレーム補完\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"375:104-375:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"375:106-375:117\"\u003e\u003ca href=\"/GeneLab_999\" class=\"user-mention js-hovercard\" title=\"GeneLab_999\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeneLab_999\"\u003e@GeneLab_999\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"376:1-376:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"376:2-376:48\"\u003e\u003ca href=\"https://qiita.com/tags/PhraseSet\"\u003e\u003ccode\u003ePhraseSet\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"376:50-376:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"376:52-376:56\"\u003e\u003ca href=\"/kuct\" class=\"user-mention js-hovercard\" title=\"kuct\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kuct\"\u003e@kuct\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"377:1-377:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"377:2-377:44\"\u003e\u003ca href=\"https://qiita.com/tags/ESP_NOW\"\u003e\u003ccode\u003eESP_NOW\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"377:46-377:46\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"377:48-377:56\"\u003e\u003ca href=\"/bit2rock\" class=\"user-mention js-hovercard\" title=\"bit2rock\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"bit2rock\"\u003e@bit2rock\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"378:1-378:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"378:2-378:54\"\u003e\u003ca href=\"https://qiita.com/tags/AIforScience\"\u003e\u003ccode\u003eAIforScience\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"378:56-378:56\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"378:58-378:64\"\u003e\u003ca href=\"/hisaho\" class=\"user-mention js-hovercard\" title=\"hisaho\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hisaho\"\u003e@hisaho\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"379:1-379:92\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"379:2-379:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%80%E3%83%A1%E3%81%A7%E3%81%99\"\u003e\u003ccode\u003eダメです\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"379:80-379:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"379:82-379:91\"\u003e\u003ca href=\"/toyboot4e\" class=\"user-mention js-hovercard\" title=\"toyboot4e\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"toyboot4e\"\u003e@toyboot4e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"380:1-380:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"380:2-380:58\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E9%81%8B%E7%94%A8\"\u003e\u003ccode\u003eAI運用\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"380:60-380:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"380:62-380:74\"\u003e\u003ca href=\"/mellowlaunch\" class=\"user-mention js-hovercard\" title=\"mellowlaunch\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mellowlaunch\"\u003e@mellowlaunch\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"381:1-381:115\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"381:2-381:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%89%E3%83%BC%E3%83%9E%E3%83%BC%E6%9D%A1%E4%BB%B6\"\u003e\u003ccode\u003eドーマー条件\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"381:104-381:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"381:106-381:114\"\u003e\u003ca href=\"/hosshuru\" class=\"user-mention js-hovercard\" title=\"hosshuru\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hosshuru\"\u003e@hosshuru\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"382:1-382:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"382:2-382:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%9B%BD%E5%82%B5\"\u003e\u003ccode\u003e国債\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"382:56-382:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"382:58-382:66\"\u003e\u003ca href=\"/hosshuru\" class=\"user-mention js-hovercard\" title=\"hosshuru\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hosshuru\"\u003e@hosshuru\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"383:1-383:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"383:2-383:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%B2%A1%E6%94%BF\"\u003e\u003ccode\u003e財政\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"383:56-383:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"383:58-383:66\"\u003e\u003ca href=\"/hosshuru\" class=\"user-mention js-hovercard\" title=\"hosshuru\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hosshuru\"\u003e@hosshuru\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"384:1-384:165\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"384:2-384:150\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88\"\u003e\u003ccode\u003eグレーボックステスト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"384:152-384:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"384:154-384:164\"\u003e\u003ca href=\"/errguess40\" class=\"user-mention js-hovercard\" title=\"errguess40\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"errguess40\"\u003e@errguess40\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"385:1-385:114\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"385:2-385:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%A9%E3%82%A4%E3%83%89%E5%8F%8D%E5%BF%9C\"\u003e\u003ccode\u003eプライド反応\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"385:104-385:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"385:106-385:113\"\u003e\u003ca href=\"/J_Cotan\" class=\"user-mention js-hovercard\" title=\"J_Cotan\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"J_Cotan\"\u003e@J_Cotan\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"386:1-386:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"386:2-386:56\"\u003e\u003ca href=\"https://qiita.com/tags/gpt-5.2-codex\"\u003e\u003ccode\u003egpt-5.2-codex\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"386:58-386:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"386:60-386:66\"\u003e\u003ca href=\"/user19\" class=\"user-mention js-hovercard\" title=\"user19\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"user19\"\u003e@user19\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"387:1-387:91\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"387:2-387:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A6%96%E7%82%B9%E5%A4%89%E6%9B%B4\"\u003e\u003ccode\u003e視点変更\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"387:80-387:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"387:82-387:90\"\u003e\u003ca href=\"/nonikeno\" class=\"user-mention js-hovercard\" title=\"nonikeno\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nonikeno\"\u003e@nonikeno\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"388:1-388:138\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"388:2-388:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8\"\u003e\u003ccode\u003e名前付きステージ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"388:128-388:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"388:130-388:137\"\u003e\u003ca href=\"/coco_co\" class=\"user-mention js-hovercard\" title=\"coco_co\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"coco_co\"\u003e@coco_co\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"389:1-389:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"389:2-389:40\"\u003e\u003ca href=\"https://qiita.com/tags/qTest\"\u003e\u003ccode\u003eqTest\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"389:42-389:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"389:44-389:56\"\u003e\u003ca href=\"/Syahu_Writer\" class=\"user-mention js-hovercard\" title=\"Syahu_Writer\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Syahu_Writer\"\u003e@Syahu_Writer\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"390:1-390:97\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"390:2-390:82\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%ABGO\"\u003e\u003ccode\u003eレンタルGO\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"390:84-390:84\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"390:86-390:96\"\u003e\u003ca href=\"/yu_kamioka\" class=\"user-mention js-hovercard\" title=\"yu_kamioka\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yu_kamioka\"\u003e@yu_kamioka\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"391:1-391:82\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"391:2-391:68\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%80%80%E8%81%B7D%E9%80%B2\"\u003e\u003ccode\u003e退職D進\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"391:70-391:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"391:72-391:81\"\u003e\u003ca href=\"/market_fy\" class=\"user-mention js-hovercard\" title=\"market_fy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"market_fy\"\u003e@market_fy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"392:1-392:104\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"392:2-392:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%8F%97%E9%A8%93%E4%BD%93%E9%A8%93%E8%A8%98\"\u003e\u003ccode\u003e受験体験記\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"392:92-392:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"392:94-392:103\"\u003e\u003ca href=\"/market_fy\" class=\"user-mention js-hovercard\" title=\"market_fy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"market_fy\"\u003e@market_fy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"393:1-393:55\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"393:2-393:44\"\u003e\u003ca href=\"https://qiita.com/tags/Data360\"\u003e\u003ccode\u003eData360\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"393:46-393:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"393:48-393:54\"\u003e\u003ca href=\"/hrk623\" class=\"user-mention js-hovercard\" title=\"hrk623\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hrk623\"\u003e@hrk623\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"394:1-394:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"394:2-394:50\"\u003e\u003ca href=\"https://qiita.com/tags/ConnectApi\"\u003e\u003ccode\u003eConnectApi\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"394:52-394:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"394:54-394:60\"\u003e\u003ca href=\"/hrk623\" class=\"user-mention js-hovercard\" title=\"hrk623\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hrk623\"\u003e@hrk623\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"395:1-395:63\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"395:2-395:54\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23vscsi\"\u003e\u003ccode\u003e#vscsi\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"395:56-395:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"395:58-395:62\"\u003e\u003ca href=\"/M_XD\" class=\"user-mention js-hovercard\" title=\"M_XD\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"M_XD\"\u003e@M_XD\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"396:1-396:61\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"396:2-396:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23vios\"\u003e\u003ccode\u003e#vios\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"396:54-396:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"396:56-396:60\"\u003e\u003ca href=\"/M_XD\" class=\"user-mention js-hovercard\" title=\"M_XD\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"M_XD\"\u003e@M_XD\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"397:1-397:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"397:2-397:58\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23PowerVM\"\u003e\u003ccode\u003e#PowerVM\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"397:60-397:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"397:62-397:66\"\u003e\u003ca href=\"/M_XD\" class=\"user-mention js-hovercard\" title=\"M_XD\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"M_XD\"\u003e@M_XD\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"398:1-398:138\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"398:2-398:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%8F%E3%83%B3%E3%82%B0%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%80%E3%83%BC\"\u003e\u003ccode\u003eハンググライダー\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"398:128-398:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"398:130-398:137\"\u003e\u003ca href=\"/mkc1370\" class=\"user-mention js-hovercard\" title=\"mkc1370\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mkc1370\"\u003e@mkc1370\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"399:1-399:126\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"399:2-399:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B9%E3%82%AB%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84\"\u003e\u003ccode\u003eスカイスポーツ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"399:116-399:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"399:118-399:125\"\u003e\u003ca href=\"/mkc1370\" class=\"user-mention js-hovercard\" title=\"mkc1370\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mkc1370\"\u003e@mkc1370\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"400:1-400:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"400:2-400:44\"\u003e\u003ca href=\"https://qiita.com/tags/RPATest\"\u003e\u003ccode\u003eRPATest\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"400:46-400:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"400:48-400:59\"\u003e\u003ca href=\"/Jun96427231\" class=\"user-mention js-hovercard\" title=\"Jun96427231\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Jun96427231\"\u003e@Jun96427231\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"401:1-401:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"401:2-401:64\"\u003e\u003ca href=\"https://qiita.com/tags/ImageOptimization\"\u003e\u003ccode\u003eImageOptimization\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"401:66-401:66\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"401:68-401:74\"\u003e\u003ca href=\"/miyaaa\" class=\"user-mention js-hovercard\" title=\"miyaaa\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"miyaaa\"\u003e@miyaaa\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"402:1-402:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"402:2-402:48\"\u003e\u003ca href=\"https://qiita.com/tags/Superpipe\"\u003e\u003ccode\u003eSuperpipe\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"402:50-402:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"402:52-402:61\"\u003e\u003ca href=\"/nickqinsc\" class=\"user-mention js-hovercard\" title=\"nickqinsc\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nickqinsc\"\u003e@nickqinsc\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"403:1-403:217\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"403:2-403:198\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3\"\u003e\u003ccode\u003eソフトウェアデザインパターン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"403:200-403:200\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"403:202-403:216\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"404:1-404:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"404:2-404:54\"\u003e\u003ca href=\"https://qiita.com/tags/Map-anything\"\u003e\u003ccode\u003eMap-anything\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"404:56-404:56\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"404:58-404:64\"\u003e\u003ca href=\"/syun88\" class=\"user-mention js-hovercard\" title=\"syun88\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"syun88\"\u003e@syun88\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"405:1-405:53\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"405:2-405:44\"\u003e\u003ca href=\"https://qiita.com/tags/pg_cron\"\u003e\u003ccode\u003epg_cron\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"405:46-405:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"405:48-405:52\"\u003e\u003ca href=\"/meto\" class=\"user-mention js-hovercard\" title=\"meto\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"meto\"\u003e@meto\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"406:1-406:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"406:2-406:64\"\u003e\u003ca href=\"https://qiita.com/tags/Depth-Anything-V2\"\u003e\u003ccode\u003eDepth-Anything-V2\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"406:66-406:66\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"406:68-406:78\"\u003e\u003ca href=\"/rotarymars\" class=\"user-mention js-hovercard\" title=\"rotarymars\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"rotarymars\"\u003e@rotarymars\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"407:1-407:126\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"407:2-407:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%A6%8F%E5%B2%A1%E4%BC%9A%E5%A0%B4\"\u003e\u003ccode\u003e福岡会場\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"407:80-407:80\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"407:82-407:125\"\u003e\n\u003ca href=\"/nagase_m\" class=\"user-mention js-hovercard\" title=\"nagase_m\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nagase_m\"\u003e@nagase_m\u003c/a\u003e, \u003ca href=\"/plateau-academy\" class=\"user-mention js-hovercard\" title=\"plateau-academy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"plateau-academy\"\u003e@plateau-academy\u003c/a\u003e, \u003ca href=\"/t-watanabe-tgt\" class=\"user-mention js-hovercard\" title=\"t-watanabe-tgt\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"t-watanabe-tgt\"\u003e@t-watanabe-tgt\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"408:1-408:176\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"408:2-408:152\"\u003e\u003ca href=\"https://qiita.com/tags/PLATEAU%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC%E7%A6%8F%E5%B2%A1%E4%BC%9A%E5%A0%B4\"\u003e\u003ccode\u003ePLATEAUアカデミー福岡会場\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"408:154-408:154\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"408:156-408:175\"\u003e\n\u003ca href=\"/TT221\" class=\"user-mention js-hovercard\" title=\"TT221\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TT221\"\u003e@TT221\u003c/a\u003e, \u003ca href=\"/f13897pwnog\" class=\"user-mention js-hovercard\" title=\"f13897pwnog\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"f13897pwnog\"\u003e@f13897pwnog\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"409:1-409:79\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"409:2-409:60\"\u003e\u003ca href=\"https://qiita.com/tags/JigsAndFixtures\"\u003e\u003ccode\u003eJigsAndFixtures\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"409:62-409:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"409:64-409:78\"\u003e\u003ca href=\"/yicenprecision\" class=\"user-mention js-hovercard\" title=\"yicenprecision\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yicenprecision\"\u003e@yicenprecision\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"410:1-410:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"410:2-410:56\"\u003e\u003ca href=\"https://qiita.com/tags/CustomTooling\"\u003e\u003ccode\u003eCustomTooling\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"410:58-410:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"410:60-410:74\"\u003e\u003ca href=\"/yicenprecision\" class=\"user-mention js-hovercard\" title=\"yicenprecision\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yicenprecision\"\u003e@yicenprecision\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"411:1-411:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"411:2-411:46\"\u003e\u003ca href=\"https://qiita.com/tags/GBStudio\"\u003e\u003ccode\u003eGBStudio\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"411:48-411:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"411:50-411:65\"\u003e\u003ca href=\"/rom1000_onigiri\" class=\"user-mention js-hovercard\" title=\"rom1000_onigiri\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"rom1000_onigiri\"\u003e@rom1000_onigiri\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"412:1-412:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"412:2-412:46\"\u003e\u003ca href=\"https://qiita.com/tags/Agent365\"\u003e\u003ccode\u003eAgent365\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"412:48-412:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"412:50-412:57\"\u003e\u003ca href=\"/eyepyon\" class=\"user-mention js-hovercard\" title=\"eyepyon\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"eyepyon\"\u003e@eyepyon\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"413:1-413:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"413:2-413:50\"\u003e\u003ca href=\"https://qiita.com/tags/ignite2025\"\u003e\u003ccode\u003eignite2025\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"413:52-413:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"413:54-413:61\"\u003e\u003ca href=\"/eyepyon\" class=\"user-mention js-hovercard\" title=\"eyepyon\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"eyepyon\"\u003e@eyepyon\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"414:1-414:80\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"414:2-414:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%9C%9F%E6%AD%A3%E6%80%A7\"\u003e\u003ccode\u003e真正性\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"414:68-414:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"414:70-414:79\"\u003e\u003ca href=\"/lemiyachi\" class=\"user-mention js-hovercard\" title=\"lemiyachi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lemiyachi\"\u003e@lemiyachi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"415:1-415:80\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"415:2-415:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E6%9C%AC%E4%BA%BA%E6%80%A7\"\u003e\u003ccode\u003e本人性\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"415:68-415:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"415:70-415:79\"\u003e\u003ca href=\"/lemiyachi\" class=\"user-mention js-hovercard\" title=\"lemiyachi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lemiyachi\"\u003e@lemiyachi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"416:1-416:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"416:2-416:54\"\u003e\u003ca href=\"https://qiita.com/tags/LamoToolsSet\"\u003e\u003ccode\u003eLamoToolsSet\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"416:56-416:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"416:58-416:70\"\u003e\u003ca href=\"/lamo-shibata\" class=\"user-mention js-hovercard\" title=\"lamo-shibata\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lamo-shibata\"\u003e@lamo-shibata\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"417:1-417:143\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"417:2-417:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%AA%E3%82%B6%E3%83%B3%E3%82%BF%E3%83%BC%E9%81%8B%E7%94%A8\"\u003e\u003ccode\u003eプリザンター運用\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"417:128-417:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"417:130-417:142\"\u003e\u003ca href=\"/lamo-shibata\" class=\"user-mention js-hovercard\" title=\"lamo-shibata\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"lamo-shibata\"\u003e@lamo-shibata\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"418:1-418:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"418:2-418:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%9D%E3%82%B9%E3%83%88%E3%83%88%E3%83%BC%E3%83%86%E3%83%A0\"\u003e\u003ccode\u003eポストトーテム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"418:116-418:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"418:118-418:130\"\u003e\u003ca href=\"/Tagomori0211\" class=\"user-mention js-hovercard\" title=\"Tagomori0211\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Tagomori0211\"\u003e@Tagomori0211\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"419:1-419:76\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"419:2-419:60\"\u003e\u003ca href=\"https://qiita.com/tags/GPU%E6%94%AF%E6%8F%B4\"\u003e\u003ccode\u003eGPU支援\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"419:62-419:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"419:64-419:75\"\u003e\u003ca href=\"/walterkammi\" class=\"user-mention js-hovercard\" title=\"walterkammi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"walterkammi\"\u003e@walterkammi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"420:1-420:132\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"420:2-420:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A2%E3%83%80%E3%83%8A%E3%82%A4%E3%82%BA%E9%96%8B%E7%99%BA\"\u003e\u003ccode\u003eモダナイズ開発\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"420:116-420:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"420:118-420:131\"\u003e\u003ca href=\"/kojiro8977230\" class=\"user-mention js-hovercard\" title=\"kojiro8977230\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"kojiro8977230\"\u003e@kojiro8977230\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"421:1-421:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"421:2-421:40\"\u003e\u003ca href=\"https://qiita.com/tags/SCITT\"\u003e\u003ccode\u003eSCITT\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"421:42-421:42\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"421:44-421:56\"\u003e\u003ca href=\"/tetsuko_room\" class=\"user-mention js-hovercard\" title=\"tetsuko_room\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tetsuko_room\"\u003e@tetsuko_room\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"422:1-422:95\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"422:2-422:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%87%91%E8%9E%8D%E6%8A%80%E8%A1%93\"\u003e\u003ccode\u003e金融技術\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"422:80-422:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"422:82-422:94\"\u003e\u003ca href=\"/tetsuko_room\" class=\"user-mention js-hovercard\" title=\"tetsuko_room\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tetsuko_room\"\u003e@tetsuko_room\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"423:1-423:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"423:2-423:42\"\u003e\u003ca href=\"https://qiita.com/tags/COBYLA\"\u003e\u003ccode\u003eCOBYLA\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"423:44-423:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"423:46-423:57\"\u003e\u003ca href=\"/TaiyoYamada\" class=\"user-mention js-hovercard\" title=\"TaiyoYamada\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TaiyoYamada\"\u003e@TaiyoYamada\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"424:1-424:169\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"424:2-424:150\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%9E%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E8%AA%8D%E8%A8%BC\"\u003e\u003ccode\u003eマトリクスコード認証\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"424:152-424:152\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"424:154-424:168\"\u003e\u003ca href=\"/teppei19980914\" class=\"user-mention js-hovercard\" title=\"teppei19980914\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"teppei19980914\"\u003e@teppei19980914\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"425:1-425:85\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"425:2-425:72\"\u003e\u003ca href=\"https://qiita.com/tags/EPSONTMPrintAssistant\"\u003e\u003ccode\u003eEPSONTMPrintAssistant\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"425:74-425:74\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"425:76-425:84\"\u003e\u003ca href=\"/nack0204\" class=\"user-mention js-hovercard\" title=\"nack0204\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nack0204\"\u003e@nack0204\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"426:1-426:154\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"426:2-426:138\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9\"\u003e\u003ccode\u003e逆引きリファレンス\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"426:140-426:140\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"426:142-426:153\"\u003e\u003ca href=\"/super_ucchi\" class=\"user-mention js-hovercard\" title=\"super_ucchi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"super_ucchi\"\u003e@super_ucchi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"427:1-427:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"427:2-427:58\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E5%AD%A6%E4%BC%9A\"\u003e\u003ccode\u003eAI学会\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"427:60-427:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"427:62-427:76\"\u003e\u003ca href=\"/Taito_Murakami\" class=\"user-mention js-hovercard\" title=\"Taito_Murakami\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Taito_Murakami\"\u003e@Taito_Murakami\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"429:1-429:13\"\u003e\n\u003cspan id=\"12月20日\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#12%E6%9C%8820%E6%97%A5\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e12月20日\u003c/h2\u003e\n\u003ctable data-sourcepos=\"431:1-491:98\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"431:1-431:28\"\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"431:2-431:7\"\u003eタグ\u003c/th\u003e\n\u003cth style=\"text-align: center\" data-sourcepos=\"431:9-431:17\"\u003e記事数\u003c/th\u003e\n\u003cth style=\"text-align: left\" data-sourcepos=\"431:19-431:27\"\u003e利用者\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"433:1-433:138\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"433:2-433:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%86%E3%82%B9%E3%83%88%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88\"\u003e\u003ccode\u003eテストアスペクト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"433:128-433:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"433:130-433:137\"\u003e\u003ca href=\"/EgaSaQA\" class=\"user-mention js-hovercard\" title=\"EgaSaQA\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"EgaSaQA\"\u003e@EgaSaQA\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"434:1-434:71\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"434:2-434:58\"\u003e\u003ca href=\"https://qiita.com/tags/NotionCalendar\"\u003e\u003ccode\u003eNotionCalendar\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"434:60-434:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"434:62-434:70\"\u003e\u003ca href=\"/ycookiey\" class=\"user-mention js-hovercard\" title=\"ycookiey\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ycookiey\"\u003e@ycookiey\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"435:1-435:55\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"435:2-435:42\"\u003e\u003ca href=\"https://qiita.com/tags/Oxlint\"\u003e\u003ccode\u003eOxlint\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"435:44-435:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"435:46-435:54\"\u003e\u003ca href=\"/oekazuma\" class=\"user-mention js-hovercard\" title=\"oekazuma\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"oekazuma\"\u003e@oekazuma\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"436:1-436:104\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"436:2-436:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B0%E3%83%AC%E3%82%B7%E3%83%A3%E3%83%A0\"\u003e\u003ccode\u003eグレシャム\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"436:92-436:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"436:94-436:103\"\u003e\u003ca href=\"/zazen_inu\" class=\"user-mention js-hovercard\" title=\"zazen_inu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"zazen_inu\"\u003e@zazen_inu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"437:1-437:91\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"437:2-437:78\"\u003e\u003ca href=\"https://qiita.com/tags/%E8%A1%A8%E8%A8%98%E6%8F%BA%E3%82%8C\"\u003e\u003ccode\u003e表記揺れ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"437:80-437:80\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"437:82-437:90\"\u003e\u003ca href=\"/masato_y\" class=\"user-mention js-hovercard\" title=\"masato_y\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"masato_y\"\u003e@masato_y\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"438:1-438:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"438:2-438:44\"\u003e\u003ca href=\"https://qiita.com/tags/Kathara\"\u003e\u003ccode\u003eKathara\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"438:46-438:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"438:48-438:56\"\u003e\u003ca href=\"/uedaeita\" class=\"user-mention js-hovercard\" title=\"uedaeita\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"uedaeita\"\u003e@uedaeita\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"439:1-439:68\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"439:2-439:52\"\u003e\u003ca href=\"https://qiita.com/tags/MediaEngine\"\u003e\u003ccode\u003eMediaEngine\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"439:54-439:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"439:56-439:67\"\u003e\u003ca href=\"/GeneLab_999\" class=\"user-mention js-hovercard\" title=\"GeneLab_999\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeneLab_999\"\u003e@GeneLab_999\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"440:1-440:70\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"440:2-440:54\"\u003e\u003ca href=\"https://qiita.com/tags/NeuralEngine\"\u003e\u003ccode\u003eNeuralEngine\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"440:56-440:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"440:58-440:69\"\u003e\u003ca href=\"/GeneLab_999\" class=\"user-mention js-hovercard\" title=\"GeneLab_999\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"GeneLab_999\"\u003e@GeneLab_999\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"441:1-441:54\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"441:2-441:44\"\u003e\u003ca href=\"https://qiita.com/tags/SMT-LIB\"\u003e\u003ccode\u003eSMT-LIB\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"441:46-441:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"441:48-441:53\"\u003e\u003ca href=\"/nbsat\" class=\"user-mention js-hovercard\" title=\"nbsat\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nbsat\"\u003e@nbsat\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"442:1-442:56\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"442:2-442:44\"\u003e\u003ca href=\"https://qiita.com/tags/Torizon\"\u003e\u003ccode\u003eTorizon\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"442:46-442:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"442:48-442:55\"\u003e\u003ca href=\"/hermit4\" class=\"user-mention js-hovercard\" title=\"hermit4\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hermit4\"\u003e@hermit4\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"443:1-443:205\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"443:2-443:190\"\u003e\u003ca href=\"https://qiita.com/tags/AI%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%BA%BA%E9%96%93%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99\"\u003e\u003ccode\u003eAIではなく人間が書いています\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"443:192-443:192\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"443:194-443:204\"\u003e\u003ca href=\"/tongararin\" class=\"user-mention js-hovercard\" title=\"tongararin\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tongararin\"\u003e@tongararin\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"444:1-444:128\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"444:2-444:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B2%E3%83%8E%E3%83%A0%E9%96%A2%E4%BF%82%E8%A1%8C%E5%88%97\"\u003e\u003ccode\u003eゲノム関係行列\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"444:116-444:116\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"444:118-444:127\"\u003e\u003ca href=\"/KimuraSoh\" class=\"user-mention js-hovercard\" title=\"KimuraSoh\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"KimuraSoh\"\u003e@KimuraSoh\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"445:1-445:117\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"445:2-445:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%AD%E3%83%8E%E3%82%B3%E3%83%A9%E3%83%AA%E3%83%BC\"\u003e\u003ccode\u003eキノコラリー\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"445:104-445:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"445:106-445:116\"\u003e\u003ca href=\"/h2m_kinoko\" class=\"user-mention js-hovercard\" title=\"h2m_kinoko\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"h2m_kinoko\"\u003e@h2m_kinoko\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"446:1-446:120\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"446:2-446:104\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BC%9A\"\u003e\u003ccode\u003e#ユーザー会\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"446:106-446:106\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"446:108-446:119\"\u003e\u003ca href=\"/nekonekoRPA\" class=\"user-mention js-hovercard\" title=\"nekonekoRPA\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"nekonekoRPA\"\u003e@nekonekoRPA\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"447:1-447:96\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"447:2-447:82\"\u003e\u003ca href=\"https://qiita.com/tags/peephole%E6%9C%80%E9%81%A9%E5%8C%96\"\u003e\u003ccode\u003epeephole最適化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"447:84-447:84\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"447:86-447:95\"\u003e\u003ca href=\"/h_sakurai\" class=\"user-mention js-hovercard\" title=\"h_sakurai\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"h_sakurai\"\u003e@h_sakurai\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"448:1-448:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"448:2-448:48\"\u003e\u003ca href=\"https://qiita.com/tags/autosetup\"\u003e\u003ccode\u003eautosetup\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"448:50-448:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"448:52-448:58\"\u003e\u003ca href=\"/tkxlab\" class=\"user-mention js-hovercard\" title=\"tkxlab\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tkxlab\"\u003e@tkxlab\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"449:1-449:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"449:2-449:54\"\u003e\u003ca href=\"https://qiita.com/tags/gemini3.0pro\"\u003e\u003ccode\u003egemini3.0pro\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"449:56-449:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"449:58-449:64\"\u003e\u003ca href=\"/youtoy\" class=\"user-mention js-hovercard\" title=\"youtoy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"youtoy\"\u003e@youtoy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"450:1-450:66\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"450:2-450:56\"\u003e\u003ca href=\"https://qiita.com/tags/FunctionGemma\"\u003e\u003ccode\u003eFunctionGemma\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"450:58-450:58\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"450:60-450:65\"\u003e\u003ca href=\"/levol\" class=\"user-mention js-hovercard\" title=\"levol\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"levol\"\u003e@levol\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"451:1-451:217\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"451:2-451:198\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC\"\u003e\u003ccode\u003eコミュニケーションデザイナー\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"451:200-451:200\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"451:202-451:216\"\u003e\u003ca href=\"/noriko_yashiki\" class=\"user-mention js-hovercard\" title=\"noriko_yashiki\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"noriko_yashiki\"\u003e@noriko_yashiki\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"452:1-452:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"452:2-452:50\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23ASR\"\u003e\u003ccode\u003e#ASR\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"452:52-452:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"452:54-452:68\"\u003e\u003ca href=\"/Rsm-Microstate\" class=\"user-mention js-hovercard\" title=\"Rsm-Microstate\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Rsm-Microstate\"\u003e@Rsm-Microstate\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"453:1-453:112\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"453:2-453:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%A4%9A%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003e多リージョン\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"453:104-453:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"453:106-453:111\"\u003e\u003ca href=\"/mkydk\" class=\"user-mention js-hovercard\" title=\"mkydk\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mkydk\"\u003e@mkydk\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"454:1-454:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"454:2-454:50\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23BFF\"\u003e\u003ccode\u003e#BFF\u003cspan class=\"inline-code-color\" style=\"background-color: #BFF;\"\u003e\u003c/span\u003e\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"454:52-454:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"454:54-454:64\"\u003e\u003ca href=\"/Usui_keiyu\" class=\"user-mention js-hovercard\" title=\"Usui_keiyu\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Usui_keiyu\"\u003e@Usui_keiyu\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"455:1-455:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"455:2-455:50\"\u003e\u003ca href=\"https://qiita.com/tags/PyInstalle\"\u003e\u003ccode\u003ePyInstalle\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"455:52-455:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"455:54-455:64\"\u003e\u003ca href=\"/cae_python\" class=\"user-mention js-hovercard\" title=\"cae_python\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"cae_python\"\u003e@cae_python\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"456:1-456:87\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"456:2-456:68\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E4%BF%B3%E5%8F%A5\"\u003e\u003ccode\u003e#俳句\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"456:70-456:70\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"456:72-456:86\"\u003e\u003ca href=\"/shunya_okumura\" class=\"user-mention js-hovercard\" title=\"shunya_okumura\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"shunya_okumura\"\u003e@shunya_okumura\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"457:1-457:105\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"457:2-457:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%AE%9F%E9%A8%93%E7%9A%84%E6%80%9D%E8%80%83\"\u003e\u003ccode\u003e実験的思考\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"457:92-457:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"457:94-457:104\"\u003e\u003ca href=\"/test_tarou\" class=\"user-mention js-hovercard\" title=\"test_tarou\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"test_tarou\"\u003e@test_tarou\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"458:1-458:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"458:2-458:48\"\u003e\u003ca href=\"https://qiita.com/tags/fail-fast\"\u003e\u003ccode\u003efail-fast\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"458:50-458:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"458:52-458:61\"\u003e\u003ca href=\"/arika1125\" class=\"user-mention js-hovercard\" title=\"arika1125\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"arika1125\"\u003e@arika1125\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"459:1-459:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"459:2-459:50\"\u003e\u003ca href=\"https://qiita.com/tags/mailserver\"\u003e\u003ccode\u003emailserver\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"459:52-459:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"459:54-459:66\"\u003e\u003ca href=\"/takoyakidath\" class=\"user-mention js-hovercard\" title=\"takoyakidath\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"takoyakidath\"\u003e@takoyakidath\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"460:1-460:74\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"460:2-460:62\"\u003e\u003ca href=\"https://qiita.com/tags/IBMSemeruRuntime\"\u003e\u003ccode\u003eIBMSemeruRuntime\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"460:64-460:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"460:66-460:73\"\u003e\u003ca href=\"/TSA2019\" class=\"user-mention js-hovercard\" title=\"TSA2019\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TSA2019\"\u003e@TSA2019\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"461:1-461:72\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"461:2-461:52\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/Song%2C\"\u003e\u003ccode\u003eSong,\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"461:54-461:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"461:56-461:71\"\u003e\u003ca href=\"/aisonggenerator\" class=\"user-mention js-hovercard\" title=\"aisonggenerator\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"aisonggenerator\"\u003e@aisonggenerator\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"462:1-462:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"462:2-462:46\"\u003e\u003ca href=\"https://qiita.com/tags/UIScript\"\u003e\u003ccode\u003eUIScript\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"462:48-462:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"462:50-462:58\"\u003e\u003ca href=\"/mototoke\" class=\"user-mention js-hovercard\" title=\"mototoke\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mototoke\"\u003e@mototoke\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"463:1-463:59\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"463:2-463:42\"\u003e\u003ca href=\"https://qiita.com/tags/PtWAVE\"\u003e\u003ccode\u003ePtWAVE\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"463:44-463:44\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"463:46-463:58\"\u003e\u003ca href=\"/Algo_Lighter\" class=\"user-mention js-hovercard\" title=\"Algo_Lighter\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Algo_Lighter\"\u003e@Algo_Lighter\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"464:1-464:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"464:2-464:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%A9%E3%83%81%E3%83%8A%E3%83%90%E3%82%A4%E3%82%AA\"\u003e\u003ccode\u003eプラチナバイオ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"464:116-464:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"464:118-464:130\"\u003e\u003ca href=\"/Algo_Lighter\" class=\"user-mention js-hovercard\" title=\"Algo_Lighter\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Algo_Lighter\"\u003e@Algo_Lighter\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"465:1-465:131\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"465:2-465:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%B7%A8%E9%9B%86%E7%A2%BA%E8%AA%8D%E3%82%BD%E3%83%95%E3%83%88\"\u003e\u003ccode\u003e編集確認ソフト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"465:116-465:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"465:118-465:130\"\u003e\u003ca href=\"/Algo_Lighter\" class=\"user-mention js-hovercard\" title=\"Algo_Lighter\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Algo_Lighter\"\u003e@Algo_Lighter\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"466:1-466:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"466:2-466:52\"\u003e\u003ca href=\"https://qiita.com/tags/sqlite-data\"\u003e\u003ccode\u003esqlite-data\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"466:54-466:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"466:56-466:66\"\u003e\u003ca href=\"/suffle8422\" class=\"user-mention js-hovercard\" title=\"suffle8422\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"suffle8422\"\u003e@suffle8422\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"467:1-467:65\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"467:2-467:50\"\u003e\u003ca href=\"https://qiita.com/tags/point-free\"\u003e\u003ccode\u003epoint-free\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"467:52-467:52\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"467:54-467:64\"\u003e\u003ca href=\"/suffle8422\" class=\"user-mention js-hovercard\" title=\"suffle8422\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"suffle8422\"\u003e@suffle8422\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"468:1-468:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"468:2-468:62\"\u003e\u003ca href=\"https://qiita.com/tags/ChaosDestruction\"\u003e\u003ccode\u003eChaosDestruction\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"468:64-468:64\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"468:66-468:76\"\u003e\u003ca href=\"/mintiatian\" class=\"user-mention js-hovercard\" title=\"mintiatian\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mintiatian\"\u003e@mintiatian\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"469:1-469:69\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"469:2-469:54\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%BF%E3%83%AB\"\u003e\u003ccode\u003eタル\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"469:56-469:56\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"469:58-469:68\"\u003e\u003ca href=\"/mintiatian\" class=\"user-mention js-hovercard\" title=\"mintiatian\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"mintiatian\"\u003e@mintiatian\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"470:1-470:78\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"470:2-470:60\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%86%85%E9%83%A8API\"\u003e\u003ccode\u003e内部API\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"470:62-470:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"470:64-470:77\"\u003e\u003ca href=\"/ktdatascience\" class=\"user-mention js-hovercard\" title=\"ktdatascience\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ktdatascience\"\u003e@ktdatascience\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"471:1-471:142\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"471:2-471:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A9%E3%82%A4%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88\"\u003e\u003ccode\u003eライブスクリプト\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"471:128-471:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"471:130-471:141\"\u003e\u003ca href=\"/cafe_on_the\" class=\"user-mention js-hovercard\" title=\"cafe_on_the\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"cafe_on_the\"\u003e@cafe_on_the\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"472:1-472:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"472:2-472:42\"\u003e\u003ca href=\"https://qiita.com/tags/HS2008\"\u003e\u003ccode\u003eHS2008\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"472:44-472:44\"\u003e3\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"472:46-472:56\"\u003e\u003ca href=\"/Trubetzkoy\" class=\"user-mention js-hovercard\" title=\"Trubetzkoy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"Trubetzkoy\"\u003e@Trubetzkoy\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"473:1-473:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"473:2-473:60\"\u003e\u003ca href=\"https://qiita.com/tags/ExternalObjects\"\u003e\u003ccode\u003eExternalObjects\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"473:62-473:62\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"473:64-473:74\"\u003e\u003ca href=\"/cattleya96\" class=\"user-mention js-hovercard\" title=\"cattleya96\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"cattleya96\"\u003e@cattleya96\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"474:1-474:81\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"474:2-474:66\"\u003e\u003ca href=\"https://qiita.com/tags/%E5%85%B1%E9%80%B2%E5%8C%96\"\u003e\u003ccode\u003e共進化\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"474:68-474:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"474:70-474:80\"\u003e\u003ca href=\"/yuu-henjin\" class=\"user-mention js-hovercard\" title=\"yuu-henjin\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yuu-henjin\"\u003e@yuu-henjin\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"475:1-475:75\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"475:2-475:58\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BD%8F%E5%AE%85ip\"\u003e\u003ccode\u003e住宅ip\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"475:60-475:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"475:62-475:74\"\u003e\u003ca href=\"/zhangz941225\" class=\"user-mention js-hovercard\" title=\"zhangz941225\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"zhangz941225\"\u003e@zhangz941225\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"476:1-476:123\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"476:2-476:106\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BD%8F%E5%AE%85IP%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7\"\u003e\u003ccode\u003e住宅IPプロキシ\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"476:108-476:108\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"476:110-476:122\"\u003e\u003ca href=\"/zhangz941225\" class=\"user-mention js-hovercard\" title=\"zhangz941225\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"zhangz941225\"\u003e@zhangz941225\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"477:1-477:136\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"477:2-477:126\"\u003e\u003ca href=\"https://qiita.com/tags/%E4%BC%9A%E8%A9%B1%E3%83%AD%E3%82%B0%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA\"\u003e\u003ccode\u003e会話ログ駆動開発\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"477:128-477:128\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"477:130-477:135\"\u003e\u003ca href=\"/basio\" class=\"user-mention js-hovercard\" title=\"basio\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"basio\"\u003e@basio\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"478:1-478:73\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"478:2-478:58\"\u003e\u003ca href=\"https://qiita.com/tags/LLM-as-a-Judge\"\u003e\u003ccode\u003eLLM-as-a-Judge\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"478:60-478:60\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"478:62-478:72\"\u003e\u003ca href=\"/hiyoko1729\" class=\"user-mention js-hovercard\" title=\"hiyoko1729\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hiyoko1729\"\u003e@hiyoko1729\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"479:1-479:58\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"479:2-479:44\"\u003e\u003ca href=\"https://qiita.com/tags/HARKing\"\u003e\u003ccode\u003eHARKing\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"479:46-479:46\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"479:48-479:57\"\u003e\u003ca href=\"/making111\" class=\"user-mention js-hovercard\" title=\"making111\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"making111\"\u003e@making111\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"480:1-480:77\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"480:2-480:64\"\u003e\u003ca href=\"https://qiita.com/tags/scroll-snap-align\"\u003e\u003ccode\u003escroll-snap-align\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"480:66-480:66\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"480:68-480:76\"\u003e\u003ca href=\"/ktrk2002\" class=\"user-mention js-hovercard\" title=\"ktrk2002\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ktrk2002\"\u003e@ktrk2002\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"481:1-481:101\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"481:2-481:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%82%B9%E3%83%9E%E3%83%9B%E6%96%B0%E6%B3%95\"\u003e\u003ccode\u003eスマホ新法\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"481:92-481:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"481:94-481:100\"\u003e\u003ca href=\"/wadawd\" class=\"user-mention js-hovercard\" title=\"wadawd\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"wadawd\"\u003e@wadawd\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"482:1-482:151\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"482:2-482:128\"\u003e\n\u003cimg alt=\":warning:\" class=\"emoji\" height=\"20\" src=\"https://cdn.qiita.com/emoji/twemoji/unicode/26a0-fe0f.png\" title=\":warning:\" width=\"20\" loading=\"lazy\"\u003e \u003ca href=\"https://qiita.com/tags/%23%E5%BA%83%E5%B3%B6%E3%81%AE%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3\"\u003e\u003ccode\u003e#広島のポケモン\u003c/code\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"482:130-482:130\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"482:132-482:150\"\u003e\u003ca href=\"/hiroshimanopockmon\" class=\"user-mention js-hovercard\" title=\"hiroshimanopockmon\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"hiroshimanopockmon\"\u003e@hiroshimanopockmon\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"483:1-483:62\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"483:2-483:46\"\u003e\u003ca href=\"https://qiita.com/tags/PHP8.2.4\"\u003e\u003ccode\u003ePHP8.2.4\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"483:48-483:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"483:50-483:61\"\u003e\u003ca href=\"/pig_buhi555\" class=\"user-mention js-hovercard\" title=\"pig_buhi555\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"pig_buhi555\"\u003e@pig_buhi555\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"484:1-484:67\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"484:2-484:52\"\u003e\u003ca href=\"https://qiita.com/tags/eclipse2025\"\u003e\u003ccode\u003eeclipse2025\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"484:54-484:54\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"484:56-484:66\"\u003e\u003ca href=\"/SKY-HaYaTo\" class=\"user-mention js-hovercard\" title=\"SKY-HaYaTo\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"SKY-HaYaTo\"\u003e@SKY-HaYaTo\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"485:1-485:57\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"485:2-485:48\"\u003e\u003ca href=\"https://qiita.com/tags/Narrowing\"\u003e\u003ccode\u003eNarrowing\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"485:50-485:50\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"485:52-485:56\"\u003e\u003ca href=\"/only\" class=\"user-mention js-hovercard\" title=\"only\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"only\"\u003e@only\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"486:1-486:60\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"486:2-486:46\"\u003e\u003ca href=\"https://qiita.com/tags/Untitled\"\u003e\u003ccode\u003eUntitled\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"486:48-486:48\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"486:50-486:59\"\u003e\u003ca href=\"/masa_code\" class=\"user-mention js-hovercard\" title=\"masa_code\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"masa_code\"\u003e@masa_code\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"487:1-487:90\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"487:2-487:42\"\u003e\u003ca href=\"https://qiita.com/tags/ABC437\"\u003e\u003ccode\u003eABC437\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"487:44-487:44\"\u003e5\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"487:46-487:89\"\u003e\n\u003ca href=\"/TThaskboy\" class=\"user-mention js-hovercard\" title=\"TThaskboy\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"TThaskboy\"\u003e@TThaskboy\u003c/a\u003e, \u003ca href=\"/iastm\" class=\"user-mention js-hovercard\" title=\"iastm\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"iastm\"\u003e@iastm\u003c/a\u003e, \u003ca href=\"/meel_tech\" class=\"user-mention js-hovercard\" title=\"meel_tech\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"meel_tech\"\u003e@meel_tech\u003c/a\u003e, \u003ca href=\"/omakasessan\" class=\"user-mention js-hovercard\" title=\"omakasessan\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"omakasessan\"\u003e@omakasessan\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"488:1-488:127\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"488:2-488:114\"\u003e\u003ca href=\"https://qiita.com/tags/%E9%96%A2%E6%95%B0%E6%93%AC%E4%BC%BC%E3%82%AF%E3%83%A9%E3%82%B9\"\u003e\u003ccode\u003e関数擬似クラス\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"488:116-488:116\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"488:118-488:126\"\u003e\u003ca href=\"/ktrk2002\" class=\"user-mention js-hovercard\" title=\"ktrk2002\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"ktrk2002\"\u003e@ktrk2002\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"489:1-489:119\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"489:2-489:102\"\u003e\u003ca href=\"https://qiita.com/tags/%E7%B6%AD%E6%8C%81%E7%AE%A1%E7%90%86%E6%A1%88%E4%BB%B6\"\u003e\u003ccode\u003e維持管理案件\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"489:104-489:104\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"489:106-489:118\"\u003e\u003ca href=\"/yoshiki_sysi\" class=\"user-mention js-hovercard\" title=\"yoshiki_sysi\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"yoshiki_sysi\"\u003e@yoshiki_sysi\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"490:1-490:82\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"490:2-490:66\"\u003e\u003ca href=\"https://qiita.com/tags/MultimodalUniverse\"\u003e\u003ccode\u003eMultimodalUniverse\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"490:68-490:68\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"490:70-490:81\"\u003e\u003ca href=\"/tozastation\" class=\"user-mention js-hovercard\" title=\"tozastation\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tozastation\"\u003e@tozastation\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"491:1-491:98\"\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"491:2-491:90\"\u003e\u003ca href=\"https://qiita.com/tags/%E3%83%A9%E3%83%99%E3%83%AB%E7%AE%A1%E7%90%86\"\u003e\u003ccode\u003eラベル管理\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center\" data-sourcepos=\"491:92-491:92\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align: left\" data-sourcepos=\"491:94-491:97\"\u003e\u003ca href=\"/tzp\" class=\"user-mention js-hovercard\" title=\"tzp\" data-hovercard-target-type=\"user\" data-hovercard-target-name=\"tzp\"\u003e@tzp\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"493:1-493:22\"\u003e\n\u003cspan id=\"記事数0のタグ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A8%98%E4%BA%8B%E6%95%B00%E3%81%AE%E3%82%BF%E3%82%B0\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e記事数0のタグ\u003c/h2\u003e\n\u003cul data-sourcepos=\"495:1-505:527\"\u003e\n\u003cli data-sourcepos=\"495:1-495:116\"\u003e\n\u003ca href=\"https://qiita.com/tags/%2CCloths%2CPress\"\u003e\u003ccode\u003e,Cloths,Press\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%2Celectron%2C\"\u003e\u003ccode\u003e,electron,\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"496:1-496:43\"\u003e\u003ca href=\"https://qiita.com/tags/%23%3F%3F\"\u003e\u003ccode\u003e#??\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"497:1-497:3180\"\u003e\n\u003ca href=\"https://qiita.com/tags/%23ADUConstruction\"\u003e\u003ccode\u003e#ADUConstruction\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23AffordableDentist\"\u003e\u003ccode\u003e#AffordableDentist\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23AGas\"\u003e\u003ccode\u003e#AGas\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23anime%2C\"\u003e\u003ccode\u003e#anime,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23anime3d\"\u003e\u003ccode\u003e#anime3d\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23animevietsub%2C\"\u003e\u003ccode\u003e#animevietsub,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23animevietsub3d%2C\"\u003e\u003ccode\u003e#animevietsub3d,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23banmo\"\u003e\u003ccode\u003e#banmo\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23BayAreaBuilders\"\u003e\u003ccode\u003e#BayAreaBuilders\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23BinanceClone%2C\"\u003e\u003ccode\u003e#BinanceClone,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23CryptoExchangeScript%2C\"\u003e\u003ccode\u003e#CryptoExchangeScript,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23CryptoTradingPlatform\"\u003e\u003ccode\u003e#CryptoTradingPlatform\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23daomodien\"\u003e\u003ccode\u003e#daomodien\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23DentistNearYou\"\u003e\u003ccode\u003e#DentistNearYou\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23EdmontonDentalClinic\"\u003e\u003ccode\u003e#EdmontonDentalClinic\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23ESA\"\u003e\u003ccode\u003e#ESA\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23FamilyDentistEdmonton\"\u003e\u003ccode\u003e#FamilyDentistEdmonton\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23GasD%E1%BA%A7ukh%C3%AD%2C\"\u003e\u003ccode\u003e#GasDầukhí,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23GasSouth%2C\"\u003e\u003ccode\u003e#GasSouth,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23GeneralDentistryEdmonton\"\u003e\u003ccode\u003e#GeneralDentistryEdmonton\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23HeatSign\"\u003e\u003ccode\u003e#HeatSign\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23HomeRemodeling\"\u003e\u003ccode\u003e#HomeRemodeling\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23HomeRenovation\"\u003e\u003ccode\u003e#HomeRenovation\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23HybridExchange\"\u003e\u003ccode\u003e#HybridExchange\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23LaserEngraving\"\u003e\u003ccode\u003e#LaserEngraving\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23LearnNumerologyOnline\"\u003e\u003ccode\u003e#LearnNumerologyOnline\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003e#Linuxディストリビューション\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23LiteLLM\"\u003e\u003ccode\u003e#LiteLLM\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23Lumidex\"\u003e\u003ccode\u003e#Lumidex\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23ManufacturingTech\"\u003e\u003ccode\u003e#ManufacturingTech\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23maysoctim\"\u003e\u003ccode\u003e#maysoctim\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23meditop\"\u003e\u003ccode\u003e#meditop\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23monitor\"\u003e\u003ccode\u003e#monitor\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23Numerology\"\u003e\u003ccode\u003e#Numerology\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23ParrotOS\"\u003e\u003ccode\u003e#ParrotOS\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23PGS%2C\"\u003e\u003ccode\u003e#PGS,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23remover\"\u003e\u003ccode\u003e#remover\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23RK\"\u003e\u003ccode\u003e#RK\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23SEALPROPERTIES\"\u003e\u003ccode\u003e#SEALPROPERTIES\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23solarpanels\"\u003e\u003ccode\u003e#solarpanels\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23Tails\"\u003e\u003ccode\u003e#Tails\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23thegioithungrac\"\u003e\u003ccode\u003e#thegioithungrac\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23thietbijbaoholaodong\"\u003e\u003ccode\u003e#thietbijbaoholaodong\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23trendings\"\u003e\u003ccode\u003e#trendings\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23vanchuyenkhithiennhienhoalong\"\u003e\u003ccode\u003e#vanchuyenkhithiennhienhoalong\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23VastuShastra\"\u003e\u003ccode\u003e#VastuShastra\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23vioc\"\u003e\u003ccode\u003e#vioc\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23VTGas%2C\"\u003e\u003ccode\u003e#VTGas,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23VTGas\"\u003e\u003ccode\u003e#VTGas\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23watermark\"\u003e\u003ccode\u003e#watermark\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23xemphimanime%2C\"\u003e\u003ccode\u003e#xemphimanime,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23xuhuong\"\u003e\u003ccode\u003e#xuhuong\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"498:1-498:309\"\u003e\n\u003ca href=\"https://qiita.com/tags/%23%E3%82%A2%E3%83%97%E3%83%AA%E5%88%B6%E4%BD%9C\"\u003e\u003ccode\u003e#アプリ制作\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%A2%E3%83%83%E3%83%97\"\u003e\u003ccode\u003e#キャッチアップ\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23%E3%83%A2%E3%83%87%E3%83%AB%E6%AF%94%E8%BC%83\"\u003e\u003ccode\u003e#モデル比較\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"499:1-499:237\"\u003e\n\u003ca href=\"https://qiita.com/tags/%23%E4%B8%AD%E9%80%94%E5%85%A5%E7%A4%BE\"\u003e\u003ccode\u003e#中途入社\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23%E5%93%81%E5%B7%9D%E4%BC%9A\"\u003e\u003ccode\u003e#品川会\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%23%E6%9C%AA%E6%9D%A5%E4%BA%88%E6%B8%AC\"\u003e\u003ccode\u003e#未来予測\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"500:1-500:98\"\u003e\n\u003ca href=\"https://qiita.com/tags/135236\"\u003e\u003ccode\u003e135236\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/3DExperience\"\u003e\u003ccode\u003e3DExperience\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"501:1-501:8671\"\u003e\n\u003ca href=\"https://qiita.com/tags/AccurateShuttle\"\u003e\u003ccode\u003eAccurateShuttle\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AdCP\"\u003e\u003ccode\u003eAdCP\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AgentforceScript\"\u003e\u003ccode\u003eAgentforceScript\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AIsecurity\"\u003e\u003ccode\u003eAIsecurity\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Aitl\"\u003e\u003ccode\u003eAitl\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AI%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E5%86%99%E7%9C%9F%E7%B7%A8%E9%9B%86%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%EF%BC%81\"\u003e\u003ccode\u003eAIで簡単に写真編集ができる！\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AI%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A3%BD%E5%93%81%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B\"\u003e\u003ccode\u003eAIを活用したネットワーク製品のご紹介\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AI%E6%A0%A1%E6%AD%A3\"\u003e\u003ccode\u003eAI校正\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/autoclaves\"\u003e\u003ccode\u003eautoclaves\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/AX5400\"\u003e\u003ccode\u003eAX5400\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/BadApple%21%21\"\u003e\u003ccode\u003eBadApple!!\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/banding\"\u003e\u003ccode\u003ebanding\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/BESTIFTARMEAL\"\u003e\u003ccode\u003eBESTIFTARMEAL\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/bioassay\"\u003e\u003ccode\u003ebioassay\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Blown\"\u003e\u003ccode\u003eBlown\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Boosts\"\u003e\u003ccode\u003eBoosts\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Bss\"\u003e\u003ccode\u003eBss\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/busices\"\u003e\u003ccode\u003ebusices\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/cardamomessentialoil\"\u003e\u003ccode\u003ecardamomessentialoil\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/cardamomoil\"\u003e\u003ccode\u003ecardamomoil\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/CGBN\"\u003e\u003ccode\u003eCGBN\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Chatgpt-5.2\"\u003e\u003ccode\u003eChatgpt-5.2\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/CitiBank\"\u003e\u003ccode\u003eCitiBank\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Comet%2C\"\u003e\u003ccode\u003eComet,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/compareunlistedzone\"\u003e\u003ccode\u003ecompareunlistedzone\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Comprare\"\u003e\u003ccode\u003eComprare\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/corporatelegalservices\"\u003e\u003ccode\u003ecorporatelegalservices\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/corteva\"\u003e\u003ccode\u003ecorteva\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/cost%2Chr\"\u003e\u003ccode\u003ecost,hr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/CP93\"\u003e\u003ccode\u003eCP93\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/culvert\"\u003e\u003ccode\u003eculvert\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/delistedstock\"\u003e\u003ccode\u003edelistedstock\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/DesktopFlow\"\u003e\u003ccode\u003eDesktopFlow\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/dienmattroi\"\u003e\u003ccode\u003edienmattroi\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/diodo\"\u003e\u003ccode\u003ediodo\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Dirbato\"\u003e\u003ccode\u003eDirbato\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Disnana\"\u003e\u003ccode\u003eDisnana\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/DualSenseExplorer\"\u003e\u003ccode\u003eDualSenseExplorer\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/dwdwd\"\u003e\u003ccode\u003edwdwd\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/dwdwdw\"\u003e\u003ccode\u003edwdwdw\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/EB3\"\u003e\u003ccode\u003eEB3\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/EB5\"\u003e\u003ccode\u003eEB5\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ElbowReplacementSurgery\"\u003e\u003ccode\u003eElbowReplacementSurgery\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ElectricVehicleChargers\"\u003e\u003ccode\u003eElectricVehicleChargers\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/EliveraGroup\"\u003e\u003ccode\u003eEliveraGroup\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Engraving\"\u003e\u003ccode\u003eEngraving\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/EVChargerCompany\"\u003e\u003ccode\u003eEVChargerCompany\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/EVChargerManufacturer\"\u003e\u003ccode\u003eEVChargerManufacturer\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/F61BMD\"\u003e\u003ccode\u003eF61BMD\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/factory%2C\"\u003e\u003ccode\u003efactory,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Flows\"\u003e\u003ccode\u003eFlows\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Flux2.free\"\u003e\u003ccode\u003eFlux2.free\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Fluxim%E8%A3%BD%E5%93%81\"\u003e\u003ccode\u003eFluxim製品\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/FPGFA\"\u003e\u003ccode\u003eFPGFA\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/FreelancingCourse\"\u003e\u003ccode\u003eFreelancingCourse\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/GDTF\"\u003e\u003ccode\u003eGDTF\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/GO%E8%A7%A3%E6%9E%90%2C\"\u003e\u003ccode\u003eGO解析,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Greencard\"\u003e\u003ccode\u003eGreencard\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/HBM\"\u003e\u003ccode\u003eHBM\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/HealthySmile\"\u003e\u003ccode\u003eHealthySmile\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/HighVolumeEmail\"\u003e\u003ccode\u003eHighVolumeEmail\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/HoangCuong\"\u003e\u003ccode\u003eHoangCuong\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/HomeEVCharger\"\u003e\u003ccode\u003eHomeEVCharger\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Homewares\"\u003e\u003ccode\u003eHomewares\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Iftar%2C\"\u003e\u003ccode\u003eIftar,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ImageOptimization%2C\"\u003e\u003ccode\u003eImageOptimization,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/India%2CHRM\"\u003e\u003ccode\u003eIndia,HRM\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/IndustrialMarking\"\u003e\u003ccode\u003eIndustrialMarking\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Intech\"\u003e\u003ccode\u003eIntech\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Java22%2C\"\u003e\u003ccode\u003eJava22,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Java23%2C\"\u003e\u003ccode\u003eJava23,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Java24%2C\"\u003e\u003ccode\u003eJava24,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/jl7\"\u003e\u003ccode\u003ejl7\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Khachhang\"\u003e\u003ccode\u003eKhachhang\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/KVM%2CLinux\"\u003e\u003ccode\u003eKVM,Linux\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Lakeland\"\u003e\u003ccode\u003eLakeland\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/LANAP\"\u003e\u003ccode\u003eLANAP\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/landscaper\"\u003e\u003ccode\u003elandscaper\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Litos\"\u003e\u003ccode\u003eLitos\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/MA3\"\u003e\u003ccode\u003eMA3\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/mayhanmiengtui\"\u003e\u003ccode\u003emayhanmiengtui\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/miniature\"\u003e\u003ccode\u003eminiature\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Muasam\"\u003e\u003ccode\u003eMuasam\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/mutualfundsoftwareinindia%2C\"\u003e\u003ccode\u003emutualfundsoftwareinindia,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/NanoBanana2\"\u003e\u003ccode\u003eNanoBanana2\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/netflowinternal\"\u003e\u003ccode\u003enetflowinternal\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/noai\"\u003e\u003ccode\u003enoai\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Notion%2C\"\u003e\u003ccode\u003eNotion,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/NutritionArmy\"\u003e\u003ccode\u003eNutritionArmy\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/obg%E7%A4%BE%E5%86%85%E5%85%B1%E6%9C%89\"\u003e\u003ccode\u003eobg社内共有\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/optimalfilter\"\u003e\u003ccode\u003eoptimalfilter\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/oraclefusionscm\"\u003e\u003ccode\u003eoraclefusionscm\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/OralHygiene\"\u003e\u003ccode\u003eOralHygiene\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ordre\"\u003e\u003ccode\u003eordre\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/penwrt\"\u003e\u003ccode\u003epenwrt\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Periodontist%2C\"\u003e\u003ccode\u003ePeriodontist,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/PiPico\"\u003e\u003ccode\u003ePiPico\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/PL%EF%BC%8FSQL\"\u003e\u003ccode\u003ePL／SQL\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Plasterers\"\u003e\u003ccode\u003ePlasterers\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Podlora\"\u003e\u003ccode\u003ePodlora\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/porcleain\"\u003e\u003ccode\u003eporcleain\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/portacabin\"\u003e\u003ccode\u003eportacabin\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Price%2Cbest\"\u003e\u003ccode\u003ePrice,best\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Print-on-Demand\"\u003e\u003ccode\u003ePrint-on-Demand\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/probate\"\u003e\u003ccode\u003eprobate\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Prolotherapy\"\u003e\u003ccode\u003eProlotherapy\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ps5.js\"\u003e\u003ccode\u003eps5.js\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/R%2CedgeR%2C\"\u003e\u003ccode\u003eR,edgeR,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Raju%403242%21Raju%403242%21Raju%403242%21\"\u003e\u003ccode\u003eRaju@3242!Raju@3242!Raju@3242!\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/rangefinder\"\u003e\u003ccode\u003erangefinder\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Ray-ban\"\u003e\u003ccode\u003eRay-ban\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Rayban-Meta\"\u003e\u003ccode\u003eRayban-Meta\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/receta\"\u003e\u003ccode\u003ereceta\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Relic%2CAPM%2C%E3%83%87%E3%83%BC%E3%82%BF%E9%87%8F%E5%89%8A%E6%B8%9B%2C%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B\"\u003e\u003ccode\u003eRelic,APM,データ量削減,コスト削減\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Responsibility\"\u003e\u003ccode\u003eResponsibility\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/ricetta\"\u003e\u003ccode\u003ericetta\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Risala\"\u003e\u003ccode\u003eRisala\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RNA-Sea%2C\"\u003e\u003ccode\u003eRNA-Sea,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RNA-Seq%2C\"\u003e\u003ccode\u003eRNA-Seq,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RoboticFloorCleaner\"\u003e\u003ccode\u003eRoboticFloorCleaner\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RoboticFloorCleaners\"\u003e\u003ccode\u003eRoboticFloorCleaners\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RSPL\"\u003e\u003ccode\u003eRSPL\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Ruffled\"\u003e\u003ccode\u003eRuffled\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/RunbookAutomation\"\u003e\u003ccode\u003eRunbookAutomation\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/senza\"\u003e\u003ccode\u003esenza\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/setlist.fm\"\u003e\u003ccode\u003esetlist.fm\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Smartly\"\u003e\u003ccode\u003eSmartly\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Software%2Cbest\"\u003e\u003ccode\u003eSoftware,best\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/software%2CPayroll\"\u003e\u003ccode\u003esoftware,Payroll\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/spicypy\"\u003e\u003ccode\u003espicypy\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Spreading\"\u003e\u003ccode\u003eSpreading\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/stackable\"\u003e\u003ccode\u003estackable\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/stackableplasticpalletsDubai%2C\"\u003e\u003ccode\u003estackableplasticpalletsDubai,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/stackableplasticpalletsDubai\"\u003e\u003ccode\u003estackableplasticpalletsDubai\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Stansted\"\u003e\u003ccode\u003eStansted\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Summertimesaga\"\u003e\u003ccode\u003eSummertimesaga\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Summertimesagaapk\"\u003e\u003ccode\u003eSummertimesagaapk\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/TDGL\"\u003e\u003ccode\u003eTDGL\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/texasestimate\"\u003e\u003ccode\u003etexasestimate\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/thuocbaovethucvat\"\u003e\u003ccode\u003ethuocbaovethucvat\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/thuocdetco\"\u003e\u003ccode\u003ethuocdetco\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Tieudung\"\u003e\u003ccode\u003eTieudung\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/tp-li\"\u003e\u003ccode\u003etp-li\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/TransitionEdgeSensors\"\u003e\u003ccode\u003eTransitionEdgeSensors\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Traycer\"\u003e\u003ccode\u003eTraycer\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/TripLink\"\u003e\u003ccode\u003eTripLink\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/trocco%2CUX\"\u003e\u003ccode\u003etrocco,UX\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/unlistedshare\"\u003e\u003ccode\u003eunlistedshare\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/unlistedzone\"\u003e\u003ccode\u003eunlistedzone\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/uying\"\u003e\u003ccode\u003euying\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/vidalyn\"\u003e\u003ccode\u003evidalyn\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Vyas\"\u003e\u003ccode\u003eVyas\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/WaterviewNursing\"\u003e\u003ccode\u003eWaterviewNursing\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/webdevelopmentaffordable%2C\"\u003e\u003ccode\u003ewebdevelopmentaffordable,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/XGS\"\u003e\u003ccode\u003eXGS\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/XGSPON\"\u003e\u003ccode\u003eXGSPON\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/Zhengjiu\"\u003e\u003ccode\u003eZhengjiu\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"502:1-502:2504\"\u003e\n\u003ca href=\"https://qiita.com/tags/%E3%82%A2%E3%83%97%E3%83%AA%E7%94%B3%E8%AB%8B%2C\"\u003e\u003ccode\u003eアプリ申請,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%2CCS%2C%E4%B8%8A%E6%B5%81%E5%B7%A5%E7%A8%8B\"\u003e\u003ccode\u003eカスタマーサポート,CS,上流工程\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%91%E3%81%84%E3%81%95%E3%82%93%E5%90%8D%E4%BA%BA\"\u003e\u003ccode\u003eけいさん名人\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%9F%E3%81%84%E3%82%84%E3%81%A4\"\u003e\u003ccode\u003eこれから見たいやつ\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0\"\u003e\u003ccode\u003eだだっこぱんだ\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC\"\u003e\u003ccode\u003eだだっこぱんださんのRVC\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVCWebUI\"\u003e\u003ccode\u003eだだっこぱんださんのRVCWebUI\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC%E3%81%AEWebUI\"\u003e\u003ccode\u003eだだっこぱんださんのRVCのWebUI\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC%E3%81%AEWebUI%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%81%84\"\u003e\u003ccode\u003eだだっこぱんださんのRVCのWebUIをインストールしたい\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%89%E3%82%A1%E3%81%A0%E3%81%82wd\"\u003e\u003ccode\u003eドァだあwd\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E5%9E%8B\"\u003e\u003ccode\u003eドキュメント型\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB\"\u003e\u003ccode\u003eパラレル\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E6%8E%A5%E7%B6%9A\"\u003e\u003ccode\u003eパラレル接続\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%AB\"\u003e\u003ccode\u003eフリーランスに\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89\"\u003e\u003ccode\u003eプロンプトコマンド\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF\"\u003e\u003ccode\u003eペーパーバック\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003eレガシーマイグレーション\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E3%83%AC%E3%82%AF%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3\"\u003e\u003ccode\u003eレクリエーション\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"503:1-503:1137\"\u003e\n\u003ca href=\"https://qiita.com/tags/%E6%A0%BC%E5%AE%89%E8%88%AA%E7%A9%BA%E5%88%B8\"\u003e\u003ccode\u003e格安航空券\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E9%AD%9A%E7%9C%BC%E3%82%AB%E3%83%A1%E3%83%A9\"\u003e\u003ccode\u003e魚眼カメラ\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E8%A8%80%E8%AA%9E%E5%AD%A6%2C\"\u003e\u003ccode\u003e言語学,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E5%80%8B%E4%BA%BA%E9%96%8B%E5%80%8B%E4%BA%BA\"\u003e\u003ccode\u003e個人開個人\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E5%B7%A5%E5%AD%A6%E5%AE%9F%E9%A8%93\"\u003e\u003ccode\u003e工学実験\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E5%B8%82%E6%B0%91%E9%96%8B%E7%99%BA\"\u003e\u003ccode\u003e市民開発\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E6%9B%B8%E7%B1%8D%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%AA%AD%E3%82%80%E6%8A%80%E8%A1%93%E3%80%8D%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0\"\u003e\u003ccode\u003e書籍「プログラムを読む技術」コードリーディング\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E8%81%B7%E5%A0%B4%E5%AE%9F%E7%BF%92\"\u003e\u003ccode\u003e職場実習\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E5%A4%9A%E9%87%8D%E6%A4%9C%E5%AE%9A\"\u003e\u003ccode\u003e多重検定\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E5%90%8C%E4%BD%8D%E4%BD%93\"\u003e\u003ccode\u003e同位体\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89\"\u003e\u003ccode\u003e日本語コード\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"504:1-504:348\"\u003e\n\u003ca href=\"https://qiita.com/tags/%D8%A7%D9%84%D8%AD%D8%A7%D9%8A%D8%B1\"\u003e\u003ccode\u003eالحاير\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%D8%A7%D9%84%D8%AD%D9%85%D8%AF%D8%A7%D9%86%D9%8A%D8%A9\"\u003e\u003ccode\u003eالحمدانية\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%D8%A8%D8%A7%D9%84%D8%B1%D9%8A%D8%A7%D8%B6%2C%2C\"\u003e\u003ccode\u003eبالرياض,,\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%D8%AA%D8%B4%D9%84%D9%8A%D8%AD\"\u003e\u003ccode\u003eتشليح\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"505:1-505:527\"\u003e\n\u003ca href=\"https://qiita.com/tags/%EB%8B%A4%EB%82%AD%EC%B9%B4%EC%A7%80%EB%85%B8\"\u003e\u003ccode\u003e다낭카지노\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%EB%B2%A0%ED%8A%B8%EB%82%A8%EC%B9%B4%EC%A7%80%EB%85%B8\"\u003e\u003ccode\u003e베트남카지노\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%EB%B2%A0%ED%8A%B8%EB%82%A8%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C\"\u003e\u003ccode\u003e베트남카지노추천\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%ED%95%98%EB%85%B8%EC%9D%B4%EC%B9%B4%EC%A7%80%EB%85%B8\"\u003e\u003ccode\u003e하노이카지노\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://qiita.com/tags/%ED%98%B8%EC%B9%98%EB%AF%BC%EC%B9%B4%EC%A7%80%EB%85%B8\"\u003e\u003ccode\u003e호치민카지노\u003c/code\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","body":"# Qiita新規作成タグレポート（2025/12/14 - 20）\n\n一週間のうちに新しく作成されたタグをまとめています。余計な記号（`#`や`,`など）が付いていると思われるタグには「:warning:」をマークしています。\n\n:star: 【最近Qiitaへの投稿を始めた方へ】下記の記事で、Qiitaにおけるタグの有意義な使い方が紹介されています。参考にしてみてください。\n\nhttps://qiita.com/shiracamus/items/fd309513d54c68694bc2\n\n:arrow_backward: 前週（2025/12/07 - 13）のレポートはコチラ:\n\nhttps://qiita.com/nkay/items/61a8d69a1ac43090aa12\n\n※ データ取得時刻の関係で、下記データは現在とは異なる場合があります。\n\n## 12月14日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`cargo-compete`](https://qiita.com/tags/cargo-compete)|1|@slow-cat|\n|[`cuOpt`](https://qiita.com/tags/cuOpt)|1|@nukipei|\n|[`ファイル修正`](https://qiita.com/tags/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%AE%E6%AD%A3)|1|@Atsumoripress|\n|[`屋内地図`](https://qiita.com/tags/%E5%B1%8B%E5%86%85%E5%9C%B0%E5%9B%B3)|1|@shi-works|\n|[`AI対話ログ`](https://qiita.com/tags/AI%E5%AF%BE%E8%A9%B1%E3%83%AD%E3%82%B0)|1|@RyuGotoo|\n|[`Xyce`](https://qiita.com/tags/Xyce)|1|@yoshiki9636|\n|[`データコスト`](https://qiita.com/tags/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B3%E3%82%B9%E3%83%88)|1|@mar1213|\n|[`React2Shell`](https://qiita.com/tags/React2Shell)|3|@GeneLab_999, @Higemal, @Kengo2003|\n|[`超漢字`](https://qiita.com/tags/%E8%B6%85%E6%BC%A2%E5%AD%97)|1|@shiozaki|\n|[`インフォマティクス`](https://qiita.com/tags/%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9)|1|@Seine_A_Shintani|\n|[`エンジニア大喜利`](https://qiita.com/tags/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%A4%A7%E5%96%9C%E5%88%A9)|1|@EgaSaQA|\n|[`hackason`](https://qiita.com/tags/hackason)|1|@Hir0_IC|\n|[`NICTER`](https://qiita.com/tags/NICTER)|1|@Chisho|\n|[`NCSC`](https://qiita.com/tags/NCSC)|1|@Chisho|\n|[`AtCoderConference2025`](https://qiita.com/tags/AtCoderConference2025)|1|@take37|\n|[`AIモデル管理`](https://qiita.com/tags/AI%E3%83%A2%E3%83%87%E3%83%AB%E7%AE%A1%E7%90%86)|1|@mellowlaunch|\n|[`ユーザビリティ評価`](https://qiita.com/tags/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E8%A9%95%E4%BE%A1)|1|@NNobu|\n|[`プロジェクトコード`](https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89)|1|@guppi524|\n|[`映像符号化`](https://qiita.com/tags/%E6%98%A0%E5%83%8F%E7%AC%A6%E5%8F%B7%E5%8C%96)|1|@Cis_1075|\n|[`マイクロカーネル`](https://qiita.com/tags/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB)|1|@maru3745|\n|:warning: [`#ヒュッケル`](https://qiita.com/tags/%23%E3%83%92%E3%83%A5%E3%83%83%E3%82%B1%E3%83%AB)|1|@suzuka_0602|\n|[`誤操作対策`](https://qiita.com/tags/%E8%AA%A4%E6%93%8D%E4%BD%9C%E5%AF%BE%E7%AD%96)|1|@yuri_777|\n|:warning: [`#stac2025`](https://qiita.com/tags/%23stac2025)|1|@orfevre_love|\n|:warning: [`--onedir`](https://qiita.com/tags/--onedir)|1|@yuri_777|\n|[`シリアル接続`](https://qiita.com/tags/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E6%8E%A5%E7%B6%9A)|1|@yuri_777|\n|[`ログイン方法`](https://qiita.com/tags/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%96%B9%E6%B3%95)|1|@yuri_777|\n|[`AdvancedArchitectingonAWS`](https://qiita.com/tags/AdvancedArchitectingonAWS)|1|@Michinoku|\n|:warning: [`#PQC`](https://qiita.com/tags/%23PQC)|1|@shu_koma|\n|:warning: [`#QKD`](https://qiita.com/tags/%23QKD)|1|@shu_koma|\n|[`mustknow`](https://qiita.com/tags/mustknow)|1|@softbase|\n|[`5件`](https://qiita.com/tags/5%E4%BB%B6)|1|@JaJaThree|\n|[`LangGraphStudio`](https://qiita.com/tags/LangGraphStudio)|1|@chiaoi|\n|[`2025JapanAWSJr.Champi`](https://qiita.com/tags/2025JapanAWSJr.Champi)|1|@shj_m|\n|[`Haiku4.5`](https://qiita.com/tags/Haiku4.5)|2|@buchi_org, @nahiro_tus|\n|[`管理コマンド`](https://qiita.com/tags/%E7%AE%A1%E7%90%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)|1|@jojo__xxxxx|\n|[`ウェブ開発を学ぶためのおすすめオンライ`](https://qiita.com/tags/%E3%82%A6%E3%82%A7%E3%83%96%E9%96%8B%E7%99%BA%E3%82%92%E5%AD%A6%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4)|1|@Sandip-Bhujel|\n|[`StrapiV5`](https://qiita.com/tags/StrapiV5)|1|@kensuto_tv|\n|:warning: [`#MultiAgent`](https://qiita.com/tags/%23MultiAgent)|5|@ryouta_takaoka|\n|:warning: [`#HandsOn`](https://qiita.com/tags/%23HandsOn)|1|@ryouta_takaoka|\n|:warning: [`#CloudArchitecture`](https://qiita.com/tags/%23CloudArchitecture)|1|@ryouta_takaoka|\n|[`clobalFiled`](https://qiita.com/tags/clobalFiled)|1|@n_hideyuki|\n|[`ArduinnoIDE`](https://qiita.com/tags/ArduinnoIDE)|1|@_Moony|\n|:warning: [`` `Azure`, ``](https://qiita.com/tags/%60Azure%60%2C)|1|@banquet_kuma|\n|:warning: [`` `RAG`, ``](https://qiita.com/tags/%60RAG%60%2C)|1|@banquet_kuma|\n|:warning: [`` `OpenAI`, ``](https://qiita.com/tags/%60OpenAI%60%2C)|1|@banquet_kuma|\n|:warning: [`` `AzureFunctions`, ``](https://qiita.com/tags/%60AzureFunctions%60%2C)|1|@banquet_kuma|\n|:warning: [`` `ServerlessArchitecture` ``](https://qiita.com/tags/%60ServerlessArchitecture%60)|1|@banquet_kuma|\n|[`SnapCenter`](https://qiita.com/tags/SnapCenter)|1|@curryboy_ex01|\n|:warning: [`#CASB`](https://qiita.com/tags/%23CASB)|1|@hyper-yosuke|\n|[`割符`](https://qiita.com/tags/%E5%89%B2%E7%AC%A6)|1|@sapi_kawahara|\n|[`健康保険証`](https://qiita.com/tags/%E5%81%A5%E5%BA%B7%E4%BF%9D%E9%99%BA%E8%A8%BC)|1|@sapi_kawahara|\n|[`ガクチカ`](https://qiita.com/tags/%E3%82%AC%E3%82%AF%E3%83%81%E3%82%AB)|2|@Riochin, @Shotaro-Akehi|\n|[`設計レビュー`](https://qiita.com/tags/%E8%A8%AD%E8%A8%88%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)|4|@asurawill|\n\n## 12月15日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`スクワット`](https://qiita.com/tags/%E3%82%B9%E3%82%AF%E3%83%AF%E3%83%83%E3%83%88)|2|@100dFitApp|\n|[`oilnvim`](https://qiita.com/tags/oilnvim)|1|@kosments|\n|[`即席チーム`](https://qiita.com/tags/%E5%8D%B3%E5%B8%AD%E3%83%81%E3%83%BC%E3%83%A0)|1|@c0a2212903|\n|[`azooKey`](https://qiita.com/tags/azooKey)|2|@inugamine|\n|[`CIMD`](https://qiita.com/tags/CIMD)|1|@TakahikoKawasaki|\n|[`シェイプキー`](https://qiita.com/tags/%E3%82%B7%E3%82%A7%E3%82%A4%E3%83%97%E3%82%AD%E3%83%BC)|1|@tsukino_|\n|[`Fleets`](https://qiita.com/tags/Fleets)|1|@Riku_Nitta|\n|[`MainToolbar`](https://qiita.com/tags/MainToolbar)|1|@ScreenPocket|\n|:warning: [`mq,`](https://qiita.com/tags/mq%2C)|1|@hrhtonda|\n|:warning: [`MQ,,`](https://qiita.com/tags/MQ%2C%2C)|1|@hrhtonda|\n|[`MAZ`](https://qiita.com/tags/MAZ)|1|@hrhtonda|\n|[`きらりん☆レボリューション`](https://qiita.com/tags/%E3%81%8D%E3%82%89%E3%82%8A%E3%82%93%E2%98%86%E3%83%AC%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)|1|@inovue3|\n|[`JakartaData`](https://qiita.com/tags/JakartaData)|1|@noritaka-kagei|\n|:warning: [`#学会コンペ`](https://qiita.com/tags/%23%E5%AD%A6%E4%BC%9A%E3%82%B3%E3%83%B3%E3%83%9A)|1|@ShunsukeKikuchi|\n|:warning: [`@esp32c5`](https://qiita.com/tags/%40esp32c5)|1|@MikH|\n|[`ExternalLocation`](https://qiita.com/tags/ExternalLocation)|1|@mellowlaunch|\n|[`StorageCredential`](https://qiita.com/tags/StorageCredential)|1|@mellowlaunch|\n|[`シナリオ設計`](https://qiita.com/tags/%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E8%A8%AD%E8%A8%88)|2|@mellowlaunch|\n|[`業務フロー定義`](https://qiita.com/tags/%E6%A5%AD%E5%8B%99%E3%83%95%E3%83%AD%E3%83%BC%E5%AE%9A%E7%BE%A9)|1|@mellowlaunch|\n|[`EbhancedOpne`](https://qiita.com/tags/EbhancedOpne)|1|@teppei19980914|\n|[`Xwiki`](https://qiita.com/tags/Xwiki)|1|@Brutus|\n|:warning: [`#TS`](https://qiita.com/tags/%23TS)|1|@rykmryoke|\n|[`中小企業の情報セキュリティ対策ガイドライン`](https://qiita.com/tags/%E4%B8%AD%E5%B0%8F%E4%BC%81%E6%A5%AD%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3)|1|@teppei19980914|\n|[`自己宣言`](https://qiita.com/tags/%E8%87%AA%E5%B7%B1%E5%AE%A3%E8%A8%80)|1|@teppei19980914|\n|[`GPT5.2`](https://qiita.com/tags/GPT5.2)|2|@lenali070411, @tai_niwa|\n|:warning: [`CARLA,ROS,Jetson,WSL2,自動運転`](https://qiita.com/tags/CARLA%2CROS%2CJetson%2CWSL2%2C%E8%87%AA%E5%8B%95%E9%81%8B%E8%BB%A2)|1|@nnnnanana|\n|[`Deepgram`](https://qiita.com/tags/Deepgram)|1|@kuma_3838|\n|[`ロイヤルティ向上`](https://qiita.com/tags/%E3%83%AD%E3%82%A4%E3%83%A4%E3%83%AB%E3%83%86%E3%82%A3%E5%90%91%E4%B8%8A)|1|@handakazunori|\n|[`Tavus`](https://qiita.com/tags/Tavus)|1|@f-kaito|\n|[`subdiv`](https://qiita.com/tags/subdiv)|1|@hextomino|\n|[`JDBCAPI`](https://qiita.com/tags/JDBCAPI)|1|@kanfutrooper|\n|:warning: [`@PowerApps`](https://qiita.com/tags/%40PowerApps)|1|@bruce-ip-gxp|\n|:warning: [`@ローコードツール`](https://qiita.com/tags/%40%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB)|1|@bruce-ip-gxp|\n|[`AIIP`](https://qiita.com/tags/AIIP)|2|@tetsuko_room|\n|[`宇宙インターネット`](https://qiita.com/tags/%E5%AE%87%E5%AE%99%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88)|1|@tetsuko_room|\n|[`リットリンク`](https://qiita.com/tags/%E3%83%AA%E3%83%83%E3%83%88%E3%83%AA%E3%83%B3%E3%82%AF)|1|@mrbirddev|\n|:warning: [`#連鎖率`](https://qiita.com/tags/%23%E9%80%A3%E9%8E%96%E7%8E%87)|1|@yasunari0421|\n|[`秘匿性`](https://qiita.com/tags/%E7%A7%98%E5%8C%BF%E6%80%A7)|1|@yam_dev|\n|[`RdmineJapan`](https://qiita.com/tags/RdmineJapan)|3|@yam_asaki|\n|[`NVIDIAGB200`](https://qiita.com/tags/NVIDIAGB200)|1|@Walmate_Tech|\n|[`水冷プレート`](https://qiita.com/tags/%E6%B0%B4%E5%86%B7%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88)|1|@Walmate_Tech|\n|[`仮想通貨環境`](https://qiita.com/tags/%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E7%92%B0%E5%A2%83)|1|@teppei19980914|\n|[`クリプトジャッキング`](https://qiita.com/tags/%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0)|1|@teppei19980914|\n|[`分散データベースシステム`](https://qiita.com/tags/%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)|1|@teppei19980914|\n|[`オーディエンスリスト連携`](https://qiita.com/tags/%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%AA%E3%82%B9%E3%83%88%E9%80%A3%E6%90%BA)|1|@SoySoySoyB|\n|[`Ray-banMeta`](https://qiita.com/tags/Ray-banMeta)|1|@vent0908|\n|[`Muti-Protocol`](https://qiita.com/tags/Muti-Protocol)|1|@kuze_k|\n|[`ヘヴィサイドの階段関数`](https://qiita.com/tags/%E3%83%98%E3%83%B4%E3%82%A3%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%E9%9A%8E%E6%AE%B5%E9%96%A2%E6%95%B0)|1|@mytube_algo_discover|\n|[`初めてのハッカソン`](https://qiita.com/tags/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3)|1|@TAK0-wasa|\n|:warning: [`#grot`](https://qiita.com/tags/%23grot)|1|@LeaNagashima|\n|[`crafty4`](https://qiita.com/tags/crafty4)|1|@harunn|\n|[`CloudMonitoringConsole`](https://qiita.com/tags/CloudMonitoringConsole)|1|@torippy1024|\n|[`AIウォッシング`](https://qiita.com/tags/AI%E3%82%A6%E3%82%A9%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0)|1|@Dataiku|\n|[`パウリ行列`](https://qiita.com/tags/%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97)|1|@osawat|\n|[`next-themes`](https://qiita.com/tags/next-themes)|1|@yuki_saito|\n|[`kiropower`](https://qiita.com/tags/kiropower)|1|@ec2_on_aws|\n|[`coworkingspaceinIndore`](https://qiita.com/tags/coworkingspaceinIndore)|1|@flexihub|\n|:warning: [`XPath,`](https://qiita.com/tags/XPath%2C)|1|@fujitsuna|\n|:warning: [`Resonite,`](https://qiita.com/tags/Resonite%2C)|1|@rabbuttz|\n|[`SECCON2025`](https://qiita.com/tags/SECCON2025)|1|@Saku0512|\n|[`祝日対応`](https://qiita.com/tags/%E7%A5%9D%E6%97%A5%E5%AF%BE%E5%BF%9C)|1|@return_chiba|\n|[`アーキテクチャメカニズム`](https://qiita.com/tags/%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0)|1|@Kudo_panda|\n|[`DSPM`](https://qiita.com/tags/DSPM)|1|@yren|\n|[`GoogleSkills`](https://qiita.com/tags/GoogleSkills)|1|@nkmrt|\n|[`ShokoServer`](https://qiita.com/tags/ShokoServer)|1|@nab|\n|[`Lenny`](https://qiita.com/tags/Lenny)|1|@penguin425|\n|[`ScoreP`](https://qiita.com/tags/ScoreP)|1|@kamet0703|\n|[`OTF2`](https://qiita.com/tags/OTF2)|1|@kamet0703|\n|[`sasakure.uk`](https://qiita.com/tags/sasakure.uk)|1|@mob_engineer|\n|[`vtable.el`](https://qiita.com/tags/vtable.el)|1|@gemmaro|\n|[`LocalASR`](https://qiita.com/tags/LocalASR)|1|@Dongagent|\n|[`出戻り`](https://qiita.com/tags/%E5%87%BA%E6%88%BB%E3%82%8A)|1|@starfy_starfy|\n|[`見ないでください`](https://qiita.com/tags/%E8%A6%8B%E3%81%AA%E3%81%84%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)|1|@tamachan_DXQ|\n\n## 12月16日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`つくってみた`](https://qiita.com/tags/%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F)|1|@tech_tuna|\n|[`StagingStorage`](https://qiita.com/tags/StagingStorage)|1|@baku2san|\n|[`ocrmypdf`](https://qiita.com/tags/ocrmypdf)|1|@H-goto16|\n|[`LBE`](https://qiita.com/tags/LBE)|1|@afjk|\n|[`MaprayJS`](https://qiita.com/tags/MaprayJS)|1|@darshu|\n|[`コモンモードチョークコイル`](https://qiita.com/tags/%E3%82%B3%E3%83%A2%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89%E3%83%81%E3%83%A7%E3%83%BC%E3%82%AF%E3%82%B3%E3%82%A4%E3%83%AB)|1|@YuTanakaaa|\n|[`伝導ノイズ`](https://qiita.com/tags/%E4%BC%9D%E5%B0%8E%E3%83%8E%E3%82%A4%E3%82%BA)|1|@YuTanakaaa|\n|[`CPPModule02`](https://qiita.com/tags/CPPModule02)|1|@moppy626|\n|[`直動式`](https://qiita.com/tags/%E7%9B%B4%E5%8B%95%E5%BC%8F)|1|@YuTanakaaa|\n|[`パイロット式`](https://qiita.com/tags/%E3%83%91%E3%82%A4%E3%83%AD%E3%83%83%E3%83%88%E5%BC%8F)|1|@YuTanakaaa|\n|[`p進数`](https://qiita.com/tags/p%E9%80%B2%E6%95%B0)|1|@taisei0418|\n|[`３次元アニメーション`](https://qiita.com/tags/%EF%BC%93%E6%AC%A1%E5%85%83%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)|1|@hiroaki2702|\n|[`OA高度化`](https://qiita.com/tags/OA%E9%AB%98%E5%BA%A6%E5%8C%96)|1|@NTTDkyushu_CRM_CyberSec|\n|[`血縁行列`](https://qiita.com/tags/%E8%A1%80%E7%B8%81%E8%A1%8C%E5%88%97)|4|@KimuraSoh|\n|[`メモリを擬人化で理解する`](https://qiita.com/tags/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E6%93%AC%E4%BA%BA%E5%8C%96%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)|1|@RyuGotoo|\n|[`AIMemory`](https://qiita.com/tags/AIMemory)|1|@fe2030|\n|[`JankyBorders`](https://qiita.com/tags/JankyBorders)|1|@tyPhoon|\n|[`ライツアウト`](https://qiita.com/tags/%E3%83%A9%E3%82%A4%E3%83%84%E3%82%A2%E3%82%A6%E3%83%88)|1|@tami7f|\n|[`ダークネット`](https://qiita.com/tags/%E3%83%80%E3%83%BC%E3%82%AF%E3%83%8D%E3%83%83%E3%83%88)|1|@teppei19980914|\n|[`ディープウェブ`](https://qiita.com/tags/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%82%A6%E3%82%A7%E3%83%96)|1|@teppei19980914|\n|[`根回し`](https://qiita.com/tags/%E6%A0%B9%E5%9B%9E%E3%81%97)|1|@piyonakajima|\n|[`サイバーセキュリティ経営ガイドライン`](https://qiita.com/tags/%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E7%B5%8C%E5%96%B6%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3)|1|@teppei19980914|\n|[`vico`](https://qiita.com/tags/vico)|1|@t_hiro2626|\n|[`幹事`](https://qiita.com/tags/%E5%B9%B9%E4%BA%8B)|1|@mamoru-ngy|\n|[`チャレキャラ`](https://qiita.com/tags/%E3%83%81%E3%83%A3%E3%83%AC%E3%82%AD%E3%83%A3%E3%83%A9)|1|@kuroda50|\n|[`ESP32c`](https://qiita.com/tags/ESP32c)|1|@hayato_sakaida_rh|\n|[`GitWorktree`](https://qiita.com/tags/GitWorktree)|1|@bhkbb2|\n|[`ベクターグラフィックス`](https://qiita.com/tags/%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9)|1|@YaHey|\n|:warning: [`#顧客価値`](https://qiita.com/tags/%23%E9%A1%A7%E5%AE%A2%E4%BE%A1%E5%80%A4)|1|@4mdy|\n|[`軌道角運動量`](https://qiita.com/tags/%E8%BB%8C%E9%81%93%E8%A7%92%E9%81%8B%E5%8B%95%E9%87%8F)|1|@Takeshi_Baba|\n|[`ラゲールガウスビーム`](https://qiita.com/tags/%E3%83%A9%E3%82%B2%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A6%E3%82%B9%E3%83%93%E3%83%BC%E3%83%A0)|1|@Takeshi_Baba|\n|[`MXMaster4`](https://qiita.com/tags/MXMaster4)|1|@check50045366|\n|[`PngImage`](https://qiita.com/tags/PngImage)|1|@p_kato|\n|[`AI通信`](https://qiita.com/tags/AI%E9%80%9A%E4%BF%A1)|1|@tetsuko_room|\n|:warning: [`ガリレオ、ニュートン、アインシュタイン、ワインバーグ、オイラ`](https://qiita.com/tags/%E3%82%AC%E3%83%AA%E3%83%AC%E3%82%AA%E3%80%81%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%80%81%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%80%81%E3%83%AF%E3%82%A4%E3%83%B3%E3%83%90%E3%83%BC%E3%82%B0%E3%80%81%E3%82%AA%E3%82%A4%E3%83%A9)|1|@profkubo|\n|[`以上`](https://qiita.com/tags/%E4%BB%A5%E4%B8%8A)|1|@shinyama|\n|[`以降`](https://qiita.com/tags/%E4%BB%A5%E9%99%8D)|1|@shinyama|\n|[`AWS認定アカウント`](https://qiita.com/tags/AWS%E8%AA%8D%E5%AE%9A%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88)|1|@Fujiden70|\n|[`更更新`](https://qiita.com/tags/%E6%9B%B4%E6%9B%B4%E6%96%B0)|1|@CodeLeaf|\n|[`部分更更新`](https://qiita.com/tags/%E9%83%A8%E5%88%86%E6%9B%B4%E6%9B%B4%E6%96%B0)|1|@CodeLeaf|\n|[`OfficeQA`](https://qiita.com/tags/OfficeQA)|1|@taka_yayoi|\n|[`名前を変名前`](https://qiita.com/tags/%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E5%90%8D%E5%89%8D)|1|@CodeLeaf|\n|[`Ruby4.0`](https://qiita.com/tags/Ruby4.0)|6|@scivola|\n|[`ビジネス要件分析`](https://qiita.com/tags/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E8%A6%81%E4%BB%B6%E5%88%86%E6%9E%90)|1|@angel_high_low|\n|[`Robotiq.ai`](https://qiita.com/tags/Robotiq.ai)|1|@nakamura_bvt|\n|[`さくらのAIEngine`](https://qiita.com/tags/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEAIEngine)|1|@y4s2hol|\n|[`HealthTech`](https://qiita.com/tags/HealthTech)|1|@paridhipurohit02|\n|[`Rincoin`](https://qiita.com/tags/Rincoin)|2|@ysmreg1|\n|[`内部ステージ`](https://qiita.com/tags/%E5%86%85%E9%83%A8%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8)|2|@coco_co|\n|[`MetadataAccessControl`](https://qiita.com/tags/MetadataAccessControl)|1|@nickqinsc|\n|[`devCamp`](https://qiita.com/tags/devCamp)|1|@gababy_00|\n|[`我々が目指すもの`](https://qiita.com/tags/%E6%88%91%E3%80%85%E3%81%8C%E7%9B%AE%E6%8C%87%E3%81%99%E3%82%82%E3%81%AE)|1|@soga_slj|\n|[`OpenJava`](https://qiita.com/tags/OpenJava)|1|@TSA2019|\n|[`picocom`](https://qiita.com/tags/picocom)|1|@mnishiguchi|\n|[`コーディング先行`](https://qiita.com/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%85%88%E8%A1%8C)|1|@dice_rice|\n|[`CSSDesign`](https://qiita.com/tags/CSSDesign)|1|@akiy2009|\n|[`ADTO`](https://qiita.com/tags/ADTO)|1|@akiy2009|\n|[`AutoDesign`](https://qiita.com/tags/AutoDesign)|1|@akiy2009|\n|[`依存関係地獄`](https://qiita.com/tags/%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E5%9C%B0%E7%8D%84)|1|@GeneLab_999|\n|:warning: [`Nerves,`](https://qiita.com/tags/Nerves%2C)|2|@MickeyOoh|\n|[`PIC16F747`](https://qiita.com/tags/PIC16F747)|1|@y2ru|\n|[`MPLABXIDE`](https://qiita.com/tags/MPLABXIDE)|1|@y2ru|\n|[`ノードスクリプティング`](https://qiita.com/tags/%E3%83%8E%E3%83%BC%E3%83%89%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)|1|@tsune2ne|\n|[`Persistnt`](https://qiita.com/tags/Persistnt)|1|@flathill|\n|[`連打対策`](https://qiita.com/tags/%E9%80%A3%E6%89%93%E5%AF%BE%E7%AD%96)|1|@softbase|\n|[`eza`](https://qiita.com/tags/eza)|1|@msredcomet06|\n|[`モデル設計`](https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%AB%E8%A8%AD%E8%A8%88)|1|@jojo__xxxxx|\n|[`DefenderforContainers`](https://qiita.com/tags/DefenderforContainers)|1|@yama-s|\n|[`TsukinoEventBus`](https://qiita.com/tags/TsukinoEventBus)|1|@tsukino_|\n|[`WGU`](https://qiita.com/tags/WGU)|1|@liligi|\n|[`ReAct-Pattern`](https://qiita.com/tags/ReAct-Pattern)|1|@baku2san|\n|[`CVE-2021-38757`](https://qiita.com/tags/CVE-2021-38757)|1|@nozomi2025|\n\n## 12月17日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`Enabling`](https://qiita.com/tags/Enabling)|1|@future_kame|\n|[`三洋電機`](https://qiita.com/tags/%E4%B8%89%E6%B4%8B%E9%9B%BB%E6%A9%9F)|1|@YuTanakaaa|\n|[`リリース一覧`](https://qiita.com/tags/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7)|1|@mucho243|\n|[`WYSIWD`](https://qiita.com/tags/WYSIWD)|1|@koriym|\n|[`勤怠連絡`](https://qiita.com/tags/%E5%8B%A4%E6%80%A0%E9%80%A3%E7%B5%A1)|1|@hagiwara_akira|\n|[`ENARSI`](https://qiita.com/tags/ENARSI)|1|@ma_dash|\n|[`セルフホスティング`](https://qiita.com/tags/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)|1|@shngmsw|\n|[`ServiceBridge`](https://qiita.com/tags/ServiceBridge)|1|@iamicchan|\n|[`InstanceDataReplication`](https://qiita.com/tags/InstanceDataReplication)|1|@iamicchan|\n|[`IMAPsync`](https://qiita.com/tags/IMAPsync)|1|@You_I|\n|[`オオブジェクト`](https://qiita.com/tags/%E3%82%AA%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)|1|@CodeLeaf|\n|:warning: [`#Airbyte`](https://qiita.com/tags/%23Airbyte)|1|@mellowlaunch|\n|:warning: [`#ELT`](https://qiita.com/tags/%23ELT)|1|@mellowlaunch|\n|[`AccessConnector`](https://qiita.com/tags/AccessConnector)|2|@mellowlaunch|\n|[`NTT技術史料館`](https://qiita.com/tags/NTT%E6%8A%80%E8%A1%93%E5%8F%B2%E6%96%99%E9%A4%A8)|1|@e99h2121|\n|[`民主主義`](https://qiita.com/tags/%E6%B0%91%E4%B8%BB%E4%B8%BB%E7%BE%A9)|1|@Chisho|\n|[`共通フレーム2007`](https://qiita.com/tags/%E5%85%B1%E9%80%9A%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A02007)|1|@teppei19980914|\n|[`共通フレーム2013`](https://qiita.com/tags/%E5%85%B1%E9%80%9A%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A02013)|1|@teppei19980914|\n|[`Slackデータコミュニケーション分析`](https://qiita.com/tags/Slack%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%86%E6%9E%90)|1|@kim_dongock|\n|:warning: [`行動計画,`](https://qiita.com/tags/%E8%A1%8C%E5%8B%95%E8%A8%88%E7%94%BB%2C)|1|@pons_cawaii|\n|:warning: [`ミッション,`](https://qiita.com/tags/%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%2C)|1|@pons_cawaii|\n|[`gpt-image-1.5`](https://qiita.com/tags/gpt-image-1.5)|6|@7mpy, @Peanuts05, @kabumira|\n|[`UIアニメーション`](https://qiita.com/tags/UI%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)|1|@albatrus|\n|[`BinaryNinja`](https://qiita.com/tags/BinaryNinja)|1|@schectman-hell|\n|:warning: [`.agent`](https://qiita.com/tags/.agent)|1|@gurigurico|\n|[`360アプリ`](https://qiita.com/tags/360%E3%82%A2%E3%83%97%E3%83%AA)|1|@eishii|\n|:warning: [`ChromeExtension,`](https://qiita.com/tags/ChromeExtension%2C)|1|@gurigurico|\n|:warning: [`Productivity,`](https://qiita.com/tags/Productivity%2C)|1|@gurigurico|\n|[`Mixboard`](https://qiita.com/tags/Mixboard)|1|@nao_manabitan|\n|[`SECCON14`](https://qiita.com/tags/SECCON14)|1|@Liesegang|\n|:warning: [`#AIコーディング`](https://qiita.com/tags/%23AI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)|1|@NestRec|\n|[`OSSJ`](https://qiita.com/tags/OSSJ)|1|@shu-mutow|\n|[`tiberCAD`](https://qiita.com/tags/tiberCAD)|3|@Takeshi_Baba|\n|[`AIとの対話ログ`](https://qiita.com/tags/AI%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1%E3%83%AD%E3%82%B0)|2|@RyuGotoo|\n|[`DownlinkAPI`](https://qiita.com/tags/DownlinkAPI)|1|@yukataoka|\n|[`継続的テスト`](https://qiita.com/tags/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%86%E3%82%B9%E3%83%88)|1|@rymetry|\n|[`Nutjs`](https://qiita.com/tags/Nutjs)|1|@n0bisuke|\n|[`アウトカム`](https://qiita.com/tags/%E3%82%A2%E3%82%A6%E3%83%88%E3%82%AB%E3%83%A0)|1|@ryo_beppu|\n|[`寝ろ`](https://qiita.com/tags/%E5%AF%9D%E3%82%8D)|1|@zazen_inu|\n|[`SitetoSite`](https://qiita.com/tags/SitetoSite)|1|@air789|\n|[`消費者ホットライン`](https://qiita.com/tags/%E6%B6%88%E8%B2%BB%E8%80%85%E3%83%9B%E3%83%83%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3)|1|@ekzemplaro|\n|[`TanstackAI`](https://qiita.com/tags/TanstackAI)|1|@gorilla_garden|\n|[`PearOS`](https://qiita.com/tags/PearOS)|1|@Kanade147359|\n|:warning: [`#toggle`](https://qiita.com/tags/%23toggle)|1|@hhibara|\n|:warning: [`#projectLINKS`](https://qiita.com/tags/%23projectLINKS)|1|@hhibara|\n|:warning: [`#MLIT`](https://qiita.com/tags/%23MLIT)|1|@hhibara|\n|:warning: [`#つくるAI`](https://qiita.com/tags/%23%E3%81%A4%E3%81%8F%E3%82%8BAI)|1|@hhibara|\n|[`Quickwit`](https://qiita.com/tags/Quickwit)|1|@melktzk|\n|:warning: [`Productionautomationsoftware,`](https://qiita.com/tags/Productionautomationsoftware%2C)|1|@itsybizz|\n|[`automationsoftware`](https://qiita.com/tags/automationsoftware)|1|@itsybizz|\n|[`Vectorpea`](https://qiita.com/tags/Vectorpea)|1|@a-nemo|\n|:warning: [`#内部不正`](https://qiita.com/tags/%23%E5%86%85%E9%83%A8%E4%B8%8D%E6%AD%A3)|1|@yamada_sec|\n|:warning: [`#セキュリティ心理学`](https://qiita.com/tags/%23%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%BF%83%E7%90%86%E5%AD%A6)|2|@yamada_sec|\n|:warning: [`#抑止設計`](https://qiita.com/tags/%23%E6%8A%91%E6%AD%A2%E8%A8%AD%E8%A8%88)|1|@yamada_sec|\n|[`高精度`](https://qiita.com/tags/%E9%AB%98%E7%B2%BE%E5%BA%A6)|1|@nozomi2025|\n|:warning: [`#AIモデリング`](https://qiita.com/tags/%23AI%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0)|1|@Etsuoo|\n|:warning: [`書籍「プログラムを読む技術」`](https://qiita.com/tags/%E6%9B%B8%E7%B1%8D%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%AA%AD%E3%82%80%E6%8A%80%E8%A1%93%E3%80%8D)|1|@lighttobrca|\n|[`tweening`](https://qiita.com/tags/tweening)|1|@malo21st|\n|[`プロダクトサポート`](https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88)|1|@yuyasasaki|\n|[`ネットワーク構成図`](https://qiita.com/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A7%8B%E6%88%90%E5%9B%B3)|1|@to-nagano|\n|[`AIファースト設計`](https://qiita.com/tags/AI%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E8%A8%AD%E8%A8%88)|1|@___nix___|\n|[`設計書の再定義`](https://qiita.com/tags/%E8%A8%AD%E8%A8%88%E6%9B%B8%E3%81%AE%E5%86%8D%E5%AE%9A%E7%BE%A9)|1|@___nix___|\n|[`人間とAIの役割分担`](https://qiita.com/tags/%E4%BA%BA%E9%96%93%E3%81%A8AI%E3%81%AE%E5%BD%B9%E5%89%B2%E5%88%86%E6%8B%85)|1|@___nix___|\n|[`EUCC`](https://qiita.com/tags/EUCC)|1|@satokan3|\n|[`CEA-Leti`](https://qiita.com/tags/CEA-Leti)|1|@satokan3|\n|[`CESTI`](https://qiita.com/tags/CESTI)|1|@satokan3|\n|[`モデナイズ`](https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%8A%E3%82%A4%E3%82%BA)|1|@keitakei777|\n|[`DatabricksAssetBundles`](https://qiita.com/tags/DatabricksAssetBundles)|2|@taka_yayoi|\n|[`UserVoice`](https://qiita.com/tags/UserVoice)|1|@baku2san|\n|[`ダッコフ`](https://qiita.com/tags/%E3%83%80%E3%83%83%E3%82%B3%E3%83%95)|1|@ShiinaNekko|\n|[`モデレーター`](https://qiita.com/tags/%E3%83%A2%E3%83%87%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC)|1|@beajourneyman|\n|[`参加型トークセッション`](https://qiita.com/tags/%E5%8F%82%E5%8A%A0%E5%9E%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3)|1|@beajourneyman|\n|[`魔方陣`](https://qiita.com/tags/%E9%AD%94%E6%96%B9%E9%99%A3)|1|@Joe75792433|\n|[`バックトレース`](https://qiita.com/tags/%E3%83%90%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)|2|@namn1125|\n|[`ICM-42688`](https://qiita.com/tags/ICM-42688)|1|@RamTuckey|\n|[`関西春ロボコン`](https://qiita.com/tags/%E9%96%A2%E8%A5%BF%E6%98%A5%E3%83%AD%E3%83%9C%E3%82%B3%E3%83%B3)|1|@kadoya|\n|[`ろう・難聴者`](https://qiita.com/tags/%E3%82%8D%E3%81%86%E3%83%BB%E9%9B%A3%E8%81%B4%E8%80%85)|1|@fujiemon|\n\n## 12月18日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`GPTImage1.5`](https://qiita.com/tags/GPTImage1.5)|2|@youtoy|\n|[`AIP-C01`](https://qiita.com/tags/AIP-C01)|3|@e52yamada, @ry-harada, @sense_of_unity|\n|[`realtimekit`](https://qiita.com/tags/realtimekit)|3|@toreis|\n|[`ml-sharp`](https://qiita.com/tags/ml-sharp)|1|@kongo-jun|\n|:warning: [`#Axon`](https://qiita.com/tags/%23Axon)|1|@koyo52611798|\n|[`AGENTS.md`](https://qiita.com/tags/AGENTS.md)|1|@kitfactory|\n|[`Skills.md`](https://qiita.com/tags/Skills.md)|2|@autotaker1984, @kitfactory|\n|[`Seafile`](https://qiita.com/tags/Seafile)|1|@niimi_ToB|\n|[`デバイス競合`](https://qiita.com/tags/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E7%AB%B6%E5%90%88)|1|@nisepan_nono|\n|[`Raygun`](https://qiita.com/tags/Raygun)|1|@jsakamoto|\n|[`gemini-3.0-flash`](https://qiita.com/tags/gemini-3.0-flash)|1|@7mpy|\n|:warning: [`#HULFTSquare`](https://qiita.com/tags/%23HULFTSquare)|1|@kyohei_tsuno|\n|[`AP1-C01`](https://qiita.com/tags/AP1-C01)|2|@sense_of_unity, @taro-yamada|\n|[`DNS水責め攻撃`](https://qiita.com/tags/DNS%E6%B0%B4%E8%B2%AC%E3%82%81%E6%94%BB%E6%92%83)|1|@teppei19980914|\n|[`ランダムサブドメイン攻撃`](https://qiita.com/tags/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%B5%E3%83%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E6%94%BB%E6%92%83)|1|@teppei19980914|\n|[`SOAレコード`](https://qiita.com/tags/SOA%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89)|1|@teppei19980914|\n|[`NTAG215`](https://qiita.com/tags/NTAG215)|1|@TakumiSaito|\n|[`NFCForumType2Tag`](https://qiita.com/tags/NFCForumType2Tag)|1|@TakumiSaito|\n|:warning: [`#AIREADI`](https://qiita.com/tags/%23AIREADI)|1|@Pyonaya|\n|[`Web-LLM-attacks`](https://qiita.com/tags/Web-LLM-attacks)|2|@yna020311|\n|[`MUSUBI`](https://qiita.com/tags/MUSUBI)|1|@hisaho|\n|[`DrawMeshInstancedProcedural`](https://qiita.com/tags/DrawMeshInstancedProcedural)|1|@kaki_ice|\n|[`Box認定管理者試験`](https://qiita.com/tags/Box%E8%AA%8D%E5%AE%9A%E7%AE%A1%E7%90%86%E8%80%85%E8%A9%A6%E9%A8%93)|1|@ctc-tm-kobayashi|\n|[`CIP`](https://qiita.com/tags/CIP)|1|@llbxg|\n|:warning: [`OSTからPDFへのコンバーター,`](https://qiita.com/tags/OST%E3%81%8B%E3%82%89PDF%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC%2C)|1|@jackdaniel1990y|\n|:warning: [`ostをpdfに変換,`](https://qiita.com/tags/ost%E3%82%92pdf%E3%81%AB%E5%A4%89%E6%8F%9B%2C)|1|@jackdaniel1990y|\n|[`ostをpdfに変換する`](https://qiita.com/tags/ost%E3%82%92pdf%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)|1|@jackdaniel1990y|\n|[`テストコントロール`](https://qiita.com/tags/%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB)|1|@EgaSaQA|\n|[`営業自動化`](https://qiita.com/tags/%E5%96%B6%E6%A5%AD%E8%87%AA%E5%8B%95%E5%8C%96)|1|@ai_to_chienoakari|\n|[`マーケティング自動化`](https://qiita.com/tags/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E8%87%AA%E5%8B%95%E5%8C%96)|1|@ai_to_chienoakari|\n|[`外部ソース連携`](https://qiita.com/tags/%E5%A4%96%E9%83%A8%E3%82%BD%E3%83%BC%E3%82%B9%E9%80%A3%E6%90%BA)|1|@Kajiita|\n|:warning: [`#Agent365`](https://qiita.com/tags/%23Agent365)|1|@yamada_sec|\n|:warning: [`#車載`](https://qiita.com/tags/%23%E8%BB%8A%E8%BC%89)|1|@tanami|\n|:warning: [`#ロードスター`](https://qiita.com/tags/%23%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B9%E3%82%BF%E3%83%BC)|1|@tanami|\n|:warning: [`#ReverseEngineering`](https://qiita.com/tags/%23ReverseEngineering)|1|@tanami|\n|[`匠Method`](https://qiita.com/tags/%E5%8C%A0Method)|1|@dsol_dtakeuchi|\n|[`インフラエンジニアからSREチームに入って感じたこと`](https://qiita.com/tags/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8B%E3%82%89SRE%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%A6%E6%84%9F%E3%81%98%E3%81%9F%E3%81%93%E3%81%A8)|1|@kawada-masah|\n|[`ゆるデザイン`](https://qiita.com/tags/%E3%82%86%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3)|1|@Ryuki4648|\n|:warning: [`#内部不正対策`](https://qiita.com/tags/%23%E5%86%85%E9%83%A8%E4%B8%8D%E6%AD%A3%E5%AF%BE%E7%AD%96)|1|@yamada_sec|\n|[`securitydashboard`](https://qiita.com/tags/securitydashboard)|1|@kuze_k|\n|[`GeminiPaper`](https://qiita.com/tags/GeminiPaper)|1|@GeminiPaper|\n|[`REST推論`](https://qiita.com/tags/REST%E6%8E%A8%E8%AB%96)|1|@mellowlaunch|\n|[`ゼロから触ってわかった`](https://qiita.com/tags/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E8%A7%A6%E3%81%A3%E3%81%A6%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F)|1|@mellowlaunch|\n|[`シュワルツシルト解`](https://qiita.com/tags/%E3%82%B7%E3%83%A5%E3%83%AF%E3%83%AB%E3%83%84%E3%82%B7%E3%83%AB%E3%83%88%E8%A7%A3)|3|@cosmosnori|\n|[`ネタアプリ`](https://qiita.com/tags/%E3%83%8D%E3%82%BF%E3%82%A2%E3%83%97%E3%83%AA)|1|@easegis|\n|[`オンライン麻雀`](https://qiita.com/tags/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E9%BA%BB%E9%9B%80)|1|@satokan3|\n|[`PDデザイン`](https://qiita.com/tags/PD%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3)|1|@dsk-f|\n|[`アイリスアウト`](https://qiita.com/tags/%E3%82%A2%E3%82%A4%E3%83%AA%E3%82%B9%E3%82%A2%E3%82%A6%E3%83%88)|1|@Tatami0926|\n|[`おわり`](https://qiita.com/tags/%E3%81%8A%E3%82%8F%E3%82%8A)|1|@Tatami0926|\n|[`AIGirlfriend`](https://qiita.com/tags/AIGirlfriend)|1|@sweetdreamai|\n|:warning: [`iRIC,`](https://qiita.com/tags/iRIC%2C)|1|@yasu6888|\n|:warning: [`SRTM,`](https://qiita.com/tags/SRTM%2C)|1|@yasu6888|\n|[`CloudNativePG`](https://qiita.com/tags/CloudNativePG)|1|@YoheiZuho|\n|:warning: [`#自然言語`](https://qiita.com/tags/%23%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E)|1|@chattori|\n|[`迷走`](https://qiita.com/tags/%E8%BF%B7%E8%B5%B0)|1|@Amatarou-SUN|\n|[`単眼深度`](https://qiita.com/tags/%E5%8D%98%E7%9C%BC%E6%B7%B1%E5%BA%A6)|1|@gin_ta24|\n\n## 12月19日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`フレーム補完`](https://qiita.com/tags/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E8%A3%9C%E5%AE%8C)|1|@GeneLab_999|\n|[`PhraseSet`](https://qiita.com/tags/PhraseSet)|1|@kuct|\n|[`ESP_NOW`](https://qiita.com/tags/ESP_NOW)|2|@bit2rock|\n|[`AIforScience`](https://qiita.com/tags/AIforScience)|2|@hisaho|\n|[`ダメです`](https://qiita.com/tags/%E3%83%80%E3%83%A1%E3%81%A7%E3%81%99)|1|@toyboot4e|\n|[`AI運用`](https://qiita.com/tags/AI%E9%81%8B%E7%94%A8)|1|@mellowlaunch|\n|[`ドーマー条件`](https://qiita.com/tags/%E3%83%89%E3%83%BC%E3%83%9E%E3%83%BC%E6%9D%A1%E4%BB%B6)|1|@hosshuru|\n|[`国債`](https://qiita.com/tags/%E5%9B%BD%E5%82%B5)|1|@hosshuru|\n|[`財政`](https://qiita.com/tags/%E8%B2%A1%E6%94%BF)|1|@hosshuru|\n|[`グレーボックステスト`](https://qiita.com/tags/%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88)|1|@errguess40|\n|[`プライド反応`](https://qiita.com/tags/%E3%83%97%E3%83%A9%E3%82%A4%E3%83%89%E5%8F%8D%E5%BF%9C)|1|@J_Cotan|\n|[`gpt-5.2-codex`](https://qiita.com/tags/gpt-5.2-codex)|1|@user19|\n|[`視点変更`](https://qiita.com/tags/%E8%A6%96%E7%82%B9%E5%A4%89%E6%9B%B4)|1|@nonikeno|\n|[`名前付きステージ`](https://qiita.com/tags/%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8)|1|@coco_co|\n|[`qTest`](https://qiita.com/tags/qTest)|1|@Syahu_Writer|\n|[`レンタルGO`](https://qiita.com/tags/%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%ABGO)|1|@yu_kamioka|\n|[`退職D進`](https://qiita.com/tags/%E9%80%80%E8%81%B7D%E9%80%B2)|1|@market_fy|\n|[`受験体験記`](https://qiita.com/tags/%E5%8F%97%E9%A8%93%E4%BD%93%E9%A8%93%E8%A8%98)|1|@market_fy|\n|[`Data360`](https://qiita.com/tags/Data360)|1|@hrk623|\n|[`ConnectApi`](https://qiita.com/tags/ConnectApi)|1|@hrk623|\n|:warning: [`#vscsi`](https://qiita.com/tags/%23vscsi)|1|@M_XD|\n|:warning: [`#vios`](https://qiita.com/tags/%23vios)|1|@M_XD|\n|:warning: [`#PowerVM`](https://qiita.com/tags/%23PowerVM)|1|@M_XD|\n|[`ハンググライダー`](https://qiita.com/tags/%E3%83%8F%E3%83%B3%E3%82%B0%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%80%E3%83%BC)|1|@mkc1370|\n|[`スカイスポーツ`](https://qiita.com/tags/%E3%82%B9%E3%82%AB%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84)|1|@mkc1370|\n|[`RPATest`](https://qiita.com/tags/RPATest)|1|@Jun96427231|\n|[`ImageOptimization`](https://qiita.com/tags/ImageOptimization)|1|@miyaaa|\n|[`Superpipe`](https://qiita.com/tags/Superpipe)|1|@nickqinsc|\n|[`ソフトウェアデザインパターン`](https://qiita.com/tags/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)|1|@teppei19980914|\n|[`Map-anything`](https://qiita.com/tags/Map-anything)|2|@syun88|\n|[`pg_cron`](https://qiita.com/tags/pg_cron)|1|@meto|\n|[`Depth-Anything-V2`](https://qiita.com/tags/Depth-Anything-V2)|1|@rotarymars|\n|[`福岡会場`](https://qiita.com/tags/%E7%A6%8F%E5%B2%A1%E4%BC%9A%E5%A0%B4)|3|@nagase_m, @plateau-academy, @t-watanabe-tgt|\n|[`PLATEAUアカデミー福岡会場`](https://qiita.com/tags/PLATEAU%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC%E7%A6%8F%E5%B2%A1%E4%BC%9A%E5%A0%B4)|2|@TT221, @f13897pwnog|\n|[`JigsAndFixtures`](https://qiita.com/tags/JigsAndFixtures)|1|@yicenprecision|\n|[`CustomTooling`](https://qiita.com/tags/CustomTooling)|1|@yicenprecision|\n|[`GBStudio`](https://qiita.com/tags/GBStudio)|1|@rom1000_onigiri|\n|[`Agent365`](https://qiita.com/tags/Agent365)|1|@eyepyon|\n|[`ignite2025`](https://qiita.com/tags/ignite2025)|1|@eyepyon|\n|[`真正性`](https://qiita.com/tags/%E7%9C%9F%E6%AD%A3%E6%80%A7)|1|@lemiyachi|\n|[`本人性`](https://qiita.com/tags/%E6%9C%AC%E4%BA%BA%E6%80%A7)|1|@lemiyachi|\n|[`LamoToolsSet`](https://qiita.com/tags/LamoToolsSet)|1|@lamo-shibata|\n|[`プリザンター運用`](https://qiita.com/tags/%E3%83%97%E3%83%AA%E3%82%B6%E3%83%B3%E3%82%BF%E3%83%BC%E9%81%8B%E7%94%A8)|1|@lamo-shibata|\n|[`ポストトーテム`](https://qiita.com/tags/%E3%83%9D%E3%82%B9%E3%83%88%E3%83%88%E3%83%BC%E3%83%86%E3%83%A0)|1|@Tagomori0211|\n|[`GPU支援`](https://qiita.com/tags/GPU%E6%94%AF%E6%8F%B4)|1|@walterkammi|\n|[`モダナイズ開発`](https://qiita.com/tags/%E3%83%A2%E3%83%80%E3%83%8A%E3%82%A4%E3%82%BA%E9%96%8B%E7%99%BA)|1|@kojiro8977230|\n|[`SCITT`](https://qiita.com/tags/SCITT)|1|@tetsuko_room|\n|[`金融技術`](https://qiita.com/tags/%E9%87%91%E8%9E%8D%E6%8A%80%E8%A1%93)|1|@tetsuko_room|\n|[`COBYLA`](https://qiita.com/tags/COBYLA)|1|@TaiyoYamada|\n|[`マトリクスコード認証`](https://qiita.com/tags/%E3%83%9E%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E8%AA%8D%E8%A8%BC)|1|@teppei19980914|\n|[`EPSONTMPrintAssistant`](https://qiita.com/tags/EPSONTMPrintAssistant)|1|@nack0204|\n|[`逆引きリファレンス`](https://qiita.com/tags/%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)|1|@super_ucchi|\n|[`AI学会`](https://qiita.com/tags/AI%E5%AD%A6%E4%BC%9A)|1|@Taito_Murakami|\n\n## 12月20日\n\n|タグ|記事数|利用者|\n|:---|:---:|:---|\n|[`テストアスペクト`](https://qiita.com/tags/%E3%83%86%E3%82%B9%E3%83%88%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88)|1|@EgaSaQA|\n|[`NotionCalendar`](https://qiita.com/tags/NotionCalendar)|1|@ycookiey|\n|[`Oxlint`](https://qiita.com/tags/Oxlint)|1|@oekazuma|\n|[`グレシャム`](https://qiita.com/tags/%E3%82%B0%E3%83%AC%E3%82%B7%E3%83%A3%E3%83%A0)|1|@zazen_inu|\n|[`表記揺れ`](https://qiita.com/tags/%E8%A1%A8%E8%A8%98%E6%8F%BA%E3%82%8C)|1|@masato_y|\n|[`Kathara`](https://qiita.com/tags/Kathara)|1|@uedaeita|\n|[`MediaEngine`](https://qiita.com/tags/MediaEngine)|1|@GeneLab_999|\n|[`NeuralEngine`](https://qiita.com/tags/NeuralEngine)|1|@GeneLab_999|\n|[`SMT-LIB`](https://qiita.com/tags/SMT-LIB)|1|@nbsat|\n|[`Torizon`](https://qiita.com/tags/Torizon)|1|@hermit4|\n|[`AIではなく人間が書いています`](https://qiita.com/tags/AI%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%BA%BA%E9%96%93%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99)|1|@tongararin|\n|[`ゲノム関係行列`](https://qiita.com/tags/%E3%82%B2%E3%83%8E%E3%83%A0%E9%96%A2%E4%BF%82%E8%A1%8C%E5%88%97)|2|@KimuraSoh|\n|[`キノコラリー`](https://qiita.com/tags/%E3%82%AD%E3%83%8E%E3%82%B3%E3%83%A9%E3%83%AA%E3%83%BC)|1|@h2m_kinoko|\n|:warning: [`#ユーザー会`](https://qiita.com/tags/%23%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BC%9A)|1|@nekonekoRPA|\n|[`peephole最適化`](https://qiita.com/tags/peephole%E6%9C%80%E9%81%A9%E5%8C%96)|1|@h_sakurai|\n|[`autosetup`](https://qiita.com/tags/autosetup)|1|@tkxlab|\n|[`gemini3.0pro`](https://qiita.com/tags/gemini3.0pro)|1|@youtoy|\n|[`FunctionGemma`](https://qiita.com/tags/FunctionGemma)|1|@levol|\n|[`コミュニケーションデザイナー`](https://qiita.com/tags/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC)|1|@noriko_yashiki|\n|:warning: [`#ASR`](https://qiita.com/tags/%23ASR)|1|@Rsm-Microstate|\n|[`多リージョン`](https://qiita.com/tags/%E5%A4%9A%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)|1|@mkydk|\n|:warning: [`#BFF`](https://qiita.com/tags/%23BFF)|1|@Usui_keiyu|\n|[`PyInstalle`](https://qiita.com/tags/PyInstalle)|1|@cae_python|\n|:warning: [`#俳句`](https://qiita.com/tags/%23%E4%BF%B3%E5%8F%A5)|1|@shunya_okumura|\n|[`実験的思考`](https://qiita.com/tags/%E5%AE%9F%E9%A8%93%E7%9A%84%E6%80%9D%E8%80%83)|1|@test_tarou|\n|[`fail-fast`](https://qiita.com/tags/fail-fast)|1|@arika1125|\n|[`mailserver`](https://qiita.com/tags/mailserver)|1|@takoyakidath|\n|[`IBMSemeruRuntime`](https://qiita.com/tags/IBMSemeruRuntime)|1|@TSA2019|\n|:warning: [`Song,`](https://qiita.com/tags/Song%2C)|1|@aisonggenerator|\n|[`UIScript`](https://qiita.com/tags/UIScript)|1|@mototoke|\n|[`PtWAVE`](https://qiita.com/tags/PtWAVE)|1|@Algo_Lighter|\n|[`プラチナバイオ`](https://qiita.com/tags/%E3%83%97%E3%83%A9%E3%83%81%E3%83%8A%E3%83%90%E3%82%A4%E3%82%AA)|1|@Algo_Lighter|\n|[`編集確認ソフト`](https://qiita.com/tags/%E7%B7%A8%E9%9B%86%E7%A2%BA%E8%AA%8D%E3%82%BD%E3%83%95%E3%83%88)|1|@Algo_Lighter|\n|[`sqlite-data`](https://qiita.com/tags/sqlite-data)|1|@suffle8422|\n|[`point-free`](https://qiita.com/tags/point-free)|1|@suffle8422|\n|[`ChaosDestruction`](https://qiita.com/tags/ChaosDestruction)|1|@mintiatian|\n|[`タル`](https://qiita.com/tags/%E3%82%BF%E3%83%AB)|1|@mintiatian|\n|[`内部API`](https://qiita.com/tags/%E5%86%85%E9%83%A8API)|1|@ktdatascience|\n|[`ライブスクリプト`](https://qiita.com/tags/%E3%83%A9%E3%82%A4%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)|1|@cafe_on_the|\n|[`HS2008`](https://qiita.com/tags/HS2008)|3|@Trubetzkoy|\n|[`ExternalObjects`](https://qiita.com/tags/ExternalObjects)|1|@cattleya96|\n|[`共進化`](https://qiita.com/tags/%E5%85%B1%E9%80%B2%E5%8C%96)|1|@yuu-henjin|\n|[`住宅ip`](https://qiita.com/tags/%E4%BD%8F%E5%AE%85ip)|1|@zhangz941225|\n|[`住宅IPプロキシ`](https://qiita.com/tags/%E4%BD%8F%E5%AE%85IP%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)|1|@zhangz941225|\n|[`会話ログ駆動開発`](https://qiita.com/tags/%E4%BC%9A%E8%A9%B1%E3%83%AD%E3%82%B0%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)|1|@basio|\n|[`LLM-as-a-Judge`](https://qiita.com/tags/LLM-as-a-Judge)|1|@hiyoko1729|\n|[`HARKing`](https://qiita.com/tags/HARKing)|1|@making111|\n|[`scroll-snap-align`](https://qiita.com/tags/scroll-snap-align)|1|@ktrk2002|\n|[`スマホ新法`](https://qiita.com/tags/%E3%82%B9%E3%83%9E%E3%83%9B%E6%96%B0%E6%B3%95)|1|@wadawd|\n|:warning: [`#広島のポケモン`](https://qiita.com/tags/%23%E5%BA%83%E5%B3%B6%E3%81%AE%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3)|2|@hiroshimanopockmon|\n|[`PHP8.2.4`](https://qiita.com/tags/PHP8.2.4)|1|@pig_buhi555|\n|[`eclipse2025`](https://qiita.com/tags/eclipse2025)|1|@SKY-HaYaTo|\n|[`Narrowing`](https://qiita.com/tags/Narrowing)|1|@only|\n|[`Untitled`](https://qiita.com/tags/Untitled)|1|@masa_code|\n|[`ABC437`](https://qiita.com/tags/ABC437)|5|@TThaskboy, @iastm, @meel_tech, @omakasessan|\n|[`関数擬似クラス`](https://qiita.com/tags/%E9%96%A2%E6%95%B0%E6%93%AC%E4%BC%BC%E3%82%AF%E3%83%A9%E3%82%B9)|1|@ktrk2002|\n|[`維持管理案件`](https://qiita.com/tags/%E7%B6%AD%E6%8C%81%E7%AE%A1%E7%90%86%E6%A1%88%E4%BB%B6)|1|@yoshiki_sysi|\n|[`MultimodalUniverse`](https://qiita.com/tags/MultimodalUniverse)|1|@tozastation|\n|[`ラベル管理`](https://qiita.com/tags/%E3%83%A9%E3%83%99%E3%83%AB%E7%AE%A1%E7%90%86)|1|@tzp|\n\n## 記事数0のタグ\n\n- [`,Cloths,Press`](https://qiita.com/tags/%2CCloths%2CPress), [`,electron,`](https://qiita.com/tags/%2Celectron%2C)\n- [`#??`](https://qiita.com/tags/%23%3F%3F)\n- [`#ADUConstruction`](https://qiita.com/tags/%23ADUConstruction), [`#AffordableDentist`](https://qiita.com/tags/%23AffordableDentist), [`#AGas`](https://qiita.com/tags/%23AGas), [`#anime,`](https://qiita.com/tags/%23anime%2C), [`#anime3d`](https://qiita.com/tags/%23anime3d), [`#animevietsub,`](https://qiita.com/tags/%23animevietsub%2C), [`#animevietsub3d,`](https://qiita.com/tags/%23animevietsub3d%2C), [`#banmo`](https://qiita.com/tags/%23banmo), [`#BayAreaBuilders`](https://qiita.com/tags/%23BayAreaBuilders), [`#BinanceClone,`](https://qiita.com/tags/%23BinanceClone%2C), [`#CryptoExchangeScript,`](https://qiita.com/tags/%23CryptoExchangeScript%2C), [`#CryptoTradingPlatform`](https://qiita.com/tags/%23CryptoTradingPlatform), [`#daomodien`](https://qiita.com/tags/%23daomodien), [`#DentistNearYou`](https://qiita.com/tags/%23DentistNearYou), [`#EdmontonDentalClinic`](https://qiita.com/tags/%23EdmontonDentalClinic), [`#ESA`](https://qiita.com/tags/%23ESA), [`#FamilyDentistEdmonton`](https://qiita.com/tags/%23FamilyDentistEdmonton), [`#GasDầukhí,`](https://qiita.com/tags/%23GasD%E1%BA%A7ukh%C3%AD%2C), [`#GasSouth,`](https://qiita.com/tags/%23GasSouth%2C), [`#GeneralDentistryEdmonton`](https://qiita.com/tags/%23GeneralDentistryEdmonton), [`#HeatSign`](https://qiita.com/tags/%23HeatSign), [`#HomeRemodeling`](https://qiita.com/tags/%23HomeRemodeling), [`#HomeRenovation`](https://qiita.com/tags/%23HomeRenovation), [`#HybridExchange`](https://qiita.com/tags/%23HybridExchange), [`#LaserEngraving`](https://qiita.com/tags/%23LaserEngraving), [`#LearnNumerologyOnline`](https://qiita.com/tags/%23LearnNumerologyOnline), [`#Linuxディストリビューション`](https://qiita.com/tags/%23Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3), [`#LiteLLM`](https://qiita.com/tags/%23LiteLLM), [`#Lumidex`](https://qiita.com/tags/%23Lumidex), [`#ManufacturingTech`](https://qiita.com/tags/%23ManufacturingTech), [`#maysoctim`](https://qiita.com/tags/%23maysoctim), [`#meditop`](https://qiita.com/tags/%23meditop), [`#monitor`](https://qiita.com/tags/%23monitor), [`#Numerology`](https://qiita.com/tags/%23Numerology), [`#ParrotOS`](https://qiita.com/tags/%23ParrotOS), [`#PGS,`](https://qiita.com/tags/%23PGS%2C), [`#remover`](https://qiita.com/tags/%23remover), [`#RK`](https://qiita.com/tags/%23RK), [`#SEALPROPERTIES`](https://qiita.com/tags/%23SEALPROPERTIES), [`#solarpanels`](https://qiita.com/tags/%23solarpanels), [`#Tails`](https://qiita.com/tags/%23Tails), [`#thegioithungrac`](https://qiita.com/tags/%23thegioithungrac), [`#thietbijbaoholaodong`](https://qiita.com/tags/%23thietbijbaoholaodong), [`#trendings`](https://qiita.com/tags/%23trendings), [`#vanchuyenkhithiennhienhoalong`](https://qiita.com/tags/%23vanchuyenkhithiennhienhoalong), [`#VastuShastra`](https://qiita.com/tags/%23VastuShastra), [`#vioc`](https://qiita.com/tags/%23vioc), [`#VTGas,`](https://qiita.com/tags/%23VTGas%2C), [`#VTGas`](https://qiita.com/tags/%23VTGas), [`#watermark`](https://qiita.com/tags/%23watermark), [`#xemphimanime,`](https://qiita.com/tags/%23xemphimanime%2C), [`#xuhuong`](https://qiita.com/tags/%23xuhuong)\n- [`#アプリ制作`](https://qiita.com/tags/%23%E3%82%A2%E3%83%97%E3%83%AA%E5%88%B6%E4%BD%9C), [`#キャッチアップ`](https://qiita.com/tags/%23%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%A2%E3%83%83%E3%83%97), [`#モデル比較`](https://qiita.com/tags/%23%E3%83%A2%E3%83%87%E3%83%AB%E6%AF%94%E8%BC%83)\n- [`#中途入社`](https://qiita.com/tags/%23%E4%B8%AD%E9%80%94%E5%85%A5%E7%A4%BE), [`#品川会`](https://qiita.com/tags/%23%E5%93%81%E5%B7%9D%E4%BC%9A), [`#未来予測`](https://qiita.com/tags/%23%E6%9C%AA%E6%9D%A5%E4%BA%88%E6%B8%AC)\n- [`135236`](https://qiita.com/tags/135236), [`3DExperience`](https://qiita.com/tags/3DExperience)\n- [`AccurateShuttle`](https://qiita.com/tags/AccurateShuttle), [`AdCP`](https://qiita.com/tags/AdCP), [`AgentforceScript`](https://qiita.com/tags/AgentforceScript), [`AIsecurity`](https://qiita.com/tags/AIsecurity), [`Aitl`](https://qiita.com/tags/Aitl), [`AIで簡単に写真編集ができる！`](https://qiita.com/tags/AI%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E5%86%99%E7%9C%9F%E7%B7%A8%E9%9B%86%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%EF%BC%81), [`AIを活用したネットワーク製品のご紹介`](https://qiita.com/tags/AI%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A3%BD%E5%93%81%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B), [`AI校正`](https://qiita.com/tags/AI%E6%A0%A1%E6%AD%A3), [`autoclaves`](https://qiita.com/tags/autoclaves), [`AX5400`](https://qiita.com/tags/AX5400), [`BadApple!!`](https://qiita.com/tags/BadApple%21%21), [`banding`](https://qiita.com/tags/banding), [`BESTIFTARMEAL`](https://qiita.com/tags/BESTIFTARMEAL), [`bioassay`](https://qiita.com/tags/bioassay), [`Blown`](https://qiita.com/tags/Blown), [`Boosts`](https://qiita.com/tags/Boosts), [`Bss`](https://qiita.com/tags/Bss), [`busices`](https://qiita.com/tags/busices), [`cardamomessentialoil`](https://qiita.com/tags/cardamomessentialoil), [`cardamomoil`](https://qiita.com/tags/cardamomoil), [`CGBN`](https://qiita.com/tags/CGBN), [`Chatgpt-5.2`](https://qiita.com/tags/Chatgpt-5.2), [`CitiBank`](https://qiita.com/tags/CitiBank), [`Comet,`](https://qiita.com/tags/Comet%2C), [`compareunlistedzone`](https://qiita.com/tags/compareunlistedzone), [`Comprare`](https://qiita.com/tags/Comprare), [`corporatelegalservices`](https://qiita.com/tags/corporatelegalservices), [`corteva`](https://qiita.com/tags/corteva), [`cost,hr`](https://qiita.com/tags/cost%2Chr), [`CP93`](https://qiita.com/tags/CP93), [`culvert`](https://qiita.com/tags/culvert), [`delistedstock`](https://qiita.com/tags/delistedstock), [`DesktopFlow`](https://qiita.com/tags/DesktopFlow), [`dienmattroi`](https://qiita.com/tags/dienmattroi), [`diodo`](https://qiita.com/tags/diodo), [`Dirbato`](https://qiita.com/tags/Dirbato), [`Disnana`](https://qiita.com/tags/Disnana), [`DualSenseExplorer`](https://qiita.com/tags/DualSenseExplorer), [`dwdwd`](https://qiita.com/tags/dwdwd), [`dwdwdw`](https://qiita.com/tags/dwdwdw), [`EB3`](https://qiita.com/tags/EB3), [`EB5`](https://qiita.com/tags/EB5), [`ElbowReplacementSurgery`](https://qiita.com/tags/ElbowReplacementSurgery), [`ElectricVehicleChargers`](https://qiita.com/tags/ElectricVehicleChargers), [`EliveraGroup`](https://qiita.com/tags/EliveraGroup), [`Engraving`](https://qiita.com/tags/Engraving), [`EVChargerCompany`](https://qiita.com/tags/EVChargerCompany), [`EVChargerManufacturer`](https://qiita.com/tags/EVChargerManufacturer), [`F61BMD`](https://qiita.com/tags/F61BMD), [`factory,`](https://qiita.com/tags/factory%2C), [`Flows`](https://qiita.com/tags/Flows), [`Flux2.free`](https://qiita.com/tags/Flux2.free), [`Fluxim製品`](https://qiita.com/tags/Fluxim%E8%A3%BD%E5%93%81), [`FPGFA`](https://qiita.com/tags/FPGFA), [`FreelancingCourse`](https://qiita.com/tags/FreelancingCourse), [`GDTF`](https://qiita.com/tags/GDTF), [`GO解析,`](https://qiita.com/tags/GO%E8%A7%A3%E6%9E%90%2C), [`Greencard`](https://qiita.com/tags/Greencard), [`HBM`](https://qiita.com/tags/HBM), [`HealthySmile`](https://qiita.com/tags/HealthySmile), [`HighVolumeEmail`](https://qiita.com/tags/HighVolumeEmail), [`HoangCuong`](https://qiita.com/tags/HoangCuong), [`HomeEVCharger`](https://qiita.com/tags/HomeEVCharger), [`Homewares`](https://qiita.com/tags/Homewares), [`Iftar,`](https://qiita.com/tags/Iftar%2C), [`ImageOptimization,`](https://qiita.com/tags/ImageOptimization%2C), [`India,HRM`](https://qiita.com/tags/India%2CHRM), [`IndustrialMarking`](https://qiita.com/tags/IndustrialMarking), [`Intech`](https://qiita.com/tags/Intech), [`Java22,`](https://qiita.com/tags/Java22%2C), [`Java23,`](https://qiita.com/tags/Java23%2C), [`Java24,`](https://qiita.com/tags/Java24%2C), [`jl7`](https://qiita.com/tags/jl7), [`Khachhang`](https://qiita.com/tags/Khachhang), [`KVM,Linux`](https://qiita.com/tags/KVM%2CLinux), [`Lakeland`](https://qiita.com/tags/Lakeland), [`LANAP`](https://qiita.com/tags/LANAP), [`landscaper`](https://qiita.com/tags/landscaper), [`Litos`](https://qiita.com/tags/Litos), [`MA3`](https://qiita.com/tags/MA3), [`mayhanmiengtui`](https://qiita.com/tags/mayhanmiengtui), [`miniature`](https://qiita.com/tags/miniature), [`Muasam`](https://qiita.com/tags/Muasam), [`mutualfundsoftwareinindia,`](https://qiita.com/tags/mutualfundsoftwareinindia%2C), [`NanoBanana2`](https://qiita.com/tags/NanoBanana2), [`netflowinternal`](https://qiita.com/tags/netflowinternal), [`noai`](https://qiita.com/tags/noai), [`Notion,`](https://qiita.com/tags/Notion%2C), [`NutritionArmy`](https://qiita.com/tags/NutritionArmy), [`obg社内共有`](https://qiita.com/tags/obg%E7%A4%BE%E5%86%85%E5%85%B1%E6%9C%89), [`optimalfilter`](https://qiita.com/tags/optimalfilter), [`oraclefusionscm`](https://qiita.com/tags/oraclefusionscm), [`OralHygiene`](https://qiita.com/tags/OralHygiene), [`ordre`](https://qiita.com/tags/ordre), [`penwrt`](https://qiita.com/tags/penwrt), [`Periodontist,`](https://qiita.com/tags/Periodontist%2C), [`PiPico`](https://qiita.com/tags/PiPico), [`PL／SQL`](https://qiita.com/tags/PL%EF%BC%8FSQL), [`Plasterers`](https://qiita.com/tags/Plasterers), [`Podlora`](https://qiita.com/tags/Podlora), [`porcleain`](https://qiita.com/tags/porcleain), [`portacabin`](https://qiita.com/tags/portacabin), [`Price,best`](https://qiita.com/tags/Price%2Cbest), [`Print-on-Demand`](https://qiita.com/tags/Print-on-Demand), [`probate`](https://qiita.com/tags/probate), [`Prolotherapy`](https://qiita.com/tags/Prolotherapy), [`ps5.js`](https://qiita.com/tags/ps5.js), [`R,edgeR,`](https://qiita.com/tags/R%2CedgeR%2C), [`Raju@3242!Raju@3242!Raju@3242!`](https://qiita.com/tags/Raju%403242%21Raju%403242%21Raju%403242%21), [`rangefinder`](https://qiita.com/tags/rangefinder), [`Ray-ban`](https://qiita.com/tags/Ray-ban), [`Rayban-Meta`](https://qiita.com/tags/Rayban-Meta), [`receta`](https://qiita.com/tags/receta), [`Relic,APM,データ量削減,コスト削減`](https://qiita.com/tags/Relic%2CAPM%2C%E3%83%87%E3%83%BC%E3%82%BF%E9%87%8F%E5%89%8A%E6%B8%9B%2C%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B), [`Responsibility`](https://qiita.com/tags/Responsibility), [`ricetta`](https://qiita.com/tags/ricetta), [`Risala`](https://qiita.com/tags/Risala), [`RNA-Sea,`](https://qiita.com/tags/RNA-Sea%2C), [`RNA-Seq,`](https://qiita.com/tags/RNA-Seq%2C), [`RoboticFloorCleaner`](https://qiita.com/tags/RoboticFloorCleaner), [`RoboticFloorCleaners`](https://qiita.com/tags/RoboticFloorCleaners), [`RSPL`](https://qiita.com/tags/RSPL), [`Ruffled`](https://qiita.com/tags/Ruffled), [`RunbookAutomation`](https://qiita.com/tags/RunbookAutomation), [`senza`](https://qiita.com/tags/senza), [`setlist.fm`](https://qiita.com/tags/setlist.fm), [`Smartly`](https://qiita.com/tags/Smartly), [`Software,best`](https://qiita.com/tags/Software%2Cbest), [`software,Payroll`](https://qiita.com/tags/software%2CPayroll), [`spicypy`](https://qiita.com/tags/spicypy), [`Spreading`](https://qiita.com/tags/Spreading), [`stackable`](https://qiita.com/tags/stackable), [`stackableplasticpalletsDubai,`](https://qiita.com/tags/stackableplasticpalletsDubai%2C), [`stackableplasticpalletsDubai`](https://qiita.com/tags/stackableplasticpalletsDubai), [`Stansted`](https://qiita.com/tags/Stansted), [`Summertimesaga`](https://qiita.com/tags/Summertimesaga), [`Summertimesagaapk`](https://qiita.com/tags/Summertimesagaapk), [`TDGL`](https://qiita.com/tags/TDGL), [`texasestimate`](https://qiita.com/tags/texasestimate), [`thuocbaovethucvat`](https://qiita.com/tags/thuocbaovethucvat), [`thuocdetco`](https://qiita.com/tags/thuocdetco), [`Tieudung`](https://qiita.com/tags/Tieudung), [`tp-li`](https://qiita.com/tags/tp-li), [`TransitionEdgeSensors`](https://qiita.com/tags/TransitionEdgeSensors), [`Traycer`](https://qiita.com/tags/Traycer), [`TripLink`](https://qiita.com/tags/TripLink), [`trocco,UX`](https://qiita.com/tags/trocco%2CUX), [`unlistedshare`](https://qiita.com/tags/unlistedshare), [`unlistedzone`](https://qiita.com/tags/unlistedzone), [`uying`](https://qiita.com/tags/uying), [`vidalyn`](https://qiita.com/tags/vidalyn), [`Vyas`](https://qiita.com/tags/Vyas), [`WaterviewNursing`](https://qiita.com/tags/WaterviewNursing), [`webdevelopmentaffordable,`](https://qiita.com/tags/webdevelopmentaffordable%2C), [`XGS`](https://qiita.com/tags/XGS), [`XGSPON`](https://qiita.com/tags/XGSPON), [`Zhengjiu`](https://qiita.com/tags/Zhengjiu)\n- [`アプリ申請,`](https://qiita.com/tags/%E3%82%A2%E3%83%97%E3%83%AA%E7%94%B3%E8%AB%8B%2C), [`カスタマーサポート,CS,上流工程`](https://qiita.com/tags/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%2CCS%2C%E4%B8%8A%E6%B5%81%E5%B7%A5%E7%A8%8B), [`けいさん名人`](https://qiita.com/tags/%E3%81%91%E3%81%84%E3%81%95%E3%82%93%E5%90%8D%E4%BA%BA), [`これから見たいやつ`](https://qiita.com/tags/%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%9F%E3%81%84%E3%82%84%E3%81%A4), [`だだっこぱんだ`](https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0), [`だだっこぱんださんのRVC`](https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC), [`だだっこぱんださんのRVCWebUI`](https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVCWebUI), [`だだっこぱんださんのRVCのWebUI`](https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC%E3%81%AEWebUI), [`だだっこぱんださんのRVCのWebUIをインストールしたい`](https://qiita.com/tags/%E3%81%A0%E3%81%A0%E3%81%A3%E3%81%93%E3%81%B1%E3%82%93%E3%81%A0%E3%81%95%E3%82%93%E3%81%AERVC%E3%81%AEWebUI%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%81%84), [`ドァだあwd`](https://qiita.com/tags/%E3%83%89%E3%82%A1%E3%81%A0%E3%81%82wd), [`ドキュメント型`](https://qiita.com/tags/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E5%9E%8B), [`パラレル`](https://qiita.com/tags/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB), [`パラレル接続`](https://qiita.com/tags/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E6%8E%A5%E7%B6%9A), [`フリーランスに`](https://qiita.com/tags/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%AB), [`プロンプトコマンド`](https://qiita.com/tags/%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89), [`ペーパーバック`](https://qiita.com/tags/%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF), [`レガシーマイグレーション`](https://qiita.com/tags/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3), [`レクリエーション`](https://qiita.com/tags/%E3%83%AC%E3%82%AF%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)\n- [`格安航空券`](https://qiita.com/tags/%E6%A0%BC%E5%AE%89%E8%88%AA%E7%A9%BA%E5%88%B8), [`魚眼カメラ`](https://qiita.com/tags/%E9%AD%9A%E7%9C%BC%E3%82%AB%E3%83%A1%E3%83%A9), [`言語学,`](https://qiita.com/tags/%E8%A8%80%E8%AA%9E%E5%AD%A6%2C), [`個人開個人`](https://qiita.com/tags/%E5%80%8B%E4%BA%BA%E9%96%8B%E5%80%8B%E4%BA%BA), [`工学実験`](https://qiita.com/tags/%E5%B7%A5%E5%AD%A6%E5%AE%9F%E9%A8%93), [`市民開発`](https://qiita.com/tags/%E5%B8%82%E6%B0%91%E9%96%8B%E7%99%BA), [`書籍「プログラムを読む技術」コードリーディング`](https://qiita.com/tags/%E6%9B%B8%E7%B1%8D%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%AA%AD%E3%82%80%E6%8A%80%E8%A1%93%E3%80%8D%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0), [`職場実習`](https://qiita.com/tags/%E8%81%B7%E5%A0%B4%E5%AE%9F%E7%BF%92), [`多重検定`](https://qiita.com/tags/%E5%A4%9A%E9%87%8D%E6%A4%9C%E5%AE%9A), [`同位体`](https://qiita.com/tags/%E5%90%8C%E4%BD%8D%E4%BD%93), [`日本語コード`](https://qiita.com/tags/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89)\n- [`الحاير`](https://qiita.com/tags/%D8%A7%D9%84%D8%AD%D8%A7%D9%8A%D8%B1), [`الحمدانية`](https://qiita.com/tags/%D8%A7%D9%84%D8%AD%D9%85%D8%AF%D8%A7%D9%86%D9%8A%D8%A9), [`بالرياض,,`](https://qiita.com/tags/%D8%A8%D8%A7%D9%84%D8%B1%D9%8A%D8%A7%D8%B6%2C%2C), [`تشليح`](https://qiita.com/tags/%D8%AA%D8%B4%D9%84%D9%8A%D8%AD)\n- [`다낭카지노`](https://qiita.com/tags/%EB%8B%A4%EB%82%AD%EC%B9%B4%EC%A7%80%EB%85%B8), [`베트남카지노`](https://qiita.com/tags/%EB%B2%A0%ED%8A%B8%EB%82%A8%EC%B9%B4%EC%A7%80%EB%85%B8), [`베트남카지노추천`](https://qiita.com/tags/%EB%B2%A0%ED%8A%B8%EB%82%A8%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C), [`하노이카지노`](https://qiita.com/tags/%ED%95%98%EB%85%B8%EC%9D%B4%EC%B9%B4%EC%A7%80%EB%85%B8), [`호치민카지노`](https://qiita.com/tags/%ED%98%B8%EC%B9%98%EB%AF%BC%EC%B9%B4%EC%A7%80%EB%85%B8)\n","coediting":false,"comments_count":0,"created_at":"2025-12-23T13:04:43+09:00","group":null,"id":"9a2155679b70101ae52e","likes_count":0,"private":false,"reactions_count":0,"stocks_count":1,"tags":[{"name":"Qiita","versions":[]}],"title":"Qiita新規作成タグレポート（2025/12/14 - 20）","updated_at":"2025-12-23T13:04:43+09:00","url":"https://qiita.com/nkay/items/9a2155679b70101ae52e","user":{"description":"Pythonでビッグデータの分析をする仕事をしている。\r\nnote → https://note.com/nkay","facebook_id":"","followees_count":10,"followers_count":103,"github_login_name":"nkay0","id":"nkay","items_count":64,"linkedin_id":"","location":"日本","name":"","organization":"","permanent_id":394333,"profile_image_url":"https://pbs.twimg.com/profile_images/650209068368310273/b01MKkm4_bigger.jpg","team_only":false,"twitter_screen_name":"nkay166687","website_url":"https://note.com/nkay"},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003cp data-sourcepos=\"1:1-1:147\"\u003eこの記事は、\u003ca href=\"https://qiita.com/advent-calendar/2025/istyle\"\u003eアイスタイル アドベントカレンダー2025\u003c/a\u003e 21日目の記事です。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"3:1-3:15\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h2\u003e\n\u003cp data-sourcepos=\"5:1-5:66\"\u003eこんにちは、データ分析システム部のしばです。\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-8:162\"\u003e突然ですが、みなさんは \u003cstrong\u003e「過去から学び、今日のために生き、未来に対して希望を持つ」\u003c/strong\u003e という言葉をどこかで聞いたことがありますか？\u003cbr\u003e\nかの有名なアインシュタインが言ったとか言わないとか。私も詳しくは知らないので、興味がある人は調べてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"10:1-12:120\"\u003eさて、気がついたら2025年ももう残すところあとわずかになりましたね。みなさんにとって2025年はどんな一年だったでしょうか。\u003cbr\u003e\nということで、今日は年忘れの年末にふさわしく、過去を振り返ってアイスタイルのデータ基盤の技術変遷史を紹介しようと思います。\u003cbr\u003e\n我々の過去の歴史が、みなさんの『今』や『未来』に少しでもお役に立てれば幸いです。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"14:1-14:9\"\u003e\n\u003cspan id=\"目次\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9B%AE%E6%AC%A1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e目次\u003c/h2\u003e\n\u003cp data-sourcepos=\"16:1-20:50\"\u003e\u003ca href=\"#%EF%BC%90%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%AE%E7%B4%B9%E4%BB%8B\"\u003e０．全体像の紹介\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#%EF%BC%91%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9%E4%B8%BB%E5%8A%9B%E6%99%82%E4%BB%A3\"\u003e１．オンプレミス主力時代\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#%EF%BC%92%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%B8%E3%81%AE%E5%A4%89%E9%81%B7\"\u003e２．クラウドへの変遷\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#%EF%BC%93%E5%B9%BB%E3%81%AE%E7%90%86%E6%83%B3%E9%83%B7%E3%81%B8%E3%81%AE%E6%8C%91%E6%88%A6\"\u003e３．幻の「理想郷」への挑戦\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#%EF%BC%94%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E8%A9%B1\"\u003e４．これからの話\u003c/a\u003e\u003c/p\u003e\n\u003chr data-sourcepos=\"22:1-23:0\"\u003e\n\u003ch2 data-sourcepos=\"24:1-24:27\"\u003e\n\u003cspan id=\"０全体像の紹介\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%EF%BC%90%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%AE%E7%B4%B9%E4%BB%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e０．全体像の紹介\u003c/h2\u003e\n\u003cp data-sourcepos=\"26:1-27:105\"\u003eまずはこちらをご覧ください。\u003cbr\u003e\n今回説明する我々の歩んできた歴史を超シンプルにまとめた図がこちらです。\u003c/p\u003e\n\u003cp data-sourcepos=\"29:1-29:120\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Fcfe883dc-a101-41ff-aab8-e21a862f89cc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bcece4886c4ed039df6ca8f13b9a498a\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Fcfe883dc-a101-41ff-aab8-e21a862f89cc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=bcece4886c4ed039df6ca8f13b9a498a\" alt=\"2025.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Fcfe883dc-a101-41ff-aab8-e21a862f89cc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2c9f970e5cf457b59c5fcdb151c34f17 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/cfe883dc-a101-41ff-aab8-e21a862f89cc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"31:1-31:200\"\u003eアイスタイルの中には、全社で幅広く利用される分析やレポートのためのデータ基盤と、Brand Officialというサービス提供用のデータ基盤があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"33:1-34:117\"\u003e複数ドメインにまたがってデータを利用しているシステムは他にも複数あるのですが、データ収集から加工や提供までを基盤内で一貫して担っているものは大きくこの２つになります。\u003cbr\u003e\nその２つが辿ってきた歴史をこの記事で少しずつピックアップして紹介していきます。\u003c/p\u003e\n\u003cp data-sourcepos=\"36:1-36:60\"\u003eそれでは、時代を追って見ていきましょう。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"38:1-38:39\"\u003e\n\u003cspan id=\"１オンプレミス主力時代\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%EF%BC%91%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9%E4%B8%BB%E5%8A%9B%E6%99%82%E4%BB%A3\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e１．オンプレミス主力時代\u003c/h2\u003e\n\u003cp data-sourcepos=\"40:1-40:122\"\u003eむかしむかし、というほどではありませんが、かなり遡って2017年〜2018年頃から始めます。\u003c/p\u003e\n\u003cp data-sourcepos=\"42:1-42:177\"\u003e当時はまだ「クラウドネイティブ」という言葉が今ほど当たり前ではなく、アイスタイルでもオンプレミスサーバーが主力でした。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"44:1-44:47\"\u003e\n\u003cspan id=\"全社向けのデータ基盤原点\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%85%A8%E7%A4%BE%E5%90%91%E3%81%91%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9F%BA%E7%9B%A4%E5%8E%9F%E7%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e全社向けのデータ基盤：原点？\u003c/h4\u003e\n\u003cp data-sourcepos=\"46:1-46:233\"\u003eこの頃から、全社のデータを集約するデータレイクとして \u003cstrong\u003eBigQuery\u003c/strong\u003e が利用され始め、データの転送にはオンプレミスサーバー上で動く \u003cstrong\u003eEmbulk\u003c/strong\u003e の本格運用が始まりました。\u003c/p\u003e\n\u003cp data-sourcepos=\"48:1-50:219\"\u003e実はこれより前の2015年頃から HDFS（Hadoop Distributed File System）にデータを流す検証などは行われていたようですが、本格的な運用として定着し、BigQueryへのデータ連携が増え始めたのがこの時期でした。\u003cbr\u003e\nまた、この頃のデータ加工には、こちらもオンプレミス上での \u003cstrong\u003eDigdag\u003c/strong\u003e が使われていました。\u003cbr\u003e\n正直、私もこの時期はまだ深く関わっていなかったため、古くからいるメンバーに確認した限りの歴史ですが、ここが現在のデータ基盤の原点と言えるでしょう。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"52:1-52:53\"\u003e\n\u003cspan id=\"brand-official-データ基盤独立の道へ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#brand-official-%E3%83%87%E3%83%BC%E3%82%BF%E5%9F%BA%E7%9B%A4%E7%8B%AC%E7%AB%8B%E3%81%AE%E9%81%93%E3%81%B8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBrand Official データ基盤：独立の道へ\u003c/h4\u003e\n\u003cp data-sourcepos=\"54:1-55:224\"\u003e一方、2018年〜2019年頃には、ブランド向けマーケティングツールである『Brand Official』専用データ基盤の前身となる、内製トラッキングシステムの構想が動き出します。\u003cbr\u003e\nここでは \u003ca href=\"https://www.cosme.net/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e@cosme\u003c/a\u003e 上のユーザーの行動データをトラッキングし、Apache Kafkaで収集して、オンプレミスのHDFSに蓄積していくという構成が取られました。\u003c/p\u003e\n\u003cp data-sourcepos=\"57:1-57:124\"\u003eそして2019年の『Brand Official』のリニューアルに伴い、専用のApache Hadoop基盤が誕生しました。\u003c/p\u003e\n\u003cp data-sourcepos=\"59:1-59:123\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ff17b3ddb-2e83-49d2-a64b-bef03bbc0e9b.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=fc2db5f7a47cd49a784baf0d024b428e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ff17b3ddb-2e83-49d2-a64b-bef03bbc0e9b.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=fc2db5f7a47cd49a784baf0d024b428e\" alt=\"BO_01.avif\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ff17b3ddb-2e83-49d2-a64b-bef03bbc0e9b.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=89595857b882ed1e4860507fc7d480e7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/f17b3ddb-2e83-49d2-a64b-bef03bbc0e9b.avif\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"61:1-61:112\"\u003eここで Brand Official データ基盤は、完全に全社向けのデータ基盤と道を分かれます。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"63:1-63:33\"\u003e\n\u003cspan id=\"２クラウドへの変遷\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%EF%BC%92%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%B8%E3%81%AE%E5%A4%89%E9%81%B7\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e２．クラウドへの変遷\u003c/h2\u003e\n\u003cp data-sourcepos=\"65:1-66:154\"\u003e少し時代が進んで2020年頃、サービス成長に伴ってありがたいことに \u003ca href=\"https://www.cosme.net/\" rel=\"nofollow noopener\" target=\"_blank\"\u003e@cosme\u003c/a\u003e のユーザーがどんどん増え、もちろんデータ量もその分増大していきました。\u003cbr\u003e\n2020年頃といえばデータシステムに限らず、世の中のトレンドがどんどんクラウドへとシフトしていった時期です。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"68:1-68:56\"\u003e\n\u003cspan id=\"全社向けデータ基盤embulkの利用拡大\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%85%A8%E7%A4%BE%E5%90%91%E3%81%91%E3%83%87%E3%83%BC%E3%82%BF%E5%9F%BA%E7%9B%A4embulk%E3%81%AE%E5%88%A9%E7%94%A8%E6%8B%A1%E5%A4%A7\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e全社向けデータ基盤：Embulkの利用拡大\u003c/h4\u003e\n\u003cp data-sourcepos=\"70:1-73:278\"\u003e社内のデータをBigQueryに集約する動きは加速し続け、どんどんテーブルの連携対象は増えていきました。\u003cbr\u003e\nなんと驚くことに、初期から利用していたEmbulkは2025年末現在の今でも運用をし続けており、\u003cbr\u003e\n6台のEmbulkサーバーで負荷計算のパズルをしながら1500を超えるテーブルを日々連携しています。\u003cbr\u003e\n（ただし、Embulkは2025年11月には \u003ca href=\"https://www.embulk.org/articles/2025/11/10/embulk-into-the-maintenance-mode.html\" rel=\"nofollow noopener\" target=\"_blank\"\u003eメンテナンスモードへの移行\u003c/a\u003e の発表もあり、アイスタイルでも年明けのクローズに向けて動き始めております）\u003c/p\u003e\n\u003cp data-sourcepos=\"75:1-75:224\"\u003e一方で、データ加工を担っていたオンプレミスのDigdagはその役目を終え、現在はその役割の一部をSaaSである \u003cstrong\u003eTROCCO\u003c/strong\u003e が担っています。ここでようやくのSaaS導入です。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"77:1-77:77\"\u003e\n\u003cspan id=\"brand-official-データ基盤クラウドネイティブへの刷新\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#brand-official-%E3%83%87%E3%83%BC%E3%82%BF%E5%9F%BA%E7%9B%A4%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%B8%E3%81%AE%E5%88%B7%E6%96%B0\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBrand Official データ基盤：クラウドネイティブへの刷新\u003c/h4\u003e\n\u003cp data-sourcepos=\"79:1-79:157\"\u003e2020年を過ぎた頃、独立したおかげでフットワークの軽い（？）Brand Official データ基盤は、大きな転換点を迎えます。\u003c/p\u003e\n\u003cp data-sourcepos=\"81:1-82:76\"\u003e最初は5台規模（データノード4台）だった Apache Hadoop クラスタを、一度、データ量の増加と処理速度の限界に伴い14台（データノード12台）へと拡張したのですが、それでもオンプレミスでの運用は限界を迎えます。\u003cbr\u003e\nエンジニアとしての運用負荷も相当でした。\u003cdel\u003eつらい。\u003c/del\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"84:1-84:181\"\u003eそして2022年、ついにBrand Official データ基盤は \u003cstrong\u003eGoogle Cloudを中心としたクラウドネイティブな構成へフルリニューアル\u003c/strong\u003e を行いました。\u003c/p\u003e\n\u003cp data-sourcepos=\"86:1-86:123\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ffb5293d5-7bb3-4c39-9fb3-368e3faa63dd.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2981cf353687d8bf2b3db52251ab140c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ffb5293d5-7bb3-4c39-9fb3-368e3faa63dd.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2981cf353687d8bf2b3db52251ab140c\" alt=\"BO_02.avif\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2Ffb5293d5-7bb3-4c39-9fb3-368e3faa63dd.avif?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=876e641cdc3d9d7216bdcfc9f3d8deeb 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/fb5293d5-7bb3-4c39-9fb3-368e3faa63dd.avif\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"88:1-90:54\"\u003e詳しくは過去に私が書いた \u003ca href=\"https://qiita.com/grassy/items/06b9054071559f5f8e45\" id=\"reference-2dd7df800a6d3ee78ad7\"\u003eこちら\u003c/a\u003e の記事に記載しております。\u003cbr\u003e\nポイントは、オンプレミスの Apache Hadoop の大変な運用から脱却し、マネージドサービスの活用により圧倒的な運用負荷軽減、処理速度の向上、安定性の向上を手に入れたという点です。\u003cbr\u003e\n（この記事を書いてからもう３年……）\u003c/p\u003e\n\u003ch2 data-sourcepos=\"92:1-92:42\"\u003e\n\u003cspan id=\"３幻の理想郷への挑戦\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%EF%BC%93%E5%B9%BB%E3%81%AE%E7%90%86%E6%83%B3%E9%83%B7%E3%81%B8%E3%81%AE%E6%8C%91%E6%88%A6\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e３．幻の「理想郷」への挑戦\u003c/h2\u003e\n\u003cp data-sourcepos=\"94:1-95:111\"\u003eさて、 Brand Official データ基盤がクラウド化により大成功を収めたように見える（結果的には……）、その裏で。\u003cbr\u003e\n実はアイスタイルのデータ基盤の歴史には、大きな「挑戦と挫折」がありました。\u003c/p\u003e\n\u003cp data-sourcepos=\"97:1-97:154\"\u003e2022年頃、未来のために全社のデータを統合した共通のデータ基盤を作ろうというプロジェクトが発足したのです。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"99:1-99:23\"\u003e\n\u003cspan id=\"目指したもの\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e目指したもの\u003c/h4\u003e\n\u003cp data-sourcepos=\"101:1-101:57\"\u003eまずは、目指したものの全体像がこちら。\u003c/p\u003e\n\u003cp data-sourcepos=\"103:1-103:132\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2F4dad6c06-70dd-4a17-af40-9ce12c8cac78.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1a5afaebee6f60f9303d43b76abcd7c7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2F4dad6c06-70dd-4a17-af40-9ce12c8cac78.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1a5afaebee6f60f9303d43b76abcd7c7\" alt=\"Pasted Graphic 3.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F210815%2F4dad6c06-70dd-4a17-af40-9ce12c8cac78.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e4153f4c42b5a161f6d274828e44c894 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/4dad6c06-70dd-4a17-af40-9ce12c8cac78.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"105:1-106:39\"\u003e一言で言えば、\u003cstrong\u003eモダンデータスタックをフル活用した、堅牢かつ柔軟な基盤\u003c/strong\u003eでした。\u003cbr\u003e\n大きな特徴としてはこちら。\u003c/p\u003e\n\u003cul data-sourcepos=\"108:1-111:0\"\u003e\n\u003cli data-sourcepos=\"108:1-108:108\"\u003e\n\u003cstrong\u003eData Vault 2.0の採用：\u003c/strong\u003e 変更に強く、完璧な履歴管理ができるデータモデリング\u003c/li\u003e\n\u003cli data-sourcepos=\"109:1-109:85\"\u003e\n\u003cstrong\u003e高度なデータ品質管理：\u003c/strong\u003e Great Expectationsを採用した品質担保\u003c/li\u003e\n\u003cli data-sourcepos=\"110:1-111:0\"\u003e\n\u003cstrong\u003e盤石なセキュリティ：\u003c/strong\u003e PII要件に対応した高度なセキュリティ\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"112:1-112:187\"\u003eいずれは Brand Official の基盤や機械学習用の基盤なども統合し、社内のデータの流れの中央ハブとなる……そんな理想のデータ基盤でした。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"114:1-114:35\"\u003e\n\u003cspan id=\"ぶち当たった現実\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%B6%E3%81%A1%E5%BD%93%E3%81%9F%E3%81%A3%E3%81%9F%E7%8F%BE%E5%AE%9F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eぶち当たった「現実」\u003c/h4\u003e\n\u003cp data-sourcepos=\"116:1-117:144\"\u003eしかし、高い理想に対して現実は厳しく立ちはだかります。\u003cbr\u003e\nこれだけで一記事が書けそうなほどの課題や難しさはあったのですが、簡単にまとめるとこんな感じです。\u003c/p\u003e\n\u003cul data-sourcepos=\"119:1-125:0\"\u003e\n\u003cli data-sourcepos=\"119:1-120:169\"\u003e\n\u003cstrong\u003eルールが複雑すぎた\u003c/strong\u003e\n\u003cul data-sourcepos=\"120:3-120:169\"\u003e\n\u003cli data-sourcepos=\"120:3-120:169\"\u003e開発・運用のルールが複雑化し、実運用に乗せるための学習コストと実装コストが増大し、エンジニアの疲弊の原因となる\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"121:1-122:165\"\u003e\n\u003cstrong\u003e運用コストの増大\u003c/strong\u003e\n\u003cul data-sourcepos=\"122:3-122:165\"\u003e\n\u003cli data-sourcepos=\"122:3-122:165\"\u003eクラウド化したとはいえ、 GKE 上で Prefect を自前管理する構成は、インフラ運用コストとしては結果的に増加に繋がった\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"123:1-125:0\"\u003e\n\u003cstrong\u003e活用要件との足並みが揃っていない\u003c/strong\u003e\n\u003cul data-sourcepos=\"124:3-125:0\"\u003e\n\u003cli data-sourcepos=\"124:3-125:0\"\u003eまだ今のアイスタイルは、『このデータ基盤でしか叶えられない』ような複雑かつ高度な要件が生まれるデータ活用フェーズではない（一番の要因）\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"126:1-126:162\"\u003e結果として、このデータ基盤はアイスタイルのメインストリームにはならず、我々は多くの教訓を得ることになります。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"128:1-128:27\"\u003e\n\u003cspan id=\"４これからの話\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%EF%BC%94%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E8%A9%B1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e４．これからの話\u003c/h2\u003e\n\u003cp data-sourcepos=\"130:1-130:120\"\u003eこれまでの歴史を経て、今の私たちは新たな方針でデータ基盤の刷新に邁進しています。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"132:1-132:52\"\u003e\n\u003cspan id=\"01ではなく今ある土台を活かす\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#01%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%BB%8A%E3%81%82%E3%82%8B%E5%9C%9F%E5%8F%B0%E3%82%92%E6%B4%BB%E3%81%8B%E3%81%99\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e0→1ではなく、今ある土台を活かす\u003c/h4\u003e\n\u003cp data-sourcepos=\"134:1-135:245\"\u003eデータエンジニアの真の目的は、\u003cstrong\u003e社内のデータ活用を促進するための土台を作ること\u003c/strong\u003eであり、新しい技術を採用することでも、最強のデータ基盤を目指すことでもありません。\u003cbr\u003e\n理想の基盤を0→1で作って完全なスイッチを目指すのではなく、長い歴史の中で課題が山積みである既存のデータ基盤と向き合い、少しずつ立て直していく道も選択肢のひとつです。\u003c/p\u003e\n\u003cp data-sourcepos=\"137:1-137:186\"\u003eこのあたりの「今」と「未来」については、 弊社の河野が書いた \u003ca href=\"https://qiita.com/konot/items/a90739a52eb961f02171\" id=\"reference-04b4cb9b299c22fcbb8f\"\u003eこちら\u003c/a\u003e の記事をご覧ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"139:1-139:225\"\u003e守りを固めながらレガシーな部分を少しずつモダナイズし、一歩ずつユーザー活用を促しながら本当に使いやすい形へと整地していく。それが今の我々の戦い方です。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"141:1-141:35\"\u003e\n\u003cspan id=\"統合か分離か\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%B5%B1%E5%90%88%E3%81%8B%E5%88%86%E9%9B%A2%E3%81%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e「統合」か「分離」か\u003c/h4\u003e\n\u003cp data-sourcepos=\"143:1-145:183\"\u003eまた、一度は「理想郷」による全社のデータの流れの統合を目指しましたが、今は「サービス用の基盤となる Brand Official データ基盤は、本当に社内活用向けのデータ基盤と統合すべきなのか？」という点も、改めて考え直しています。\u003cbr\u003e\ntoBサービスとして高いサービスレベルが求められる基盤と、自由で柔軟な分析が求められる基盤。それぞれで必要な技術要件も、進化のスピードも異なります。\u003cbr\u003e\nこれまでの歴史からも見える通り、別々であるからこそ、それぞれの目的に対して最適な機能開発や技術採用ができる側面もあります。\u003c/p\u003e\n\u003ch4 data-sourcepos=\"147:1-147:59\"\u003e\n\u003cspan id=\"変わらないもののために変わり続ける\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%82%82%E3%81%AE%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E5%A4%89%E3%82%8F%E3%82%8A%E7%B6%9A%E3%81%91%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e変わらないもののために、変わり続ける\u003c/h4\u003e\n\u003cp data-sourcepos=\"149:1-152:84\"\u003eこれはデータ基盤に限った話ではありませんが、システム開発に「完成」はありません。その時にベストだと思った技術選定も、１年後、２年後にはベストではなくなっていることなんて当然のようによくあります。\u003cbr\u003e\nただ、アイスタイルにおける『データ分析システム部』という組織が持つ、データの価値を引き出すために社内のデータ活用を促進していく、という存在意義が変わるわけではありません。\u003cbr\u003e\n物事には変わるものと変わらないものがあるように、「変わらない目的」のために、手段や技術や求められる要件といった「変わっていくもの」にどう対応していくか。そのために、自分たち自身の組織をどう変えていくか。\u003cbr\u003e\nそれが、これからにとって最も大切なことだと私は思います。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"154:1-154:15\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h2\u003e\n\u003cp data-sourcepos=\"156:1-157:181\"\u003eこの変遷期の半ば、2021年にデータエンジニア組織として『データ分析システム部』が生まれました。\u003cbr\u003e\n2025年になり、立ち上げ当初からこの部署の歴史の全てを知るメンバーも少なくなり、節目として今年はこんな記事を書いてみました。\u003c/p\u003e\n\u003cp data-sourcepos=\"159:1-160:174\"\u003eあくまでこの記事でお伝えしたのは過去のことであり、今のデータ分析システム部が目指すものと直接的に繋がらない部分はたくさんあると思います。\u003cbr\u003e\nただ、こうして過去を知ることで、ぜひ未来に対しての学びを得て、今の選択へと活かせればいいなと願い、紹介いたしました。\u003c/p\u003e\n\u003cp data-sourcepos=\"162:1-163:249\"\u003e未来への挑戦を続けているアイスタイルのデータ領域に興味がある方は、ぜひ一度ご連絡ください。\u003cbr\u003e\n特にインフラ領域、モデリング領域に力を入れたい方、マネジメントの目線を持ってデータ領域でバリューを発揮したい方など、まずはカジュアルにお話させていただければ幸いです！\u003c/p\u003e\n\u003cul data-sourcepos=\"165:1-167:154\"\u003e\n\u003cli data-sourcepos=\"165:1-165:149\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/115442\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】プロジェクトマネージャー/大規模データ分析基盤領域\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"166:1-166:143\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/115570\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】テクニカルリーダー候補/データ基盤インフラ領域\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"167:1-167:154\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/110492\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】データモデリングリード候補／データ基盤モデリング領域\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","body":"この記事は、[アイスタイル アドベントカレンダー2025](https://qiita.com/advent-calendar/2025/istyle) 21日目の記事です。\n\n## はじめに\n\nこんにちは、データ分析システム部のしばです。\n\n突然ですが、みなさんは **「過去から学び、今日のために生き、未来に対して希望を持つ」** という言葉をどこかで聞いたことがありますか？\nかの有名なアインシュタインが言ったとか言わないとか。私も詳しくは知らないので、興味がある人は調べてください。\n\nさて、気がついたら2025年ももう残すところあとわずかになりましたね。みなさんにとって2025年はどんな一年だったでしょうか。\nということで、今日は年忘れの年末にふさわしく、過去を振り返ってアイスタイルのデータ基盤の技術変遷史を紹介しようと思います。\n我々の過去の歴史が、みなさんの『今』や『未来』に少しでもお役に立てれば幸いです。\n\n## 目次\n\n[０．全体像の紹介](#０全体像の紹介)\n[１．オンプレミス主力時代](#１オンプレミス主力時代)\n[２．クラウドへの変遷](#２クラウドへの変遷)\n[３．幻の「理想郷」への挑戦](#３幻の理想郷への挑戦)\n[４．これからの話](#４これからの話)\n\n---\n\n## ０．全体像の紹介\n\nまずはこちらをご覧ください。\n今回説明する我々の歩んできた歴史を超シンプルにまとめた図がこちらです。\n\n![2025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/cfe883dc-a101-41ff-aab8-e21a862f89cc.png)\n\nアイスタイルの中には、全社で幅広く利用される分析やレポートのためのデータ基盤と、Brand Officialというサービス提供用のデータ基盤があります。\n\n複数ドメインにまたがってデータを利用しているシステムは他にも複数あるのですが、データ収集から加工や提供までを基盤内で一貫して担っているものは大きくこの２つになります。\nその２つが辿ってきた歴史をこの記事で少しずつピックアップして紹介していきます。\n\nそれでは、時代を追って見ていきましょう。\n\n## １．オンプレミス主力時代\n\nむかしむかし、というほどではありませんが、かなり遡って2017年〜2018年頃から始めます。\n\n当時はまだ「クラウドネイティブ」という言葉が今ほど当たり前ではなく、アイスタイルでもオンプレミスサーバーが主力でした。\n\n#### 全社向けのデータ基盤：原点？\n\nこの頃から、全社のデータを集約するデータレイクとして **BigQuery** が利用され始め、データの転送にはオンプレミスサーバー上で動く **Embulk** の本格運用が始まりました。\n\n実はこれより前の2015年頃から HDFS（Hadoop Distributed File System）にデータを流す検証などは行われていたようですが、本格的な運用として定着し、BigQueryへのデータ連携が増え始めたのがこの時期でした。\nまた、この頃のデータ加工には、こちらもオンプレミス上での **Digdag** が使われていました。\n正直、私もこの時期はまだ深く関わっていなかったため、古くからいるメンバーに確認した限りの歴史ですが、ここが現在のデータ基盤の原点と言えるでしょう。\n\n#### Brand Official データ基盤：独立の道へ\n\n一方、2018年〜2019年頃には、ブランド向けマーケティングツールである『Brand Official』専用データ基盤の前身となる、内製トラッキングシステムの構想が動き出します。\nここでは [@cosme](https://www.cosme.net/) 上のユーザーの行動データをトラッキングし、Apache Kafkaで収集して、オンプレミスのHDFSに蓄積していくという構成が取られました。\n\nそして2019年の『Brand Official』のリニューアルに伴い、専用のApache Hadoop基盤が誕生しました。\n\n![BO_01.avif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/f17b3ddb-2e83-49d2-a64b-bef03bbc0e9b.avif)\n\nここで Brand Official データ基盤は、完全に全社向けのデータ基盤と道を分かれます。\n\n## ２．クラウドへの変遷\n\n少し時代が進んで2020年頃、サービス成長に伴ってありがたいことに [@cosme](https://www.cosme.net/) のユーザーがどんどん増え、もちろんデータ量もその分増大していきました。\n2020年頃といえばデータシステムに限らず、世の中のトレンドがどんどんクラウドへとシフトしていった時期です。\n\n#### 全社向けデータ基盤：Embulkの利用拡大\n\n社内のデータをBigQueryに集約する動きは加速し続け、どんどんテーブルの連携対象は増えていきました。\nなんと驚くことに、初期から利用していたEmbulkは2025年末現在の今でも運用をし続けており、\n6台のEmbulkサーバーで負荷計算のパズルをしながら1500を超えるテーブルを日々連携しています。\n（ただし、Embulkは2025年11月には [メンテナンスモードへの移行](https://www.embulk.org/articles/2025/11/10/embulk-into-the-maintenance-mode.html) の発表もあり、アイスタイルでも年明けのクローズに向けて動き始めております）\n\n一方で、データ加工を担っていたオンプレミスのDigdagはその役目を終え、現在はその役割の一部をSaaSである **TROCCO** が担っています。ここでようやくのSaaS導入です。\n\n#### Brand Official データ基盤：クラウドネイティブへの刷新\n\n2020年を過ぎた頃、独立したおかげでフットワークの軽い（？）Brand Official データ基盤は、大きな転換点を迎えます。\n\n最初は5台規模（データノード4台）だった Apache Hadoop クラスタを、一度、データ量の増加と処理速度の限界に伴い14台（データノード12台）へと拡張したのですが、それでもオンプレミスでの運用は限界を迎えます。\nエンジニアとしての運用負荷も相当でした。~~つらい。~~\n\nそして2022年、ついにBrand Official データ基盤は **Google Cloudを中心としたクラウドネイティブな構成へフルリニューアル** を行いました。\n\n![BO_02.avif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/fb5293d5-7bb3-4c39-9fb3-368e3faa63dd.avif)\n\n詳しくは過去に私が書いた [こちら](https://qiita.com/grassy/items/06b9054071559f5f8e45) の記事に記載しております。\nポイントは、オンプレミスの Apache Hadoop の大変な運用から脱却し、マネージドサービスの活用により圧倒的な運用負荷軽減、処理速度の向上、安定性の向上を手に入れたという点です。\n（この記事を書いてからもう３年……）\n\n## ３．幻の「理想郷」への挑戦\n\nさて、 Brand Official データ基盤がクラウド化により大成功を収めたように見える（結果的には……）、その裏で。\n実はアイスタイルのデータ基盤の歴史には、大きな「挑戦と挫折」がありました。\n\n2022年頃、未来のために全社のデータを統合した共通のデータ基盤を作ろうというプロジェクトが発足したのです。\n\n#### 目指したもの\n\nまずは、目指したものの全体像がこちら。\n\n![Pasted Graphic 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210815/4dad6c06-70dd-4a17-af40-9ce12c8cac78.png)\n\n一言で言えば、**モダンデータスタックをフル活用した、堅牢かつ柔軟な基盤**でした。\n大きな特徴としてはこちら。\n\n* **Data Vault 2.0の採用：** 変更に強く、完璧な履歴管理ができるデータモデリング\n* **高度なデータ品質管理：** Great Expectationsを採用した品質担保\n* **盤石なセキュリティ：** PII要件に対応した高度なセキュリティ\n\nいずれは Brand Official の基盤や機械学習用の基盤なども統合し、社内のデータの流れの中央ハブとなる……そんな理想のデータ基盤でした。\n\n#### ぶち当たった「現実」\n\nしかし、高い理想に対して現実は厳しく立ちはだかります。\nこれだけで一記事が書けそうなほどの課題や難しさはあったのですが、簡単にまとめるとこんな感じです。\n\n* **ルールが複雑すぎた**\n  * 開発・運用のルールが複雑化し、実運用に乗せるための学習コストと実装コストが増大し、エンジニアの疲弊の原因となる\n* **運用コストの増大**\n  * クラウド化したとはいえ、 GKE 上で Prefect を自前管理する構成は、インフラ運用コストとしては結果的に増加に繋がった\n* **活用要件との足並みが揃っていない**\n  * まだ今のアイスタイルは、『このデータ基盤でしか叶えられない』ような複雑かつ高度な要件が生まれるデータ活用フェーズではない（一番の要因）\n\n結果として、このデータ基盤はアイスタイルのメインストリームにはならず、我々は多くの教訓を得ることになります。\n\n## ４．これからの話\n\nこれまでの歴史を経て、今の私たちは新たな方針でデータ基盤の刷新に邁進しています。\n\n#### 0→1ではなく、今ある土台を活かす\n\nデータエンジニアの真の目的は、**社内のデータ活用を促進するための土台を作ること**であり、新しい技術を採用することでも、最強のデータ基盤を目指すことでもありません。\n理想の基盤を0→1で作って完全なスイッチを目指すのではなく、長い歴史の中で課題が山積みである既存のデータ基盤と向き合い、少しずつ立て直していく道も選択肢のひとつです。\n\nこのあたりの「今」と「未来」については、 弊社の河野が書いた [こちら](https://qiita.com/konot/items/a90739a52eb961f02171) の記事をご覧ください。\n\n守りを固めながらレガシーな部分を少しずつモダナイズし、一歩ずつユーザー活用を促しながら本当に使いやすい形へと整地していく。それが今の我々の戦い方です。\n\n#### 「統合」か「分離」か\n\nまた、一度は「理想郷」による全社のデータの流れの統合を目指しましたが、今は「サービス用の基盤となる Brand Official データ基盤は、本当に社内活用向けのデータ基盤と統合すべきなのか？」という点も、改めて考え直しています。\ntoBサービスとして高いサービスレベルが求められる基盤と、自由で柔軟な分析が求められる基盤。それぞれで必要な技術要件も、進化のスピードも異なります。\nこれまでの歴史からも見える通り、別々であるからこそ、それぞれの目的に対して最適な機能開発や技術採用ができる側面もあります。\n\n#### 変わらないもののために、変わり続ける\n\nこれはデータ基盤に限った話ではありませんが、システム開発に「完成」はありません。その時にベストだと思った技術選定も、１年後、２年後にはベストではなくなっていることなんて当然のようによくあります。\nただ、アイスタイルにおける『データ分析システム部』という組織が持つ、データの価値を引き出すために社内のデータ活用を促進していく、という存在意義が変わるわけではありません。\n物事には変わるものと変わらないものがあるように、「変わらない目的」のために、手段や技術や求められる要件といった「変わっていくもの」にどう対応していくか。そのために、自分たち自身の組織をどう変えていくか。\nそれが、これからにとって最も大切なことだと私は思います。\n\n## おわりに\n\nこの変遷期の半ば、2021年にデータエンジニア組織として『データ分析システム部』が生まれました。\n2025年になり、立ち上げ当初からこの部署の歴史の全てを知るメンバーも少なくなり、節目として今年はこんな記事を書いてみました。\n\nあくまでこの記事でお伝えしたのは過去のことであり、今のデータ分析システム部が目指すものと直接的に繋がらない部分はたくさんあると思います。\nただ、こうして過去を知ることで、ぜひ未来に対しての学びを得て、今の選択へと活かせればいいなと願い、紹介いたしました。\n\n未来への挑戦を続けているアイスタイルのデータ領域に興味がある方は、ぜひ一度ご連絡ください。\n特にインフラ領域、モデリング領域に力を入れたい方、マネジメントの目線を持ってデータ領域でバリューを発揮したい方など、まずはカジュアルにお話させていただければ幸いです！\n\n- [【istyle】プロジェクトマネージャー/大規模データ分析基盤領域](https://open.talentio.com/r/1/c/istyle_career/pages/115442)\n- [【istyle】テクニカルリーダー候補/データ基盤インフラ領域](https://open.talentio.com/r/1/c/istyle_career/pages/115570)\n- [【istyle】データモデリングリード候補／データ基盤モデリング領域](https://open.talentio.com/r/1/c/istyle_career/pages/110492)\n","coediting":false,"comments_count":0,"created_at":"2025-12-19T22:51:10+09:00","group":null,"id":"7446abf7494838632f5e","likes_count":6,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"データ基盤","versions":[]},{"name":"GoogleCloud","versions":[]}],"title":"過去から学び、未来へ繋ぐ。アイスタイルのデータ基盤技術変遷史","updated_at":"2025-12-22T12:06:33+09:00","url":"https://qiita.com/grassy/items/7446abf7494838632f5e","user":{"description":null,"facebook_id":null,"followees_count":0,"followers_count":1,"github_login_name":null,"id":"grassy","items_count":3,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":210815,"profile_image_url":"https://qiita-image-store.s3.amazonaws.com/0/210815/profile-images/1544683903","team_only":false,"twitter_screen_name":"grassy_sbs","website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"istyle","slide":false},{"rendered_body":"\u003cp data-sourcepos=\"2:1-2:129\"\u003eこの記事は \u003ca href=\"https://qiita.com/advent-calendar/2025/trocco\"\u003eTROCCO\u0026amp;COMETA Advent Calendar 2025\u003c/a\u003e の18日目の記事です。\u003c/p\u003e\n\u003cp data-sourcepos=\"4:1-4:63\"\u003eこんにちは、TROCCOの開発をしている u110 です。\u003c/p\u003e\n\u003cp data-sourcepos=\"6:1-7:81\"\u003e接続情報の管理をより安全で効率的に行えるよう、\u003cbr\u003e\n「接続情報の利用元可視化機能」をリリースいたしました。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"9:1-9:14\"\u003e\n\u003cspan id=\"開発背景\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E9%96%8B%E7%99%BA%E8%83%8C%E6%99%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e開発背景\u003c/h1\u003e\n\u003cp data-sourcepos=\"11:1-11:96\"\u003eTROCCOをご利用いただく中で、接続情報の管理に関する課題があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"13:1-13:58\"\u003e\u003cstrong\u003e「この接続情報、削除しても大丈夫？」\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"15:1-15:253\"\u003e使われなくなった接続情報を整理したいけれど、どの転送設定やワークフローで使われているか分からない。 万が一、稼働中の処理で使われていたら...と思うと、なかなか手が出せない。\u003c/p\u003e\n\u003cp data-sourcepos=\"17:1-17:129\"\u003eこういった課題を解決するために、接続情報の利用元を一目で確認できる機能を開発しました。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"19:1-19:14\"\u003e\n\u003cspan id=\"機能概要\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%A9%9F%E8%83%BD%E6%A6%82%E8%A6%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e機能概要\u003c/h1\u003e\n\u003cp data-sourcepos=\"21:1-21:360\"\u003e接続情報がどの転送設定やワークフローなどで使用されているかを一目で確認できる機能です。これまで接続情報を変更・削除する際に「どこで使われているか分からない」という課題がありましたが、この機能により依存関係を簡単に把握できるようになりました。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"23:1-23:34\"\u003e\n\u003cspan id=\"表示例-一覧ページ全体\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A1%A8%E7%A4%BA%E4%BE%8B-%E4%B8%80%E8%A6%A7%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e表示例: 一覧ページ全体\u003c/h1\u003e\n\u003cp data-sourcepos=\"25:1-25:129\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F4fdf9790-5961-4531-b448-ba26237fae3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3f6722743b5e22ca92bfef39221c499f\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F4fdf9790-5961-4531-b448-ba26237fae3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3f6722743b5e22ca92bfef39221c499f\" alt=\"02_index_page.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F4fdf9790-5961-4531-b448-ba26237fae3d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=db4ebe1e2c999d5285cd7d3a4d7b6491 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/4fdf9790-5961-4531-b448-ba26237fae3d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"26:1-28:0\"\u003e\n\u003cli data-sourcepos=\"26:1-26:113\"\u003e各接続情報ごとに「利用されているリソース」というボタンが追加されています。\u003c/li\u003e\n\u003cli data-sourcepos=\"27:1-28:0\"\u003e同じタイミングで転送設定やワークフローの一覧ページと同様に、接続情報一覧ページにも検索フォームができました。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"29:1-29:55\"\u003e\n\u003cspan id=\"表示例-利用されているリソースの展開\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%A1%A8%E7%A4%BA%E4%BE%8B-%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E5%B1%95%E9%96%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e表示例: 利用されているリソースの展開\u003c/h1\u003e\n\u003cp data-sourcepos=\"31:1-31:130\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F3e3baf33-dc7a-4cea-81a6-56b5866173f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=da45b442bac3704db7cf3a55c091d921\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F3e3baf33-dc7a-4cea-81a6-56b5866173f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=da45b442bac3704db7cf3a55c091d921\" alt=\"01_card_sample.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F3e3baf33-dc7a-4cea-81a6-56b5866173f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b4b065b014f96009ef18ce040c1ced2b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/3e3baf33-dc7a-4cea-81a6-56b5866173f2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"33:1-35:0\"\u003e\n\u003cli data-sourcepos=\"33:1-35:0\"\u003e\n\u003ccode\u003e利用されているリソース\u003c/code\u003e を押すと、関連する機能毎に利用元の情報を参照できます。\u003cbr\u003e\nこの接続情報は、TROCCOの検証環境のとある接続情報になりますが、QAチームが検証で利用している接続情報がなんと\u003cstrong\u003e2万件を超える転送設定や他の機能と紐づいている\u003c/strong\u003eことがわかりました！\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"36:1-36:35\"\u003e\n\u003cspan id=\"確認できる利用元の種類\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B%E5%88%A9%E7%94%A8%E5%85%83%E3%81%AE%E7%A8%AE%E9%A1%9E\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e確認できる利用元の種類\u003c/h1\u003e\n\u003cp data-sourcepos=\"38:1-38:84\"\u003e利用元可視化機能では、以下の種類の利用元を確認できます：\u003c/p\u003e\n\u003cul data-sourcepos=\"40:1-51:0\"\u003e\n\u003cli data-sourcepos=\"40:1-40:14\"\u003e転送設定\u003c/li\u003e\n\u003cli data-sourcepos=\"41:1-41:26\"\u003eデータマート定義\u003c/li\u003e\n\u003cli data-sourcepos=\"42:1-42:29\"\u003eマネージド転送設定\u003c/li\u003e\n\u003cli data-sourcepos=\"43:1-43:20\"\u003eCDCデータ転送\u003c/li\u003e\n\u003cli data-sourcepos=\"44:1-48:20\"\u003eワークフロー:\n\u003cul data-sourcepos=\"45:3-48:20\"\u003e\n\u003cli data-sourcepos=\"45:3-45:25\"\u003eデータチェック\u003c/li\u003e\n\u003cli data-sourcepos=\"46:3-46:49\"\u003eカスタムループ実行のクエリ機能\u003c/li\u003e\n\u003cli data-sourcepos=\"47:3-47:17\"\u003eHTTPタスク\u003c/li\u003e\n\u003cli data-sourcepos=\"48:3-48:20\"\u003eTableauタスク\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"49:1-49:11\"\u003edbt連携\u003c/li\u003e\n\u003cli data-sourcepos=\"50:1-51:0\"\u003eSSMを利用する接続情報\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"52:1-52:114\"\u003e列挙すると、接続情報がTROCCOの多くの機能と密接に紐づいていることがわかります。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"54:1-54:62\"\u003e\n\u003cspan id=\"推したいポイント権限の壁を超えた可視化\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A8%E3%81%97%E3%81%9F%E3%81%84%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E6%A8%A9%E9%99%90%E3%81%AE%E5%A3%81%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%8F%AF%E8%A6%96%E5%8C%96\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e推したいポイント：権限の壁を超えた可視化\u003c/h1\u003e\n\u003cp data-sourcepos=\"57:1-57:196\"\u003eTROCCOには強力な権限管理（リソースグループ）がありますが、これまでは 「権限がない＝存在が見えない」ため、全体の影響把握が困難でした。\u003c/p\u003e\n\u003cp data-sourcepos=\"59:1-59:296\"\u003e本機能は、\u003cstrong\u003e権限外の設定であっても「設定名」と「作成者」が表示されます。\u003c/strong\u003e これにより、「誰が使っているか分からないから消せない」という状況を防ぎ、スムーズに担当者へ確認を入れられるようになりました。\u003c/p\u003e\n\u003cp data-sourcepos=\"61:1-61:127\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F19fddbed-f15c-4693-87b6-44c7cefb66cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0a0836f2d6236280e0c0307ac59ddad1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F19fddbed-f15c-4693-87b6-44c7cefb66cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0a0836f2d6236280e0c0307ac59ddad1\" alt=\"03_datamart.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F169862%2F19fddbed-f15c-4693-87b6-44c7cefb66cd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=63705d1ea76222e3c476155630426670 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/19fddbed-f15c-4693-87b6-44c7cefb66cd.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"62:1-63:0\"\u003e\n\u003cli data-sourcepos=\"62:1-63:0\"\u003e上のスクショでは、利用元のデータマート定義が3件表示され、作成者を特定できるようになりました。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"64:1-64:11\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h1\u003e\n\u003cp data-sourcepos=\"66:1-66:93\"\u003e接続情報利用元可視化機能により、以下のことが可能になりました：\u003c/p\u003e\n\u003cul data-sourcepos=\"68:1-71:0\"\u003e\n\u003cli data-sourcepos=\"68:1-68:47\"\u003e接続情報の依存関係を一目で把握\u003c/li\u003e\n\u003cli data-sourcepos=\"69:1-69:56\"\u003e安全な削除・変更のための影響範囲確認\u003c/li\u003e\n\u003cli data-sourcepos=\"70:1-71:0\"\u003e監査対応・棚卸し作業の効率化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"72:1-73:105\"\u003e今後もTROCCOをより使いやすく、安全にご利用いただけるよう機能改善を続けてまいります。\u003cbr\u003e\nご不明な点がございましたら、お気軽にサポートまでお問い合わせください。\u003c/p\u003e\n","body":"\nこの記事は [TROCCO\u0026COMETA Advent Calendar 2025](https://qiita.com/advent-calendar/2025/trocco) の18日目の記事です。\n\nこんにちは、TROCCOの開発をしている u110 です。\n\n接続情報の管理をより安全で効率的に行えるよう、\n「接続情報の利用元可視化機能」をリリースいたしました。\n\n# 開発背景\n\nTROCCOをご利用いただく中で、接続情報の管理に関する課題があります。\n\n**「この接続情報、削除しても大丈夫？」**\n\n使われなくなった接続情報を整理したいけれど、どの転送設定やワークフローで使われているか分からない。 万が一、稼働中の処理で使われていたら...と思うと、なかなか手が出せない。\n\nこういった課題を解決するために、接続情報の利用元を一目で確認できる機能を開発しました。\n\n# 機能概要\n\n接続情報がどの転送設定やワークフローなどで使用されているかを一目で確認できる機能です。これまで接続情報を変更・削除する際に「どこで使われているか分からない」という課題がありましたが、この機能により依存関係を簡単に把握できるようになりました。\n\n# 表示例: 一覧ページ全体\n\n![02_index_page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/4fdf9790-5961-4531-b448-ba26237fae3d.png)\n- 各接続情報ごとに「利用されているリソース」というボタンが追加されています。\n- 同じタイミングで転送設定やワークフローの一覧ページと同様に、接続情報一覧ページにも検索フォームができました。\n\n# 表示例: 利用されているリソースの展開\n\n![01_card_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/3e3baf33-dc7a-4cea-81a6-56b5866173f2.png)\n\n- `利用されているリソース` を押すと、関連する機能毎に利用元の情報を参照できます。\nこの接続情報は、TROCCOの検証環境のとある接続情報になりますが、QAチームが検証で利用している接続情報がなんと**2万件を超える転送設定や他の機能と紐づいている**ことがわかりました！\n\n# 確認できる利用元の種類\n\n利用元可視化機能では、以下の種類の利用元を確認できます：\n\n- 転送設定\n- データマート定義\n- マネージド転送設定\n- CDCデータ転送\n- ワークフロー:\n  - データチェック\n  - カスタムループ実行のクエリ機能\n  - HTTPタスク\n  - Tableauタスク\n- dbt連携\n- SSMを利用する接続情報\n\n列挙すると、接続情報がTROCCOの多くの機能と密接に紐づいていることがわかります。\n\n# 推したいポイント：権限の壁を超えた可視化\n\n\nTROCCOには強力な権限管理（リソースグループ）がありますが、これまでは 「権限がない＝存在が見えない」ため、全体の影響把握が困難でした。\n\n本機能は、**権限外の設定であっても「設定名」と「作成者」が表示されます。** これにより、「誰が使っているか分からないから消せない」という状況を防ぎ、スムーズに担当者へ確認を入れられるようになりました。\n\n![03_datamart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169862/19fddbed-f15c-4693-87b6-44c7cefb66cd.png)\n- 上のスクショでは、利用元のデータマート定義が3件表示され、作成者を特定できるようになりました。\n\n# まとめ\n\n接続情報利用元可視化機能により、以下のことが可能になりました：\n\n- 接続情報の依存関係を一目で把握\n- 安全な削除・変更のための影響範囲確認\n- 監査対応・棚卸し作業の効率化\n\n今後もTROCCOをより使いやすく、安全にご利用いただけるよう機能改善を続けてまいります。\nご不明な点がございましたら、お気軽にサポートまでお問い合わせください。\n\n\n","coediting":false,"comments_count":0,"created_at":"2025-12-17T11:13:49+09:00","group":null,"id":"e78a7bb0d90ec4c450ce","likes_count":7,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"UX","versions":[]},{"name":"trocco","versions":[]}],"title":"その接続情報、消しても大丈夫？「利用元可視化機能」でTROCCOの棚卸しが安全にできるようになりました","updated_at":"2025-12-18T13:16:40+09:00","url":"https://qiita.com/u110/items/e78a7bb0d90ec4c450ce","user":{"description":"","facebook_id":"","followees_count":24,"followers_count":7,"github_login_name":"u110","id":"u110","items_count":7,"linkedin_id":"","location":"japan","name":"Yuu Ito","organization":"freelance","permanent_id":169862,"profile_image_url":"https://avatars1.githubusercontent.com/u/1389397?v=3","team_only":false,"twitter_screen_name":"yuu_ito","website_url":"https://web-u-project.com/"},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"2:1-5:129\"\u003eこんにちは、ポーラ・オルビスホールディングスでデータエンジニアをしているyu_shinoと申します。\u003cbr\u003e\n弊社ではETLツールとしてTROCCOを利用しているのですが、これまで本番へのデプロイフローに少しモヤモヤを抱えていました。\u003cbr\u003e\nそんな中で、TROCCOに新しく追加された\u003cstrong\u003e環境管理機能\u003c/strong\u003eを試す機会があったので紹介したいと思います。\u003cbr\u003e\n「TROCCOの環境管理機能、気になっているけど触れていない」という方の参考になれば幸いです。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"7:1-7:26\"\u003e\n\u003cspan id=\"弊社でのtrocco運用\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%BC%8A%E7%A4%BE%E3%81%A7%E3%81%AEtrocco%E9%81%8B%E7%94%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e弊社でのTROCCO運用\u003c/h1\u003e\n\u003ch2 data-sourcepos=\"9:1-9:15\"\u003e\n\u003cspan id=\"利用状況\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%88%A9%E7%94%A8%E7%8A%B6%E6%B3%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e利用状況\u003c/h2\u003e\n\u003cp data-sourcepos=\"11:1-12:173\"\u003e弊社では主にTROCCOのデータ転送機能を利用しており、本番用と開発用を合わせて200個以上の転送ジョブが存在します。\u003cbr\u003e\nこのうち、本番環境で常時稼働しているジョブは70個程度あり、ほとんどはInputをRedshift、OutputをS3としたデータ抽出ジョブです。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"14:1-14:27\"\u003e\n\u003cspan id=\"ジョブ開発フロー\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%B8%E3%83%A7%E3%83%96%E9%96%8B%E7%99%BA%E3%83%95%E3%83%AD%E3%83%BC\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eジョブ開発フロー\u003c/h2\u003e\n\u003cp data-sourcepos=\"16:1-16:78\"\u003eジョブ開発は、基本的に次のような流れで進めています。\u003c/p\u003e\n\u003col data-sourcepos=\"18:1-22:0\"\u003e\n\u003cli data-sourcepos=\"18:1-18:45\"\u003e開発用ジョブを作成・編集する\u003c/li\u003e\n\u003cli data-sourcepos=\"19:1-19:48\"\u003e開発用ジョブで各種テストを行う\u003c/li\u003e\n\u003cli data-sourcepos=\"20:1-20:72\"\u003eテスト結果を確認し、ジョブのレビューを実施する\u003c/li\u003e\n\u003cli data-sourcepos=\"21:1-22:0\"\u003e本番用ジョブを作成・編集し、リリースする\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-sourcepos=\"23:1-23:104\"\u003eこのように、\u003cstrong\u003e開発用と本番用で別々のジョブを持つ運用\u003c/strong\u003e になっています。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"25:1-25:29\"\u003e\n\u003cspan id=\"リリース運用の課題\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%81%8B%E7%94%A8%E3%81%AE%E8%AA%B2%E9%A1%8C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eリリース運用の課題\u003c/h1\u003e\n\u003cp data-sourcepos=\"27:1-27:111\"\u003e弊社におけるTROCCO利用の一番の課題は、本番用ジョブのリリース方法にあります。\u003c/p\u003e\n\u003cp data-sourcepos=\"29:1-29:220\"\u003e前述の通り、開発用ジョブでテストとレビューを行ったあとに、本番用ジョブを作成・編集してリリースしていますが、\u003cstrong\u003eこのリリース作業はすべて手作業\u003c/strong\u003eです。\u003c/p\u003e\n\u003cp data-sourcepos=\"31:1-31:63\"\u003e具体的には、次のような運用になっています。\u003c/p\u003e\n\u003cul data-sourcepos=\"33:1-40:0\"\u003e\n\u003cli data-sourcepos=\"33:1-36:0\"\u003e\n\u003cp data-sourcepos=\"33:3-33:30\"\u003e\u003cstrong\u003e新規ジョブの場合\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"34:3-36:0\"\u003e\n\u003cli data-sourcepos=\"34:3-34:37\"\u003e開発用ジョブを複製する\u003c/li\u003e\n\u003cli data-sourcepos=\"35:3-36:0\"\u003eS3バケット名など、一部のパラメータを本番用の値に置き換える\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"37:1-40:0\"\u003e\n\u003cp data-sourcepos=\"37:3-37:42\"\u003e\u003cstrong\u003e既存ジョブを変更する場合\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"38:3-40:0\"\u003e\n\u003cli data-sourcepos=\"38:3-38:64\"\u003e開発用ジョブで変更内容を反映・テストする\u003c/li\u003e\n\u003cli data-sourcepos=\"39:3-40:0\"\u003e変更箇所を開発用ジョブから本番用ジョブへ、一つずつコピペして反映する\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"41:1-41:156\"\u003e最初はこの運用でも問題ありませんでしたが、ジョブ数が増えるにつれて次のような課題が顕著になってきました。\u003c/p\u003e\n\u003cul data-sourcepos=\"43:1-45:0\"\u003e\n\u003cli data-sourcepos=\"43:1-43:116\"\u003e開発環境と本番環境の差分が分かりにくく、リリース時のチェックコストが高くなる\u003c/li\u003e\n\u003cli data-sourcepos=\"44:1-45:0\"\u003eリリース時にパラメータの変え忘れやコピペミスが発生するリスクがある\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"46:1-46:38\"\u003e\n\u003cspan id=\"環境管理機能を使ってみた\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%92%B0%E5%A2%83%E7%AE%A1%E7%90%86%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e環境管理機能を使ってみた\u003c/h1\u003e\n\u003cp data-sourcepos=\"48:1-50:102\"\u003eそんな中で、TROCCOに \u003cstrong\u003e環境管理機能\u003c/strong\u003e がリリースされました。\u003cbr\u003e\nこの機能では、TROCCO上の各種リソースを複数の環境ごとに分けて管理でき、環境ごとの差分を意識しながら段階的にリリースしていくことができるようです。\u003cbr\u003e\n弊社が抱えている課題解決に繋がりそうだと感じ、実際に試してみました。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"53:1-53:15\"\u003e\n\u003cspan id=\"環境準備\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e環境準備\u003c/h2\u003e\n\u003cp data-sourcepos=\"54:1-56:58\"\u003eまず、TROCCOの環境グループを作成しました。\u003cbr\u003e\n作成は環境管理画面から簡単に行えます。\u003cbr\u003e\n今回利用するのは以下の2環境としました。\u003c/p\u003e\n\u003cul data-sourcepos=\"57:1-64:0\"\u003e\n\u003cli data-sourcepos=\"57:1-58:24\"\u003edev\n\u003cul data-sourcepos=\"58:5-58:24\"\u003e\n\u003cli data-sourcepos=\"58:5-58:24\"\u003e開発用の環境\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"59:1-64:0\"\u003eprd\n\u003cul data-sourcepos=\"60:5-64:0\"\u003e\n\u003cli data-sourcepos=\"60:5-60:24\"\u003e本番用の環境\u003c/li\u003e\n\u003cli data-sourcepos=\"61:5-64:0\"\u003edevで検証済みのジョブをリリースする想定\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F5970f3ef-684a-405c-9871-9b129847e7fd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=11c74f45910d8dfb4ee5842b35ceed15\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F5970f3ef-684a-405c-9871-9b129847e7fd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=11c74f45910d8dfb4ee5842b35ceed15\" alt=\"1.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F5970f3ef-684a-405c-9871-9b129847e7fd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=7f2e64fdc65bae4f4f4c37cad951caa7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/5970f3ef-684a-405c-9871-9b129847e7fd.png\" loading=\"lazy\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 data-sourcepos=\"65:1-65:33\"\u003e\n\u003cspan id=\"dev環境へのジョブ作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#dev%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AE%E3%82%B8%E3%83%A7%E3%83%96%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003edev環境へのジョブ作成\u003c/h2\u003e\n\u003cp data-sourcepos=\"66:1-67:71\"\u003e環境の準備ができたので、まずはdev環境用のジョブを作成します。\u003cbr\u003e\n今回は例としてRedshift to S3のジョブを作成しました。\u003c/p\u003e\n\u003cp data-sourcepos=\"69:1-69:167\"\u003eジョブ作成時の注意点としては、デプロイする際に\u003cstrong\u003e環境ごとに変更できる項目が以下の3つに限られている\u003c/strong\u003eという点です。\u003c/p\u003e\n\u003cul data-sourcepos=\"70:1-73:0\"\u003e\n\u003cli data-sourcepos=\"70:1-70:14\"\u003e接続情報\u003c/li\u003e\n\u003cli data-sourcepos=\"71:1-71:56\"\u003e文字列型のカスタム変数の固定の文字列\u003c/li\u003e\n\u003cli data-sourcepos=\"72:1-73:0\"\u003eリソースグループ\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"74:1-75:138\"\u003eそのため、S3のバケット名やRedshiftのデータベース名といった環境ごとに変更したい値をジョブ内にベタ書きしてしまうと、デプロイ後に手動で書き換えることになってしまいます。\u003cbr\u003e\nそのため、環境ごとに変更したい部分については文字列型のカスタム変数を利用することにしました。\u003c/p\u003e\n\u003cp data-sourcepos=\"77:1-78:118\"\u003e転送元であるRedshiftの設定はデータベースとスキーマ名をカスタム変数化し、クエリ内にも埋め込んでいます。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F2cea12cf-db1b-4bb5-a54d-82eb147a02cf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f60d368d88f4d7acde60c8f7860a5ba7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F2cea12cf-db1b-4bb5-a54d-82eb147a02cf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f60d368d88f4d7acde60c8f7860a5ba7\" alt=\"2.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F2cea12cf-db1b-4bb5-a54d-82eb147a02cf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=2fdf2dab63bace0f46cd0849a5146ee6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/2cea12cf-db1b-4bb5-a54d-82eb147a02cf.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"82:1-83:118\"\u003e転送先のS3についてもバケット名とパスプレフィックスをカスタム変数化しました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe2e2ca9d-469c-4359-bc85-2ddfbd28add5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1c4ed55931693457c4eff7a861a485a\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe2e2ca9d-469c-4359-bc85-2ddfbd28add5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d1c4ed55931693457c4eff7a861a485a\" alt=\"3.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe2e2ca9d-469c-4359-bc85-2ddfbd28add5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=194379a7ccb3714965714cb39ba40bfb 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/e2e2ca9d-469c-4359-bc85-2ddfbd28add5.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"86:1-87:118\"\u003e完成したジョブを環境に紐づけて準備完了です。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Ff05df4ae-38d5-4b60-87e0-4460674209f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=65341dfb25032def4f89a94afbef1148\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Ff05df4ae-38d5-4b60-87e0-4460674209f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=65341dfb25032def4f89a94afbef1148\" alt=\"4.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Ff05df4ae-38d5-4b60-87e0-4460674209f8.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=090b4ce319f2e512ac13760f75c8712f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/f05df4ae-38d5-4b60-87e0-4460674209f8.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"91:1-91:33\"\u003e\n\u003cspan id=\"prd環境へのジョブ作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#prd%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AE%E3%82%B8%E3%83%A7%E3%83%96%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eprd環境へのジョブ作成\u003c/h2\u003e\n\u003cp data-sourcepos=\"92:1-92:84\"\u003e先ほど作成したdev環境用のジョブをprd環境にデプロイします。\u003c/p\u003e\n\u003cp data-sourcepos=\"94:1-94:105\"\u003eデプロイ時には、以下の項目について環境ごとに上書きすることができます。\u003c/p\u003e\n\u003cul data-sourcepos=\"95:1-98:0\"\u003e\n\u003cli data-sourcepos=\"95:1-95:14\"\u003e接続情報\u003c/li\u003e\n\u003cli data-sourcepos=\"96:1-96:20\"\u003eカスタム変数\u003c/li\u003e\n\u003cli data-sourcepos=\"97:1-98:0\"\u003eリソースグループ\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"99:1-101:118\"\u003e今回は、\u003cstrong\u003eS3 のパスプレフィックス\u003c/strong\u003e を prd 向けの値に変更しました。\u003cbr\u003e\n元の設定から変更が入った箇所は画面上で「差分あり」と表示されるため、\u003cstrong\u003eどこを変えたか一目で分かる\u003c/strong\u003e のが便利です！\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F869d3af1-a506-4579-bd0e-678f47fbe762.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=471751914aec3aed8bd286712ab10620\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F869d3af1-a506-4579-bd0e-678f47fbe762.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=471751914aec3aed8bd286712ab10620\" alt=\"5.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F869d3af1-a506-4579-bd0e-678f47fbe762.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c82676ba069fdd6d4f427ba6ccfdf8e6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/869d3af1-a506-4579-bd0e-678f47fbe762.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"104:1-107:118\"\u003eprd環境用に接続情報やリソースグループを設定し、ジョブの作成が完了しました。\u003cbr\u003e\nデプロイ後にprd環境のジョブを確認すると、S3のパスプレフィックスはprd用にきちんと切り替わっていました！\u003cbr\u003e\nそれ以外のSQLや各種パラメータはdev環境からそのまま引き継がれています。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F80d2eae3-606f-44c6-b6a4-6b94dbe0ccde.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2177d5d46126bc0810579cbbf4397bab\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F80d2eae3-606f-44c6-b6a4-6b94dbe0ccde.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2177d5d46126bc0810579cbbf4397bab\" alt=\"6.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F80d2eae3-606f-44c6-b6a4-6b94dbe0ccde.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=996653ca0924662a937b6c5e3dffc0eb 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/80d2eae3-606f-44c6-b6a4-6b94dbe0ccde.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"110:1-110:45\"\u003e\n\u003cspan id=\"dev環境からprd環境への変更作業\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#dev%E7%92%B0%E5%A2%83%E3%81%8B%E3%82%89prd%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AE%E5%A4%89%E6%9B%B4%E4%BD%9C%E6%A5%AD\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003edev環境からprd環境への変更作業\u003c/h2\u003e\n\u003cp data-sourcepos=\"111:1-111:205\"\u003edev環境、prd環境にそれぞれジョブを作成できたので、次は 「dev環境でジョブを変更→prd環境に反映」という、実際の運用に近いフローを試してみます。\u003c/p\u003e\n\u003cp data-sourcepos=\"113:1-115:118\"\u003eまずはdev環境のジョブに対して既存のSQLに簡単な変更を加えました。\u003cbr\u003e\n\u003cstrong\u003e変更前\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fa1c6a015-102f-4966-b592-bb0ab816336a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5b40692fba7febfab935d40a7bea48aa\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fa1c6a015-102f-4966-b592-bb0ab816336a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5b40692fba7febfab935d40a7bea48aa\" alt=\"7.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fa1c6a015-102f-4966-b592-bb0ab816336a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=df814591be42424c144d2f6f694f4658 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/a1c6a015-102f-4966-b592-bb0ab816336a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"117:1-118:118\"\u003e\u003cstrong\u003e変更後\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fb04f3ea8-4d4e-4769-9b55-7f48fd0e6147.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=940f901af7f56342620bc6e8e4ac9505\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fb04f3ea8-4d4e-4769-9b55-7f48fd0e6147.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=940f901af7f56342620bc6e8e4ac9505\" alt=\"8.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fb04f3ea8-4d4e-4769-9b55-7f48fd0e6147.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b4ee556f5ff3b3fed5b2b83ca82deafa 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/b04f3ea8-4d4e-4769-9b55-7f48fd0e6147.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"121:1-123:118\"\u003eジョブを保存し、変更をprd環境に反映します。\u003cbr\u003e\n新規作成時にprd 環境用のカスタム変数（S3 パスプレフィックスなど）はすでに設定済みのため、今回はSQL の変更だけをデプロイします。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F09191562-820f-48cd-8fb4-14a0282911dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1b09682342cdfb5708aabbdcbe7de41e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F09191562-820f-48cd-8fb4-14a0282911dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1b09682342cdfb5708aabbdcbe7de41e\" alt=\"9.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2F09191562-820f-48cd-8fb4-14a0282911dc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=f30d709a428157f6cc977ccf5fcdb6f1 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/09191562-820f-48cd-8fb4-14a0282911dc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"126:1-127:119\"\u003eデプロイ後に prd環境のジョブを確認すると、dev 環境で変更した SQL がそのまま反映されていることが確認できました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe837add8-8fe1-408d-aac3-2b35e70f16b7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=54fa076287534b149762110c65ada4a5\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe837add8-8fe1-408d-aac3-2b35e70f16b7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=54fa076287534b149762110c65ada4a5\" alt=\"10.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1714573%2Fe837add8-8fe1-408d-aac3-2b35e70f16b7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=1a6fe1e2efc51321ba5a56eb325e6e9b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/e837add8-8fe1-408d-aac3-2b35e70f16b7.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"130:1-130:208\"\u003eこれまではdev環境で修正したSQLをコピペで本番ジョブに転記していたので、\u003cstrong\u003eワンボタンで反映できるようになったのは大きなメリット\u003c/strong\u003eだと思いました！\u003c/p\u003e\n\u003ch2 data-sourcepos=\"132:1-132:12\"\u003e\n\u003cspan id=\"注意点\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%B3%A8%E6%84%8F%E7%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e注意点\u003c/h2\u003e\n\u003cp data-sourcepos=\"133:1-133:90\"\u003e実際に使ってみて、運用面で注意が必要だと感じた点もあります。\u003c/p\u003e\n\u003cul data-sourcepos=\"135:1-137:0\"\u003e\n\u003cli data-sourcepos=\"135:1-135:61\"\u003eTROCCO側ではデプロイフローを強制できない\u003c/li\u003e\n\u003cli data-sourcepos=\"136:1-137:0\"\u003e環境の序列（例：prd \u0026gt; stg \u0026gt; dev）のような概念を持つことができないため、最初からジョブを prd 環境に紐づけることもできてしまう\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"138:1-138:249\"\u003eそのため、「dev でジョブを作成する」、「環境設定から prd 環境にデプロイする」といった、望ましいデプロイフローをチーム内ルールとして明文化しておく必要があると感じました。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"141:1-141:8\"\u003e\n\u003cspan id=\"所感\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%89%80%E6%84%9F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e所感\u003c/h1\u003e\n\u003cp data-sourcepos=\"142:1-143:48\"\u003eTROCCOの環境管理機能を実際に使ってみて、これまでデプロイ時に感じていた不安をかなり解消できそうだと感じました。\u003cbr\u003e\n特に良かった点としては以下です。\u003c/p\u003e\n\u003cul data-sourcepos=\"145:1-147:0\"\u003e\n\u003cli data-sourcepos=\"145:1-145:65\"\u003eデプロイ時に変更点を手動で反映しなくて済む\u003c/li\u003e\n\u003cli data-sourcepos=\"146:1-147:0\"\u003e開発用ジョブと本番用ジョブの差分が分かりやすい\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"148:1-149:141\"\u003e一方で、各パラメータをあらかじめ変数化する必要があるため、弊社で利用している既存ジョブをすべて変更するのはある程度の工数がかかりそうだとも感じました。\u003cbr\u003e\nまずは新規ジョブでの利用などから段階的に取り入れて、ルールの整備もしていきたいと考えています。\u003c/p\u003e\n","body":"# はじめに\nこんにちは、ポーラ・オルビスホールディングスでデータエンジニアをしているyu_shinoと申します。\n弊社ではETLツールとしてTROCCOを利用しているのですが、これまで本番へのデプロイフローに少しモヤモヤを抱えていました。\nそんな中で、TROCCOに新しく追加された**環境管理機能**を試す機会があったので紹介したいと思います。\n「TROCCOの環境管理機能、気になっているけど触れていない」という方の参考になれば幸いです。\n\n# 弊社でのTROCCO運用\n\n## 利用状況\n\n弊社では主にTROCCOのデータ転送機能を利用しており、本番用と開発用を合わせて200個以上の転送ジョブが存在します。\nこのうち、本番環境で常時稼働しているジョブは70個程度あり、ほとんどはInputをRedshift、OutputをS3としたデータ抽出ジョブです。\n\n## ジョブ開発フロー\n\nジョブ開発は、基本的に次のような流れで進めています。\n\n1. 開発用ジョブを作成・編集する\n2. 開発用ジョブで各種テストを行う\n3. テスト結果を確認し、ジョブのレビューを実施する\n4. 本番用ジョブを作成・編集し、リリースする\n\nこのように、**開発用と本番用で別々のジョブを持つ運用** になっています。\n\n# リリース運用の課題\n\n弊社におけるTROCCO利用の一番の課題は、本番用ジョブのリリース方法にあります。\n\n前述の通り、開発用ジョブでテストとレビューを行ったあとに、本番用ジョブを作成・編集してリリースしていますが、**このリリース作業はすべて手作業**です。\n\n具体的には、次のような運用になっています。\n\n- **新規ジョブの場合**\n  - 開発用ジョブを複製する\n  - S3バケット名など、一部のパラメータを本番用の値に置き換える\n\n- **既存ジョブを変更する場合**\n  - 開発用ジョブで変更内容を反映・テストする\n  - 変更箇所を開発用ジョブから本番用ジョブへ、一つずつコピペして反映する\n\n最初はこの運用でも問題ありませんでしたが、ジョブ数が増えるにつれて次のような課題が顕著になってきました。\n\n- 開発環境と本番環境の差分が分かりにくく、リリース時のチェックコストが高くなる\n- リリース時にパラメータの変え忘れやコピペミスが発生するリスクがある\n\n# 環境管理機能を使ってみた\n\nそんな中で、TROCCOに **環境管理機能** がリリースされました。\nこの機能では、TROCCO上の各種リソースを複数の環境ごとに分けて管理でき、環境ごとの差分を意識しながら段階的にリリースしていくことができるようです。  \n弊社が抱えている課題解決に繋がりそうだと感じ、実際に試してみました。\n\n\n## 環境準備\nまず、TROCCOの環境グループを作成しました。\n作成は環境管理画面から簡単に行えます。\n今回利用するのは以下の2環境としました。\n- dev\n    - 開発用の環境\n- prd\n    - 本番用の環境\n    - devで検証済みのジョブをリリースする想定\n![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/5970f3ef-684a-405c-9871-9b129847e7fd.png)\n\n\n## dev環境へのジョブ作成\n環境の準備ができたので、まずはdev環境用のジョブを作成します。\n今回は例としてRedshift to S3のジョブを作成しました。\n\nジョブ作成時の注意点としては、デプロイする際に**環境ごとに変更できる項目が以下の3つに限られている**という点です。\n- 接続情報\n- 文字列型のカスタム変数の固定の文字列\n- リソースグループ\n\nそのため、S3のバケット名やRedshiftのデータベース名といった環境ごとに変更したい値をジョブ内にベタ書きしてしまうと、デプロイ後に手動で書き換えることになってしまいます。\nそのため、環境ごとに変更したい部分については文字列型のカスタム変数を利用することにしました。\n\n転送元であるRedshiftの設定はデータベースとスキーマ名をカスタム変数化し、クエリ内にも埋め込んでいます。\n![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/2cea12cf-db1b-4bb5-a54d-82eb147a02cf.png)\n\n\n\n転送先のS3についてもバケット名とパスプレフィックスをカスタム変数化しました。\n![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/e2e2ca9d-469c-4359-bc85-2ddfbd28add5.png)\n\n\n完成したジョブを環境に紐づけて準備完了です。\n![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/f05df4ae-38d5-4b60-87e0-4460674209f8.png)\n\n\n\n## prd環境へのジョブ作成\n先ほど作成したdev環境用のジョブをprd環境にデプロイします。\n\nデプロイ時には、以下の項目について環境ごとに上書きすることができます。\n- 接続情報\n- カスタム変数\n- リソースグループ\n\n今回は、**S3 のパスプレフィックス** を prd 向けの値に変更しました。  \n元の設定から変更が入った箇所は画面上で「差分あり」と表示されるため、**どこを変えたか一目で分かる** のが便利です！\n![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/869d3af1-a506-4579-bd0e-678f47fbe762.png)\n\n\nprd環境用に接続情報やリソースグループを設定し、ジョブの作成が完了しました。\nデプロイ後にprd環境のジョブを確認すると、S3のパスプレフィックスはprd用にきちんと切り替わっていました！\nそれ以外のSQLや各種パラメータはdev環境からそのまま引き継がれています。\n![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/80d2eae3-606f-44c6-b6a4-6b94dbe0ccde.png)\n\n\n## dev環境からprd環境への変更作業\ndev環境、prd環境にそれぞれジョブを作成できたので、次は 「dev環境でジョブを変更→prd環境に反映」という、実際の運用に近いフローを試してみます。\n\nまずはdev環境のジョブに対して既存のSQLに簡単な変更を加えました。\n**変更前**\n![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/a1c6a015-102f-4966-b592-bb0ab816336a.png)\n\n**変更後**\n![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/b04f3ea8-4d4e-4769-9b55-7f48fd0e6147.png)\n\n\nジョブを保存し、変更をprd環境に反映します。\n新規作成時にprd 環境用のカスタム変数（S3 パスプレフィックスなど）はすでに設定済みのため、今回はSQL の変更だけをデプロイします。\n![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/09191562-820f-48cd-8fb4-14a0282911dc.png)\n\n\nデプロイ後に prd環境のジョブを確認すると、dev 環境で変更した SQL がそのまま反映されていることが確認できました。\n![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/e837add8-8fe1-408d-aac3-2b35e70f16b7.png)\n\n\nこれまではdev環境で修正したSQLをコピペで本番ジョブに転記していたので、**ワンボタンで反映できるようになったのは大きなメリット**だと思いました！\n\n## 注意点\n実際に使ってみて、運用面で注意が必要だと感じた点もあります。\n\n- TROCCO側ではデプロイフローを強制できない  \n- 環境の序列（例：prd \u003e stg \u003e dev）のような概念を持つことができないため、最初からジョブを prd 環境に紐づけることもできてしまう  \n\nそのため、「dev でジョブを作成する」、「環境設定から prd 環境にデプロイする」といった、望ましいデプロイフローをチーム内ルールとして明文化しておく必要があると感じました。\n\n\n# 所感\nTROCCOの環境管理機能を実際に使ってみて、これまでデプロイ時に感じていた不安をかなり解消できそうだと感じました。  \n特に良かった点としては以下です。\n\n- デプロイ時に変更点を手動で反映しなくて済む\n- 開発用ジョブと本番用ジョブの差分が分かりやすい\n\n一方で、各パラメータをあらかじめ変数化する必要があるため、弊社で利用している既存ジョブをすべて変更するのはある程度の工数がかかりそうだとも感じました。  \nまずは新規ジョブでの利用などから段階的に取り入れて、ルールの整備もしていきたいと考えています。\n","coediting":false,"comments_count":0,"created_at":"2025-12-16T11:41:34+09:00","group":null,"id":"4ac49119177406b8dc3a","likes_count":2,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"trocco","versions":[]}],"title":"TROCCOの環境管理機能を試してみた","updated_at":"2025-12-23T07:07:20+09:00","url":"https://qiita.com/yu_shino/items/4ac49119177406b8dc3a","user":{"description":null,"facebook_id":null,"followees_count":0,"followers_count":0,"github_login_name":null,"id":"yu_shino","items_count":1,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":1714573,"profile_image_url":"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1714573/profile-images/1764226974","team_only":false,"twitter_screen_name":null,"website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"POHD","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:426\"\u003e広告配信の最適化にあたっては、広告配信の対象を適切に選択し、それに対して適切なクリエイティブで訴求することが重要です。このとき、対象の選択にあたっては、まずは広告プラットフォーム上で保持しているユーザーデータ（属性・行動）や、自社サイト側に配置したタグでの計測を利用するのが基本です。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:300\"\u003e一方で、ブラウザのCookie制限に伴いタグでの計測精度が下がっていたり、そもそも広告プラットフォーム側には自社で保持しているほどの情報が不足しているため望んだ形の配信ができなかったり、という課題があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:411\"\u003e後者のわかりやすい例として、既存顧客に新規獲得向けの割引キャンペーンが広告として掲出されることで、過剰な割引で利益を逸失してしまうということがあります。既存顧客かどうかという情報は広告プラットフォーム側ではないからです。あるあるだ・・・と思い当たる方もいらっしゃるでしょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:235\"\u003eこうした課題を解決する方法の1つが、自社で保持する顧客リストのオーディエンスリストへの連携です。本記事では、Yahoo!ディスプレイ広告を例に、その方法を紹介します。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"11:1-11:29\"\u003e\n\u003cspan id=\"こんな方におすすめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%93%E3%81%AA%E6%96%B9%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこんな方におすすめ\u003c/h1\u003e\n\u003cul data-sourcepos=\"13:1-17:0\"\u003e\n\u003cli data-sourcepos=\"13:1-13:47\"\u003e広告効果に課題感を感じている方\u003c/li\u003e\n\u003cli data-sourcepos=\"14:1-14:146\"\u003e既存顧客に対して新規獲得キャンペーンの割引が適用されるなど、ターゲティングの不整合を解決したい方\u003c/li\u003e\n\u003cli data-sourcepos=\"15:1-15:104\"\u003e期待するターゲットに対して上手くアプローチできていないと感じている方\u003c/li\u003e\n\u003cli data-sourcepos=\"16:1-17:0\"\u003eデータ基盤に顧客データを連携しているが、その有効な活用方法についてビジネス部門への提案に苦労している技術部門の方\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"18:1-18:71\"\u003e\n\u003cspan id=\"そもそも広告配信におけるオーディエンスとは\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E5%BA%83%E5%91%8A%E9%85%8D%E4%BF%A1%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%A8%E3%81%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eそもそも広告配信における「オーディエンス」とは\u003c/h1\u003e\n\u003cp data-sourcepos=\"20:1-20:171\"\u003e広告配信をするユーザーのリストのことを、オーディエンスと言います。例えば、Yahoo!広告では以下のようなものがあります。\u003c/p\u003e\n\u003cp data-sourcepos=\"22:1-23:144\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb4d90b86-293b-4773-aed4-75226f9b322b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=23528c055eaf0cefeef65f8dfe2e17dc\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb4d90b86-293b-4773-aed4-75226f9b322b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=23528c055eaf0cefeef65f8dfe2e17dc\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb4d90b86-293b-4773-aed4-75226f9b322b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=59a8781100c8a4c6ff4d8918d2556d5b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b4d90b86-293b-4773-aed4-75226f9b322b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003cbr\u003e\n（出典：\u003ca href=\"https://ads-help.yahoo-net.jp/s/article/H000044833?language=ja\" rel=\"nofollow noopener\" target=\"_blank\"\u003eオーディエンスリストとは - ヘルプ - Yahoo!広告\u003c/a\u003e）\u003c/p\u003e\n\u003cp data-sourcepos=\"25:1-25:153\"\u003eこのうち、「顧客データ」というものが今回の連携対象となる、広告主側で保持している顧客データになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"27:1-27:282\"\u003eなお、「類似ユーザー」については、特定の基となるオーディエンスリストのユーザーに対して、広告プラットフォーム側で保持しているデータに基づいて類似していると判定されるもののリストになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"29:1-29:291\"\u003e広告キャンペーンを実施する際には、これらの種別のオーディエンスに対して、広告の配信対象として「対象にする」または「対象から除外する」という設定を行います。これは例えば、以下のようなイメージです。\u003c/p\u003e\n\u003ciframe id=\"qiita-embed-content__8ba0d4448a6023a530dd9c1a539eeaf1\" src=\"https://qiita.com/embed-contents/mermaid#qiita-embed-content__8ba0d4448a6023a530dd9c1a539eeaf1\" style=\"width:100%;\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" data-content='{\"data\":\"flowchart LR\\n subgraph 通常のリスト\\n i[特定の興味関心を持っているユーザー]\\n aa[特定の広告アクションを起こしているユーザー]\\n end\\n subgraph 外部から連携するリスト\\n ic[売り上げの高い優良顧客]\\n c[既存顧客]\\n end\\n su[優良顧客類似ユーザー]\\n t[広告配信のターゲット]\\n i--\u0026gt;|配信対象|t\\n aa--\u0026gt;|配信対象|t\\n ic--\u0026gt;|類似拡張|su\\n su--\u0026gt;|配信対象|t\\n c--\u0026gt;|配信除外|t\",\"key\":\"2dd3e3982a67237d11339a0f71e40e81\"}'\u003e\n\u003c/iframe\u003e\n\n\u003cp data-sourcepos=\"50:1-50:162\"\u003e単純に計測ができる上部だけを配信対象とするより、より効果的な配信対象を選定できるイメージがついたでしょうか。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"52:1-52:53\"\u003e\n\u003cspan id=\"yahooディスプレイ広告での設定方法例\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#yahoo%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E5%BA%83%E5%91%8A%E3%81%A7%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E4%BE%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eYahoo!ディスプレイ広告での設定方法例\u003c/h1\u003e\n\u003cp data-sourcepos=\"54:1-54:105\"\u003eここからは、Yahoo!ディスプレイ広告を例にして、その設定方法を解説します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"56:1-56:30\"\u003e\n\u003cspan id=\"接続情報を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e接続情報を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"58:1-58:182\"\u003eまずは、Yahoo!側にデータを連携するための、認証情報を設定します。接続情報の作成画面で「Yahooアカウント認証」をクリックします。\u003c/p\u003e\n\u003cp data-sourcepos=\"60:1-60:162\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8d912976-b7d8-4ae3-a130-df4d4be07ae0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=87c51efa3409aaca0353207663257fff\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8d912976-b7d8-4ae3-a130-df4d4be07ae0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=87c51efa3409aaca0353207663257fff\" alt=\"スクリーンショット 2025-12-12 173831.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8d912976-b7d8-4ae3-a130-df4d4be07ae0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=1ce1de2c8e6b65abbbf22a9be850d3a2 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8d912976-b7d8-4ae3-a130-df4d4be07ae0.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"62:1-62:98\"\u003eYahoo!ビジネスIDでログインし、認証を行って保存すれば設定は完了です。\u003c/p\u003e\n\u003cp data-sourcepos=\"64:1-64:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0268f34b-154c-4662-a091-132f48fe17bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=be11e30508c674b88e30e3e37bd22158\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0268f34b-154c-4662-a091-132f48fe17bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=be11e30508c674b88e30e3e37bd22158\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0268f34b-154c-4662-a091-132f48fe17bc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=db1674855ec2b367d91c56fb77b97f58 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/0268f34b-154c-4662-a091-132f48fe17bc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"66:1-66:93\"\u003eその他、詳細については以下の公式ドキュメントをご確認ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"68:1-68:70\"\u003e\u003ciframe id=\"qiita-embed-content__a1fdcfd4737b89dc82cab8e267d8f1d7\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__a1fdcfd4737b89dc82cab8e267d8f1d7\" data-content=\"https%3A%2F%2Fdocuments.trocco.io%2Fdocs%2Fthe-authentification-of-yahoo-ads-api\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch2 data-sourcepos=\"70:1-70:51\"\u003e\n\u003cspan id=\"参考サンプルデータを用意する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%82%E8%80%83%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e※参考：サンプルデータを用意する\u003c/h2\u003e\n\u003cp data-sourcepos=\"72:1-72:240\"\u003e今回はサンプルデータをもとにテストを行います。そこで、スプレッドシートにサンプルデータを記載します。Yahoo!の場合は100件以上のデータが必要なことに注意してください。\u003c/p\u003e\n\u003cp data-sourcepos=\"74:1-74:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4d4e5635-22ba-493c-86d9-0f7fdcab3c83.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f769d8c8343b255f78eb71d603adb641\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4d4e5635-22ba-493c-86d9-0f7fdcab3c83.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f769d8c8343b255f78eb71d603adb641\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4d4e5635-22ba-493c-86d9-0f7fdcab3c83.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=50ff4ce17d225bebfdb7171b4d82fcfd 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4d4e5635-22ba-493c-86d9-0f7fdcab3c83.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdetails\u003e\u003csummary\u003eBigQueryでサンプルデータを作成する方法（クリックして詳細を確認）\u003c/summary\u003e\n\u003cp data-sourcepos=\"78:1-78:152\"\u003e以下のSQLで、ユニークユーザーID（UUID）の一部＋example.comのメールアドレスと、連番の電話番号を生成できます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"80:1-89:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e-- ユニークユーザーIDを生成して、-より前の部分を取得して@以下をつける\u003c/span\u003e\n  \u003cspan class=\"n\"\u003egenerate_uuid\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'-'\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'@example.com'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e-- 日本の国番号に対して90以下を0にして、末尾4桁を1～100の0埋めの4桁とする\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'+81900000'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003elpad\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003ecast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enum\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'0'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ephone_number\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e-- 1～100までの数字を生成する\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eunnest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egenerate_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"n\"\u003enum\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003ch2 data-sourcepos=\"93:1-93:30\"\u003e\n\u003cspan id=\"転送設定を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送設定を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"95:1-95:30\"\u003e転送設定については、\u003c/p\u003e\n\u003cul data-sourcepos=\"97:1-102:0\"\u003e\n\u003cli data-sourcepos=\"97:1-97:23\"\u003e概要設定を行う\u003c/li\u003e\n\u003cli data-sourcepos=\"98:1-98:131\"\u003e転送元の設定を行う（今回はスプレッドシートとしていますが、任意の対象で問題ありません）\u003c/li\u003e\n\u003cli data-sourcepos=\"99:1-99:29\"\u003e転送先の設定を行う\u003c/li\u003e\n\u003cli data-sourcepos=\"100:1-100:50\"\u003eプレビューを確認しながら調整する\u003c/li\u003e\n\u003cli data-sourcepos=\"101:1-102:0\"\u003e作成内容を確認して保存する\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"103:1-103:48\"\u003eという簡単な流れで設定できます。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"105:1-105:25\"\u003e\n\u003cspan id=\"概要設定を行う\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%A6%82%E8%A6%81%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e概要設定を行う\u003c/h3\u003e\n\u003cp data-sourcepos=\"107:1-107:51\"\u003e任意の転送設定の名称を指定します。\u003c/p\u003e\n\u003cp data-sourcepos=\"109:1-109:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe636b081-1240-4527-b232-83e5d58894ba.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=481991374e5d330d3c7178385d870fb7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe636b081-1240-4527-b232-83e5d58894ba.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=481991374e5d330d3c7178385d870fb7\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fe636b081-1240-4527-b232-83e5d58894ba.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=af12a4cb8c58ff90e0d5d96d7c72db36 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e636b081-1240-4527-b232-83e5d58894ba.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"111:1-111:55\"\u003e\n\u003cspan id=\"転送元スプレッドシートの設定をする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E5%85%83%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送元スプレッドシートの設定をする\u003c/h3\u003e\n\u003cp data-sourcepos=\"113:1-113:93\"\u003eサンプルデータを作成したスプレッドシートへの情報を記載します。\u003c/p\u003e\n\u003cp data-sourcepos=\"115:1-115:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F962f17d0-59bf-478b-9a28-55f4e163f88e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=17c64019d306cb2a9b9825f189d4fadd\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F962f17d0-59bf-478b-9a28-55f4e163f88e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=17c64019d306cb2a9b9825f189d4fadd\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F962f17d0-59bf-478b-9a28-55f4e163f88e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c473e9c501cb24b4b0b6d9db09daeea2 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/962f17d0-59bf-478b-9a28-55f4e163f88e.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"117:1-117:99\"\u003e\n\u003cspan id=\"転送先yahoo広告-ディスプレイ広告-オーディエンスリストの設定をする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E5%85%88yahoo%E5%BA%83%E5%91%8A-%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E5%BA%83%E5%91%8A-%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送先Yahoo!広告 ディスプレイ広告 オーディエンスリストの設定をする\u003c/h3\u003e\n\u003cp data-sourcepos=\"119:1-119:317\"\u003eアカウントIDは作成した接続情報に応じてサジェストがされるので、対応するものを選択してください。オーディエンスリスト名は、既存のリストから選択をすればそれに応じて処理がされ、新規の名前を記載すると新規作成されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"121:1-121:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F97fc0d2c-7050-466b-8116-96a6b58ae725.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=91d29eb20ed65094189214f33d3b5425\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F97fc0d2c-7050-466b-8116-96a6b58ae725.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=91d29eb20ed65094189214f33d3b5425\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F97fc0d2c-7050-466b-8116-96a6b58ae725.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b8b27d5683d0d76277dbcd972b21bec7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/97fc0d2c-7050-466b-8116-96a6b58ae725.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"123:1-123:51\"\u003eここまでで基本的な設定は完了です。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"125:1-125:46\"\u003e\n\u003cspan id=\"プレビューを見ながら調整する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E8%A6%8B%E3%81%AA%E3%81%8C%E3%82%89%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eプレビューを見ながら調整する\u003c/h3\u003e\n\u003cp data-sourcepos=\"127:1-127:84\"\u003e次のステップに進むと、データのプレビューが表示されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"129:1-129:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feaa0fb18-054b-419f-b8de-8d5b3f6b4b32.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9a98f8d02598fab331c74bebe632c782\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feaa0fb18-054b-419f-b8de-8d5b3f6b4b32.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9a98f8d02598fab331c74bebe632c782\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feaa0fb18-054b-419f-b8de-8d5b3f6b4b32.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bd3d0f22f78aafd57cee6cdc41279f06 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/eaa0fb18-054b-419f-b8de-8d5b3f6b4b32.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"131:1-131:141\"\u003eここでは、ハッシュ化してから連携をしたいので、手順を説明する前にハッシュ化について解説します。\u003c/p\u003e\n\u003cp data-sourcepos=\"133:1-133:342\"\u003eハッシュ化とは、一定のアルゴリズムに則って、不可逆な（元に戻せない）変換処理を行うことです。例えば、\u003ccode\u003ea\u003c/code\u003eという文字列は、\u003ccode\u003eSHA-256\u003c/code\u003eというアルゴリズムで処理すると、\u003ccode\u003eca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb\u003c/code\u003eという文字列に変換されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"135:1-135:492\"\u003eこれは、取扱いに注意が必要な生の個人情報をそのまま連携しないようにするために必要となっています。つまり、広告主側から生の個人情報を送って広告プラットフォーム側で照合するのではなく、広告主側でハッシュ化されたデータと、広告プラットフォーム側で保持しているデータをハッシュ化したデータを突合し、それらが一致するかで照合をするのです。\u003c/p\u003e\n\u003ciframe id=\"qiita-embed-content__df8f2d50c4f3b0b4e18b014b4702c93c\" src=\"https://qiita.com/embed-contents/mermaid#qiita-embed-content__df8f2d50c4f3b0b4e18b014b4702c93c\" style=\"width:100%;\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" data-content='{\"data\":\"flowchart LR\\n subgraph 広告主環境\\n u[広告主ユーザー情報]\\n uh[広告主ユーザー情報（ハッシュ化）]\\n end\\n subgraph 広告プラットフォーム環境\\n thu[広告主ユーザー情報（ハッシュ化）]\\n pu[プラットフォームユーザー情報]\\n phu[プラットフォームユーザー情報（ハッシュ化）]\\n end\\n u--\u0026gt;|ハッシュ化|uh\\n uh--\u0026gt;|データ連携|thu\\n pu--\u0026gt;|ハッシュ化|phu\\n thu---|一致確認|phu\",\"key\":\"24945b2a59e5f80d0320d856d004da5a\"}'\u003e\n\u003c/iframe\u003e\n\n\u003cp data-sourcepos=\"154:1-154:154\"\u003eちなみに、ハッシュ関数にはSHA-256以外にも様々な種類がありますが、以下のサイトで試してみることができます。\u003c/p\u003e\n\u003cp data-sourcepos=\"156:1-156:30\"\u003e\u003ciframe id=\"qiita-embed-content__cbc65b48f5c6e8bea9fee060b2b526e8\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__cbc65b48f5c6e8bea9fee060b2b526e8\" data-content=\"https%3A%2F%2Fkujiira.com%2Ftools%2Fhash\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"158:1-158:295\"\u003eさて、TROCCOではカラム名を指定するだけでSHA-256でハッシュ化してくれる機能があるので、その機能を利用します。カラムハッシュ化の部分で対象カラム名を入力し、更新をプレビューでプレビューデータを更新します。\u003c/p\u003e\n\u003cp data-sourcepos=\"160:1-160:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F57ed429e-be02-460c-b081-39e319669c81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=64334f6494f1fce74032e1d04514ad8e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F57ed429e-be02-460c-b081-39e319669c81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=64334f6494f1fce74032e1d04514ad8e\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F57ed429e-be02-460c-b081-39e319669c81.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=062112d146937d16ccf8351bf537183c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/57ed429e-be02-460c-b081-39e319669c81.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"162:1-162:81\"\u003eすると、メールアドレスや電話番号がハッシュ化されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"164:1-164:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F904448de-2ed1-45c2-ae27-d34aa099fff6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f07e3b308ea3bd9bbb69906f536050ff\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F904448de-2ed1-45c2-ae27-d34aa099fff6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f07e3b308ea3bd9bbb69906f536050ff\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F904448de-2ed1-45c2-ae27-d34aa099fff6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=d488f4dc7bc5ae48e4b89b912d4108b6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/904448de-2ed1-45c2-ae27-d34aa099fff6.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"166:1-166:45\"\u003eこれで転送時の設定は完了です。\u003c/p\u003e\n\u003cp data-sourcepos=\"168:1-168:370\"\u003eなお、今回は生の個人情報を転送時にハッシュ化していますが、組織のセキュリティポリシーの関係でそもそも生の個人情報を取扱えなかったり、求められるハッシュ関数がSHA-256ではなかったりする場合もあります。そのときは事前にハッシュ化をしておくことになります。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"170:1-170:43\"\u003e\n\u003cspan id=\"作成内容を確認して保存する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BD%9C%E6%88%90%E5%86%85%E5%AE%B9%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e作成内容を確認して保存する\u003c/h3\u003e\n\u003cp data-sourcepos=\"172:1-172:147\"\u003e次のステップに進むと、作成内容の確認画面が表示されるので、内容を見て問題なければ保存してください。\u003c/p\u003e\n\u003cp data-sourcepos=\"174:1-174:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9063a0a4-3c0a-4fbd-865d-842c8203b987.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d791abce20b53cf4a415d115ea574d7f\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9063a0a4-3c0a-4fbd-865d-842c8203b987.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d791abce20b53cf4a415d115ea574d7f\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9063a0a4-3c0a-4fbd-865d-842c8203b987.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=71d68d8618f8fc735990021b41e2551b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9063a0a4-3c0a-4fbd-865d-842c8203b987.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"176:1-176:102\"\u003eその他、設定の詳細については以下の公式ドキュメントをご確認ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"178:1-178:81\"\u003e\u003ciframe id=\"qiita-embed-content__d9cbb7a6a0a9275305b017a9220343bf\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__d9cbb7a6a0a9275305b017a9220343bf\" data-content=\"https%3A%2F%2Fdocuments.trocco.io%2Fdocs%2Fdata-destination-yahoo-display-ads-audience-list\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch2 data-sourcepos=\"180:1-180:27\"\u003e\n\u003cspan id=\"データを転送する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータを転送する\u003c/h2\u003e\n\u003cp data-sourcepos=\"182:1-182:72\"\u003e作成した転送設定を実行します。爆速で終わります。\u003c/p\u003e\n\u003cp data-sourcepos=\"184:1-184:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b37f3d-d4ea-4b52-82cf-8bb4b2aaafc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d103f638d3766143eb63b861730538dc\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b37f3d-d4ea-4b52-82cf-8bb4b2aaafc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d103f638d3766143eb63b861730538dc\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b37f3d-d4ea-4b52-82cf-8bb4b2aaafc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=0d4b92d90b4242d6f5ce18c37fd8804d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73b37f3d-d4ea-4b52-82cf-8bb4b2aaafc3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"186:1-186:135\"\u003eYahoo!ディスプレイ広告の管理画面を確認すると、確かにオーディエンスリストが作成されています。\u003c/p\u003e\n\u003cp data-sourcepos=\"188:1-188:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9f3befbb-4e8e-49d3-b8cb-3648dbdfe18e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f8ef4eb2d32723341a0f6a9d0516ead4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9f3befbb-4e8e-49d3-b8cb-3648dbdfe18e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f8ef4eb2d32723341a0f6a9d0516ead4\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9f3befbb-4e8e-49d3-b8cb-3648dbdfe18e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=920a752fdaf7d4bb3adf1112e42c291d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9f3befbb-4e8e-49d3-b8cb-3648dbdfe18e.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"190:1-190:334\"\u003eなお、広告プラットフォーム側でのリスト生成にあたっては、データ転送後から反映までにラグがあるというのと、そもそも今回のものはダミーデータのためマッチングするユーザーが存在せず、ユーザーサイズは0件となるのにはご注意ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"192:1-192:102\"\u003eデータ反映までのラグについては、以下のドキュメントをご確認ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"194:1-194:62\"\u003e\u003ciframe id=\"qiita-embed-content__3bd7f6a40aac31a0eb23380301dd441c\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__3bd7f6a40aac31a0eb23380301dd441c\" data-content=\"https%3A%2F%2Fads-help.yahoo-net.jp%2Fs%2Farticle%2FH000044299%3Flanguage%3Dja\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"196:1-196:198\"\u003eリストの連携方法は以上です。ハッシュ化の処理をカラム名を指定するだけで実現できるので、設定についてはとても簡単に行うことができます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"198:1-198:20\"\u003e\n\u003cspan id=\"利用上の注意\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%88%A9%E7%94%A8%E4%B8%8A%E3%81%AE%E6%B3%A8%E6%84%8F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e利用上の注意\u003c/h1\u003e\n\u003cp data-sourcepos=\"200:1-200:210\"\u003eハッシュ化しているとはいえ個人情報の授受にあたるため、広告プラットフォーム側の規約および顧客との許諾に基づいた運用をするようご注意ください。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"202:1-202:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"204:1-204:298\"\u003eYahoo!ディスプレイ広告を例に、TROCCOを用いたオーディエンスリスト連携についてご紹介してきました。まずはシンプルな運用からでもよいので、広告配信の最適化に向けて、方法の1つとしてご活用いただければ幸いです。\u003c/p\u003e\n","body":"# はじめに\n\n広告配信の最適化にあたっては、広告配信の対象を適切に選択し、それに対して適切なクリエイティブで訴求することが重要です。このとき、対象の選択にあたっては、まずは広告プラットフォーム上で保持しているユーザーデータ（属性・行動）や、自社サイト側に配置したタグでの計測を利用するのが基本です。\n\n一方で、ブラウザのCookie制限に伴いタグでの計測精度が下がっていたり、そもそも広告プラットフォーム側には自社で保持しているほどの情報が不足しているため望んだ形の配信ができなかったり、という課題があります。\n\n後者のわかりやすい例として、既存顧客に新規獲得向けの割引キャンペーンが広告として掲出されることで、過剰な割引で利益を逸失してしまうということがあります。既存顧客かどうかという情報は広告プラットフォーム側ではないからです。あるあるだ・・・と思い当たる方もいらっしゃるでしょう。\n\nこうした課題を解決する方法の1つが、自社で保持する顧客リストのオーディエンスリストへの連携です。本記事では、Yahoo!ディスプレイ広告を例に、その方法を紹介します。\n\n# こんな方におすすめ\n\n- 広告効果に課題感を感じている方\n- 既存顧客に対して新規獲得キャンペーンの割引が適用されるなど、ターゲティングの不整合を解決したい方\n- 期待するターゲットに対して上手くアプローチできていないと感じている方\n- データ基盤に顧客データを連携しているが、その有効な活用方法についてビジネス部門への提案に苦労している技術部門の方\n\n# そもそも広告配信における「オーディエンス」とは\n\n広告配信をするユーザーのリストのことを、オーディエンスと言います。例えば、Yahoo!広告では以下のようなものがあります。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b4d90b86-293b-4773-aed4-75226f9b322b.png)\n（出典：[オーディエンスリストとは - ヘルプ - Yahoo!広告](https://ads-help.yahoo-net.jp/s/article/H000044833?language=ja)）\n\nこのうち、「顧客データ」というものが今回の連携対象となる、広告主側で保持している顧客データになります。\n\nなお、「類似ユーザー」については、特定の基となるオーディエンスリストのユーザーに対して、広告プラットフォーム側で保持しているデータに基づいて類似していると判定されるもののリストになります。\n\n広告キャンペーンを実施する際には、これらの種別のオーディエンスに対して、広告の配信対象として「対象にする」または「対象から除外する」という設定を行います。これは例えば、以下のようなイメージです。\n\n```mermaid\nflowchart LR\n  subgraph 通常のリスト\n    i[特定の興味関心を持っているユーザー]\n    aa[特定の広告アクションを起こしているユーザー]\n  end\n  subgraph 外部から連携するリスト\n    ic[売り上げの高い優良顧客]\n    c[既存顧客]\n  end\n  su[優良顧客類似ユーザー]\n  t[広告配信のターゲット]\n  i--\u003e|配信対象|t\n  aa--\u003e|配信対象|t\n  ic--\u003e|類似拡張|su\n  su--\u003e|配信対象|t\n  c--\u003e|配信除外|t\n```\n\n単純に計測ができる上部だけを配信対象とするより、より効果的な配信対象を選定できるイメージがついたでしょうか。\n\n# Yahoo!ディスプレイ広告での設定方法例\n\nここからは、Yahoo!ディスプレイ広告を例にして、その設定方法を解説します。\n\n## 接続情報を作成する\n\nまずは、Yahoo!側にデータを連携するための、認証情報を設定します。接続情報の作成画面で「Yahooアカウント認証」をクリックします。\n\n![スクリーンショット 2025-12-12 173831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8d912976-b7d8-4ae3-a130-df4d4be07ae0.png)\n\nYahoo!ビジネスIDでログインし、認証を行って保存すれば設定は完了です。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/0268f34b-154c-4662-a091-132f48fe17bc.png)\n\nその他、詳細については以下の公式ドキュメントをご確認ください。\n\nhttps://documents.trocco.io/docs/the-authentification-of-yahoo-ads-api\n\n## ※参考：サンプルデータを用意する\n\n今回はサンプルデータをもとにテストを行います。そこで、スプレッドシートにサンプルデータを記載します。Yahoo!の場合は100件以上のデータが必要なことに注意してください。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4d4e5635-22ba-493c-86d9-0f7fdcab3c83.png)\n\n\u003cdetails\u003e\u003csummary\u003eBigQueryでサンプルデータを作成する方法（クリックして詳細を確認）\u003c/summary\u003e\n\n以下のSQLで、ユニークユーザーID（UUID）の一部＋example.comのメールアドレスと、連番の電話番号を生成できます。\n\n```sql\nselect\n  -- ユニークユーザーIDを生成して、-より前の部分を取得して@以下をつける\n  generate_uuid().split('-')[0] || '@example.com' as email,\n  -- 日本の国番号に対して90以下を0にして、末尾4桁を1～100の0埋めの4桁とする\n  '+81900000' || lpad(cast(num as string), 4, '0') as phone_number,\nfrom\n  -- 1～100までの数字を生成する\n  unnest(generate_array(1, 100, 1)) num\n```\n\n\u003c/details\u003e\n\n## 転送設定を作成する\n\n転送設定については、\n\n- 概要設定を行う\n- 転送元の設定を行う（今回はスプレッドシートとしていますが、任意の対象で問題ありません）\n- 転送先の設定を行う\n- プレビューを確認しながら調整する\n- 作成内容を確認して保存する\n\nという簡単な流れで設定できます。\n\n### 概要設定を行う\n\n任意の転送設定の名称を指定します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e636b081-1240-4527-b232-83e5d58894ba.png)\n\n### 転送元スプレッドシートの設定をする\n\nサンプルデータを作成したスプレッドシートへの情報を記載します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/962f17d0-59bf-478b-9a28-55f4e163f88e.png)\n\n### 転送先Yahoo!広告 ディスプレイ広告 オーディエンスリストの設定をする\n\nアカウントIDは作成した接続情報に応じてサジェストがされるので、対応するものを選択してください。オーディエンスリスト名は、既存のリストから選択をすればそれに応じて処理がされ、新規の名前を記載すると新規作成されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/97fc0d2c-7050-466b-8116-96a6b58ae725.png)\n\nここまでで基本的な設定は完了です。\n\n### プレビューを見ながら調整する\n\n次のステップに進むと、データのプレビューが表示されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/eaa0fb18-054b-419f-b8de-8d5b3f6b4b32.png)\n\nここでは、ハッシュ化してから連携をしたいので、手順を説明する前にハッシュ化について解説します。\n\nハッシュ化とは、一定のアルゴリズムに則って、不可逆な（元に戻せない）変換処理を行うことです。例えば、`a`という文字列は、`SHA-256`というアルゴリズムで処理すると、`ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb`という文字列に変換されます。\n\nこれは、取扱いに注意が必要な生の個人情報をそのまま連携しないようにするために必要となっています。つまり、広告主側から生の個人情報を送って広告プラットフォーム側で照合するのではなく、広告主側でハッシュ化されたデータと、広告プラットフォーム側で保持しているデータをハッシュ化したデータを突合し、それらが一致するかで照合をするのです。\n\n```mermaid\nflowchart LR\n  subgraph 広告主環境\n    u[広告主ユーザー情報]\n    uh[広告主ユーザー情報（ハッシュ化）]\n  end\n  subgraph 広告プラットフォーム環境\n    thu[広告主ユーザー情報（ハッシュ化）]\n    pu[プラットフォームユーザー情報]\n    phu[プラットフォームユーザー情報（ハッシュ化）]\n  end\n  u--\u003e|ハッシュ化|uh\n  uh--\u003e|データ連携|thu\n  pu--\u003e|ハッシュ化|phu\n  thu---|一致確認|phu\n```\n\nちなみに、ハッシュ関数にはSHA-256以外にも様々な種類がありますが、以下のサイトで試してみることができます。\n\nhttps://kujiira.com/tools/hash\n\nさて、TROCCOではカラム名を指定するだけでSHA-256でハッシュ化してくれる機能があるので、その機能を利用します。カラムハッシュ化の部分で対象カラム名を入力し、更新をプレビューでプレビューデータを更新します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/57ed429e-be02-460c-b081-39e319669c81.png)\n\nすると、メールアドレスや電話番号がハッシュ化されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/904448de-2ed1-45c2-ae27-d34aa099fff6.png)\n\nこれで転送時の設定は完了です。\n\nなお、今回は生の個人情報を転送時にハッシュ化していますが、組織のセキュリティポリシーの関係でそもそも生の個人情報を取扱えなかったり、求められるハッシュ関数がSHA-256ではなかったりする場合もあります。そのときは事前にハッシュ化をしておくことになります。\n\n### 作成内容を確認して保存する\n\n次のステップに進むと、作成内容の確認画面が表示されるので、内容を見て問題なければ保存してください。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9063a0a4-3c0a-4fbd-865d-842c8203b987.png)\n\nその他、設定の詳細については以下の公式ドキュメントをご確認ください。\n\nhttps://documents.trocco.io/docs/data-destination-yahoo-display-ads-audience-list\n\n## データを転送する\n\n作成した転送設定を実行します。爆速で終わります。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73b37f3d-d4ea-4b52-82cf-8bb4b2aaafc3.png)\n\nYahoo!ディスプレイ広告の管理画面を確認すると、確かにオーディエンスリストが作成されています。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9f3befbb-4e8e-49d3-b8cb-3648dbdfe18e.png)\n\nなお、広告プラットフォーム側でのリスト生成にあたっては、データ転送後から反映までにラグがあるというのと、そもそも今回のものはダミーデータのためマッチングするユーザーが存在せず、ユーザーサイズは0件となるのにはご注意ください。\n\nデータ反映までのラグについては、以下のドキュメントをご確認ください。\n\nhttps://ads-help.yahoo-net.jp/s/article/H000044299?language=ja\n\nリストの連携方法は以上です。ハッシュ化の処理をカラム名を指定するだけで実現できるので、設定についてはとても簡単に行うことができます。\n\n# 利用上の注意\n\nハッシュ化しているとはいえ個人情報の授受にあたるため、広告プラットフォーム側の規約および顧客との許諾に基づいた運用をするようご注意ください。\n\n# おわりに\n\nYahoo!ディスプレイ広告を例に、TROCCOを用いたオーディエンスリスト連携についてご紹介してきました。まずはシンプルな運用からでもよいので、広告配信の最適化に向けて、方法の1つとしてご活用いただければ幸いです。\n","coediting":false,"comments_count":0,"created_at":"2025-12-15T13:28:15+09:00","group":null,"id":"d9362d98550555f3e2fe","likes_count":0,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"trocco","versions":[]},{"name":"Yahoo!広告","versions":[]},{"name":"広告配信","versions":[]},{"name":"オーディエンスリスト連携","versions":[]}],"title":"広告配信の最適化のために、TROCCOで広告プラットフォームへ顧客リストを連携する方法","updated_at":"2025-12-15T13:28:15+09:00","url":"https://qiita.com/SoySoySoyB/items/d9362d98550555f3e2fe","user":{"description":"データ基盤運用SaaSのPMM｜SnowPro Core/Google Certified Professional Data Engineer資格保持｜関心はデータサイエンス/データエンジニアリング/学術/教育/人材育成など","facebook_id":"","followees_count":0,"followers_count":41,"github_login_name":null,"id":"SoySoySoyB","items_count":59,"linkedin_id":"","location":"","name":"D","organization":"primeNumber Inc.","permanent_id":3492462,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3492462/e25cd3e19152b991613ccced5875eed607083730/x_large.png?1687963044","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:136\"\u003e本記事は、\u003ca href=\"https://qiita.com/advent-calendar/2025/trocco\"\u003eTROCCO\u0026amp;COMETA Advent Calendar 2025\u003c/a\u003eの13日目の記事になります。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:45\"\u003e\u003ciframe id=\"qiita-embed-content__e586c704521f9a9ef852be7e0500b187\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__e586c704521f9a9ef852be7e0500b187\" data-content=\"https%3A%2F%2Fqiita.com%2Fadvent-calendar%2F2025%2Ftrocco\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:472\"\u003eTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:154\"\u003eその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。\u003c/p\u003e\n\u003cdiv data-sourcepos=\"11:1-15:3\" class=\"note info\"\u003e\n\u003cspan class=\"fa fa-fw fa-check-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"13:1-13:173\"\u003eこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cp data-sourcepos=\"17:1-17:99\"\u003e転送先カスタムコネクタについては以下の記事で概要を説明しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"19:1-19:55\"\u003e\u003ciframe id=\"qiita-embed-content__d9be4ca4dbed65adb736100d9d2adcbe\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__d9be4ca4dbed65adb736100d9d2adcbe\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F8987b5938e2a499053c7\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"21:1-21:157\"\u003eまた、複数レコードに対して1リクエストを行う事例として、LINE Messaging APIを利用した以下の記事も公開しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"23:1-23:55\"\u003e\u003ciframe id=\"qiita-embed-content__5ba1b7999e465ca75b04cbdfb4849e97\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__5ba1b7999e465ca75b04cbdfb4849e97\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F44c3016a66482cd51a0f\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"25:1-25:330\"\u003eこれらの記事は全て新規作成のみを行う処理だったのですが、転送先カスタムコネクタでは作成APIと更新APIを組み合わせて、Upsertの処理を行うこともできます。本記事では、Upsert処理の例としてNotion Databaseへのデータ連携の事例を取り上げます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"27:1-27:29\"\u003e\n\u003cspan id=\"こんな方におすすめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%93%E3%81%AA%E6%96%B9%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこんな方におすすめ\u003c/h1\u003e\n\u003cul data-sourcepos=\"29:1-32:0\"\u003e\n\u003cli data-sourcepos=\"29:1-29:62\"\u003e転送先カスタムコネクタの概要を知りたい方\u003c/li\u003e\n\u003cli data-sourcepos=\"30:1-30:101\"\u003e転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\u003c/li\u003e\n\u003cli data-sourcepos=\"31:1-32:0\"\u003eUpsertモードの設定方法を確認したい方\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv data-sourcepos=\"33:1-37:3\" class=\"note warn\"\u003e\n\u003cspan class=\"fa fa-fw fa-exclamation-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"35:1-35:141\"\u003e本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003ch1 data-sourcepos=\"39:1-39:44\"\u003e\n\u003cspan id=\"notion-databaseにデータを連携する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#notion-database%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eNotion Databaseにデータを連携する\u003c/h1\u003e\n\u003cp data-sourcepos=\"41:1-41:207\"\u003eNotionでは、GUIでリッチな視覚的表現をできる反面、裏側のデータの保持の仕方が非常に複雑になっています。それによって、APIも取り回しが難しいです。\u003c/p\u003e\n\u003cp data-sourcepos=\"43:1-43:171\"\u003eそこで、本記事では外部で管理しているデータをNotionで読み取り専用の形で利用する形とします。以下のようなイメージです。\u003c/p\u003e\n\u003cp data-sourcepos=\"45:1-45:188\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F19035820-c166-4672-929e-5389112a1eed.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=28a2d63b8a9fabc47247c5175d867071\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F19035820-c166-4672-929e-5389112a1eed.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=28a2d63b8a9fabc47247c5175d867071\" alt=\"転送先Connector Builderを利用したNotion DatabaseのUpsert処理.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F19035820-c166-4672-929e-5389112a1eed.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=1daf6a0e26bf7562334c36ad8c54b286 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/19035820-c166-4672-929e-5389112a1eed.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"47:1-47:180\"\u003e例としてはスプレッドシートでデータを保持する形にしていますが、考え方としては他のデータソースにも適用できるかと思います。\u003c/p\u003e\n\u003cp data-sourcepos=\"49:1-49:185\"\u003eスプレッドシート→BigQueryのデータ転送については割愛しますが、わかりやすさのためフィルターをかけてレコード数を制限しています。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"51:1-51:36\"\u003e\n\u003cspan id=\"ソースデータを準備する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eソースデータを準備する\u003c/h2\u003e\n\u003cp data-sourcepos=\"53:1-53:179\"\u003eソースのデータとしては、データサイエンス100本ノックのstoreのデータを利用します。これをスプレッドシートに記載しておきます。\u003c/p\u003e\n\u003cp data-sourcepos=\"55:1-55:110\"\u003e\u003ciframe id=\"qiita-embed-content__57e32e2875a7cfbfd3f65f6cf89da2f7\" src=\"https://qiita.com/embed-contents/github-blob#qiita-embed-content__57e32e2875a7cfbfd3f65f6cf89da2f7\" data-content=\"https%3A%2F%2Fgithub.com%2FThe-Japan-DataScientist-Society%2F100knocks-preprocess%2Fblob%2Fmaster%2Fdocker%2Fwork%2Fdata%2Fstore.csv\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"57:1-57:136\"\u003eソースデータのBigQueryへの転送時に、\u003ccode\u003estore_cd\u003c/code\u003eの末尾が「0」のもののみにフィルタリングしています。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"59:1-59:39\"\u003e\n\u003cspan id=\"notionと接続する準備をする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#notion%E3%81%A8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%BA%96%E5%82%99%E3%82%92%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eNotionと接続する準備をする\u003c/h2\u003e\n\u003cp data-sourcepos=\"61:1-61:216\"\u003eシークレットの発行方法等については、以下の記事を参考にしてください。転送元として利用するにも、転送先として利用するにも設定方法としては共通です。\u003c/p\u003e\n\u003cp data-sourcepos=\"63:1-63:51\"\u003e\u003ciframe id=\"qiita-embed-content__5b8a7b1e06da0e8efb424a603afc25cc\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__5b8a7b1e06da0e8efb424a603afc25cc\" data-content=\"https%3A%2F%2Fqiita.com%2FMK0000%2Fitems%2Ffe9324bc8bb7a9488c05\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"65:1-65:57\"\u003eデータベースも事前に設定しておきます。\u003c/p\u003e\n\u003cp data-sourcepos=\"67:1-67:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fbc5ab2d8-2618-4808-b972-a683b57ef646.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=56c470b06eb646cb33fb7f60a0bfd3c0\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fbc5ab2d8-2618-4808-b972-a683b57ef646.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=56c470b06eb646cb33fb7f60a0bfd3c0\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fbc5ab2d8-2618-4808-b972-a683b57ef646.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=05c0d78d7e0e29de9665ed6599923320 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/bc5ab2d8-2618-4808-b972-a683b57ef646.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"69:1-69:60\"\u003e\n\u003cspan id=\"カスタムコネクタを作成する基本情報\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（基本情報）\u003c/h2\u003e\n\u003cp data-sourcepos=\"71:1-71:87\"\u003e各種項目を設定していきます。認証種別はAPIキーを選択します。\u003c/p\u003e\n\u003cp data-sourcepos=\"73:1-73:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fcd47ca82-cc2b-456e-aa1e-0bada734ddb0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=20569fc2eeaf5edd13d490aa61818f53\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fcd47ca82-cc2b-456e-aa1e-0bada734ddb0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=20569fc2eeaf5edd13d490aa61818f53\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fcd47ca82-cc2b-456e-aa1e-0bada734ddb0.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=7d543c2d12a206abccbc79a6f3bb5e85 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/cd47ca82-cc2b-456e-aa1e-0bada734ddb0.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"75:1-75:72\"\u003eこの段階で一度保存し、次は接続情報を作成します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"77:1-77:30\"\u003e\n\u003cspan id=\"接続情報を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e接続情報を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"79:1-79:105\"\u003eAPIキーや認証トークンとしてインテグレーションシークレットを入力します。\u003c/p\u003e\n\u003cp data-sourcepos=\"81:1-81:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2d6208e8-5ab9-4184-aafd-729d9e173a1a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=052c41b1ae5d1511a7a9b4447e4d6eb0\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2d6208e8-5ab9-4184-aafd-729d9e173a1a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=052c41b1ae5d1511a7a9b4447e4d6eb0\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2d6208e8-5ab9-4184-aafd-729d9e173a1a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a6a42bed1259d60189dbe0079b07b368 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2d6208e8-5ab9-4184-aafd-729d9e173a1a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"83:1-83:69\"\u003e\n\u003cspan id=\"カスタムコネクタを作成するエンドポイント\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（エンドポイント）\u003c/h2\u003e\n\u003cp data-sourcepos=\"85:1-85:112\"\u003e今回はUpsertの設定をするため、作成APIと更新APIの2種類を作成する必要があります。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"87:1-87:13\"\u003e\n\u003cspan id=\"作成api\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BD%9C%E6%88%90api\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e作成API\u003c/h3\u003e\n\u003cp data-sourcepos=\"89:1-89:48\"\u003e以下のエンドポイントになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"91:1-91:49\"\u003e\u003ciframe id=\"qiita-embed-content__95535a5a96d4dcff1bf9fe38133d2c5c\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__95535a5a96d4dcff1bf9fe38133d2c5c\" data-content=\"https%3A%2F%2Fdevelopers.notion.com%2Freference%2Fpost-page\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"93:1-93:206\"\u003eリクエストテンプレートは以下の通りです。ややこしいのはAPI仕様がややこしいので・・・。とはいえAIに依頼すればこれくらいは全然書いてくれます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"95:1-132:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etitle_column\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"store_cd\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"store_name,prefecture,address,address_kana\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"prefecture_cd,longitude,latitude,floor_area\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"tel_no\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eother_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003econcat:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003econcat:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"parent\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"database_id\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.database_id }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"properties\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ title_column }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"content\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[title_column] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"rich_text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"content\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[col] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"number\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"phone_number\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[col] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"134:1-134:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F680789cd-e647-4886-ba53-8fa145279231.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6bf946da8151ad0021b6f100b3f5062d\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F680789cd-e647-4886-ba53-8fa145279231.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6bf946da8151ad0021b6f100b3f5062d\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F680789cd-e647-4886-ba53-8fa145279231.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=4ee64ae5c0613338c2d9afd23f3e5059 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/680789cd-e647-4886-ba53-8fa145279231.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"136:1-136:219\"\u003eなお、テンプレートを書くのが大変すぎたので変数を活用して設定している関係で、接続確認時にキーの値が自動では出てきませんが、入力すれば利用可能です。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"138:1-138:13\"\u003e\n\u003cspan id=\"更新api\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%9B%B4%E6%96%B0api\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e更新API\u003c/h3\u003e\n\u003cp data-sourcepos=\"140:1-140:48\"\u003e以下のエンドポイントになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"142:1-142:50\"\u003e\u003ciframe id=\"qiita-embed-content__6f3720dda01ebc342763d70d8e81defe\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__6f3720dda01ebc342763d70d8e81defe\" data-content=\"https%3A%2F%2Fdevelopers.notion.com%2Freference%2Fpatch-page\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"144:1-144:263\"\u003eこちらは既存のレコードに対して更新をかけるので、パスに\u003ccode\u003epage_id\u003c/code\u003eを指定してPATCHでリクエストを送る形になっています。リクエストテンプレートは以下の通りです。こちらもややこし（以下略）\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"146:1-180:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etitle_column\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"store_cd\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"store_name,prefecture,address,address_kana\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"prefecture_cd,longitude,latitude,floor_area\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"tel_no\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esplit:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eassign\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eother_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003econcat:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003econcat:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"properties\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ title_column }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"content\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[title_column] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003etext_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"rich_text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"content\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[col] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003enumber_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"number\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecol\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ephone_columns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"{{ col }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n            \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"phone_number\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row[col] }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"182:1-182:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F62082bfd-3712-4427-9879-7dc2f7e07b6c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=54e5d3143a4d0563e1aa91a25922b094\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F62082bfd-3712-4427-9879-7dc2f7e07b6c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=54e5d3143a4d0563e1aa91a25922b094\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F62082bfd-3712-4427-9879-7dc2f7e07b6c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=464bbdbda6bff68b465784d2a5e42bc6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/62082bfd-3712-4427-9879-7dc2f7e07b6c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"184:1-184:75\"\u003eここまでできればカスタムコネクタの作成は完了です。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"186:1-186:30\"\u003e\n\u003cspan id=\"転送設定を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送設定を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"188:1-188:167\"\u003e続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\u003c/p\u003e\n\u003cp data-sourcepos=\"190:1-190:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feb9d55ea-5530-4031-9781-c5a3b773170f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=db71a062db22c6f21ebfce63a0d479c8\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feb9d55ea-5530-4031-9781-c5a3b773170f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=db71a062db22c6f21ebfce63a0d479c8\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Feb9d55ea-5530-4031-9781-c5a3b773170f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bcc6ab71bfc6f098af79ce612cd05b91 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/eb9d55ea-5530-4031-9781-c5a3b773170f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"192:1-192:30\"\u003eSQLは以下の通りです。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"195:1-202:3\"\u003e\n\u003cdiv class=\"code-lang\"\u003e\u003cspan class=\"bold\"\u003e初期設定\u003c/span\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'$database_id$'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edatabase_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003enull\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epage_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`\u0026lt;project_id\u0026gt;.\u0026lt;dataset_id\u0026gt;.raw_spreadsheet__store`\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"204:1-230:3\"\u003e\n\u003cdiv class=\"code-lang\"\u003e\u003cspan class=\"bold\"\u003e 更新後（転送元Notionのデータも合わせて活用）\u003c/span\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'$database_id$'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edatabase_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epage_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`\u0026lt;project_id\u0026gt;.\u0026lt;dataset_id\u0026gt;.raw_spreadsheet__store`\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003cspan class=\"k\"\u003einner\u003c/span\u003e \u003cspan class=\"k\"\u003ejoin\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`\u0026lt;project_id\u0026gt;.\u0026lt;dataset_id\u0026gt;.raw_notion__store`\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eon\u003c/span\u003e\n    \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estore_cd\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejson_query_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproperties__store_cd__title\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$.text.content'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eunion\u003c/span\u003e \u003cspan class=\"k\"\u003eall\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'$database_id$'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edatabase_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"k\"\u003enull\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epage_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`\u0026lt;project_id\u0026gt;.\u0026lt;dataset_id\u0026gt;.raw_spreadsheet__store`\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003cspan class=\"k\"\u003eleft\u003c/span\u003e \u003cspan class=\"k\"\u003ejoin\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`\u0026lt;project_id\u0026gt;.\u0026lt;dataset_id\u0026gt;.raw_notion__store`\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eon\u003c/span\u003e\n    \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estore_cd\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejson_query_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproperties__store_cd__title\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$.text.content'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"k\"\u003ewhere\u003c/span\u003e\n  \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"k\"\u003eis\u003c/span\u003e \u003cspan class=\"k\"\u003enull\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp data-sourcepos=\"232:1-232:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8a359934-0fb4-4c8d-aaa9-80162248401f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=009bf2cb60d65a96f23b59e032c0b2f4\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8a359934-0fb4-4c8d-aaa9-80162248401f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=009bf2cb60d65a96f23b59e032c0b2f4\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8a359934-0fb4-4c8d-aaa9-80162248401f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=422ad3acddde34d81f476426f9673449 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8a359934-0fb4-4c8d-aaa9-80162248401f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"234:1-234:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd31df024-7792-45df-88df-9cb23b837e03.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a9c712feb659b8affceb89f0e107ebe8\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd31df024-7792-45df-88df-9cb23b837e03.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a9c712feb659b8affceb89f0e107ebe8\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd31df024-7792-45df-88df-9cb23b837e03.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bfeee64ff2dce5de71c7a50f14814548 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d31df024-7792-45df-88df-9cb23b837e03.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"236:1-236:232\"\u003eカスタムコネクタとしては、UPSERTモードを選択します。これにより、page_idの有無に応じて、なければ作成API、あれば更新APIに対してリクエストが行われるようになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"238:1-238:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F54c4c593-f3c6-4c03-9e6d-ccbd8f4d39f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0428796ad0f1e7b2e6cdaf7bb177e46c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F54c4c593-f3c6-4c03-9e6d-ccbd8f4d39f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0428796ad0f1e7b2e6cdaf7bb177e46c\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F54c4c593-f3c6-4c03-9e6d-ccbd8f4d39f7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=f8446a1da3448bc895359430f4bd8ebd 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/54c4c593-f3c6-4c03-9e6d-ccbd8f4d39f7.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"240:1-240:162\"\u003eプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"242:1-242:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12adb1a3-1d14-433a-8663-cbb907cc8723.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=586e975daaa098ed72020ffe83b65a3d\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12adb1a3-1d14-433a-8663-cbb907cc8723.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=586e975daaa098ed72020ffe83b65a3d\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12adb1a3-1d14-433a-8663-cbb907cc8723.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=9d24ddad1e0784119965783306dbb2f7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/12adb1a3-1d14-433a-8663-cbb907cc8723.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"244:1-244:45\"\u003e問題なければこれで保存します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"246:1-246:27\"\u003e\n\u003cspan id=\"データを転送する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータを転送する\u003c/h2\u003e\n\u003cp data-sourcepos=\"248:1-248:66\"\u003e保存した転送設定を実行します。無事成功です！\u003c/p\u003e\n\u003cp data-sourcepos=\"250:1-250:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4fd1a073-f671-45c0-9401-1a16edb3763a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2cec9be987699ae5c804bffc91b32b6c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4fd1a073-f671-45c0-9401-1a16edb3763a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2cec9be987699ae5c804bffc91b32b6c\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4fd1a073-f671-45c0-9401-1a16edb3763a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=24d9a42a62d13e26544794217d1315e7 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4fd1a073-f671-45c0-9401-1a16edb3763a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"252:1-252:66\"\u003e実際、Notion Databaseにデータが連携されています！\u003c/p\u003e\n\u003cp data-sourcepos=\"254:1-254:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F07e09e07-67ef-4f43-823f-18573451b95b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1d92a13135a3979d1b23f639cfe6a334\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F07e09e07-67ef-4f43-823f-18573451b95b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1d92a13135a3979d1b23f639cfe6a334\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F07e09e07-67ef-4f43-823f-18573451b95b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=8971311a5e70c85fdfd2474b55f56c44 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/07e09e07-67ef-4f43-823f-18573451b95b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"256:1-256:36\"\u003e\n\u003cspan id=\"既存レコードをupdateする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%97%A2%E5%AD%98%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92update%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e既存レコードをUpdateする\u003c/h2\u003e\n\u003cp data-sourcepos=\"258:1-258:270\"\u003e既存のレコードについては作成ではなく更新処理を行うため、転送元Notionを利用して連携済みのデータを取得し、それとスプレッドシートのデータを合わせて処理できるようワークフローを組みます。\u003c/p\u003e\n\u003cp data-sourcepos=\"260:1-260:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fed24e22d-d012-464b-adc0-2a886e91ccd2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9246f4ed20333e7b29f7e0a13498f323\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fed24e22d-d012-464b-adc0-2a886e91ccd2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9246f4ed20333e7b29f7e0a13498f323\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fed24e22d-d012-464b-adc0-2a886e91ccd2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6f097d05c0d1fb1154cc9a7229b92d58 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ed24e22d-d012-464b-adc0-2a886e91ccd2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"262:1-262:142\"\u003eこの状態で、スプレッドシートのS14010のstore_nameを「店名が変わりました！！！」に変更してみましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"264:1-264:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0ed99ce8-2b89-447a-9d62-4c826492fa53.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ccbf8b36bc9e09342709a1ffeb5bb97e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0ed99ce8-2b89-447a-9d62-4c826492fa53.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ccbf8b36bc9e09342709a1ffeb5bb97e\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F0ed99ce8-2b89-447a-9d62-4c826492fa53.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a4d0b5ef102a737e2e2eabc779170d57 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/0ed99ce8-2b89-447a-9d62-4c826492fa53.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"266:1-266:123\"\u003eこの状態でワークフローを実行します。すると、Notion Databaseのレコードが更新されました！\u003c/p\u003e\n\u003cp data-sourcepos=\"268:1-268:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8eac0c3c-ad3d-451b-9d88-98b1216e1a2b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=557b1bc3553d74fe858735e33de6b0cc\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8eac0c3c-ad3d-451b-9d88-98b1216e1a2b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=557b1bc3553d74fe858735e33de6b0cc\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8eac0c3c-ad3d-451b-9d88-98b1216e1a2b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=414b63231261951ce733322b0c684589 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8eac0c3c-ad3d-451b-9d88-98b1216e1a2b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"270:1-270:162\"\u003eなお、今回は未変更レコードの除外処理をしていないので、更新処理は既存のレコード全てに対して適用されています。\u003c/p\u003e\n\u003cp data-sourcepos=\"272:1-272:192\"\u003e差分処理に変更するには、Notionから取得したデータとスプレッドシートから取得したデータに差分があるかの判定を入れる必要が出てきます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"274:1-274:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"276:1-276:213\"\u003eここまで、Notion Databaseを例に読み取り専用のUpsert処理を行う方法を解説しました。Notion Database以外でも考え方としては使えるので、参考にしてみてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"278:1-278:413\"\u003eまた、途中で触れてもいますがNotionはそもそものデータ構造／APIの仕様が複雑であることと、作成／更新ともに1レコード1リクエストの形式になっているため、パフォーマンス上の課題も想定されます。初期取込は切り分けをする、差分更新に処理を最適化するなど、対応方法の検討が必要になるでしょう。\u003c/p\u003e\n","body":"# はじめに\n\n本記事は、[TROCCO\u0026COMETA Advent Calendar 2025](https://qiita.com/advent-calendar/2025/trocco)の13日目の記事になります。\n\nhttps://qiita.com/advent-calendar/2025/trocco\n\nTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\n\nその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。\n\n:::note info\n\nこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\n\n:::\n\n転送先カスタムコネクタについては以下の記事で概要を説明しています。\n\nhttps://qiita.com/SoySoySoyB/items/8987b5938e2a499053c7\n\nまた、複数レコードに対して1リクエストを行う事例として、LINE Messaging APIを利用した以下の記事も公開しています。\n\nhttps://qiita.com/SoySoySoyB/items/44c3016a66482cd51a0f\n\nこれらの記事は全て新規作成のみを行う処理だったのですが、転送先カスタムコネクタでは作成APIと更新APIを組み合わせて、Upsertの処理を行うこともできます。本記事では、Upsert処理の例としてNotion Databaseへのデータ連携の事例を取り上げます。\n\n# こんな方におすすめ\n\n- 転送先カスタムコネクタの概要を知りたい方\n- 転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\n- Upsertモードの設定方法を確認したい方\n\n:::note warn\n\n本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\n\n:::\n\n# Notion Databaseにデータを連携する\n\nNotionでは、GUIでリッチな視覚的表現をできる反面、裏側のデータの保持の仕方が非常に複雑になっています。それによって、APIも取り回しが難しいです。\n\nそこで、本記事では外部で管理しているデータをNotionで読み取り専用の形で利用する形とします。以下のようなイメージです。\n\n![転送先Connector Builderを利用したNotion DatabaseのUpsert処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/19035820-c166-4672-929e-5389112a1eed.png)\n\n例としてはスプレッドシートでデータを保持する形にしていますが、考え方としては他のデータソースにも適用できるかと思います。\n\nスプレッドシート→BigQueryのデータ転送については割愛しますが、わかりやすさのためフィルターをかけてレコード数を制限しています。\n\n## ソースデータを準備する\n\nソースのデータとしては、データサイエンス100本ノックのstoreのデータを利用します。これをスプレッドシートに記載しておきます。\n\nhttps://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker/work/data/store.csv\n\nソースデータのBigQueryへの転送時に、`store_cd`の末尾が「0」のもののみにフィルタリングしています。\n\n## Notionと接続する準備をする\n\nシークレットの発行方法等については、以下の記事を参考にしてください。転送元として利用するにも、転送先として利用するにも設定方法としては共通です。\n\nhttps://qiita.com/MK0000/items/fe9324bc8bb7a9488c05\n\nデータベースも事前に設定しておきます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/bc5ab2d8-2618-4808-b972-a683b57ef646.png)\n\n## カスタムコネクタを作成する（基本情報）\n\n各種項目を設定していきます。認証種別はAPIキーを選択します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/cd47ca82-cc2b-456e-aa1e-0bada734ddb0.png)\n\nこの段階で一度保存し、次は接続情報を作成します。\n\n## 接続情報を作成する\n\nAPIキーや認証トークンとしてインテグレーションシークレットを入力します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2d6208e8-5ab9-4184-aafd-729d9e173a1a.png)\n\n## カスタムコネクタを作成する（エンドポイント）\n\n今回はUpsertの設定をするため、作成APIと更新APIの2種類を作成する必要があります。\n\n### 作成API\n\n以下のエンドポイントになります。\n\nhttps://developers.notion.com/reference/post-page\n\nリクエストテンプレートは以下の通りです。ややこしいのはAPI仕様がややこしいので・・・。とはいえAIに依頼すればこれくらいは全然書いてくれます。\n\n```json\n{%- assign title_column = \"store_cd\" -%}\n{%- assign text_columns = \"store_name,prefecture,address,address_kana\" | split: \",\" -%}\n{%- assign number_columns = \"prefecture_cd,longitude,latitude,floor_area\" | split: \",\" -%}\n{%- assign phone_columns = \"tel_no\" | split: \",\" -%}\n{%- assign other_columns = text_columns | concat: number_columns | concat: phone_columns -%}\n{\n    \"parent\": {\n        \"database_id\": \"{{ row.database_id }}\"\n    },\n    \"properties\": {\n        \"{{ title_column }}\": {\n            \"title\": [\n                {\n                    \"text\": {\n                        \"content\": \"{{ row[title_column] }}\"\n                    }\n                }\n            ]\n        }{% for col in text_columns %},\n        \"{{ col }}\": {\n            \"rich_text\": [\n                {\n                    \"text\": {\n                        \"content\": \"{{ row[col] }}\"\n                    }\n                }\n            ]\n        }{% endfor %}{% for col in number_columns %},\n        \"{{ col }}\": {\n            \"number\": {{ row[col] }}\n        }{% endfor %}{% for col in phone_columns %},\n        \"{{ col }}\": {\n            \"phone_number\": \"{{ row[col] }}\"\n        }{% endfor %}\n    }\n}\n```\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/680789cd-e647-4886-ba53-8fa145279231.png)\n\nなお、テンプレートを書くのが大変すぎたので変数を活用して設定している関係で、接続確認時にキーの値が自動では出てきませんが、入力すれば利用可能です。\n\n### 更新API\n\n以下のエンドポイントになります。\n\nhttps://developers.notion.com/reference/patch-page\n\nこちらは既存のレコードに対して更新をかけるので、パスに`page_id`を指定してPATCHでリクエストを送る形になっています。リクエストテンプレートは以下の通りです。こちらもややこし（以下略）\n\n```json\n{%- assign title_column = \"store_cd\" -%}\n{%- assign text_columns = \"store_name,prefecture,address,address_kana\" | split: \",\" -%}\n{%- assign number_columns = \"prefecture_cd,longitude,latitude,floor_area\" | split: \",\" -%}\n{%- assign phone_columns = \"tel_no\" | split: \",\" -%}\n{%- assign other_columns = text_columns | concat: number_columns | concat: phone_columns -%}\n{\n    \"properties\": {\n        \"{{ title_column }}\": {\n            \"title\": [\n                {\n                    \"text\": {\n                        \"content\": \"{{ row[title_column] }}\"\n                    }\n                }\n            ]\n        }{% for col in text_columns %},\n        \"{{ col }}\": {\n            \"rich_text\": [\n                {\n                    \"text\": {\n                        \"content\": \"{{ row[col] }}\"\n                    }\n                }\n            ]\n        }{% endfor %}{% for col in number_columns %},\n        \"{{ col }}\": {\n            \"number\": {{ row[col] }}\n        }{% endfor %}{% for col in phone_columns %},\n        \"{{ col }}\": {\n            \"phone_number\": \"{{ row[col] }}\"\n        }{% endfor %}\n    }\n}\n```\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/62082bfd-3712-4427-9879-7dc2f7e07b6c.png)\n\nここまでできればカスタムコネクタの作成は完了です。\n\n## 転送設定を作成する\n\n続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/eb9d55ea-5530-4031-9781-c5a3b773170f.png)\n\nSQLは以下の通りです。\n\n\n```sql:初期設定\nselect\n  '$database_id$' as database_id,\n  null as page_id,\n  s.*\nfrom\n  `\u003cproject_id\u003e.\u003cdataset_id\u003e.raw_spreadsheet__store` s\n```\n\n```sql: 更新後（転送元Notionのデータも合わせて活用）\nselect\n  '$database_id$' as database_id,\n  n.id as page_id,\n  s.*\nfrom\n  `\u003cproject_id\u003e.\u003cdataset_id\u003e.raw_spreadsheet__store` s\ninner join\n  `\u003cproject_id\u003e.\u003cdataset_id\u003e.raw_notion__store` n\n  on\n    s.store_cd = json_value(json_query_array(n.properties__store_cd__title)[0], '$.text.content')\n\nunion all\n\nselect\n  '$database_id$' as database_id,\n  null as page_id,\n  s.*\nfrom\n  `\u003cproject_id\u003e.\u003cdataset_id\u003e.raw_spreadsheet__store` s\nleft join\n  `\u003cproject_id\u003e.\u003cdataset_id\u003e.raw_notion__store` n\n  on\n    s.store_cd = json_value(json_query_array(n.properties__store_cd__title)[0], '$.text.content')\nwhere\n  n.id is null\n```\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8a359934-0fb4-4c8d-aaa9-80162248401f.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d31df024-7792-45df-88df-9cb23b837e03.png)\n\nカスタムコネクタとしては、UPSERTモードを選択します。これにより、page_idの有無に応じて、なければ作成API、あれば更新APIに対してリクエストが行われるようになります。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/54c4c593-f3c6-4c03-9e6d-ccbd8f4d39f7.png)\n\nプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/12adb1a3-1d14-433a-8663-cbb907cc8723.png)\n\n問題なければこれで保存します。\n\n## データを転送する\n\n保存した転送設定を実行します。無事成功です！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4fd1a073-f671-45c0-9401-1a16edb3763a.png)\n\n実際、Notion Databaseにデータが連携されています！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/07e09e07-67ef-4f43-823f-18573451b95b.png)\n\n## 既存レコードをUpdateする\n\n既存のレコードについては作成ではなく更新処理を行うため、転送元Notionを利用して連携済みのデータを取得し、それとスプレッドシートのデータを合わせて処理できるようワークフローを組みます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ed24e22d-d012-464b-adc0-2a886e91ccd2.png)\n\nこの状態で、スプレッドシートのS14010のstore_nameを「店名が変わりました！！！」に変更してみましょう。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/0ed99ce8-2b89-447a-9d62-4c826492fa53.png)\n\nこの状態でワークフローを実行します。すると、Notion Databaseのレコードが更新されました！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8eac0c3c-ad3d-451b-9d88-98b1216e1a2b.png)\n\nなお、今回は未変更レコードの除外処理をしていないので、更新処理は既存のレコード全てに対して適用されています。\n\n差分処理に変更するには、Notionから取得したデータとスプレッドシートから取得したデータに差分があるかの判定を入れる必要が出てきます。\n\n# おわりに\n\nここまで、Notion Databaseを例に読み取り専用のUpsert処理を行う方法を解説しました。Notion Database以外でも考え方としては使えるので、参考にしてみてください。\n\nまた、途中で触れてもいますがNotionはそもそものデータ構造／APIの仕様が複雑であることと、作成／更新ともに1レコード1リクエストの形式になっているため、パフォーマンス上の課題も想定されます。初期取込は切り分けをする、差分更新に処理を最適化するなど、対応方法の検討が必要になるでしょう。\n","coediting":false,"comments_count":0,"created_at":"2025-12-11T15:35:18+09:00","group":null,"id":"d19aaa406ab353e20aa0","likes_count":3,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"カスタムコネクタ","versions":[]},{"name":"trocco","versions":[]},{"name":"Notion","versions":[]},{"name":"NotionAPI","versions":[]}],"title":"TROCCOの転送先カスタムコネクタでNotion Databaseに外部からデータ連携する","updated_at":"2025-12-11T15:35:18+09:00","url":"https://qiita.com/SoySoySoyB/items/d19aaa406ab353e20aa0","user":{"description":"データ基盤運用SaaSのPMM｜SnowPro Core/Google Certified Professional Data Engineer資格保持｜関心はデータサイエンス/データエンジニアリング/学術/教育/人材育成など","facebook_id":"","followees_count":0,"followers_count":41,"github_login_name":null,"id":"SoySoySoyB","items_count":59,"linkedin_id":"","location":"","name":"D","organization":"primeNumber Inc.","permanent_id":3492462,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3492462/e25cd3e19152b991613ccced5875eed607083730/x_large.png?1687963044","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:136\"\u003e本記事は、\u003ca href=\"https://qiita.com/advent-calendar/2025/trocco\"\u003eTROCCO\u0026amp;COMETA Advent Calendar 2025\u003c/a\u003eの12日目の記事になります。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:45\"\u003e\u003ciframe id=\"qiita-embed-content__2f110e5f4b1ef1a852602c5fc61dc8e5\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__2f110e5f4b1ef1a852602c5fc61dc8e5\" data-content=\"https%3A%2F%2Fqiita.com%2Fadvent-calendar%2F2025%2Ftrocco\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:472\"\u003eTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:154\"\u003eその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。\u003c/p\u003e\n\u003cdiv data-sourcepos=\"11:1-15:3\" class=\"note info\"\u003e\n\u003cspan class=\"fa fa-fw fa-check-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"13:1-13:173\"\u003eこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cp data-sourcepos=\"17:1-17:99\"\u003e転送先カスタムコネクタについては以下の記事で概要を説明しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"19:1-19:55\"\u003e\u003ciframe id=\"qiita-embed-content__80b8e03ad7f592e7ab813ff903258e96\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__80b8e03ad7f592e7ab813ff903258e96\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F8987b5938e2a499053c7\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"21:1-21:78\"\u003eさて、転送先カスタムコネクタでデータを送るときには、\u003c/p\u003e\n\u003cul data-sourcepos=\"23:1-25:0\"\u003e\n\u003cli data-sourcepos=\"23:1-23:58\"\u003e1レコード1リクエスト（単一リクエスト）\u003c/li\u003e\n\u003cli data-sourcepos=\"24:1-25:0\"\u003e複数レコード1リクエスト（一括リクエスト）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"26:1-26:254\"\u003eの2つの方法があるのですが、概要記事では前者を取り上げているため、本記事では後者の例としてLINE Messaging APIを利用したLINE公式アカウントからのメッセージ送信について取り上げます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"28:1-28:29\"\u003e\n\u003cspan id=\"こんな方におすすめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%93%E3%81%AA%E6%96%B9%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこんな方におすすめ\u003c/h1\u003e\n\u003cul data-sourcepos=\"30:1-33:0\"\u003e\n\u003cli data-sourcepos=\"30:1-30:62\"\u003e転送先カスタムコネクタの概要を知りたい方\u003c/li\u003e\n\u003cli data-sourcepos=\"31:1-31:101\"\u003e転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\u003c/li\u003e\n\u003cli data-sourcepos=\"32:1-33:0\"\u003e一括リクエストの設定方法を確認したい方\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv data-sourcepos=\"34:1-38:3\" class=\"note warn\"\u003e\n\u003cspan class=\"fa fa-fw fa-exclamation-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"36:1-36:141\"\u003e本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003ch1 data-sourcepos=\"40:1-40:63\"\u003e\n\u003cspan id=\"line公式アカウントからメッセージを送信する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#line%E5%85%AC%E5%BC%8F%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%8B%E3%82%89%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eLINE公式アカウントからメッセージを送信する\u003c/h1\u003e\n\u003cp data-sourcepos=\"42:1-42:223\"\u003e今回の例は、LINE公式アカウントで、友だち登録されている特定のユーザーのみに限定してメッセージを送信する方法です。以下のようにメッセージが送付できます。\u003c/p\u003e\n\u003cp data-sourcepos=\"44:1-44:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F5021e0f5-c56e-4b80-a6d3-eb5aca400934.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9ba354e3c79f237c73222d9ae1deb662\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F5021e0f5-c56e-4b80-a6d3-eb5aca400934.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9ba354e3c79f237c73222d9ae1deb662\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F5021e0f5-c56e-4b80-a6d3-eb5aca400934.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=aad8f14a1e2bbd33e19c105d0787d3de 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/5021e0f5-c56e-4b80-a6d3-eb5aca400934.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"46:1-46:207\"\u003eなお、これとは別にユーザー指定せずメッセージ配信することもできるので、実際には一斉配信とセグメント別配信を使い分けすることになりそうです。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"48:1-48:37\"\u003e\n\u003cspan id=\"lineの側の事前準備をする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#line%E3%81%AE%E5%81%B4%E3%81%AE%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99%E3%82%92%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eLINEの側の事前準備をする\u003c/h2\u003e\n\u003cp data-sourcepos=\"50:1-50:151\"\u003e事前にLINE公式アカウントを開設します。私は過去にやっていましたが、設定は短時間で進めることができます。\u003c/p\u003e\n\u003cp data-sourcepos=\"52:1-52:68\"\u003e\u003ciframe id=\"qiita-embed-content__aaaf4e6aedbbd23672f9b733542f7c11\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__aaaf4e6aedbbd23672f9b733542f7c11\" data-content=\"https%3A%2F%2Fwww.lycbiz.com%2Fjp%2Fmanual%2FOfficialAccountManager%2Fnew_account%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"54:1-54:199\"\u003e公式アカウントが開設できたら、チャネルのなかのMessaging APIのタブで、チャネルアクセストークンが発行できます。これを接続情報で利用します。\u003c/p\u003e\n\u003cp data-sourcepos=\"56:1-56:55\"\u003eまた、Webhook設定については後述します。\u003c/p\u003e\n\u003cp data-sourcepos=\"58:1-58:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa36b5308-a9d5-4972-9a02-5e87a99867ea.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ee006e5e7e8f3dbceb79921d82ab4f3a\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa36b5308-a9d5-4972-9a02-5e87a99867ea.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ee006e5e7e8f3dbceb79921d82ab4f3a\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa36b5308-a9d5-4972-9a02-5e87a99867ea.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=902b01adf9565c172761895653a7e4e5 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a36b5308-a9d5-4972-9a02-5e87a99867ea.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"60:1-60:62\"\u003e\n\u003cspan id=\"ユーザーid取得用のgoogle-apps-scriptを設定する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BCid%E5%8F%96%E5%BE%97%E7%94%A8%E3%81%AEgoogle-apps-script%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eユーザーID取得用のGoogle Apps Scriptを設定する\u003c/h2\u003e\n\u003cp data-sourcepos=\"62:1-62:99\"\u003e今回メッセージ送信に利用するエンドポイントは以下のものになります。\u003c/p\u003e\n\u003cp data-sourcepos=\"64:1-64:78\"\u003e\u003ciframe id=\"qiita-embed-content__df8f1ec16cec0929344d989066bbdaa2\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__df8f1ec16cec0929344d989066bbdaa2\" data-content=\"https%3A%2F%2Fdevelopers.line.biz%2Fja%2Freference%2Fmessaging-api%2F%23send-multicast-message\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"66:1-66:166\"\u003eここで、メッセージ送信をするときに指定するユーザーIDは、スマホのアプリで確認できるIDとは別のものになっています。\u003c/p\u003e\n\u003cp data-sourcepos=\"68:1-68:495\"\u003eこのIDは、ユーザーがメッセージを送ったり友だち追加したりといったイベントが発生したときのWebhook経由でしか取得できないという仕様になっているため、Webhook経由でIDを取得するための処理をGoogle Apps Scriptで作成します。以下のコードで作成し、ウェブアプリとしてデプロイしてください。これで指定したスプレッドシートにデータが登録されるようになります。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"javascript\" data-sourcepos=\"70:1-93:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003edoPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n  \u003cspan class=\"c1\"\u003e// SHEET_URLはスクリプトプロパティに登録しておく\u003c/span\u003e\n  \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHEET_URL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ePropertiesService\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003egetScriptProperties\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003egetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"s1\"\u003eSHEET_URL\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n  \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003esheet\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eSpreadsheetApp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eopenByUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eSHEET_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003egetSheetByName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"s1\"\u003ewebhook_logs\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n  \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n    \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epayload_json\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epostData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n    \u003cspan class=\"nx\"\u003esheet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappendRow\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\n      \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nc\"\u003eDate\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n      \u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003estringify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epayload_json\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n      \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003eContentService\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecreateTextOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"s1\"\u003eOk\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003ecatch \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n    \u003cspan class=\"nx\"\u003esheet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eappendRow\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\n      \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nc\"\u003eDate\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n      \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"s1\"\u003eError: \u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003etoString\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003eContentService\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecreateTextOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"s1\"\u003eError\u003c/span\u003e\u003cspan class=\"dl\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"95:1-95:84\"\u003eここで公開したときのURLをLINEのWebhook URLに設定してください。\u003c/p\u003e\n\u003cp data-sourcepos=\"97:1-97:310\"\u003eなお、Google Apps Scriptの仕様上302（リダイレクト）のレスポンスを返すので「検証」として実行してもエラーの表示が出てきますが、Webhookとしては正常に動作します。スプレッドシートにデータが登録されていれば問題ありません。\u003c/p\u003e\n\u003cp data-sourcepos=\"99:1-99:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Febd39824-6a0e-4e60-acc8-a9861dd14ea9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ffefc8e0440f41de6b7e884f87e2d352\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Febd39824-6a0e-4e60-acc8-a9861dd14ea9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ffefc8e0440f41de6b7e884f87e2d352\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Febd39824-6a0e-4e60-acc8-a9861dd14ea9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=be6b68f0c8a3c345ebcec43a79d13d82 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ebd39824-6a0e-4e60-acc8-a9861dd14ea9.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"101:1-101:47\"\u003e\n\u003cspan id=\"bigqueryの外部テーブルを作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#bigquery%E3%81%AE%E5%A4%96%E9%83%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBigQueryの外部テーブルを作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"103:1-103:126\"\u003e取り回しをよくするために、上で作成したデータに対して外部テーブルを設定しておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"105:1-123:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003ecreate\u003c/span\u003e \u003cspan class=\"k\"\u003eor\u003c/span\u003e \u003cspan class=\"k\"\u003ereplace\u003c/span\u003e \u003cspan class=\"k\"\u003eschema\u003c/span\u003e \u003cspan class=\"nv\"\u003e`raw_line`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eoptions\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n  \u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'asia-northeast1'\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003ecreate\u003c/span\u003e \u003cspan class=\"k\"\u003eor\u003c/span\u003e \u003cspan class=\"k\"\u003ereplace\u003c/span\u003e \u003cspan class=\"k\"\u003eexternal\u003c/span\u003e \u003cspan class=\"k\"\u003etable\u003c/span\u003e \u003cspan class=\"nv\"\u003e`raw_line.raw_line__webhook_logs`\u003c/span\u003e\n\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n  \u003cspan class=\"nb\"\u003etimestamp\u003c/span\u003e \u003cspan class=\"nb\"\u003etimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003epayload_json\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eerror_message\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"k\"\u003eoptions\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eformat\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'google_sheets'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003euris\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e'https://docs.google.com/spreadsheets/d/********/'\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n  \u003cspan class=\"n\"\u003esheet_range\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'webhook_logs!A:C'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003eskip_leading_rows\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"125:1-125:102\"\u003e事前の設定はこれで完了です。続いてカスタムコネクタの設定に入ります。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"127:1-127:60\"\u003e\n\u003cspan id=\"カスタムコネクタを作成する基本情報\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（基本情報）\u003c/h2\u003e\n\u003cp data-sourcepos=\"129:1-129:87\"\u003e各種項目を設定していきます。認証種別はAPIキーを選択します。\u003c/p\u003e\n\u003cp data-sourcepos=\"131:1-131:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ffc44b93d-f30a-4582-973a-1c909ee56852.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4a970e6be1a1714aa292a1baf4e38488\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ffc44b93d-f30a-4582-973a-1c909ee56852.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4a970e6be1a1714aa292a1baf4e38488\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ffc44b93d-f30a-4582-973a-1c909ee56852.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bff6557a24d86864e4dbd95abd879b92 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/fc44b93d-f30a-4582-973a-1c909ee56852.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"133:1-133:72\"\u003eこの段階で一度保存し、次は接続情報を作成します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"135:1-135:30\"\u003e\n\u003cspan id=\"接続情報を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e接続情報を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"137:1-137:96\"\u003eAPIキーや認証トークンとしてチャネルアクセストークンを入力します。\u003c/p\u003e\n\u003cp data-sourcepos=\"139:1-139:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F95ebcfc8-f17e-4b67-b311-995bb7959096.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d43c9acd5f0278675f40847672abc75e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F95ebcfc8-f17e-4b67-b311-995bb7959096.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d43c9acd5f0278675f40847672abc75e\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F95ebcfc8-f17e-4b67-b311-995bb7959096.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=463a67c4991b84d21c4bbcc9a276a9d4 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/95ebcfc8-f17e-4b67-b311-995bb7959096.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"141:1-141:69\"\u003e\n\u003cspan id=\"カスタムコネクタを作成するエンドポイント\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（エンドポイント）\u003c/h2\u003e\n\u003cp data-sourcepos=\"143:1-143:279\"\u003e再度保存していたカスタムコネクタの編集画面に戻り、エンドポイントを追加します。今回は「マルチキャストメッセージを送る」のエンドポイントを利用するので、作成API／一括リクエストを選択します。\u003c/p\u003e\n\u003cp data-sourcepos=\"145:1-145:78\"\u003e\u003ciframe id=\"qiita-embed-content__603ec645a0d9f060e89e942d842563fc\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__603ec645a0d9f060e89e942d842563fc\" data-content=\"https%3A%2F%2Fdevelopers.line.biz%2Fja%2Freference%2Fmessaging-api%2F%23send-multicast-message\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cul data-sourcepos=\"147:1-154:0\"\u003e\n\u003cli data-sourcepos=\"147:1-147:16\"\u003e名前: 任意\u003c/li\u003e\n\u003cli data-sourcepos=\"148:1-148:25\"\u003e操作種別: 作成API\u003c/li\u003e\n\u003cli data-sourcepos=\"149:1-149:49\"\u003eリクエストタイプ: 一括リクエスト\u003c/li\u003e\n\u003cli data-sourcepos=\"150:1-150:25\"\u003eバッチサイズ: 100\u003c/li\u003e\n\u003cli data-sourcepos=\"151:1-151:35\"\u003eパス: /v2/bot/message/multicast\u003c/li\u003e\n\u003cli data-sourcepos=\"152:1-152:24\"\u003eHTTPメソッド: POST\u003c/li\u003e\n\u003cli data-sourcepos=\"153:1-154:0\"\u003eリクエストテンプレート：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"155:1-155:72\"\u003eリクエストは以下のような形で送る必要があります。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"shell\" data-sourcepos=\"157:1-175:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003ecurl \u003cspan class=\"nt\"\u003e-v\u003c/span\u003e \u003cspan class=\"nt\"\u003e-X\u003c/span\u003e POST https://api.line.me/v2/bot/message/multicast \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e-H\u003c/span\u003e \u003cspan class=\"s1\"\u003e'Content-Type: application/json'\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e-H\u003c/span\u003e \u003cspan class=\"s1\"\u003e'Authorization: Bearer {channel access token}'\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e-H\u003c/span\u003e \u003cspan class=\"s1\"\u003e'X-Line-Retry-Key: {UUID}'\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e-d\u003c/span\u003e \u003cspan class=\"s1\"\u003e'{\n    \"to\": [\"U4af4980629...\",\"U0c229f96c4...\"],\n    \"messages\":[\n        {\n            \"type\":\"text\",\n            \"text\":\"Hello, world1\"\n        },\n        {\n            \"type\":\"text\",\n            \"text\":\"Hello, world2\"\n        }\n    ]\n}'\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"177:1-177:210\"\u003eそこで、テンプレートは以下のような形にします。ユーザーIDを配列にして送るほか、メッセージを共通で持たせて1レコード目のものだけを保持させます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"179:1-200:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.userId }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eunless\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eforloop.last\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n        \u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendunless\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"messages\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eforloop.first\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"type\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.message }}\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n      \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e-%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cul data-sourcepos=\"202:1-203:0\"\u003e\n\u003cli data-sourcepos=\"202:1-203:0\"\u003eHTTPヘッダ: Content-Type: application/json\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"204:1-204:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F411838aa-8b5e-4d2b-aa0f-517c812d431c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1d4499d6dcc5897ec75001683a21b8af\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F411838aa-8b5e-4d2b-aa0f-517c812d431c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=1d4499d6dcc5897ec75001683a21b8af\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F411838aa-8b5e-4d2b-aa0f-517c812d431c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=858e61346064b0ea33bb79ecc4f39eb6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/411838aa-8b5e-4d2b-aa0f-517c812d431c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"206:1-206:82\"\u003eBacklogと同じく接続確認ができますが、ここでは省略します。\u003c/p\u003e\n\u003cp data-sourcepos=\"208:1-208:75\"\u003eここまでできればカスタムコネクタの作成は完了です。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"210:1-210:30\"\u003e\n\u003cspan id=\"転送設定を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送設定を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"212:1-212:167\"\u003e続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\u003c/p\u003e\n\u003cp data-sourcepos=\"214:1-214:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fead970a8-96d1-4849-8ee2-25c07353232d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=85331c41403e59227e1a97d913e69960\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fead970a8-96d1-4849-8ee2-25c07353232d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=85331c41403e59227e1a97d913e69960\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fead970a8-96d1-4849-8ee2-25c07353232d.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=02914abc3bbdfebe5a7bb055f75a85b2 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ead970a8-96d1-4849-8ee2-25c07353232d.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"216:1-216:114\"\u003eSQLは以下の通りで、Webhookで取得したイベントログからユーザーIDを取得しています。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"218:1-228:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e \u003cspan class=\"k\"\u003edistinct\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ejson_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$.source.userId'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003euserId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'これはTROCCOの転送先カスタムコネクタで送信されたメッセージです！'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`raw_line.raw_line__webhook_logs`\u003c/span\u003e\n\u003cspan class=\"k\"\u003eleft\u003c/span\u003e \u003cspan class=\"k\"\u003ejoin\u003c/span\u003e\n  \u003cspan class=\"k\"\u003eunnest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejson_query_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eparse_json\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epayload_json\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eevents\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\n\u003cspan class=\"k\"\u003ewhere\u003c/span\u003e\n  \u003cspan class=\"n\"\u003ejson_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$.source.userId'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eis\u003c/span\u003e \u003cspan class=\"k\"\u003enot\u003c/span\u003e \u003cspan class=\"k\"\u003enull\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"230:1-230:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F3ea91303-0512-4bb8-bb1f-182967d1c434.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5e719e2075e844186fe1011ee0c2f4b6\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F3ea91303-0512-4bb8-bb1f-182967d1c434.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=5e719e2075e844186fe1011ee0c2f4b6\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F3ea91303-0512-4bb8-bb1f-182967d1c434.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6389d130c780f1109f423f771aafa710 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/3ea91303-0512-4bb8-bb1f-182967d1c434.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"232:1-232:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73a12429-bafc-4b7d-b3f2-c85ba327b2ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6183fa36d33cdb4f5dbca2a11d56fe51\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73a12429-bafc-4b7d-b3f2-c85ba327b2ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=6183fa36d33cdb4f5dbca2a11d56fe51\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73a12429-bafc-4b7d-b3f2-c85ba327b2ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=ea6c4e99acd86c3c9939de4a56831138 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73a12429-bafc-4b7d-b3f2-c85ba327b2ae.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"234:1-234:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F7715a73e-60b7-4d03-b633-4556a7d36c27.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=80b78cc5161704634a2eb200b69c735e\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F7715a73e-60b7-4d03-b633-4556a7d36c27.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=80b78cc5161704634a2eb200b69c735e\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F7715a73e-60b7-4d03-b633-4556a7d36c27.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b7716216ba795f82866466a11425511e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/7715a73e-60b7-4d03-b633-4556a7d36c27.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"236:1-236:125\"\u003eモードには「追記(INSERT)」のほか「UPSERT」がありますが、これは別記事で取り上げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"238:1-238:55\"\u003e\u003ciframe id=\"qiita-embed-content__a69f0dcfacad8269d32fe2d383e7dfec\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__a69f0dcfacad8269d32fe2d383e7dfec\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2Fd19aaa406ab353e20aa0\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"240:1-240:162\"\u003eプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"242:1-242:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F873a654e-d737-47d3-98b8-0e06bd8b3263.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f47e416a4520d418e634970e9ee5553b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F873a654e-d737-47d3-98b8-0e06bd8b3263.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f47e416a4520d418e634970e9ee5553b\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F873a654e-d737-47d3-98b8-0e06bd8b3263.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=6af98699015fecd7a00f0ae3c2befedb 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/873a654e-d737-47d3-98b8-0e06bd8b3263.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"244:1-244:45\"\u003e問題なければこれで保存します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"246:1-246:27\"\u003e\n\u003cspan id=\"データを転送する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータを転送する\u003c/h2\u003e\n\u003cp data-sourcepos=\"248:1-248:66\"\u003e保存した転送設定を実行します。無事成功です！\u003c/p\u003e\n\u003cp data-sourcepos=\"250:1-250:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F37d26298-3e28-4074-90eb-34901921fac1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c19f027cfee78191ce6321098299aa0b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F37d26298-3e28-4074-90eb-34901921fac1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c19f027cfee78191ce6321098299aa0b\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F37d26298-3e28-4074-90eb-34901921fac1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=885649ea23baa27047e7ed8906df23a3 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/37d26298-3e28-4074-90eb-34901921fac1.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"252:1-252:61\"\u003e実際、LINEにメッセージが送付されています！\u003c/p\u003e\n\u003cp data-sourcepos=\"254:1-254:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F08cb3971-7c50-4177-9acf-3937b736ee06.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ef29f31f763ebabcb98beb89427d5e52\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F08cb3971-7c50-4177-9acf-3937b736ee06.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ef29f31f763ebabcb98beb89427d5e52\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F08cb3971-7c50-4177-9acf-3937b736ee06.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=22bf4a0a87d1faf58d0d263ad5859c59 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/08cb3971-7c50-4177-9acf-3937b736ee06.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 data-sourcepos=\"256:1-256:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"258:1-258:309\"\u003eLINEでのメッセージ配信としては、ユーザーIDの取得方法が独特なため良い感じに運用していくにはもう少し工夫が必要になりますが、一括リクエストの設定方法の例として、他のサービスでの使い方をぜひ検討してくださいませ！\u003c/p\u003e\n","body":"# はじめに\n\n本記事は、[TROCCO\u0026COMETA Advent Calendar 2025](https://qiita.com/advent-calendar/2025/trocco)の12日目の記事になります。\n\nhttps://qiita.com/advent-calendar/2025/trocco\n\nTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\n\nその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。\n\n:::note info\n\nこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\n\n:::\n\n転送先カスタムコネクタについては以下の記事で概要を説明しています。\n\nhttps://qiita.com/SoySoySoyB/items/8987b5938e2a499053c7\n\nさて、転送先カスタムコネクタでデータを送るときには、\n\n- 1レコード1リクエスト（単一リクエスト）\n- 複数レコード1リクエスト（一括リクエスト）\n\nの2つの方法があるのですが、概要記事では前者を取り上げているため、本記事では後者の例としてLINE Messaging APIを利用したLINE公式アカウントからのメッセージ送信について取り上げます。\n\n# こんな方におすすめ\n\n- 転送先カスタムコネクタの概要を知りたい方\n- 転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\n- 一括リクエストの設定方法を確認したい方\n\n:::note warn\n\n本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\n\n:::\n\n# LINE公式アカウントからメッセージを送信する\n\n今回の例は、LINE公式アカウントで、友だち登録されている特定のユーザーのみに限定してメッセージを送信する方法です。以下のようにメッセージが送付できます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/5021e0f5-c56e-4b80-a6d3-eb5aca400934.png)\n\nなお、これとは別にユーザー指定せずメッセージ配信することもできるので、実際には一斉配信とセグメント別配信を使い分けすることになりそうです。\n\n## LINEの側の事前準備をする\n\n事前にLINE公式アカウントを開設します。私は過去にやっていましたが、設定は短時間で進めることができます。\n\nhttps://www.lycbiz.com/jp/manual/OfficialAccountManager/new_account/\n\n公式アカウントが開設できたら、チャネルのなかのMessaging APIのタブで、チャネルアクセストークンが発行できます。これを接続情報で利用します。\n\nまた、Webhook設定については後述します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a36b5308-a9d5-4972-9a02-5e87a99867ea.png)\n\n## ユーザーID取得用のGoogle Apps Scriptを設定する\n\n今回メッセージ送信に利用するエンドポイントは以下のものになります。\n\nhttps://developers.line.biz/ja/reference/messaging-api/#send-multicast-message\n\nここで、メッセージ送信をするときに指定するユーザーIDは、スマホのアプリで確認できるIDとは別のものになっています。\n\nこのIDは、ユーザーがメッセージを送ったり友だち追加したりといったイベントが発生したときのWebhook経由でしか取得できないという仕様になっているため、Webhook経由でIDを取得するための処理をGoogle Apps Scriptで作成します。以下のコードで作成し、ウェブアプリとしてデプロイしてください。これで指定したスプレッドシートにデータが登録されるようになります。\n\n```javascript\nfunction doPost(e) {\n  // SHEET_URLはスクリプトプロパティに登録しておく\n  const SHEET_URL = PropertiesService.getScriptProperties().getProperty('SHEET_URL');\n  const sheet = SpreadsheetApp.openByUrl(SHEET_URL).getSheetByName('webhook_logs');\n\n  try {\n    const payload_json = JSON.parse(e.postData.contents);\n    sheet.appendRow([\n      new Date(),\n      JSON.stringify(payload_json),\n      null\n    ]);\n    return ContentService.createTextOutput('Ok');\n  } catch (error) {\n    sheet.appendRow([\n      new Date(),\n      null,\n      'Error: ' + error.toString()\n    ]);\n    return ContentService.createTextOutput('Error');\n  }\n}\n```\n\nここで公開したときのURLをLINEのWebhook URLに設定してください。\n\nなお、Google Apps Scriptの仕様上302（リダイレクト）のレスポンスを返すので「検証」として実行してもエラーの表示が出てきますが、Webhookとしては正常に動作します。スプレッドシートにデータが登録されていれば問題ありません。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ebd39824-6a0e-4e60-acc8-a9861dd14ea9.png)\n\n## BigQueryの外部テーブルを作成する\n\n取り回しをよくするために、上で作成したデータに対して外部テーブルを設定しておきます。\n\n```sql\ncreate or replace schema `raw_line`\noptions (\n  location = 'asia-northeast1'\n);\n\ncreate or replace external table `raw_line.raw_line__webhook_logs`\n(\n  timestamp timestamp,\n  payload_json string,\n  error_message string\n)\noptions (\n  format = 'google_sheets',\n  uris = ['https://docs.google.com/spreadsheets/d/********/'],\n  sheet_range = 'webhook_logs!A:C',\n  skip_leading_rows = 1\n);\n```\n\n事前の設定はこれで完了です。続いてカスタムコネクタの設定に入ります。\n\n## カスタムコネクタを作成する（基本情報）\n\n各種項目を設定していきます。認証種別はAPIキーを選択します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/fc44b93d-f30a-4582-973a-1c909ee56852.png)\n\nこの段階で一度保存し、次は接続情報を作成します。\n\n## 接続情報を作成する\n\nAPIキーや認証トークンとしてチャネルアクセストークンを入力します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/95ebcfc8-f17e-4b67-b311-995bb7959096.png)\n\n## カスタムコネクタを作成する（エンドポイント）\n\n再度保存していたカスタムコネクタの編集画面に戻り、エンドポイントを追加します。今回は「マルチキャストメッセージを送る」のエンドポイントを利用するので、作成API／一括リクエストを選択します。\n\nhttps://developers.line.biz/ja/reference/messaging-api/#send-multicast-message\n\n- 名前: 任意\n- 操作種別: 作成API\n- リクエストタイプ: 一括リクエスト\n- バッチサイズ: 100\n- パス: /v2/bot/message/multicast\n- HTTPメソッド: POST\n- リクエストテンプレート：\n\nリクエストは以下のような形で送る必要があります。\n\n```shell\ncurl -v -X POST https://api.line.me/v2/bot/message/multicast \\\n-H 'Content-Type: application/json' \\\n-H 'Authorization: Bearer {channel access token}' \\\n-H 'X-Line-Retry-Key: {UUID}' \\\n-d '{\n    \"to\": [\"U4af4980629...\",\"U0c229f96c4...\"],\n    \"messages\":[\n        {\n            \"type\":\"text\",\n            \"text\":\"Hello, world1\"\n        },\n        {\n            \"type\":\"text\",\n            \"text\":\"Hello, world2\"\n        }\n    ]\n}'\n```\n\nそこで、テンプレートは以下のような形にします。ユーザーIDを配列にして送るほか、メッセージを共通で持たせて1レコード目のものだけを保持させます。\n\n```json\n{\n  \"to\": [\n    {% for row in rows -%}\n      \"{{ row.userId }}\"\n      {%- unless forloop.last -%}\n        ,\n      {%- endunless -%}\n    {%- endfor %}\n  ],\n  \"messages\": [\n    {% for row in rows -%}\n      {%- if forloop.first -%}\n    {\n      \"type\": \"text\",\n      \"text\": \"{{ row.message }}\"\n    }\n      {%- endif -%}\n    {%- endfor %}\n  ]\n}\n```\n\n- HTTPヘッダ: Content-Type: application/json\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/411838aa-8b5e-4d2b-aa0f-517c812d431c.png)\n\nBacklogと同じく接続確認ができますが、ここでは省略します。\n\nここまでできればカスタムコネクタの作成は完了です。\n\n## 転送設定を作成する\n\n続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ead970a8-96d1-4849-8ee2-25c07353232d.png)\n\nSQLは以下の通りで、Webhookで取得したイベントログからユーザーIDを取得しています。\n\n```sql\nselect distinct\n  json_value(event, '$.source.userId') as userId,\n  'これはTROCCOの転送先カスタムコネクタで送信されたメッセージです！' as message\nfrom\n  `raw_line.raw_line__webhook_logs`\nleft join\n  unnest(json_query_array(parse_json(payload_json).events)) event\nwhere\n  json_value(event, '$.source.userId') is not null\n```\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/3ea91303-0512-4bb8-bb1f-182967d1c434.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73a12429-bafc-4b7d-b3f2-c85ba327b2ae.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/7715a73e-60b7-4d03-b633-4556a7d36c27.png)\n\nモードには「追記(INSERT)」のほか「UPSERT」がありますが、これは別記事で取り上げています。\n\nhttps://qiita.com/SoySoySoyB/items/d19aaa406ab353e20aa0\n\nプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/873a654e-d737-47d3-98b8-0e06bd8b3263.png)\n\n問題なければこれで保存します。\n\n## データを転送する\n\n保存した転送設定を実行します。無事成功です！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/37d26298-3e28-4074-90eb-34901921fac1.png)\n\n実際、LINEにメッセージが送付されています！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/08cb3971-7c50-4177-9acf-3937b736ee06.png)\n\n# おわりに\n\nLINEでのメッセージ配信としては、ユーザーIDの取得方法が独特なため良い感じに運用していくにはもう少し工夫が必要になりますが、一括リクエストの設定方法の例として、他のサービスでの使い方をぜひ検討してくださいませ！\n","coediting":false,"comments_count":0,"created_at":"2025-12-11T15:33:48+09:00","group":null,"id":"44c3016a66482cd51a0f","likes_count":3,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"LINE","versions":[]},{"name":"MessagingAPI","versions":[]},{"name":"カスタムコネクタ","versions":[]},{"name":"trocco","versions":[]}],"title":"TROCCOの転送先カスタムコネクタでLINE公式アカウントからメッセージを送信する","updated_at":"2025-12-11T15:37:05+09:00","url":"https://qiita.com/SoySoySoyB/items/44c3016a66482cd51a0f","user":{"description":"データ基盤運用SaaSのPMM｜SnowPro Core/Google Certified Professional Data Engineer資格保持｜関心はデータサイエンス/データエンジニアリング/学術/教育/人材育成など","facebook_id":"","followees_count":0,"followers_count":41,"github_login_name":null,"id":"SoySoySoyB","items_count":59,"linkedin_id":"","location":"","name":"D","organization":"primeNumber Inc.","permanent_id":3492462,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3492462/e25cd3e19152b991613ccced5875eed607083730/x_large.png?1687963044","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"3:1-3:136\"\u003e本記事は、\u003ca href=\"https://qiita.com/advent-calendar/2025/trocco\"\u003eTROCCO\u0026amp;COMETA Advent Calendar 2025\u003c/a\u003eの11日目の記事になります。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:45\"\u003e\u003ciframe id=\"qiita-embed-content__07be43c09a3e6c3181a9b22db755848b\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__07be43c09a3e6c3181a9b22db755848b\" data-content=\"https%3A%2F%2Fqiita.com%2Fadvent-calendar%2F2025%2Ftrocco\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:472\"\u003eTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:314\"\u003eその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。本記事では、転送先カスタムコネクタの概要からBacklogでの課題作成を事例としたその設定方法まで解説していきます。\u003c/p\u003e\n\u003cdiv data-sourcepos=\"11:1-15:3\" class=\"note info\"\u003e\n\u003cspan class=\"fa fa-fw fa-check-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"13:1-13:173\"\u003eこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003ch1 data-sourcepos=\"17:1-17:29\"\u003e\n\u003cspan id=\"こんな方におすすめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%93%E3%81%AA%E6%96%B9%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこんな方におすすめ\u003c/h1\u003e\n\u003cul data-sourcepos=\"19:1-21:0\"\u003e\n\u003cli data-sourcepos=\"19:1-19:62\"\u003e転送先カスタムコネクタの概要を知りたい方\u003c/li\u003e\n\u003cli data-sourcepos=\"20:1-21:0\"\u003e転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv data-sourcepos=\"22:1-26:3\" class=\"note warn\"\u003e\n\u003cspan class=\"fa fa-fw fa-exclamation-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"24:1-24:141\"\u003e本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003ch1 data-sourcepos=\"28:1-28:32\"\u003e\n\u003cspan id=\"カスタムコネクタとは\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%81%A8%E3%81%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタとは\u003c/h1\u003e\n\u003cp data-sourcepos=\"30:1-30:347\"\u003eTROCCOはデータの転送／変換／ワークフロー管理といったデータ基盤の運用をAll in Oneで簡素化／自動化できるSaaSサービスですが、どれだけ多くのサービスからデータを転送できるかというコネクタの充実度は、こうしたサービスを選ぶ上では重要な観点です。\u003c/p\u003e\n\u003cp data-sourcepos=\"32:1-32:427\"\u003e\u003ca href=\"https://primenumber.com/trocco/connectors\" rel=\"nofollow noopener\" target=\"_blank\"\u003e対応コネクタ一覧\u003c/a\u003eを見ていただくとかなりのサービスに対応していることが分かりますが、一方でSaaSの導入が広がっていくなかで、どうしても対応しきれないサービスというものは出てきてしまいます。そこで、ユーザー側で独自のコネクタを作成できるのがカスタムコネクタです。\u003c/p\u003e\n\u003cp data-sourcepos=\"34:1-34:63\"\u003e以下のようなユースケースを想定しています。\u003c/p\u003e\n\u003cul data-sourcepos=\"36:1-45:0\"\u003e\n\u003cli data-sourcepos=\"36:1-36:53\"\u003eオープンデータを活用／併用した分析\u003c/li\u003e\n\u003cli data-sourcepos=\"37:1-42:51\"\u003e各種SaaSとの連携／業務自動化\n\u003cul data-sourcepos=\"38:3-42:51\"\u003e\n\u003cli data-sourcepos=\"38:3-38:65\"\u003e人事マスタSaaSを起点としたマスタデータ連携\u003c/li\u003e\n\u003cli data-sourcepos=\"39:3-39:18\"\u003eMA／SFA連携\u003c/li\u003e\n\u003cli data-sourcepos=\"40:3-40:55\"\u003e広告データの取得／コンバージョンAPI\u003c/li\u003e\n\u003cli data-sourcepos=\"41:3-41:37\"\u003eメール／メッセージ配信\u003c/li\u003e\n\u003cli data-sourcepos=\"42:3-42:51\"\u003eECプラットフォームとのデータ連携\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"43:1-45:0\"\u003e自社サービスや限定公開しているITシステムとのデータ連携\n\u003cul data-sourcepos=\"44:3-45:0\"\u003e\n\u003cli data-sourcepos=\"44:3-45:0\"\u003ePaaS/FaaSで公開しているAPI\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"46:1-46:114\"\u003e転送元カスタムコネクタについては、別途記事もあるのでそちらをご参考ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"48:1-48:54\"\u003e\u003ciframe id=\"qiita-embed-content__b91da64537c8abf8f9d0f9b5a5a07d18\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__b91da64537c8abf8f9d0f9b5a5a07d18\" data-content=\"https%3A%2F%2Fprimenumber.com%2Fblog%2Fwhat-is-connector-builder\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"50:1-50:69\"\u003e\u003ciframe id=\"qiita-embed-content__a1f8dc26a78f5a52b506c5d4b80df6ff\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__a1f8dc26a78f5a52b506c5d4b80df6ff\" data-content=\"https%3A%2F%2Fprimenumber.com%2Fblog%2Fthree-pts-to-get-start-connector-builder\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch1 data-sourcepos=\"52:1-52:41\"\u003e\n\u003cspan id=\"転送先カスタムコネクタとは\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E5%85%88%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%81%A8%E3%81%AF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送先カスタムコネクタとは\u003c/h1\u003e\n\u003cp data-sourcepos=\"54:1-54:273\"\u003e今回リリースされた転送先カスタムコネクタは、以前リリースされていた転送元カスタムコネクタの転送先版です。基本的な仕様は共通でありつつ、「転送先」コネクタとして利用できるのが違いです。\u003c/p\u003e\n\u003cp data-sourcepos=\"56:1-56:111\"\u003e転送先カスタムコネクタとしては、以下のようなユースケースを想定しています。\u003c/p\u003e\n\u003cul data-sourcepos=\"58:1-61:0\"\u003e\n\u003cli data-sourcepos=\"58:1-58:57\"\u003e様々な業務領域の各種SaaSへのデータ連携\u003c/li\u003e\n\u003cli data-sourcepos=\"59:1-59:85\"\u003eTROCCOがネイティブで対応していないMA／SFA／CRMへのデータ連携\u003c/li\u003e\n\u003cli data-sourcepos=\"60:1-61:0\"\u003eメールやメッセージサービスとの連携\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"62:1-62:192\"\u003eいずれにせよ、DWHに集約したデータを統合しつつ、各種業務にデータを連携しながら自動化を進めていくような使い方をイメージしています。\u003c/p\u003e\n\u003cp data-sourcepos=\"64:1-64:78\"\u003e利用にあたっては、以下のような流れで使っていきます。\u003c/p\u003e\n\u003cul data-sourcepos=\"66:1-74:0\"\u003e\n\u003cli data-sourcepos=\"66:1-71:25\"\u003eコネクタを作成する\n\u003cul data-sourcepos=\"67:3-71:25\"\u003e\n\u003cli data-sourcepos=\"67:3-67:31\"\u003e基本情報を設定する\u003c/li\u003e\n\u003cli data-sourcepos=\"68:3-68:31\"\u003e接続情報を作成する\u003c/li\u003e\n\u003cli data-sourcepos=\"69:3-70:111\"\u003eAPIのエンドポイントへのリクエスト方法を指定する\n\u003cul data-sourcepos=\"70:7-70:111\"\u003e\n\u003cli data-sourcepos=\"70:7-70:111\"\u003e転送先としてデータを連携するので、その際のデータの連携方法を指定する\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"71:3-71:25\"\u003e接続確認をする\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"72:1-72:86\"\u003e転送先としてカスタムコネクタを選択して転送設定を作成する\u003c/li\u003e\n\u003cli data-sourcepos=\"73:1-74:0\"\u003e転送を実行する\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"75:1-75:145\"\u003e細かい説明をしてもイメージがわきにくいと思うので、Backlogを例として具体例を通して紹介していきます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"77:1-77:33\"\u003e\n\u003cspan id=\"backlogで課題を起票する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#backlog%E3%81%A7%E8%AA%B2%E9%A1%8C%E3%82%92%E8%B5%B7%E7%A5%A8%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBacklogで課題を起票する\u003c/h1\u003e\n\u003cp data-sourcepos=\"79:1-79:245\"\u003e開発部門はもちろん、ビジネス部門でもプロジェクト管理のためによく使われているツールとしてBacklogがあります。今回は、Backlogで課題を起票する方法を事例として取り上げます。\u003c/p\u003e\n\u003cp data-sourcepos=\"81:1-81:228\"\u003e以下で取り上げるのはあくまで一例であり、何らかのデータに基づいて課題を起票し、対応を進めていくという観点では様々な用途を想像していただけるかと思います。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"83:1-83:18\"\u003e\n\u003cspan id=\"想定ケース\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%83%B3%E5%AE%9A%E3%82%B1%E3%83%BC%E3%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e想定ケース\u003c/h2\u003e\n\u003cp data-sourcepos=\"85:1-85:319\"\u003e「BigQueryでスキャン量が最も多いクエリについて、その内容をまとめて課題に起票する」という事例を例にします。BigQueryはスキャン量に応じて費用がかかるため、お金を無駄に消費していないかをモニタリングするようなイメージです。\u003c/p\u003e\n\u003cp data-sourcepos=\"87:1-87:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f19b41010fd9dcf1b6c8a5d7ac885a2\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f19b41010fd9dcf1b6c8a5d7ac885a2\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bfb8b381525bb08093937aea3864011b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"89:1-89:34\"\u003e\n\u003cspan id=\"backlogの仕様を確認する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#backlog%E3%81%AE%E4%BB%95%E6%A7%98%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBacklogの仕様を確認する\u003c/h2\u003e\n\u003cp data-sourcepos=\"91:1-91:114\"\u003eBacklogの各種IDについては以前の記事でまとめてあるので、そちらをご確認ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"93:1-93:55\"\u003e\u003ciframe id=\"qiita-embed-content__4b069c81eb01720655727ee87d3be309\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__4b069c81eb01720655727ee87d3be309\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F2bee0dd7bbcd9769f5b0\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch2 data-sourcepos=\"95:1-95:40\"\u003e\n\u003cspan id=\"backlogと接続する準備をする\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#backlog%E3%81%A8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%BA%96%E5%82%99%E3%82%92%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eBacklogと接続する準備をする\u003c/h2\u003e\n\u003cp data-sourcepos=\"97:1-97:285\"\u003eBacklogと接続する方法としては、APIキーとOAuth 2.0の2つの方法があります。BacklogではAPIキーをヘッダーではなくクエリパラメータで渡す形式になっているため、よりセキュアな方式としてOAuth 2.0での接続とします。\u003c/p\u003e\n\u003cp data-sourcepos=\"99:1-99:49\"\u003e\u003ciframe id=\"qiita-embed-content__cceeaba5c4fa6c0fe074c82b5d2f3ac8\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__cceeaba5c4fa6c0fe074c82b5d2f3ac8\" data-content=\"https%3A%2F%2Fdeveloper.nulab.com%2Fja%2Fdocs%2Fbacklog%2Fauth%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"101:1-101:216\"\u003eOAuth 2.0で接続するには、事前に接続用のアプリケーションを登録しておく必要があります。そこで、開発者向けのページからアプリケーション登録を進めます。\u003c/p\u003e\n\u003cp data-sourcepos=\"103:1-103:33\"\u003e\u003ciframe id=\"qiita-embed-content__0bed2bdfa9890fd96087a50cc1d7b04b\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__0bed2bdfa9890fd96087a50cc1d7b04b\" data-content=\"https%3A%2F%2Fbacklog.com%2Fja%2Fdeveloper%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"105:1-105:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa8a52ae6-6859-4ed1-b83e-c4d2b49010bf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2d53d6d418126efc3a2722ba80d092bf\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa8a52ae6-6859-4ed1-b83e-c4d2b49010bf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2d53d6d418126efc3a2722ba80d092bf\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fa8a52ae6-6859-4ed1-b83e-c4d2b49010bf.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=66f75b132d83b482bd4c0babb0dd98f3 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a8a52ae6-6859-4ed1-b83e-c4d2b49010bf.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"107:1-107:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdcf667ae-6bcc-416d-baed-a2ad800afffb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3ef5cbaf9266882febb3f828b89e9377\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdcf667ae-6bcc-416d-baed-a2ad800afffb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3ef5cbaf9266882febb3f828b89e9377\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdcf667ae-6bcc-416d-baed-a2ad800afffb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=566c8ddc8b8f78cc74a324a6ca23b236 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/dcf667ae-6bcc-416d-baed-a2ad800afffb.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"110:1-110:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd7ed415c-658a-44c9-ab06-f7f6ad421393.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=316da36e7ea4cd1e68961de8304ea720\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd7ed415c-658a-44c9-ab06-f7f6ad421393.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=316da36e7ea4cd1e68961de8304ea720\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd7ed415c-658a-44c9-ab06-f7f6ad421393.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=3081227bff3b68b7b1556e95887b325b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d7ed415c-658a-44c9-ab06-f7f6ad421393.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"112:1-112:36\"\u003e以下の項目を設定します。\u003c/p\u003e\n\u003cul data-sourcepos=\"114:1-117:0\"\u003e\n\u003cli data-sourcepos=\"114:1-114:72\"\u003eRedirect URI：\u003ca href=\"https://trocco.io/connections/custom_connector/callback\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://trocco.io/connections/custom_connector/callback\u003c/a\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"115:1-115:38\"\u003eアプリケーション名：任意\u003c/li\u003e\n\u003cli data-sourcepos=\"116:1-117:0\"\u003eサイトURL：任意\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"118:1-118:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12660e74-2d56-471a-91de-f5916bdb0678.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=97bf959a406a373698741618cd3c72f7\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12660e74-2d56-471a-91de-f5916bdb0678.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=97bf959a406a373698741618cd3c72f7\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F12660e74-2d56-471a-91de-f5916bdb0678.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=55d2ad05166171894ae0d3b745a285fa 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/12660e74-2d56-471a-91de-f5916bdb0678.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"120:1-120:112\"\u003eClient Id／Client Secretは後ほど利用します。これで保存をすれば事前準備は完了です。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"122:1-122:60\"\u003e\n\u003cspan id=\"カスタムコネクタを作成する基本情報\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（基本情報）\u003c/h2\u003e\n\u003cp data-sourcepos=\"124:1-124:132\"\u003eTROCCOのカスタムコネクタの新規作成画面にいくと、転送元と転送先が選べるようになっています。\u003c/p\u003e\n\u003cul data-sourcepos=\"126:1-127:0\"\u003e\n\u003cli data-sourcepos=\"126:1-127:0\"\u003e\u003ca href=\"https://trocco.io/custom_connectors/select_type\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://trocco.io/custom_connectors/select_type\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"128:1-128:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdfb10984-d91b-4b54-b145-b930b78bb5a1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a61494693d8d727b4eb6cfaf0bbc6337\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdfb10984-d91b-4b54-b145-b930b78bb5a1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a61494693d8d727b4eb6cfaf0bbc6337\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdfb10984-d91b-4b54-b145-b930b78bb5a1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=0131027da2bd1348cb8b276488010325 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/dfb10984-d91b-4b54-b145-b930b78bb5a1.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"130:1-130:42\"\u003e各種項目を設定していきます。\u003c/p\u003e\n\u003cul data-sourcepos=\"132:1-135:0\"\u003e\n\u003cli data-sourcepos=\"132:1-132:49\"\u003eベースURL：\u003ccode\u003ehttps://\u0026lt;spaceKey\u0026gt;.backlog.com\u003c/code\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"133:1-133:73\"\u003e認可URL：\u003ccode\u003ehttps://\u0026lt;spaceKey\u0026gt;.backlog.com/OAuth2AccessRequest.action\u003c/code\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"134:1-135:0\"\u003eアクセストークンURL：\u003ccode\u003ehttps://\u0026lt;spaceKey\u0026gt;.backlog.com/api/v2/oauth2/token\u003c/code\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"136:1-136:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F617837de-294a-46c5-b4c2-120787b77efb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=eec4094d147381dce9d9a2ef8e67d2f5\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F617837de-294a-46c5-b4c2-120787b77efb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=eec4094d147381dce9d9a2ef8e67d2f5\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F617837de-294a-46c5-b4c2-120787b77efb.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=ca0eec392d170a0f9c5e37f91211b512 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/617837de-294a-46c5-b4c2-120787b77efb.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"138:1-138:72\"\u003eこの段階で一度保存し、次は接続情報を作成します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"140:1-140:30\"\u003e\n\u003cspan id=\"接続情報を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e接続情報を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"142:1-142:92\"\u003eBacklogのアプリケーションにある、Client Id／Client Secretを利用します。\u003c/p\u003e\n\u003cul data-sourcepos=\"144:1-145:0\"\u003e\n\u003cli data-sourcepos=\"144:1-145:0\"\u003e\u003ca href=\"https://trocco.io/connections/custom_connector/new\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\"\u003ehttps://trocco.io/connections/custom_connector/new\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"146:1-146:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb8c89f98-5a7c-4a4b-affb-ffe5424d2dfa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=52e0ffb9753ae0264b57f309d5850555\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb8c89f98-5a7c-4a4b-affb-ffe5424d2dfa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=52e0ffb9753ae0264b57f309d5850555\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fb8c89f98-5a7c-4a4b-affb-ffe5424d2dfa.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=8c699e0e1b5acd7f9643e3527bba3042 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b8c89f98-5a7c-4a4b-affb-ffe5424d2dfa.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"148:1-148:156\"\u003e下部の認証をクリックすると、許諾を求める画面が表示されるので、「許可する」を選択すると認証が完了します。\u003c/p\u003e\n\u003cp data-sourcepos=\"150:1-150:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdf62d5ab-9072-46e4-af55-988d1de45bdc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=27bd1c324ab8705710c0298371933d86\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdf62d5ab-9072-46e4-af55-988d1de45bdc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=27bd1c324ab8705710c0298371933d86\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fdf62d5ab-9072-46e4-af55-988d1de45bdc.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c458737c001449c6f51b2f5fc81cf1e3 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/df62d5ab-9072-46e4-af55-988d1de45bdc.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"152:1-152:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F14716e0a-6e51-4561-9d85-a8c51b8dd1b5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0035d00e060bae2009d3ec8f6d2b3e4a\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F14716e0a-6e51-4561-9d85-a8c51b8dd1b5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=0035d00e060bae2009d3ec8f6d2b3e4a\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F14716e0a-6e51-4561-9d85-a8c51b8dd1b5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b635b6689cc613de1eea8c377d658860 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/14716e0a-6e51-4561-9d85-a8c51b8dd1b5.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"154:1-154:69\"\u003e\n\u003cspan id=\"カスタムコネクタを作成するエンドポイント\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eカスタムコネクタを作成する（エンドポイント）\u003c/h2\u003e\n\u003cp data-sourcepos=\"156:1-156:249\"\u003e再度保存していたカスタムコネクタの編集画面に戻り、エンドポイントを追加します。今回は「課題の追加」のエンドポイントを利用するので、作成API／単一リクエストを選択します。\u003c/p\u003e\n\u003cp data-sourcepos=\"158:1-158:60\"\u003e\u003ciframe id=\"qiita-embed-content__be6c76bdcc551d650f0263b1adf88635\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__be6c76bdcc551d650f0263b1adf88635\" data-content=\"https%3A%2F%2Fdeveloper.nulab.com%2Fja%2Fdocs%2Fbacklog%2Fapi%2F2%2Fadd-issue%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cul data-sourcepos=\"160:1-166:0\"\u003e\n\u003cli data-sourcepos=\"160:1-160:16\"\u003e名前: 任意\u003c/li\u003e\n\u003cli data-sourcepos=\"161:1-161:25\"\u003e操作種別: 作成API\u003c/li\u003e\n\u003cli data-sourcepos=\"162:1-162:49\"\u003eリクエストタイプ: 単一リクエスト\u003c/li\u003e\n\u003cli data-sourcepos=\"163:1-163:24\"\u003eパス: /api/v2/issues\u003c/li\u003e\n\u003cli data-sourcepos=\"164:1-164:24\"\u003eHTTPメソッド: POST\u003c/li\u003e\n\u003cli data-sourcepos=\"165:1-166:0\"\u003eリクエストテンプレート: 　※下部で説明します\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"167:1-177:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"projectId\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow.project_id\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"summary\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.summary }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"description\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"{{ row.description | replace: '\n', '\u003c/span\u003e\u003cspan class=\"se\"\u003e\\r\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e' | replace: '\"\u003c/span\u003e\u003cspan class=\"err\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e'\\\u003c/span\u003e\u003cspan class=\"s2\"\u003e\"' }}\"\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"issueTypeId\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow.issue_type_id\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"priorityId\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow.priority_id\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"nl\"\u003e\"assigneeId\"\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003erow.assignee_id\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cul data-sourcepos=\"179:1-180:0\"\u003e\n\u003cli data-sourcepos=\"179:1-180:0\"\u003eHTTPヘッダ: Content-Type: application/json\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"181:1-181:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4be2ec79-ef1f-42fc-9633-9901a44c71c3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b19484ac6b26ceb7a6beae7c3c034054\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4be2ec79-ef1f-42fc-9633-9901a44c71c3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=b19484ac6b26ceb7a6beae7c3c034054\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F4be2ec79-ef1f-42fc-9633-9901a44c71c3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=b1e32781556e11a97ad577a1808f93c8 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4be2ec79-ef1f-42fc-9633-9901a44c71c3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"183:1-183:306\"\u003eリクエストテンプレートが何なのかですが、転送先としてデータを送る場合、受ける側のエンドポイントが指定している形でデータを送る必要があります。そこで、テーブルデータを求める形に整形してあげる必要があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"185:1-185:240\"\u003e転送先Connector Builderでは、Liquidテンプレートというものを利用してこの整形を行うことができます。テンプレートの\u003ccode\u003e{{ row.column_1 }}\u003c/code\u003eの部分にcolumn_1の値がマッピングされる形です。\u003c/p\u003e\n\u003cp data-sourcepos=\"187:1-187:33\"\u003e\u003ciframe id=\"qiita-embed-content__e7f7bd8d90d7481d73b5b07d12316d85\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__e7f7bd8d90d7481d73b5b07d12316d85\" data-content=\"https%3A%2F%2Fshopify.github.io%2Fliquid%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"189:1-189:267\"\u003eLiquidのテンプレートはShopifyが開発したもので、Webアプリケーションとして様々な機能拡張がありますが、データ処理として利用するのは一部になるので、困ったらAIに教えてもらうと良さそうです。\u003c/p\u003e\n\u003cp data-sourcepos=\"191:1-191:262\"\u003eなお、Backlogに投げ込むにあたって改行コードのエスケープ処理に苦労しまして、どのような設定が最適なのかはちょっとよくわからないです・・・（とりあえず動いたのでヨシとしました苦笑）\u003c/p\u003e\n\u003cp data-sourcepos=\"193:1-193:220\"\u003eまた、この例では単一リクエストの例になっていますが、一括リクエスト（1リクエストで複数レコードを処理する）方法もあり、別記事で例を取り上げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"195:1-195:55\"\u003e\u003ciframe id=\"qiita-embed-content__6a94eb8b1e80cf2550f3d508bc3b8022\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__6a94eb8b1e80cf2550f3d508bc3b8022\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2F44c3016a66482cd51a0f\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"197:1-197:205\"\u003eさて、下部には接続確認をするための設定があり、サンプルデータを追加してあげることで、curlリクエストの実行およびレスポンスの確認ができます。\u003c/p\u003e\n\u003cdiv data-sourcepos=\"199:1-203:3\" class=\"note warn\"\u003e\n\u003cspan class=\"fa fa-fw fa-exclamation-circle\"\u003e\u003c/span\u003e\u003cdiv\u003e\n\u003cp data-sourcepos=\"201:1-201:132\"\u003e当然ですが実際にレコードが作成されてしまうので、不用意に実行しないようにご注意ください。\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cp data-sourcepos=\"205:1-205:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fffce1818-2753-4658-974c-cf36260c641e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d28757c6e18483437ad4c72e4c0ab57c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fffce1818-2753-4658-974c-cf36260c641e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d28757c6e18483437ad4c72e4c0ab57c\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fffce1818-2753-4658-974c-cf36260c641e.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=5a974a87eba01b84eea6baf8281284b9 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ffce1818-2753-4658-974c-cf36260c641e.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"207:1-207:73\"\u003eBacklogを確認すると、実際に課題が作成されています。\u003c/p\u003e\n\u003cp data-sourcepos=\"209:1-209:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8cc39f67-7240-433a-a3d1-8d2653cd9ae7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=324607b51d84e72d604ba418f9cc8bf1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8cc39f67-7240-433a-a3d1-8d2653cd9ae7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=324607b51d84e72d604ba418f9cc8bf1\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F8cc39f67-7240-433a-a3d1-8d2653cd9ae7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=886564b1c6bf1706bdd258b660d92242 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8cc39f67-7240-433a-a3d1-8d2653cd9ae7.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"211:1-211:75\"\u003eここまでできればカスタムコネクタの作成は完了です。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"213:1-213:30\"\u003e\n\u003cspan id=\"転送設定を作成する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送設定を作成する\u003c/h2\u003e\n\u003cp data-sourcepos=\"215:1-215:167\"\u003e続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\u003c/p\u003e\n\u003cp data-sourcepos=\"217:1-217:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F03640060-2c9e-4bff-887e-c3ccb466ed19.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2032cde16090f427b5eea467231d1246\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F03640060-2c9e-4bff-887e-c3ccb466ed19.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=2032cde16090f427b5eea467231d1246\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F03640060-2c9e-4bff-887e-c3ccb466ed19.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c05fecff79e5a10ed21ef2d48a139700 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/03640060-2c9e-4bff-887e-c3ccb466ed19.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"219:1-219:30\"\u003eSQLは以下の通りです。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"sql\" data-sourcepos=\"221:1-263:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n  \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eyour_backlog_project_id\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"mi\"\u003e3793599\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eissue_type_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"mi\"\u003e3\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epriority_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eyour_backlog_assignee_id\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eassignee_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"s1\"\u003e'$yesterday$のスキャン量が最も多いクエリ（'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003etotal_bytes_billed\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'GB）'\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n  \u003cspan class=\"n\"\u003econcat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Job URL:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'https://console.cloud.google.com/bigquery?hl=ja\u0026amp;project='\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u0026amp;ws=!1m5!1m4!1m3!1s'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'!2s'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'!3s$location$'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Principal Subject:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - `'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003eprincipal_subject\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'`\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Total Gibibytes Billed:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003etotal_bytes_billed\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Project ID:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Job Type:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ejob_type\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Referenced Tables:'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"k\"\u003eselect\u003c/span\u003e \n        \u003cspan class=\"n\"\u003estring_agg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ereferenced_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ereferenced_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edataset_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003ereferenced_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etable_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n      \u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eunnest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereferenced_tables\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003ereferenced_table\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecoalesce\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"s1\"\u003e'- Destination Table:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e  - '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003edestination_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproject_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003edestination_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edataset_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'.'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003edestination_table\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etable_id\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n    \u003cspan class=\"n\"\u003ecoalesce\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n      \u003cspan class=\"s1\"\u003e'- Labels: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n        \u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n          \u003cspan class=\"n\"\u003estring_agg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'- '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e', '\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n        \u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n          \u003cspan class=\"k\"\u003eunnest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003elabel\u003c/span\u003e\n      \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n      \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\n    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n    \u003cspan class=\"s1\"\u003e'- Query: '\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e```\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003equery\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e```\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\n  \u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"k\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"se\"\u003e\\r\u003c/span\u003e\u003cspan class=\"s1\"\u003e'\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e''\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\n  \u003cspan class=\"nv\"\u003e`$project_id$`\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nv\"\u003e`region-$location$`\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eINFORMATION_SCHEMA\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eJOBS\u003c/span\u003e\n\u003cspan class=\"k\"\u003ewhere\u003c/span\u003e\n  \u003cspan class=\"nb\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreation_time\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e'Asia/Tokyo'\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e'$yesterday$'\u003c/span\u003e\n\u003cspan class=\"k\"\u003eorder\u003c/span\u003e \u003cspan class=\"k\"\u003eby\u003c/span\u003e\n  \u003cspan class=\"n\"\u003etotal_bytes_billed\u003c/span\u003e \u003cspan class=\"k\"\u003edesc\u003c/span\u003e\n\u003cspan class=\"k\"\u003elimit\u003c/span\u003e\n  \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"265:1-265:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ff0b5ac65-a229-4eb7-b88a-59c77ebd95b9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=694146ed0536c8a8a0791fc9c9a60db3\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ff0b5ac65-a229-4eb7-b88a-59c77ebd95b9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=694146ed0536c8a8a0791fc9c9a60db3\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Ff0b5ac65-a229-4eb7-b88a-59c77ebd95b9.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=afeaec899e78b437522392c1b54e0dcd 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/f0b5ac65-a229-4eb7-b88a-59c77ebd95b9.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"267:1-267:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9e08216e-190e-45b9-926e-ded2abc7cd02.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cb1bd80ed21f92e6482c351276e2ad12\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9e08216e-190e-45b9-926e-ded2abc7cd02.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cb1bd80ed21f92e6482c351276e2ad12\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F9e08216e-190e-45b9-926e-ded2abc7cd02.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a133f1348dc020c1a19176b609a5ffa5 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9e08216e-190e-45b9-926e-ded2abc7cd02.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"269:1-269:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd675d4ea-a4b7-4a87-a670-22f3a93694c5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7935fec36071c2c4173916ebe6f5da05\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd675d4ea-a4b7-4a87-a670-22f3a93694c5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=7935fec36071c2c4173916ebe6f5da05\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2Fd675d4ea-a4b7-4a87-a670-22f3a93694c5.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=08f0151e2f12c1e547bc4d5db49e5359 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d675d4ea-a4b7-4a87-a670-22f3a93694c5.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"271:1-271:125\"\u003eモードには「追記(INSERT)」のほか「UPSERT」がありますが、これは別記事で取り上げています。\u003c/p\u003e\n\u003cp data-sourcepos=\"273:1-273:55\"\u003e\u003ciframe id=\"qiita-embed-content__e4bacdd0435a01a51f00fd87dc1a794e\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__e4bacdd0435a01a51f00fd87dc1a794e\" data-content=\"https%3A%2F%2Fqiita.com%2FSoySoySoyB%2Fitems%2Fd19aaa406ab353e20aa0\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"275:1-275:162\"\u003eプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\u003c/p\u003e\n\u003cp data-sourcepos=\"277:1-277:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b18320-6de7-4baf-a0d4-5b6cfaec659f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3a873f4b401e9a2637fd5b20f69b0e9c\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b18320-6de7-4baf-a0d4-5b6cfaec659f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=3a873f4b401e9a2637fd5b20f69b0e9c\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F73b18320-6de7-4baf-a0d4-5b6cfaec659f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=50646e331564c021f33147d97f1aa428 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73b18320-6de7-4baf-a0d4-5b6cfaec659f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"279:1-279:45\"\u003e問題なければこれで保存します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"281:1-281:27\"\u003e\n\u003cspan id=\"データを転送する\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータを転送する\u003c/h2\u003e\n\u003cp data-sourcepos=\"283:1-283:66\"\u003e保存した転送設定を実行します。無事成功です！\u003c/p\u003e\n\u003cp data-sourcepos=\"285:1-285:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F446c5d9d-3436-443d-8a70-9cfe66ac7a93.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=09841a0837555ce4ebf15d5374e4d657\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F446c5d9d-3436-443d-8a70-9cfe66ac7a93.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=09841a0837555ce4ebf15d5374e4d657\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F446c5d9d-3436-443d-8a70-9cfe66ac7a93.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=f1c8e846afaa2f140a6a15ac91e0cccc 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/446c5d9d-3436-443d-8a70-9cfe66ac7a93.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"287:1-287:73\"\u003eBacklogを確認すると、確かに課題が作成されています！\u003c/p\u003e\n\u003cp data-sourcepos=\"289:1-289:122\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f19b41010fd9dcf1b6c8a5d7ac885a2\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=9f19b41010fd9dcf1b6c8a5d7ac885a2\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3492462%2F2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=bfb8b381525bb08093937aea3864011b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"291:1-291:51\"\u003e概要としての説明は以上になります。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"293:1-293:23\"\u003e\n\u003cspan id=\"一般的な留意点\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E7%95%99%E6%84%8F%E7%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e一般的な留意点\u003c/h1\u003e\n\u003cp data-sourcepos=\"295:1-295:105\"\u003e接続先のAPI仕様に合わせてリクエストを送るという仕組みになっているため、\u003c/p\u003e\n\u003cul data-sourcepos=\"297:1-300:0\"\u003e\n\u003cli data-sourcepos=\"297:1-297:47\"\u003e認証の仕様が特殊で対応できない\u003c/li\u003e\n\u003cli data-sourcepos=\"298:1-298:53\"\u003eペイロード形式が特殊で対応できない\u003c/li\u003e\n\u003cli data-sourcepos=\"299:1-300:0\"\u003eAPIの仕様上パフォーマンスが高められない\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"301:1-301:216\"\u003eといった可能性があります。そういった場合は、プロダクトとして機能拡充や運用方法の検討などを一緒にしていければと思うので、ぜひご相談くださいませ。\u003c/p\u003e\n\u003cp data-sourcepos=\"303:1-303:260\"\u003eまた、TROCCOおよび転送先カスタムコネクタはバッチベースの仕組みであるので、iPaaS（Zapierなど）のようなイベントドリブンな仕組みとは、以下の観点で上手く使い分けをするとよいでしょう。\u003c/p\u003e\n\u003cul data-sourcepos=\"305:1-311:0\"\u003e\n\u003cli data-sourcepos=\"305:1-308:58\"\u003eTROCCO\n\u003cul data-sourcepos=\"306:3-308:58\"\u003e\n\u003cli data-sourcepos=\"306:3-306:31\"\u003e即時性が不要なもの\u003c/li\u003e\n\u003cli data-sourcepos=\"307:3-307:34\"\u003eコストを抑えたいもの\u003c/li\u003e\n\u003cli data-sourcepos=\"308:3-308:58\"\u003eデータを横断的に統合して使いたいもの\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"309:1-311:0\"\u003eiPaaS\n\u003cul data-sourcepos=\"310:3-311:0\"\u003e\n\u003cli data-sourcepos=\"310:3-311:0\"\u003e即時性が必要なもの\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"312:1-312:93\"\u003eその他、詳細な情報については公式ドキュメントをご確認ください。\u003c/p\u003e\n\u003cp data-sourcepos=\"314:1-314:55\"\u003e\u003ciframe id=\"qiita-embed-content__0e2edcbf582548452b5bea171e9eddca\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__0e2edcbf582548452b5bea171e9eddca\" data-content=\"https%3A%2F%2Fdocuments.trocco.io%2Fdocs%2Fabout-custom-connector\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch1 data-sourcepos=\"316:1-316:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"318:1-318:234\"\u003e転送先カスタムコネクタの概要について紹介しました。個人的には、転送先として利用できることで、あれができるかも／これができるかもと様々な妄想が膨らむ機能です。\u003c/p\u003e\n\u003cp data-sourcepos=\"320:1-320:96\"\u003eみなさんもぜひ色々新たな活用方法を開拓してもらえると嬉しいです！\u003c/p\u003e\n","body":"# はじめに\n\n本記事は、[TROCCO\u0026COMETA Advent Calendar 2025](https://qiita.com/advent-calendar/2025/trocco)の11日目の記事になります。\n\nhttps://qiita.com/advent-calendar/2025/trocco\n\nTROCCOでは、昨季（2024/11～2025/10）に転送元の大幅な拡充を進めてきました。これによってデータを取得できる対象は広がってきましたが、一方で従来からあるデータベース／ストレージやMA／SFAなどだけでなく、広告オーディエンスリスト連携といったデータによる業務の自動化を進めていくデータアクティベーションの領域にも対応を広げています。\n\nその一環として、2025/12/11に独自の転送先コネクタを作成できる転送先カスタムコネクタ(*)がリリースされました。本記事では、転送先カスタムコネクタの概要からBacklogでの課題作成を事例としたその設定方法まで解説していきます。\n\n:::note info\n\nこれまで「Connector Builder」と呼ばれていたものが、「カスタムコネクタ」と名称が変更になり転送先の機能が追加されています。\n\n:::\n\n# こんな方におすすめ\n\n- 転送先カスタムコネクタの概要を知りたい方\n- 転送先カスタムコネクタを使うことによって何ができそうかを考えたい方\n\n:::note warn\n\n本記事でご紹介する機能は執筆時点のものであり、機能拡充に伴い仕様が変更される可能性があります。\n\n:::\n\n# カスタムコネクタとは\n\nTROCCOはデータの転送／変換／ワークフロー管理といったデータ基盤の運用をAll in Oneで簡素化／自動化できるSaaSサービスですが、どれだけ多くのサービスからデータを転送できるかというコネクタの充実度は、こうしたサービスを選ぶ上では重要な観点です。\n\n[対応コネクタ一覧](https://primenumber.com/trocco/connectors)を見ていただくとかなりのサービスに対応していることが分かりますが、一方でSaaSの導入が広がっていくなかで、どうしても対応しきれないサービスというものは出てきてしまいます。そこで、ユーザー側で独自のコネクタを作成できるのがカスタムコネクタです。\n\n以下のようなユースケースを想定しています。\n\n- オープンデータを活用／併用した分析\n- 各種SaaSとの連携／業務自動化\n  - 人事マスタSaaSを起点としたマスタデータ連携\n  - MA／SFA連携\n  - 広告データの取得／コンバージョンAPI\n  - メール／メッセージ配信\n  - ECプラットフォームとのデータ連携\n- 自社サービスや限定公開しているITシステムとのデータ連携\n  - PaaS/FaaSで公開しているAPI\n\n転送元カスタムコネクタについては、別途記事もあるのでそちらをご参考ください。\n\nhttps://primenumber.com/blog/what-is-connector-builder\n\nhttps://primenumber.com/blog/three-pts-to-get-start-connector-builder\n\n# 転送先カスタムコネクタとは\n\n今回リリースされた転送先カスタムコネクタは、以前リリースされていた転送元カスタムコネクタの転送先版です。基本的な仕様は共通でありつつ、「転送先」コネクタとして利用できるのが違いです。\n\n転送先カスタムコネクタとしては、以下のようなユースケースを想定しています。\n\n- 様々な業務領域の各種SaaSへのデータ連携\n- TROCCOがネイティブで対応していないMA／SFA／CRMへのデータ連携\n- メールやメッセージサービスとの連携\n\nいずれにせよ、DWHに集約したデータを統合しつつ、各種業務にデータを連携しながら自動化を進めていくような使い方をイメージしています。\n\n利用にあたっては、以下のような流れで使っていきます。\n\n- コネクタを作成する\n  - 基本情報を設定する\n  - 接続情報を作成する\n  - APIのエンドポイントへのリクエスト方法を指定する\n      -  転送先としてデータを連携するので、その際のデータの連携方法を指定する\n  - 接続確認をする\n- 転送先としてカスタムコネクタを選択して転送設定を作成する\n- 転送を実行する\n\n細かい説明をしてもイメージがわきにくいと思うので、Backlogを例として具体例を通して紹介していきます。\n\n# Backlogで課題を起票する\n\n開発部門はもちろん、ビジネス部門でもプロジェクト管理のためによく使われているツールとしてBacklogがあります。今回は、Backlogで課題を起票する方法を事例として取り上げます。\n\n以下で取り上げるのはあくまで一例であり、何らかのデータに基づいて課題を起票し、対応を進めていくという観点では様々な用途を想像していただけるかと思います。\n\n## 想定ケース\n\n「BigQueryでスキャン量が最も多いクエリについて、その内容をまとめて課題に起票する」という事例を例にします。BigQueryはスキャン量に応じて費用がかかるため、お金を無駄に消費していないかをモニタリングするようなイメージです。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png)\n\n## Backlogの仕様を確認する\n\nBacklogの各種IDについては以前の記事でまとめてあるので、そちらをご確認ください。\n\nhttps://qiita.com/SoySoySoyB/items/2bee0dd7bbcd9769f5b0\n\n## Backlogと接続する準備をする\n\nBacklogと接続する方法としては、APIキーとOAuth 2.0の2つの方法があります。BacklogではAPIキーをヘッダーではなくクエリパラメータで渡す形式になっているため、よりセキュアな方式としてOAuth 2.0での接続とします。\n\nhttps://developer.nulab.com/ja/docs/backlog/auth/\n\nOAuth 2.0で接続するには、事前に接続用のアプリケーションを登録しておく必要があります。そこで、開発者向けのページからアプリケーション登録を進めます。\n\nhttps://backlog.com/ja/developer/\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a8a52ae6-6859-4ed1-b83e-c4d2b49010bf.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/dcf667ae-6bcc-416d-baed-a2ad800afffb.png)\n\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d7ed415c-658a-44c9-ab06-f7f6ad421393.png)\n\n以下の項目を設定します。\n\n- Redirect URI：https://trocco.io/connections/custom_connector/callback\n- アプリケーション名：任意\n- サイトURL：任意\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/12660e74-2d56-471a-91de-f5916bdb0678.png)\n\nClient Id／Client Secretは後ほど利用します。これで保存をすれば事前準備は完了です。\n\n## カスタムコネクタを作成する（基本情報）\n\nTROCCOのカスタムコネクタの新規作成画面にいくと、転送元と転送先が選べるようになっています。\n\n- https://trocco.io/custom_connectors/select_type\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/dfb10984-d91b-4b54-b145-b930b78bb5a1.png)\n\n各種項目を設定していきます。\n\n- ベースURL：`https://\u003cspaceKey\u003e.backlog.com`\n- 認可URL：`https://\u003cspaceKey\u003e.backlog.com/OAuth2AccessRequest.action`\n- アクセストークンURL：`https://\u003cspaceKey\u003e.backlog.com/api/v2/oauth2/token`\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/617837de-294a-46c5-b4c2-120787b77efb.png)\n\nこの段階で一度保存し、次は接続情報を作成します。\n\n## 接続情報を作成する\n\nBacklogのアプリケーションにある、Client Id／Client Secretを利用します。\n\n- https://trocco.io/connections/custom_connector/new\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b8c89f98-5a7c-4a4b-affb-ffe5424d2dfa.png)\n\n下部の認証をクリックすると、許諾を求める画面が表示されるので、「許可する」を選択すると認証が完了します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/df62d5ab-9072-46e4-af55-988d1de45bdc.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/14716e0a-6e51-4561-9d85-a8c51b8dd1b5.png)\n\n## カスタムコネクタを作成する（エンドポイント）\n\n再度保存していたカスタムコネクタの編集画面に戻り、エンドポイントを追加します。今回は「課題の追加」のエンドポイントを利用するので、作成API／単一リクエストを選択します。\n\nhttps://developer.nulab.com/ja/docs/backlog/api/2/add-issue/\n\n- 名前: 任意\n- 操作種別: 作成API\n- リクエストタイプ: 単一リクエスト\n- パス: /api/v2/issues\n- HTTPメソッド: POST\n- リクエストテンプレート: 　※下部で説明します\n\n```json\n{\n    \"projectId\": {{ row.project_id }},\n    \"summary\": \"{{ row.summary }}\",\n    \"description\": \"{{ row.description | replace: '\n', '\\r\\n' | replace: '\"', '\\\"' }}\",\n    \"issueTypeId\": {{ row.issue_type_id }},\n    \"priorityId\": {{ row.priority_id }},\n    \"assigneeId\": {{ row.assignee_id }}\n}\n```\n\n- HTTPヘッダ: Content-Type: application/json\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/4be2ec79-ef1f-42fc-9633-9901a44c71c3.png)\n\nリクエストテンプレートが何なのかですが、転送先としてデータを送る場合、受ける側のエンドポイントが指定している形でデータを送る必要があります。そこで、テーブルデータを求める形に整形してあげる必要があります。\n\n転送先Connector Builderでは、Liquidテンプレートというものを利用してこの整形を行うことができます。テンプレートの`{{ row.column_1 }}`の部分にcolumn_1の値がマッピングされる形です。\n\nhttps://shopify.github.io/liquid/\n\nLiquidのテンプレートはShopifyが開発したもので、Webアプリケーションとして様々な機能拡張がありますが、データ処理として利用するのは一部になるので、困ったらAIに教えてもらうと良さそうです。\n\nなお、Backlogに投げ込むにあたって改行コードのエスケープ処理に苦労しまして、どのような設定が最適なのかはちょっとよくわからないです・・・（とりあえず動いたのでヨシとしました苦笑）\n\nまた、この例では単一リクエストの例になっていますが、一括リクエスト（1リクエストで複数レコードを処理する）方法もあり、別記事で例を取り上げています。\n\nhttps://qiita.com/SoySoySoyB/items/44c3016a66482cd51a0f\n\nさて、下部には接続確認をするための設定があり、サンプルデータを追加してあげることで、curlリクエストの実行およびレスポンスの確認ができます。\n\n:::note warn\n\n当然ですが実際にレコードが作成されてしまうので、不用意に実行しないようにご注意ください。\n\n:::\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ffce1818-2753-4658-974c-cf36260c641e.png)\n\nBacklogを確認すると、実際に課題が作成されています。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8cc39f67-7240-433a-a3d1-8d2653cd9ae7.png)\n\nここまでできればカスタムコネクタの作成は完了です。\n\n## 転送設定を作成する\n\n続いて、転送設定を作成し転送ジョブを実行します。転送元BigQuery→転送先カスタムコネクタとして転送設定を作成します。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/03640060-2c9e-4bff-887e-c3ccb466ed19.png)\n\nSQLは以下の通りです。\n\n```sql\nselect\n  \u003cyour_backlog_project_id\u003e as project_id,\n  3793599 as issue_type_id,\n  3 as priority_id,\n  \u003cyour_backlog_assignee_id\u003e as assignee_id,\n  '$yesterday$のスキャン量が最も多いクエリ（' || total_bytes_billed / 1024 / 1024 / 1024 || 'GB）' as summary,\n  concat(\n    '- Job URL:\\n  - ' || 'https://console.cloud.google.com/bigquery?hl=ja\u0026project=' || project_id || '\u0026ws=!1m5!1m4!1m3!1s' || project_id || '!2s' || job_id || '!3s$location$' || '\\n',\n    '- Principal Subject:\\n  - `' || principal_subject || '`\\n',\n    '- Total Gibibytes Billed:\\n  - ' || total_bytes_billed / 1024 / 1024 / 1024 || '\\n',\n    '- Project ID:\\n  - ' || project_id || '\\n',\n    '- Job Type:\\n  - ' || job_type || '\\n',\n    '- Referenced Tables:' || (\n      select \n        string_agg('\\n  - ' || referenced_table.project_id || '.' || referenced_table.dataset_id || '.' || referenced_table.table_id, '')\n      from\n        unnest(referenced_tables) referenced_table\n    ) || '\\n',\n    coalesce(\n      '- Destination Table:\\n  - ' || destination_table.project_id || '.' || destination_table.dataset_id || '.' || destination_table.table_id || '\\n',\n      ''\n    ),\n    coalesce(\n      '- Labels: ' || (\n        select\n          string_agg(label.key || '- ' || label.value, ', ')\n        from\n          unnest(labels) label\n      ) || '\\n',\n      ''\n    ),\n    '- Query: ' || '\\n```\\n' || query || '\\n```\\n'\n  ).replace('\\r', '') as description,\nfrom\n  `$project_id$`.`region-$location$`.INFORMATION_SCHEMA.JOBS\nwhere\n  date(creation_time, 'Asia/Tokyo') = '$yesterday$'\norder by\n  total_bytes_billed desc\nlimit\n  1\n```\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/f0b5ac65-a229-4eb7-b88a-59c77ebd95b9.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9e08216e-190e-45b9-926e-ded2abc7cd02.png)\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d675d4ea-a4b7-4a87-a670-22f3a93694c5.png)\n\nモードには「追記(INSERT)」のほか「UPSERT」がありますが、これは別記事で取り上げています。\n\nhttps://qiita.com/SoySoySoyB/items/d19aaa406ab353e20aa0\n\nプレビューに進むと、カスタムコネクタで設定したテンプレートの通りにリクエストで送られるデータが表示されます。\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/73b18320-6de7-4baf-a0d4-5b6cfaec659f.png)\n\n問題なければこれで保存します。\n\n## データを転送する\n\n保存した転送設定を実行します。無事成功です！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/446c5d9d-3436-443d-8a70-9cfe66ac7a93.png)\n\nBacklogを確認すると、確かに課題が作成されています！\n\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/2c1a3fd5-3c5b-450a-8d1f-4f0c80077838.png)\n\n概要としての説明は以上になります。\n\n# 一般的な留意点\n\n接続先のAPI仕様に合わせてリクエストを送るという仕組みになっているため、\n\n- 認証の仕様が特殊で対応できない\n- ペイロード形式が特殊で対応できない\n- APIの仕様上パフォーマンスが高められない\n\nといった可能性があります。そういった場合は、プロダクトとして機能拡充や運用方法の検討などを一緒にしていければと思うので、ぜひご相談くださいませ。\n\nまた、TROCCOおよび転送先カスタムコネクタはバッチベースの仕組みであるので、iPaaS（Zapierなど）のようなイベントドリブンな仕組みとは、以下の観点で上手く使い分けをするとよいでしょう。\n\n- TROCCO\n  - 即時性が不要なもの\n  - コストを抑えたいもの\n  - データを横断的に統合して使いたいもの\n- iPaaS\n  - 即時性が必要なもの\n\nその他、詳細な情報については公式ドキュメントをご確認ください。\n\nhttps://documents.trocco.io/docs/about-custom-connector\n\n# おわりに\n\n転送先カスタムコネクタの概要について紹介しました。個人的には、転送先として利用できることで、あれができるかも／これができるかもと様々な妄想が膨らむ機能です。\n\nみなさんもぜひ色々新たな活用方法を開拓してもらえると嬉しいです！\n","coediting":false,"comments_count":0,"created_at":"2025-12-11T15:31:05+09:00","group":null,"id":"8987b5938e2a499053c7","likes_count":4,"private":false,"reactions_count":0,"stocks_count":1,"tags":[{"name":"API","versions":[]},{"name":"カスタムコネクタ","versions":[]},{"name":"trocco","versions":[]},{"name":"データアクティベーション","versions":[]}],"title":"転送先カスタムコネクタで広がるTROCCOによるデータアクティベーション","updated_at":"2025-12-11T15:36:43+09:00","url":"https://qiita.com/SoySoySoyB/items/8987b5938e2a499053c7","user":{"description":"データ基盤運用SaaSのPMM｜SnowPro Core/Google Certified Professional Data Engineer資格保持｜関心はデータサイエンス/データエンジニアリング/学術/教育/人材育成など","facebook_id":"","followees_count":0,"followers_count":41,"github_login_name":null,"id":"SoySoySoyB","items_count":59,"linkedin_id":"","location":"","name":"D","organization":"primeNumber Inc.","permanent_id":3492462,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3492462/e25cd3e19152b991613ccced5875eed607083730/x_large.png?1687963044","team_only":false,"twitter_screen_name":null,"website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":"primenumber_inc","slide":false},{"rendered_body":"\u003ch2 data-sourcepos=\"1:1-1:15\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h2\u003e\n\u003cp data-sourcepos=\"3:1-3:129\"\u003eこの記事は、\u003ca href=\"https://qiita.com/advent-calendar/2025/trocco\"\u003eTROCCO\u0026amp;COMETA Advent Calendar 2025\u003c/a\u003eの6日目の記事です。\u003c/p\u003e\n\u003cp data-sourcepos=\"5:1-5:270\"\u003e\u003ca href=\"https://documents.trocco.io/docs/release-notes#20251006\" rel=\"nofollow noopener\" target=\"_blank\"\u003eTROCCOの2025年10月のリリース\u003c/a\u003eにて、Qiitaのコネクタが追加されました。Qiitaのコネクタを使ってデータ転送を試しましたので、試した内容をまとめてみました。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"7:1-7:15\"\u003e\n\u003cspan id=\"事前準備\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e事前準備\u003c/h2\u003e\n\u003cp data-sourcepos=\"9:1-9:289\"\u003eTROCCOからQiitaへの接続にはQiitaで発行した個人用アクセストークン使用します。Qiitaの設定 -\u0026gt; アプリケーションから発行することができます。本記事では、スコープに\u003ccode\u003eread_qiita\u003c/code\u003eを設定したトークンを使用しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"11:1-11:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F6ace505b-1e5f-4ee2-b767-931d68732fb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=408d3fa57acc150939da0ce8b0f91b0b\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F6ace505b-1e5f-4ee2-b767-931d68732fb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=408d3fa57acc150939da0ce8b0f91b0b\" alt=\"2025-10-02_18h36_47.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F6ace505b-1e5f-4ee2-b767-931d68732fb3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=567f8ea663b27d6926a4fecc48b3bbd1 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/6ace505b-1e5f-4ee2-b767-931d68732fb3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"13:1-13:18\"\u003e\n\u003cspan id=\"troccoの設定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#trocco%E3%81%AE%E8%A8%AD%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eTROCCOの設定\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"14:1-14:16\"\u003e\n\u003cspan id=\"接続情報\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e接続情報\u003c/h3\u003e\n\u003cp data-sourcepos=\"16:1-16:125\"\u003eQiitaの接続情報を新規作成し、事前準備にて取得した個人用アクセストークンを設定します。\u003c/p\u003e\n\u003cp data-sourcepos=\"18:1-18:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F90cf3519-5ae9-4172-8c49-cfc9f64fa66c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4c0a6575103625af136aece833ca81b1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F90cf3519-5ae9-4172-8c49-cfc9f64fa66c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=4c0a6575103625af136aece833ca81b1\" alt=\"2025-10-25_14h44_56.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F90cf3519-5ae9-4172-8c49-cfc9f64fa66c.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e4808f3f78c86a3228dae2c9a2f427e8 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/90cf3519-5ae9-4172-8c49-cfc9f64fa66c.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"20:1-20:16\"\u003e\n\u003cspan id=\"転送設定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e転送設定\u003c/h3\u003e\n\u003cp data-sourcepos=\"22:1-22:130\"\u003eQiitaの転送設定を作成していきます。今回はQiitaから取得したデータをGoogle BigQueryに転送します。\u003c/p\u003e\n\u003cp data-sourcepos=\"24:1-24:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fe7cb11bc-3efc-475f-a849-0d3970f766a2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=819ef7257387618b209811d25342b434\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fe7cb11bc-3efc-475f-a849-0d3970f766a2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=819ef7257387618b209811d25342b434\" alt=\"2025-12-06_11h52_08.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fe7cb11bc-3efc-475f-a849-0d3970f766a2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=e7ae5e05f825e2ece6be77e66ba4aa7e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/e7cb11bc-3efc-475f-a849-0d3970f766a2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"26:1-26:204\"\u003eSTEP1での転送元Qiitaの設定では、Qiita接続情報と取得対象の設定があります。取得対象として、ここでは認証中のユーザーの記事一覧を選択しています。\u003c/p\u003e\n\u003cp data-sourcepos=\"28:1-28:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fde434820-ebe1-4903-987e-e37862eb3dc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a8945c4d750c61b2542f09ac3cb2b784\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fde434820-ebe1-4903-987e-e37862eb3dc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a8945c4d750c61b2542f09ac3cb2b784\" alt=\"2025-12-06_09h34_21.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2Fde434820-ebe1-4903-987e-e37862eb3dc3.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=24901f1fc6731c3c7498abc5c4eea687 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/de434820-ebe1-4903-987e-e37862eb3dc3.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"30:1-30:119\"\u003eSTEP2に進み自動データ設定を実行すると、取得するデータのプレビューを確認できます。\u003c/p\u003e\n\u003cp data-sourcepos=\"32:1-32:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F237e7809-d2eb-40c8-8233-3a5c5006fa0f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=68fcae1dc7673980e49ff994b1bb1ceb\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F237e7809-d2eb-40c8-8233-3a5c5006fa0f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=68fcae1dc7673980e49ff994b1bb1ceb\" alt=\"2025-12-06_09h36_32.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F237e7809-d2eb-40c8-8233-3a5c5006fa0f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=296ffd6906bacdf80e167420598702b6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/237e7809-d2eb-40c8-8233-3a5c5006fa0f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"34:1-34:90\"\u003e転送の設定が終わりましたら確認画面に進み、設定を保存します。\u003c/p\u003e\n\u003cp data-sourcepos=\"36:1-36:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F11fe5858-67b9-47c7-a89f-233598d6273a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=06a24ce9b839a0c8b7f11fcfa07954bb\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F11fe5858-67b9-47c7-a89f-233598d6273a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=06a24ce9b839a0c8b7f11fcfa07954bb\" alt=\"2025-12-06_12h00_52.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F11fe5858-67b9-47c7-a89f-233598d6273a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=350fea3c6af73805f7ce5958aa0ebe99 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/11fe5858-67b9-47c7-a89f-233598d6273a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"38:1-38:29\"\u003e\n\u003cspan id=\"qiitaのデータを転送\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#qiita%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E9%80%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eQiitaのデータを転送\u003c/h2\u003e\n\u003cp data-sourcepos=\"40:1-40:111\"\u003eTROCCOでデータ転送を実行すると、転送先のGoogle BigQueryにデータが挿入されました。\u003c/p\u003e\n\u003cp data-sourcepos=\"42:1-42:135\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F54f6132a-17ed-4a55-a858-c755d42f1ca1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c57dbbd5747e2e6fffae484ef3b86ca5\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F54f6132a-17ed-4a55-a858-c755d42f1ca1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c57dbbd5747e2e6fffae484ef3b86ca5\" alt=\"2025-12-06_09h47_15.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F318433%2F54f6132a-17ed-4a55-a858-c755d42f1ca1.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=d65814def230e03a9814660cd1ad9cd6 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/54f6132a-17ed-4a55-a858-c755d42f1ca1.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"44:1-44:27\"\u003e\n\u003cspan id=\"取得できるデータ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e取得できるデータ\u003c/h2\u003e\n\u003cp data-sourcepos=\"46:1-46:210\"\u003eQiitaの転送設定では、以下の取得対象から転送するデータを選択できます。以下の表のURLは、TROCCOのYAML設定ファイルや実行したログにて確認いたしました。\u003c/p\u003e\n\u003ctable data-sourcepos=\"48:1-55:160\"\u003e\n\u003cthead\u003e\n\u003ctr data-sourcepos=\"48:1-48:52\"\u003e\n\u003cth data-sourcepos=\"48:2-48:13\"\u003e取得対象\u003c/th\u003e\n\u003cth data-sourcepos=\"48:15-48:18\"\u003ePath\u003c/th\u003e\n\u003cth data-sourcepos=\"48:20-48:38\"\u003eQiita API Reference\u003c/th\u003e\n\u003cth data-sourcepos=\"48:40-48:51\"\u003e設定項目\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr data-sourcepos=\"50:1-50:185\"\u003e\n\u003ctd data-sourcepos=\"50:2-50:25\"\u003e認証中のユーザー\u003c/td\u003e\n\u003ctd data-sourcepos=\"50:27-50:52\"\u003e/api/v2/authenticated_user\u003c/td\u003e\n\u003ctd data-sourcepos=\"50:54-50:183\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E4%B8%AD%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC\"\u003e認証中のユーザー\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"50:185-50:184\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"51:1-51:152\"\u003e\n\u003ctd data-sourcepos=\"51:2-51:40\"\u003e認証中のユーザーの記事一覧\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:42-51:73\"\u003e/api/v2/authenticated_user/items\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:75-51:132\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF\"\u003e投稿\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"51:134-51:151\"\u003e・ページ番号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"52:1-52:128\"\u003e\n\u003ctd data-sourcepos=\"52:2-52:13\"\u003e記事一覧\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:15-52:27\"\u003e/api/v2/items\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:29-52:86\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF\"\u003e投稿\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"52:88-52:127\"\u003e・検索クエリ\u003cbr\u003e・ページ番号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"53:1-53:202\"\u003e\n\u003ctd data-sourcepos=\"53:2-53:52\"\u003e記事をストックしているユーザー一覧\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:54-53:84\"\u003e/api/v2/items/:item_id/stockers\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:86-53:167\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC\"\u003eユーザー\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"53:169-53:201\"\u003e・記事ID\u003cbr\u003e・ページ番号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"54:1-54:178\"\u003e\n\u003ctd data-sourcepos=\"54:2-54:28\"\u003e記事のコメント一覧\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:30-54:60\"\u003e/api/v2/items/:item_id/comments\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:62-54:143\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88\"\u003eコメント\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"54:145-54:177\"\u003e・記事ID\u003cbr\u003e・ページ番号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr data-sourcepos=\"55:1-55:160\"\u003e\n\u003ctd data-sourcepos=\"55:2-55:25\"\u003e記事のいいね一覧\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:27-55:54\"\u003e/api/v2/items/:item_id/likes\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:56-55:125\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs#%E3%81%84%E3%81%84%E3%81%AD\"\u003eいいね\u003c/a\u003e\u003c/td\u003e\n\u003ctd data-sourcepos=\"55:127-55:159\"\u003e・記事ID\u003cbr\u003e・ページ番号\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 data-sourcepos=\"57:1-57:15\"\u003e\n\u003cspan id=\"さいごに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eさいごに\u003c/h2\u003e\n\u003cp data-sourcepos=\"59:1-59:128\"\u003eTROCCOのQiitaのコネクタを使ってみました。こちらの記事が何かの参考になりましたら幸いです。\u003c/p\u003e\n\u003ch3 data-sourcepos=\"61:1-61:10\"\u003e\n\u003cspan id=\"参考\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%8F%82%E8%80%83\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e参考\u003c/h3\u003e\n\u003cul data-sourcepos=\"63:1-63:84\"\u003e\n\u003cli data-sourcepos=\"63:1-63:84\"\u003e\u003ca href=\"https://qiita.com/api/v2/docs\"\u003eQiita API v2ドキュメント - Qiita Developer\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","body":"## はじめに\n\nこの記事は、[TROCCO\u0026COMETA Advent Calendar 2025](https://qiita.com/advent-calendar/2025/trocco)の6日目の記事です。\n\n[TROCCOの2025年10月のリリース](https://documents.trocco.io/docs/release-notes#20251006)にて、Qiitaのコネクタが追加されました。Qiitaのコネクタを使ってデータ転送を試しましたので、試した内容をまとめてみました。\n\n## 事前準備\n\nTROCCOからQiitaへの接続にはQiitaで発行した個人用アクセストークン使用します。Qiitaの設定 -\u003e アプリケーションから発行することができます。本記事では、スコープに`read_qiita`を設定したトークンを使用しています。\n\n![2025-10-02_18h36_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/6ace505b-1e5f-4ee2-b767-931d68732fb3.png)\n\n## TROCCOの設定\n### 接続情報\n\nQiitaの接続情報を新規作成し、事前準備にて取得した個人用アクセストークンを設定します。\n\n![2025-10-25_14h44_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/90cf3519-5ae9-4172-8c49-cfc9f64fa66c.png)\n\n### 転送設定\n\nQiitaの転送設定を作成していきます。今回はQiitaから取得したデータをGoogle BigQueryに転送します。\n\n![2025-12-06_11h52_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/e7cb11bc-3efc-475f-a849-0d3970f766a2.png)\n\nSTEP1での転送元Qiitaの設定では、Qiita接続情報と取得対象の設定があります。取得対象として、ここでは認証中のユーザーの記事一覧を選択しています。\n\n![2025-12-06_09h34_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/de434820-ebe1-4903-987e-e37862eb3dc3.png)\n\nSTEP2に進み自動データ設定を実行すると、取得するデータのプレビューを確認できます。\n\n![2025-12-06_09h36_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/237e7809-d2eb-40c8-8233-3a5c5006fa0f.png)\n\n転送の設定が終わりましたら確認画面に進み、設定を保存します。\n\n![2025-12-06_12h00_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/11fe5858-67b9-47c7-a89f-233598d6273a.png)\n\n## Qiitaのデータを転送\n\nTROCCOでデータ転送を実行すると、転送先のGoogle BigQueryにデータが挿入されました。\n\n![2025-12-06_09h47_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/54f6132a-17ed-4a55-a858-c755d42f1ca1.png)\n\n## 取得できるデータ\n\nQiitaの転送設定では、以下の取得対象から転送するデータを選択できます。以下の表のURLは、TROCCOのYAML設定ファイルや実行したログにて確認いたしました。\n\n|取得対象|Path|Qiita API Reference|設定項目|\n|----|----|----|----|\n|認証中のユーザー|/api/v2/authenticated_user|[認証中のユーザー](https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E4%B8%AD%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC)||\n|認証中のユーザーの記事一覧|/api/v2/authenticated_user/items|[投稿](https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF)|・ページ番号|\n|記事一覧|/api/v2/items|[投稿](https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF)|・検索クエリ\u003cbr\u003e・ページ番号|\n|記事をストックしているユーザー一覧|/api/v2/items/:item_id/stockers|[ユーザー](https://qiita.com/api/v2/docs#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC)|・記事ID\u003cbr\u003e・ページ番号|\n|記事のコメント一覧|/api/v2/items/:item_id/comments|[コメント](https://qiita.com/api/v2/docs#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)|・記事ID\u003cbr\u003e・ページ番号|\n|記事のいいね一覧|/api/v2/items/:item_id/likes|[いいね](https://qiita.com/api/v2/docs#%E3%81%84%E3%81%84%E3%81%AD)|・記事ID\u003cbr\u003e・ページ番号|\n\n## さいごに\n\nTROCCOのQiitaのコネクタを使ってみました。こちらの記事が何かの参考になりましたら幸いです。\n\n### 参考\n\n- [Qiita API v2ドキュメント \\- Qiita Developer](https://qiita.com/api/v2/docs)\n","coediting":false,"comments_count":0,"created_at":"2025-12-06T12:03:35+09:00","group":null,"id":"342d035928a3f4f860e2","likes_count":4,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"Qiita","versions":[]},{"name":"trocco","versions":[]}],"title":"TROCCOのQiitaのコネクタを使ってみた","updated_at":"2025-12-06T12:03:35+09:00","url":"https://qiita.com/suzu_suzu/items/342d035928a3f4f860e2","user":{"description":"","facebook_id":"","followees_count":0,"followers_count":1,"github_login_name":null,"id":"suzu_suzu","items_count":4,"linkedin_id":"","location":"","name":"スズ","organization":"","permanent_id":318433,"profile_image_url":"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318433/profile-images/1752040722","team_only":false,"twitter_screen_name":"_su_suzu_zu_","website_url":""},"page_views_count":null,"team_membership":null,"organization_url_name":null,"slide":false},{"rendered_body":"\u003cp data-sourcepos=\"2:1-2:147\"\u003eこの記事は、アイスタイル \u003ca href=\"https://qiita.com/advent-calendar/2025/istyle\"\u003eアドベントカレンダー2025\u003c/a\u003e 10日目の記事です。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"4:1-4:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"5:1-5:107\"\u003eこんにちは、データ分析システム部の河野(\u003ca href=\"https://x.com/matako1124\" rel=\"nofollow noopener\" target=\"_blank\"\u003e@matako1124\u003c/a\u003e)です。\u003c/p\u003e\n\u003cp data-sourcepos=\"7:1-7:272\"\u003e実はアイスタイルに入社させてもらったのは2025年4月で、まだまだ学びの連続ですが、そんな私の最初のミッションは『社内のデータ分析基盤を、活用できる状態にまでしっかり立て直すこと』でした。\u003c/p\u003e\n\u003cp data-sourcepos=\"9:1-9:231\"\u003e本記事では、私が入社した当時のデータ分析基盤の状態と、現在どう改善が進んでいるのか、そして今後どう進化させていこうと考えているのかをざっくりと紹介します。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"11:1-11:9\"\u003e\n\u003cspan id=\"注意\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%B3%A8%E6%84%8F\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e注意\u003c/h2\u003e\n\u003cul data-sourcepos=\"12:1-15:0\"\u003e\n\u003cli data-sourcepos=\"12:1-12:128\"\u003e執筆に当たり細心の注意を払っておりますが、不十分な説明や誤りがある可能性もございます\u003c/li\u003e\n\u003cli data-sourcepos=\"13:1-15:0\"\u003e記事内の内容は一部\u003ca href=\"https://speakerdeck.com/takumakouno/zhu-shi-hui-she-aisutairu-data-engineering-summit-quan-she-notetahuo-yong-reheruwoshang-keru-ai-readynazu-zhi-womu-zhi-su-tetamin-zhu-hua-hurosiekuto-noli-ce?slide=12\" rel=\"nofollow noopener\" target=\"_blank\"\u003eこちらの登壇内容\u003c/a\u003eと重複する部分がございます\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"16:1-16:8\"\u003e\n\u003cspan id=\"目次\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%9B%AE%E6%AC%A1\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e目次\u003c/h1\u003e\n\u003cul data-sourcepos=\"17:1-25:0\"\u003e\n\u003cli data-sourcepos=\"17:1-17:14\"\u003eはじめに\u003c/li\u003e\n\u003cli data-sourcepos=\"18:1-18:58\"\u003e2025年4月時点でのデータ分析基盤のご紹介\u003c/li\u003e\n\u003cli data-sourcepos=\"19:1-19:17\"\u003e現状の課題\u003c/li\u003e\n\u003cli data-sourcepos=\"20:1-22:37\"\u003eデータ分析基盤Replace PJ\n\u003cul data-sourcepos=\"21:3-22:37\"\u003e\n\u003cli data-sourcepos=\"21:3-21:48\"\u003e今やっていること(2025年12月まで)\u003c/li\u003e\n\u003cli data-sourcepos=\"22:3-22:37\"\u003eこれからやっていくこと\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"23:1-23:11\"\u003eまとめ\u003c/li\u003e\n\u003cli data-sourcepos=\"24:1-25:0\"\u003e終わりに\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"26:1-26:58\"\u003e\n\u003cspan id=\"2025年4月時点でのデータ分析基盤のご紹介\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#2025%E5%B9%B44%E6%9C%88%E6%99%82%E7%82%B9%E3%81%A7%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%9F%BA%E7%9B%A4%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e2025年4月時点でのデータ分析基盤のご紹介\u003c/h1\u003e\n\u003cp data-sourcepos=\"27:1-28:164\"\u003e私が入社した時点(2025年4月)でのデータ分析基盤は、ざっくり以下のような構成でした。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F5f9941c7-6361-4138-88d0-2e3cca8124e6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f52850c06c43765d5d70245802c423d1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F5f9941c7-6361-4138-88d0-2e3cca8124e6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=f52850c06c43765d5d70245802c423d1\" alt=\"スクリーンショット 2025-12-03 12.12.33.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F5f9941c7-6361-4138-88d0-2e3cca8124e6.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=26fb2b1b4e69e75ecceec533b8a0eb4c 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/5f9941c7-6361-4138-88d0-2e3cca8124e6.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"30:1-30:39\"\u003eポイントは以下の通りです。\u003c/p\u003e\n\u003cul data-sourcepos=\"31:1-34:0\"\u003e\n\u003cli data-sourcepos=\"31:1-31:87\"\u003eデータ取り込みはオンプレのEmbulkを使い、BigQueryに取り込み(raw)\u003c/li\u003e\n\u003cli data-sourcepos=\"32:1-32:100\"\u003e社内DB以外はTrocco経由があったり、Embulkで取っていたりとバラつきがある\u003c/li\u003e\n\u003cli data-sourcepos=\"33:1-34:0\"\u003eBigQuery上では加工を行っておらず、rawデータを各利用者が個別に加工して利用している\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"35:1-36:147\"\u003eつまり、\u003cstrong\u003eとりあえずrawデータがBigQueryにある最低限の仕組み\u003c/strong\u003eが整っているだけの状態でした。\u003cbr\u003e\nデータエンジニアの方ならお察しかと思いますが、この状態だとデータ活用において多くの問題が生じます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"38:1-38:17\"\u003e\n\u003cspan id=\"現状の課題\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%8F%BE%E7%8A%B6%E3%81%AE%E8%AA%B2%E9%A1%8C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e現状の課題\u003c/h1\u003e\n\u003cp data-sourcepos=\"39:1-39:164\"\u003e\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2Fea34fb00-152a-4cae-9e2e-e392c807b137.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cd54a614a8c67a33bec0c36f9dee99c1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2Fea34fb00-152a-4cae-9e2e-e392c807b137.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cd54a614a8c67a33bec0c36f9dee99c1\" alt=\"スクリーンショット 2025-12-02 16.26.16.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2Fea34fb00-152a-4cae-9e2e-e392c807b137.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=fb083e05cd7b62925f20a15a6e9d97a2 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/ea34fb00-152a-4cae-9e2e-e392c807b137.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"41:1-41:139\"\u003e大きな課題は上記3つですが、これ以外にも既存のデータ取り込み部分でも多くの課題が残っています。\u003c/p\u003e\n\u003cul data-sourcepos=\"42:1-45:0\"\u003e\n\u003cli data-sourcepos=\"42:1-42:80\"\u003eEmbulkはオンプレで動いており、不安定な状態になっている\u003c/li\u003e\n\u003cli data-sourcepos=\"43:1-45:0\"\u003edailyバッチで全件更新をしており、DB負荷が高い\n\u003cul data-sourcepos=\"44:3-45:0\"\u003e\n\u003cli data-sourcepos=\"44:3-45:0\"\u003eデータ量の多いものではアプリ側への影響が出るケースも…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"46:1-46:144\"\u003eこの状態ではデータ活用の促進どころの話ではないため、ほぼ全面的な改修が必要という判断をしました。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"48:1-48:33\"\u003e\n\u003cspan id=\"データ分析基盤replace-pj\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%9F%BA%E7%9B%A4replace-pj\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eデータ分析基盤Replace PJ\u003c/h1\u003e\n\u003cp data-sourcepos=\"50:1-51:164\"\u003e社内のデータ活用を促進するため、まずは今年いっぱい(2025年12月)までに\u003cstrong\u003eデータ活用を促進していくためのスタートラインに立てる基盤にすること\u003c/strong\u003eを目標とし、以下のように改善しようと考えました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F4a6227ff-2189-4646-87fd-f4aca46df5ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d3c62a32c20201a26f04a08cbb869dfe\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F4a6227ff-2189-4646-87fd-f4aca46df5ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=d3c62a32c20201a26f04a08cbb869dfe\" alt=\"スクリーンショット 2025-12-02 16.58.31.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4260041%2F4a6227ff-2189-4646-87fd-f4aca46df5ae.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c91a25910e8fa81f10f1e217e554153e 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/4a6227ff-2189-4646-87fd-f4aca46df5ae.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"53:1-53:39\"\u003eそれぞれ説明していきます。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"55:1-55:47\"\u003e\n\u003cspan id=\"今やっていること2025年12月まで\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BB%8A%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A82025%E5%B9%B412%E6%9C%88%E3%81%BE%E3%81%A7\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e今やっていること(2025年12月まで)\u003c/h2\u003e\n\u003ch3 data-sourcepos=\"56:1-56:37\"\u003e\n\u003cspan id=\"データ取り込みの改善\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AE%E6%94%B9%E5%96%84\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e①データ取り込みの改善\u003c/h3\u003e\n\u003cp data-sourcepos=\"57:1-57:180\"\u003e結論から言うと、以下のような課題が残っており、Embulkのままだと解消できないものが多く、ツールごと切り替える判断をしました。\u003c/p\u003e\n\u003cp data-sourcepos=\"59:1-59:19\"\u003e\u003cstrong\u003eメイン課題\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"60:1-62:0\"\u003e\n\u003cli data-sourcepos=\"60:1-60:287\"\u003eバッチでの全件ロードだとDBに負荷がかかり、データ取り込みによるインシデントリスクが発生する可能性がある状態のため、更新されたタイミングでデータが入ってくるような形(CDC)にして、DB負荷を軽減したい\u003c/li\u003e\n\u003cli data-sourcepos=\"61:1-62:0\"\u003e全件置き換えなので、履歴情報が欠損してしまっている。現状でもdailyでsnapshotをとって実装はできます(それぞれ活用側で実装しているところもある)が工数、コストともになるべくかけないような状態を担保したい\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"63:1-63:16\"\u003e\u003cstrong\u003eサブ課題\u003c/strong\u003e\u003c/p\u003e\n\u003cul data-sourcepos=\"64:1-67:0\"\u003e\n\u003cli data-sourcepos=\"64:1-64:110\"\u003eEmbulkを動かしている環境もオンプレ環境で不安定な状態、メンテもされていない\u003c/li\u003e\n\u003cli data-sourcepos=\"65:1-65:32\"\u003eEmbulkの開発工数も高い\u003c/li\u003e\n\u003cli data-sourcepos=\"66:1-67:0\"\u003eツール自体が古い(直近で言うとサポート終了も明示された)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"68:1-68:128\"\u003e代替ツールは以下の条件で検討した結果、GCPのDatastreamとOSSのAirbyteを採用することにしました。\u003c/p\u003e\n\u003cul data-sourcepos=\"69:1-73:0\"\u003e\n\u003cli data-sourcepos=\"69:1-69:44\"\u003eコンソールから設定できること\u003c/li\u003e\n\u003cli data-sourcepos=\"70:1-70:44\"\u003e管理や運営の手間が少ないこと\u003c/li\u003e\n\u003cli data-sourcepos=\"71:1-71:41\"\u003eコストが掛かりすぎないこと\u003c/li\u003e\n\u003cli data-sourcepos=\"72:1-73:0\"\u003eCDC連携に対応したツールであること\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"74:1-74:67\"\u003eDatastream一本でいかない理由としては、以下です。\u003c/p\u003e\n\u003cul data-sourcepos=\"75:1-78:0\"\u003e\n\u003cli data-sourcepos=\"75:1-75:23\"\u003e単一障害点防止\u003c/li\u003e\n\u003cli data-sourcepos=\"76:1-76:118\"\u003e何か障害が発生した時の代替策としてもう一本用意しておきたい(ツールの冗長性確保)\u003c/li\u003e\n\u003cli data-sourcepos=\"77:1-78:0\"\u003eDBの仕様的にDatastreamで取り込みできないものもある\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"79:1-79:139\"\u003e\u003cstrong\u003e12月時点でほとんどのDBの新規取り込みが完了し、DB負荷が大幅に改善されることが判明しています。\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"81:1-81:48\"\u003e\n\u003cspan id=\"データ加工モデリングの実施\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%87%E3%83%BC%E3%82%BF%E5%8A%A0%E5%B7%A5%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e②データ加工(モデリング)の実施\u003c/h3\u003e\n\u003cp data-sourcepos=\"82:1-82:111\"\u003eデータ分析基盤の最も重要な部分であり、開発工数も多く投下している領域です。\u003c/p\u003e\n\u003cul data-sourcepos=\"84:1-87:0\"\u003e\n\u003cli data-sourcepos=\"84:1-84:71\"\u003eオーケストレーションツール: Composer(airflow) x dbt Core\u003c/li\u003e\n\u003cli data-sourcepos=\"85:1-85:79\"\u003eモデル構成: raw ⇨ cleansing ⇨ dwh ⇨ mart の一般的な3層構造\u003c/li\u003e\n\u003cli data-sourcepos=\"86:1-87:0\"\u003eモデリング手法: ディメンショナルモデリング\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"88:1-88:189\"\u003e細かいアーキテクチャの話をすると、ここだけで数万文字いってしまいそうなので、それはまた別の記事で紹介させてもらおうと思います。\u003c/p\u003e\n\u003cp data-sourcepos=\"90:1-90:322\"\u003e\u003cstrong\u003e一部の部署から徐々に展開していっており、rawデータを使って分析していた頃よりも圧倒的に活用しやすくなった、活用スピードが上がってきたというお声をいただいています。データの質向上についても少しずつ改善してきています。\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"92:1-92:52\"\u003e\n\u003cspan id=\"インフラ周りをterraformで統一管理\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E5%91%A8%E3%82%8A%E3%82%92terraform%E3%81%A7%E7%B5%B1%E4%B8%80%E7%AE%A1%E7%90%86\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e③インフラ周りをTerraformで統一管理\u003c/h3\u003e\n\u003cp data-sourcepos=\"93:1-93:135\"\u003e今までGCPのリソース管理をきちんとできていなかったため、セキュリティ的にも問題がありました。\u003c/p\u003e\n\u003cp data-sourcepos=\"95:1-95:78\"\u003eまずは以下を管理対象として、Terraformで整備しています。\u003c/p\u003e\n\u003cul data-sourcepos=\"96:1-99:0\"\u003e\n\u003cli data-sourcepos=\"96:1-96:20\"\u003eIAM管理の集約\u003c/li\u003e\n\u003cli data-sourcepos=\"97:1-97:44\"\u003eBigQuery リソース管理のコード化\u003c/li\u003e\n\u003cli data-sourcepos=\"98:1-99:0\"\u003e活用ユーザーはrawデータの参照を不可とし、モデリング以降のレイヤのみ閲覧可能に変更\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"100:1-100:130\"\u003e\u003cstrong\u003eこれにより最低限データを活用していくためのセキュリティを担保できる状態になりました。\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 data-sourcepos=\"102:1-102:105\"\u003e\n\u003cspan id=\"モデリング対象のデータカタログとしてdbt-docsを採用し全社展開予定\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0%E3%81%A8%E3%81%97%E3%81%A6dbt-docs%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%97%E5%85%A8%E7%A4%BE%E5%B1%95%E9%96%8B%E4%BA%88%E5%AE%9A\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e④モデリング対象のデータカタログとしてdbt docsを採用し、全社展開(予定)\u003c/h3\u003e\n\u003cp data-sourcepos=\"103:1-103:138\"\u003e今までどこにデータがあるかわからない、誰に聞けばいいかわからないという状態が続いていました。\u003c/p\u003e\n\u003cp data-sourcepos=\"105:1-105:222\"\u003eアイスタイルは事業が多い影響で、データの種類やステークホルダーが多く、存在しているデータをすべて追うというのは、正直非常に困難な状態となっています。\u003c/p\u003e\n\u003cp data-sourcepos=\"107:1-108:138\"\u003eしたがって、まずはデータ分析基盤側でモデリングしたデータからカタログ化していくことで、\u003cstrong\u003e信頼性の担保されたデータを誰でも素早く見つけられる\u003c/strong\u003e状態を目指しています。\u003cbr\u003e\nそのためのツールとしてはdbt docsがお手軽なので、これをhostして全社展開をする予定で進めています。\u003c/p\u003e\n\u003ch2 data-sourcepos=\"110:1-110:36\"\u003e\n\u003cspan id=\"これからやっていくこと\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8F%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこれからやっていくこと\u003c/h2\u003e\n\u003cp data-sourcepos=\"111:1-112:108\"\u003e上記記載した内容が今年中に最低限やり切ると決めていることになります。\u003cbr\u003e\nとはいえ、これができてもまだスタートラインに立てた程度だと思っています。\u003c/p\u003e\n\u003cp data-sourcepos=\"114:1-114:210\"\u003eデータ分析基盤としても、チームとしても、まずは『信頼を獲得する』ことを目標とし、今後は以下のようなことをやっていく必要があると考えています。\u003c/p\u003e\n\u003col data-sourcepos=\"116:1-128:0\"\u003e\n\u003cli data-sourcepos=\"116:1-116:39\"\u003edwh, martの継続的整備と拡張\u003c/li\u003e\n\u003cli data-sourcepos=\"117:1-117:93\"\u003eEmbulkの完全廃止(コスト\u0026amp;パフォーマンス最適化、二重取り込み解消)\u003c/li\u003e\n\u003cli data-sourcepos=\"118:1-118:90\"\u003eSA経由のrawデータ参照ブロック(RedashやTrocco等)(セキュリティ強化)\u003c/li\u003e\n\u003cli data-sourcepos=\"119:1-119:95\"\u003e他全てのGCPPJの精査、棚卸し(セキュリティ強化\u0026amp;権限管理体制の強化)\u003c/li\u003e\n\u003cli data-sourcepos=\"120:1-120:56\"\u003e権限管理体制の強化(セキュリティ強化)\u003c/li\u003e\n\u003cli data-sourcepos=\"121:1-121:109\"\u003e自社DB以外のデータ(Thirdparty系等)の取り込み改善(データ取り込み管理の統一化)\u003c/li\u003e\n\u003cli data-sourcepos=\"122:1-122:65\"\u003edbt cloudの導入(データ活用促進、スピード向上)\u003c/li\u003e\n\u003cli data-sourcepos=\"123:1-123:80\"\u003edbt semantic layerの導入(データ活用促進、データ信頼性向上)\u003c/li\u003e\n\u003cli data-sourcepos=\"124:1-124:71\"\u003eデータテスト、監視の仕組み化(データ信頼性向上)\u003c/li\u003e\n\u003cli data-sourcepos=\"125:1-125:115\"\u003eデータコントラクトの仕組み化(データ信頼性向上\u0026amp;不具合防止\u0026amp;開発チーム連携強化)\u003c/li\u003e\n\u003cli data-sourcepos=\"126:1-126:47\"\u003eBIツールのReplace(データ活用促進)\u003c/li\u003e\n\u003cli data-sourcepos=\"127:1-128:0\"\u003eデータ周りの技術水準の策定と浸透(データ分析基盤の信頼性向上\u0026amp;開発工数の削減)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-sourcepos=\"129:1-129:5\"\u003eetc..\u003c/p\u003e\n\u003cp data-sourcepos=\"131:1-131:48\"\u003eやるべきことはたくさんあります。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"133:1-133:11\"\u003e\n\u003cspan id=\"まとめ\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%BE%E3%81%A8%E3%82%81\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eまとめ\u003c/h1\u003e\n\u003cp data-sourcepos=\"134:1-134:270\"\u003e私はよく \u003cstrong\u003e\"守り\"\u003c/strong\u003e と \u003cstrong\u003e\"攻め\"\u003c/strong\u003e という言葉を使うのですが、データ分析基盤はまさにこの \u003cstrong\u003e\"守り\"\u003c/strong\u003e を固めないと話にならないと思っていて、現状のアイスタイルはこのフェーズかなと思っています。\u003c/p\u003e\n\u003cp data-sourcepos=\"136:1-138:90\"\u003eデータエンジニアリングは地道なことが多いですが、一歩ずつ前に進んでいくことで大きな成果を生むことができる領域だと思っています。\u003cbr\u003e\n引き続き、チーム一丸となってデータ分析基盤を進化させ、活用促進に向けて日々精進し続けていこうと思います。\u003cbr\u003e\nそれぞれの領域の深いお話は、また別途紹介させていただきます。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"140:1-140:14\"\u003e\n\u003cspan id=\"終わりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e終わりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"141:1-143:126\"\u003eデータエンジニア絶賛募集中です。人手が足りず、困っています。\u003cbr\u003e\nインフラ領域に強い方、モデリング領域に強い方、マネジメント領域に強い方、データ領域でいろんなチャレンジをしていきたい方など。0⇨1開発も、1⇨100開発も経験できる環境をご用意できるかと思います。\u003cbr\u003e\n少しでもご興味持っていただけた方、ぜひ情報交換という形でもお話しできたら嬉しいです。\u003c/p\u003e\n\u003cul data-sourcepos=\"145:1-147:154\"\u003e\n\u003cli data-sourcepos=\"145:1-145:149\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/115442\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】プロジェクトマネージャー/大規模データ分析基盤領域\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"146:1-146:143\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/115570\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】テクニカルリーダー候補/データ基盤インフラ領域\u003c/a\u003e\u003c/li\u003e\n\u003cli data-sourcepos=\"147:1-147:154\"\u003e\u003ca href=\"https://open.talentio.com/r/1/c/istyle_career/pages/110492\" rel=\"nofollow noopener\" target=\"_blank\"\u003e【istyle】データモデリングリード候補／データ基盤モデリング領域\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","body":"\nこの記事は、アイスタイル [アドベントカレンダー2025](https://qiita.com/advent-calendar/2025/istyle) 10日目の記事です。\n\n# はじめに\nこんにちは、データ分析システム部の河野([@matako1124](https://x.com/matako1124))です。\n\n実はアイスタイルに入社させてもらったのは2025年4月で、まだまだ学びの連続ですが、そんな私の最初のミッションは『社内のデータ分析基盤を、活用できる状態にまでしっかり立て直すこと』でした。\n\n本記事では、私が入社した当時のデータ分析基盤の状態と、現在どう改善が進んでいるのか、そして今後どう進化させていこうと考えているのかをざっくりと紹介します。\n\n## 注意\n- 執筆に当たり細心の注意を払っておりますが、不十分な説明や誤りがある可能性もございます\n- 記事内の内容は一部[こちらの登壇内容](https://speakerdeck.com/takumakouno/zhu-shi-hui-she-aisutairu-data-engineering-summit-quan-she-notetahuo-yong-reheruwoshang-keru-ai-readynazu-zhi-womu-zhi-su-tetamin-zhu-hua-hurosiekuto-noli-ce?slide=12)と重複する部分がございます\n\n\n# 目次\n- はじめに\n- 2025年4月時点でのデータ分析基盤のご紹介\n- 現状の課題\n- データ分析基盤Replace PJ\n  - 今やっていること(2025年12月まで)\n  - これからやっていくこと\n- まとめ\n- 終わりに\n\n# 2025年4月時点でのデータ分析基盤のご紹介\n私が入社した時点(2025年4月)でのデータ分析基盤は、ざっくり以下のような構成でした。\n![スクリーンショット 2025-12-03 12.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/5f9941c7-6361-4138-88d0-2e3cca8124e6.png)\n\nポイントは以下の通りです。\n- データ取り込みはオンプレのEmbulkを使い、BigQueryに取り込み(raw)\n- 社内DB以外はTrocco経由があったり、Embulkで取っていたりとバラつきがある\n- BigQuery上では加工を行っておらず、rawデータを各利用者が個別に加工して利用している\n\nつまり、**とりあえずrawデータがBigQueryにある最低限の仕組み**が整っているだけの状態でした。\nデータエンジニアの方ならお察しかと思いますが、この状態だとデータ活用において多くの問題が生じます。\n\n# 現状の課題\n![スクリーンショット 2025-12-02 16.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/ea34fb00-152a-4cae-9e2e-e392c807b137.png)\n\n大きな課題は上記3つですが、これ以外にも既存のデータ取り込み部分でも多くの課題が残っています。\n- Embulkはオンプレで動いており、不安定な状態になっている\n- dailyバッチで全件更新をしており、DB負荷が高い\n  - データ量の多いものではアプリ側への影響が出るケースも…\n\nこの状態ではデータ活用の促進どころの話ではないため、ほぼ全面的な改修が必要という判断をしました。\n\n# データ分析基盤Replace PJ\n\n社内のデータ活用を促進するため、まずは今年いっぱい(2025年12月)までに**データ活用を促進していくためのスタートラインに立てる基盤にすること**を目標とし、以下のように改善しようと考えました。\n![スクリーンショット 2025-12-02 16.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4260041/4a6227ff-2189-4646-87fd-f4aca46df5ae.png)\n\nそれぞれ説明していきます。\n\n## 今やっていること(2025年12月まで)\n### ①データ取り込みの改善\n結論から言うと、以下のような課題が残っており、Embulkのままだと解消できないものが多く、ツールごと切り替える判断をしました。\n\n**メイン課題**\n- バッチでの全件ロードだとDBに負荷がかかり、データ取り込みによるインシデントリスクが発生する可能性がある状態のため、更新されたタイミングでデータが入ってくるような形(CDC)にして、DB負荷を軽減したい\n- 全件置き換えなので、履歴情報が欠損してしまっている。現状でもdailyでsnapshotをとって実装はできます(それぞれ活用側で実装しているところもある)が工数、コストともになるべくかけないような状態を担保したい\n\n**サブ課題**\n- Embulkを動かしている環境もオンプレ環境で不安定な状態、メンテもされていない\n- Embulkの開発工数も高い\n- ツール自体が古い(直近で言うとサポート終了も明示された)\n\n代替ツールは以下の条件で検討した結果、GCPのDatastreamとOSSのAirbyteを採用することにしました。\n- コンソールから設定できること\n- 管理や運営の手間が少ないこと\n- コストが掛かりすぎないこと\n- CDC連携に対応したツールであること\n\nDatastream一本でいかない理由としては、以下です。\n- 単一障害点防止\n- 何か障害が発生した時の代替策としてもう一本用意しておきたい(ツールの冗長性確保)\n- DBの仕様的にDatastreamで取り込みできないものもある\n\n**12月時点でほとんどのDBの新規取り込みが完了し、DB負荷が大幅に改善されることが判明しています。**\n\n### ②データ加工(モデリング)の実施\nデータ分析基盤の最も重要な部分であり、開発工数も多く投下している領域です。\n\n- オーケストレーションツール: Composer(airflow) x dbt Core\n- モデル構成: raw ⇨ cleansing ⇨ dwh ⇨ mart の一般的な3層構造\n- モデリング手法: ディメンショナルモデリング\n\n細かいアーキテクチャの話をすると、ここだけで数万文字いってしまいそうなので、それはまた別の記事で紹介させてもらおうと思います。\n\n**一部の部署から徐々に展開していっており、rawデータを使って分析していた頃よりも圧倒的に活用しやすくなった、活用スピードが上がってきたというお声をいただいています。データの質向上についても少しずつ改善してきています。**\n\n### ③インフラ周りをTerraformで統一管理\n今までGCPのリソース管理をきちんとできていなかったため、セキュリティ的にも問題がありました。\n\nまずは以下を管理対象として、Terraformで整備しています。\n- IAM管理の集約\n- BigQuery リソース管理のコード化\n- 活用ユーザーはrawデータの参照を不可とし、モデリング以降のレイヤのみ閲覧可能に変更\n\n**これにより最低限データを活用していくためのセキュリティを担保できる状態になりました。**\n\n###  ④モデリング対象のデータカタログとしてdbt docsを採用し、全社展開(予定)\n今までどこにデータがあるかわからない、誰に聞けばいいかわからないという状態が続いていました。\n\nアイスタイルは事業が多い影響で、データの種類やステークホルダーが多く、存在しているデータをすべて追うというのは、正直非常に困難な状態となっています。\n\nしたがって、まずはデータ分析基盤側でモデリングしたデータからカタログ化していくことで、**信頼性の担保されたデータを誰でも素早く見つけられる**状態を目指しています。\nそのためのツールとしてはdbt docsがお手軽なので、これをhostして全社展開をする予定で進めています。\n\n## これからやっていくこと\n上記記載した内容が今年中に最低限やり切ると決めていることになります。\nとはいえ、これができてもまだスタートラインに立てた程度だと思っています。\n\nデータ分析基盤としても、チームとしても、まずは『信頼を獲得する』ことを目標とし、今後は以下のようなことをやっていく必要があると考えています。\n\n1. dwh, martの継続的整備と拡張\n1. Embulkの完全廃止(コスト\u0026パフォーマンス最適化、二重取り込み解消)\n1. SA経由のrawデータ参照ブロック(RedashやTrocco等)(セキュリティ強化)\n1. 他全てのGCPPJの精査、棚卸し(セキュリティ強化\u0026権限管理体制の強化)\n1. 権限管理体制の強化(セキュリティ強化)\n1. 自社DB以外のデータ(Thirdparty系等)の取り込み改善(データ取り込み管理の統一化)\n1. dbt cloudの導入(データ活用促進、スピード向上)\n1. dbt semantic layerの導入(データ活用促進、データ信頼性向上)\n1. データテスト、監視の仕組み化(データ信頼性向上)\n1. データコントラクトの仕組み化(データ信頼性向上\u0026不具合防止\u0026開発チーム連携強化)\n1. BIツールのReplace(データ活用促進)\n1. データ周りの技術水準の策定と浸透(データ分析基盤の信頼性向上\u0026開発工数の削減)\n\netc..\n\nやるべきことはたくさんあります。\n\n# まとめ\n私はよく **\"守り\"** と **\"攻め\"** という言葉を使うのですが、データ分析基盤はまさにこの **\"守り\"** を固めないと話にならないと思っていて、現状のアイスタイルはこのフェーズかなと思っています。\n\nデータエンジニアリングは地道なことが多いですが、一歩ずつ前に進んでいくことで大きな成果を生むことができる領域だと思っています。\n引き続き、チーム一丸となってデータ分析基盤を進化させ、活用促進に向けて日々精進し続けていこうと思います。\nそれぞれの領域の深いお話は、また別途紹介させていただきます。\n\n# 終わりに\nデータエンジニア絶賛募集中です。人手が足りず、困っています。\nインフラ領域に強い方、モデリング領域に強い方、マネジメント領域に強い方、データ領域でいろんなチャレンジをしていきたい方など。0⇨1開発も、1⇨100開発も経験できる環境をご用意できるかと思います。\n少しでもご興味持っていただけた方、ぜひ情報交換という形でもお話しできたら嬉しいです。\n\n- [【istyle】プロジェクトマネージャー/大規模データ分析基盤領域](https://open.talentio.com/r/1/c/istyle_career/pages/115442)\n- [【istyle】テクニカルリーダー候補/データ基盤インフラ領域](https://open.talentio.com/r/1/c/istyle_career/pages/115570)\n- [【istyle】データモデリングリード候補／データ基盤モデリング領域](https://open.talentio.com/r/1/c/istyle_career/pages/110492)\n","coediting":false,"comments_count":0,"created_at":"2025-12-03T00:51:12+09:00","group":null,"id":"a90739a52eb961f02171","likes_count":15,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"モデリング","versions":[]},{"name":"データ分析基盤","versions":[]},{"name":"データエンジニアリング","versions":[]}],"title":"データ分析基盤の今と未来をざっくり紹介 ~どう立て直し、どこへ向かうのか~","updated_at":"2025-12-04T07:07:46+09:00","url":"https://qiita.com/konot/items/a90739a52eb961f02171","user":{"description":null,"facebook_id":null,"followees_count":1,"followers_count":0,"github_login_name":null,"id":"konot","items_count":1,"linkedin_id":null,"location":null,"name":"","organization":null,"permanent_id":4260041,"profile_image_url":"https://lh3.googleusercontent.com/a/ACg8ocLzWo39YFJx9Jv7rfXNHOCEBxCS1ndSnbCS2DxWHomVZuePyg=s96-c","team_only":false,"twitter_screen_name":null,"website_url":null},"page_views_count":null,"team_membership":null,"organization_url_name":"istyle","slide":false},{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:14\"\u003e\n\u003cspan id=\"はじめに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eはじめに\u003c/h1\u003e\n\u003cp data-sourcepos=\"2:1-4:141\"\u003e今回使うEmbulkとはバルクデータローダーです。\u003cbr\u003e\nバルクロードとは、簡単に言うとデータをまとめてロードすることです。\u003cbr\u003e\nbulkの意味が分かればなんとなくイメージつくかなと思います。(大量とか、まとめてとかそんなイメージ)\u003c/p\u003e\n\u003cp data-sourcepos=\"6:1-6:72\"\u003eOSSなので、だれでも無料で利用することができます。\u003c/p\u003e\n\u003cp data-sourcepos=\"8:1-8:23\"\u003e\u003ciframe id=\"qiita-embed-content__61bde1517dd5ec20885f58513fa6c34e\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__61bde1517dd5ec20885f58513fa6c34e\" data-content=\"https%3A%2F%2Fwww.embulk.org%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"10:1-10:201\"\u003eサイトに記載されている通り、Embulkはプラグインを利用することでさまざまなサービスと接続して、サービス間のデータ転送を行うことができます。\u003c/p\u003e\n\u003cblockquote data-sourcepos=\"11:1-11:154\"\u003e\n\u003cp data-sourcepos=\"11:2-11:154\"\u003e様々なデータベース、ストレージ、ファイル形式、クラウドサービスなどの間でのデータ転送をサポートします。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch1 data-sourcepos=\"13:1-13:14\"\u003e\n\u003cspan id=\"注意点\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E6%B3%A8%E6%84%8F%E7%82%B9\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e⚠注意点\u003c/h1\u003e\n\u003cp data-sourcepos=\"14:1-15:99\"\u003eEmbulkはメンテナンスモードに移行しています。\u003cbr\u003e\n今後のアップデートはあまり期待できない状況なので注意してください。\u003c/p\u003e\n\u003cp data-sourcepos=\"17:1-17:80\"\u003e\u003ciframe id=\"qiita-embed-content__03cb4f5c6c45d327165d2edda49c500b\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__03cb4f5c6c45d327165d2edda49c500b\" data-content=\"https%3A%2F%2Fwww.embulk.org%2Farticles%2F2025%2F11%2F10%2Fembulk-into-the-maintenance-mode.html\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003ch1 data-sourcepos=\"19:1-19:20\"\u003e\n\u003cspan id=\"今回やること\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E4%BB%8A%E5%9B%9E%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e今回やること\u003c/h1\u003e\n\u003cul data-sourcepos=\"20:1-24:0\"\u003e\n\u003cli data-sourcepos=\"20:1-20:42\"\u003eAWSのAmazon Linux2023にEmbulkを導入\u003c/li\u003e\n\u003cli data-sourcepos=\"21:1-21:68\"\u003eEmbulkを今まで通り使えるようにエイリアスを作成\u003c/li\u003e\n\u003cli data-sourcepos=\"22:1-22:112\"\u003eAzure上の踏み台サーバを経由(SSH)して、プライベートのAzure SQL Serverのデータを抽出\u003c/li\u003e\n\u003cli data-sourcepos=\"23:1-24:0\"\u003e抽出したデータをcsv形式でAmazon S3にアップロード\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 data-sourcepos=\"25:1-25:23\"\u003e\n\u003cspan id=\"この記事の前提\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%89%8D%E6%8F%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eこの記事の前提\u003c/h1\u003e\n\u003cp data-sourcepos=\"26:1-27:45\"\u003eこの検証を行う際に、すでにAzure上の設定とAWSのEC2作成は完了していたので、説明を省きます。\u003cbr\u003e\n以下を用意しておいてください。\u003c/p\u003e\n\u003cul data-sourcepos=\"29:1-43:0\"\u003e\n\u003cli data-sourcepos=\"29:1-35:3\"\u003eAzure 仮想マシン\n\u003cul data-sourcepos=\"30:3-35:3\"\u003e\n\u003cli data-sourcepos=\"30:3-30:34\"\u003eSSH接続用のユーザ作成\u003c/li\u003e\n\u003cli data-sourcepos=\"31:3-31:28\"\u003eSSH用の秘密鍵生成\u003c/li\u003e\n\u003cli data-sourcepos=\"32:3-35:3\"\u003eネットワークセキュリティグループの設定\n\u003cul data-sourcepos=\"33:5-35:3\"\u003e\n\u003cli data-sourcepos=\"33:5-33:62\"\u003eAWSのEC2からSSHを許可(インバウンドルール)\u003c/li\u003e\n\u003cli data-sourcepos=\"34:5-35:3\"\u003eAzure SQL ServerへのJDBC接続を許可(アウトバウンドルール)\u003cbr\u003e\n　\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-sourcepos=\"36:1-38:3\"\u003eAzure SQL Server\u003cbr\u003e\nプライベートエンドポイント\u003cbr\u003e\n　\u003c/li\u003e\n\u003cli data-sourcepos=\"39:1-43:0\"\u003eAmazon EC2\n\u003cul data-sourcepos=\"40:3-43:0\"\u003e\n\u003cli data-sourcepos=\"40:3-40:44\"\u003eパブリックIPv4アドレスの付与\u003c/li\u003e\n\u003cli data-sourcepos=\"41:3-41:57\"\u003eS3バケット操作用のIAMロールのアタッチ\u003c/li\u003e\n\u003cli data-sourcepos=\"42:3-43:0\"\u003e2GB以上のメモリ\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-sourcepos=\"44:1-44:95\"\u003eなお、Azureの仮想マシンとAWSのEC2はパブリックの通信を前提とします。\u003c/p\u003e\n\u003ch1 data-sourcepos=\"46:1-46:26\"\u003e\n\u003cspan id=\"実際にやってみる\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003e実際にやってみる\u003c/h1\u003e\n\u003ch2 data-sourcepos=\"47:1-47:24\"\u003e\n\u003cspan id=\"iamロールの確認\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E7%A2%BA%E8%AA%8D\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eIAMロールの確認\u003c/h2\u003e\n\u003cp data-sourcepos=\"48:1-49:121\"\u003e一応IAMロールと、IAMロールに割り当てるIAMポリシーを確認しておきます。\u003cbr\u003e\nS3バケットにファイルをアップロードするため、S3操作権限を割り当てる必要があります。\u003c/p\u003e\n\u003cp data-sourcepos=\"51:1-52:122\"\u003e　まずこちらがEC2にアタッチするロールです。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F74750274-08d1-42b3-a4b7-18acc8eaf8dd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c8c66e484d92c7dc392046fd948128b1\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F74750274-08d1-42b3-a4b7-18acc8eaf8dd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=c8c66e484d92c7dc392046fd948128b1\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F74750274-08d1-42b3-a4b7-18acc8eaf8dd.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=cdc224c0368289aa65ba69931bb4571f 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/74750274-08d1-42b3-a4b7-18acc8eaf8dd.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"54:1-55:122\"\u003e　EC2がこのロールを使えるようにプリンシパルにEC2サービスを指定します。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F8c3e3efa-a697-4b88-b3a8-2244a431928b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a2a2551b55014499ab47b2a5ef1645d3\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F8c3e3efa-a697-4b88-b3a8-2244a431928b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=a2a2551b55014499ab47b2a5ef1645d3\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F8c3e3efa-a697-4b88-b3a8-2244a431928b.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=ded2a42fffb8676eb403474fa16db843 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/8c3e3efa-a697-4b88-b3a8-2244a431928b.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"57:1-58:123\"\u003e　そして、こちらがIAMロールに割り当てているIAMポリシーです。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F63f56219-04ef-42a4-849d-3088274e4a8f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=48d359e92b66a2afe9378cf4770d6fae\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F63f56219-04ef-42a4-849d-3088274e4a8f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=48d359e92b66a2afe9378cf4770d6fae\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F63f56219-04ef-42a4-849d-3088274e4a8f.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=a60fea4a3865a1d8663e84659ee1ba9a 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/63f56219-04ef-42a4-849d-3088274e4a8f.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"60:1-61:122\"\u003e　EC2インスタンスにもアタッチされていますね。これでEC2の設定は終わりです。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F6bede269-60a0-4abc-9ef3-67730d07f06a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec42ad3494ea1d226567f8d76e6b07bf\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F6bede269-60a0-4abc-9ef3-67730d07f06a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=ec42ad3494ea1d226567f8d76e6b07bf\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F6bede269-60a0-4abc-9ef3-67730d07f06a.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=5b990ae126863161847e307da2bacdf1 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/6bede269-60a0-4abc-9ef3-67730d07f06a.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 data-sourcepos=\"63:1-63:21\"\u003e\n\u003cspan id=\"ユーザの作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eユーザの作成\u003c/h2\u003e\n\u003cp data-sourcepos=\"64:1-66:61\"\u003eEC2の起動が完了したらユーザの作成をしておきます。\u003cbr\u003e\nお好きなようにでOKです。\u003cbr\u003e\nsudoできるように設定も入れておきましょう。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"68:2-73:4\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003esudo \u003c/span\u003euseradd ＜ユーザ名＞\n\u003cspan class=\"nb\"\u003esudo \u003c/span\u003epasswd ＜ユーザ名＞\n\u003cspan class=\"nb\"\u003esudo \u003c/span\u003eusermod \u003cspan class=\"nt\"\u003e-aG\u003c/span\u003e wheel ＜ユーザ名＞\n\u003cspan class=\"nb\"\u003esudo \u003c/span\u003evisudo\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"75:1-75:68\"\u003esudo visudoをしたら以下を末尾に追加しておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"76:1-78:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e＜ユーザ名＞ ALL=(ALL:ALL) NOPASSWD:ALL\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"80:1-80:28\"\u003e\n\u003cspan id=\"javaのインストール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#java%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eJavaのインストール\u003c/h2\u003e\n\u003cp data-sourcepos=\"81:1-81:63\"\u003e使うユーザにまずスイッチしておきましょう。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"83:1-85:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003esu - ＜ユーザ名＞\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"87:1-87:31\"\u003ednf updateを実行します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"88:1-90:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003esudo \u003c/span\u003ednf update\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"92:1-95:150\"\u003eJavaをインストールします。\u003cbr\u003e\nなお、ここでインストールするバージョンはJava8にしてください。\u003cbr\u003e\nEmbulk v0.11ではJava8を公式サポートしているためです。\u003cbr\u003e\nそれ以降のバージョンでも動くようですが、変なエラーが出ても嫌なので、いったん公式通りにしておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"96:1-98:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003esudo \u003c/span\u003ednf \u003cspan class=\"nb\"\u003einstall \u003c/span\u003ejava-1.8.0-openjdk\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"100:1-100:68\"\u003e以下コマンドでバージョンが表示されればOKです。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"101:1-103:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003ejava \u003cspan class=\"nt\"\u003e-version\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"104:1-104:30\"\u003e\n\u003cspan id=\"embulkのインストール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#embulk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eEmbulkのインストール\u003c/h2\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"106:1-111:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003emkdir\u003c/span\u003e \u003cspan class=\"nt\"\u003e-p\u003c/span\u003e ~/.embulk/bin\n\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/.embulk/bin\ncurl \u003cspan class=\"nt\"\u003e-OL\u003c/span\u003e https://github.com/embulk/embulk/releases/download/v0.11.5/embulk-0.11.5.jar\n\u003cspan class=\"nb\"\u003echmod\u003c/span\u003e +x embulk-0.11.5.jar\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"113:1-113:27\"\u003e\n\u003cspan id=\"エイリアスの作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eエイリアスの作成\u003c/h2\u003e\n\u003cp data-sourcepos=\"114:1-114:193\"\u003eEmbulkv0.9以降では、java -jar embulk-X.XX.X.jar ~~という呼び出し方法に変わっているのですがさすがに長すぎるので、エイリアスを作成しておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"116:1-118:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003evi ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"119:1-120:54\"\u003e以下を最終行に追記して保存します。\u003cbr\u003e\n一応、以下のように指定しておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"121:1-123:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003ealias embulk='java -jar $(find $HOME/.embulk/bin -name \"embulk-*.jar\" | head -1)'\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"125:1-125:111\"\u003e反映しておきましょう。これで「embulk」でコマンド実行できるようになりました。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"126:1-128:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"130:1-130:29\"\u003e\n\u003cspan id=\"jrubyのインストール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#jruby%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003ejrubyのインストール\u003c/h2\u003e\n\u003cp data-sourcepos=\"131:1-134:74\"\u003eEmbulk v0.9からjrubyプラグインがインストールされていません。\u003cbr\u003e\nEmbulk gemを利用したい場合は、jrubyを自身でインストールする必要があります。\u003cbr\u003e\nEmbulkでは9.Xのバージョンで動作できるようなので、9系の新しいバージョンをインストールすることにします。\u003cbr\u003e\njrubyが古いとEmbulkが正常に動作しない場合があります。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"135:1-138:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/\ncurl \u003cspan class=\"nt\"\u003e-OL\u003c/span\u003e https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.4.14.0/jruby-complete-9.4.14.0.jar\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"140:1-140:50\"\u003eRuby gemもインストールしておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"141:1-146:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk gem \u003cspan class=\"nb\"\u003einstall \u003c/span\u003eembulk \u003cspan class=\"nt\"\u003e-v\u003c/span\u003e 0.11.5 \u003cspan class=\"c\"\u003e# ここで指定するバージョンはEmbulkと同じバージョンを指定してください。\u003c/span\u003e\nembulk gem \u003cspan class=\"nb\"\u003einstall \u003c/span\u003emsgpack\nembulk gem \u003cspan class=\"nb\"\u003einstall \u003c/span\u003ebundler\nembulk gem \u003cspan class=\"nb\"\u003einstall \u003c/span\u003eliquid\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"148:1-148:89\"\u003eembulkがjrubyを認識できるようにプロパティファイルを作成します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"149:1-151:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003evi ~/.embulk/embulk.properties\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"153:1-155:86\"\u003e以下を定義ファイルに入力して保存します。\u003cbr\u003e\n適宜調整してください。\u003cbr\u003e\nJVMのオプションが必要であればここに記載してもOKだそうです。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"156:1-158:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003ejruby=file:///home/testuser/jruby-complete-9.4.14.0.jar\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"160:1-160:39\"\u003e\n\u003cspan id=\"プラグインのインストール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eプラグインのインストール\u003c/h2\u003e\n\u003cp data-sourcepos=\"161:1-162:133\"\u003eプラグインはembulk gem install 'パッケージ名'もしくは、embulk install 'パッケージ名'でインストールします。\u003cbr\u003e\n特に何も設定していないと、embulk installを実行した場合、リモートのMavenリポジトリを参照します。\u003c/p\u003e\n\u003cp data-sourcepos=\"164:1-165:30\"\u003e今回は、SQL Serverから情報を取得したいのと、S3に情報を出力したいので、以下のプラグインを利用します。\u003cbr\u003e\nインストールします。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"166:1-169:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk \u003cspan class=\"nb\"\u003einstall\u003c/span\u003e \u003cspan class=\"s1\"\u003e'org.embulk:embulk-input-sqlserver:0.13.2'\u003c/span\u003e\nembulk \u003cspan class=\"nb\"\u003einstall\u003c/span\u003e \u003cspan class=\"s1\"\u003e'org.embulk:embulk-output-s3:1.7.1'\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"171:1-171:139\"\u003e検証の中でSQL Server用のプラグインだけうまく認識できなかったので、プロパティに記載しておきます。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"172:1-174:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003evi ~/.embulk/embulk.properties\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"176:1-176:27\"\u003e以下を追記します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"text\" data-sourcepos=\"177:1-179:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eplugins.input.sqlserver=maven:org.embulk:sqlserver:0.13.2\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"181:1-181:43\"\u003e\n\u003cspan id=\"jdbcドライバーのインストール\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#jdbc%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eJDBCドライバーのインストール\u003c/h2\u003e\n\u003cp data-sourcepos=\"182:1-184:51\"\u003eJDBCドライバーをインストールします。\u003cbr\u003e\nうまいこと持ってこれなかったので、S3を一度経由しました。\u003cbr\u003e\n以下からダウンロードしてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"186:1-186:118\"\u003e\u003ciframe id=\"qiita-embed-content__9612429f4f23784f1349a6f5349718f5\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__9612429f4f23784f1349a6f5349718f5\" data-content=\"https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fsql%2Fconnect%2Fjdbc%2Fdownload-microsoft-jdbc-driver-for-sql-server%3Fview%3Dsql-server-ver17\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"188:1-189:70\"\u003eダウンロードが完了したら解凍して、jarファイルを配置します。\u003cbr\u003e\n今回はjava8なのでjava8用のドライバーを作成します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"190:1-194:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003emkdir\u003c/span\u003e \u003cspan class=\"nt\"\u003e-p\u003c/span\u003e ~/.embulk/lib/drivers\n\u003cspan class=\"nb\"\u003ecp\u003c/span\u003e ＜解凍後のファイルパス＞ ~/.embulk/lib/drivers/\n\u003cspan class=\"nb\"\u003echmod\u003c/span\u003e +x ~/.embulk/lib/drivers/\u003cspan class=\"k\"\u003e*\u003c/span\u003e.jar\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"196:1-196:27\"\u003e\n\u003cspan id=\"sshトンネルの作成\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eSSHトンネルの作成\u003c/h2\u003e\n\u003cp data-sourcepos=\"197:1-198:93\"\u003eSSH経由でSQL Serverへ通信を行うため、SSHの設定を行います。\u003cbr\u003e\n踏み台サーバで作成した秘密鍵の内容をコピーしておいてください。\u003c/p\u003e\n\u003cp data-sourcepos=\"200:1-201:111\"\u003e以下はEC2で作業します。\u003cbr\u003e\nなお、ここまでの作業とは別のターミナルを起動しておいた方がすっきりします。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"202:1-206:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"nb\"\u003emkdir\u003c/span\u003e ~/.ssh\nvi ~/.ssh/\u0026lt;暗号鍵名\u0026gt;\n\u003cspan class=\"nb\"\u003echmod \u003c/span\u003e600 ~/.ssh/\u0026lt;暗号鍵名\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"207:1-207:90\"\u003eこれでコピーしておいた内容を張り付けてSSH用の鍵を作成します。\u003c/p\u003e\n\u003cp data-sourcepos=\"209:1-209:48\"\u003eここまで完了したらSSHを行います。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"210:1-212:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003essh \u003cspan class=\"nt\"\u003e-f\u003c/span\u003e \u003cspan class=\"nt\"\u003e-N\u003c/span\u003e \u003cspan class=\"nt\"\u003e-L\u003c/span\u003e 1433:＜SQL ServerのFQDN＞:1433 \u003cspan class=\"nt\"\u003e-i\u003c/span\u003e ~/.ssh/\u0026lt;暗号鍵名\u0026gt; ＜踏み台サーバのユーザ名＞@＜踏み台サーバのIPアドレス＞\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 data-sourcepos=\"214:1-214:18\"\u003e\n\u003cspan id=\"embulkの実行\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#embulk%E3%81%AE%E5%AE%9F%E8%A1%8C\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eembulkの実行\u003c/h2\u003e\n\u003cp data-sourcepos=\"215:1-216:62\"\u003eやっとembulkの実行です。\u003cbr\u003e\n以下のQuick Startにある通りやってみましょう。\u003c/p\u003e\n\u003cp data-sourcepos=\"218:1-218:23\"\u003e\u003ciframe id=\"qiita-embed-content__38b6ebca8bb96a9da5e460818ec1c5c8\" src=\"https://qiita.com/embed-contents/link-card#qiita-embed-content__38b6ebca8bb96a9da5e460818ec1c5c8\" data-content=\"https%3A%2F%2Fwww.embulk.org%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\" style=\"width:100%;\" height=\"29\"\u003e\n\u003c/iframe\u003e\n\u003c/p\u003e\n\u003cp data-sourcepos=\"220:1-220:54\"\u003e以下でサンプルファイルを生成します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"221:1-223:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk example ./try1\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"225:1-227:148\"\u003eseed.ymlを修正します。\u003cbr\u003e\nseed.ymlの内容を推察していい感じにconfig.ymlを作成してくれます。\u003cbr\u003e\n私はよくわからないまま触っていたので、ここでサンプルのまま出力させて直接config.ymlを修正していました。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"228:1-230:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk guess ./try1/seed.yml \u003cspan class=\"nt\"\u003e-o\u003c/span\u003e config.yml\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"232:1-234:78\"\u003e情報はマスキングしますが、定義ファイルの内容はこのようにしました。\u003cbr\u003e\nhostの部分はlocalhostを指定します。\u003cbr\u003e\nローカルポートフォワーディングを行っているためです。\u003c/p\u003e\n\u003cp data-sourcepos=\"236:1-237:126\"\u003eauth_methodはinstanceを指定するとインスタンスプロファイル(IAMロール)の権限に従います。\u003cbr\u003e\nそれ以外では、アクセスキー／シークレットアクセスキーによる認証もサポートしています。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"json\" data-sourcepos=\"238:1-258:5\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003e\u003cspan class=\"err\"\u003ein:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003etype:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003esqlserver\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003edriver_path:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜ローカルのjarファイルパス＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003ehost:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003elocalhost\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003eport:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1433\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003euser:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜データベースユーザ名＞@＜SQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003eServerのサーバ名＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003epassword:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\"＜データベースユーザのパスワード＞\"\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003edatabase:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜データベース名＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003eschema:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜スキーマ名＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003etable:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜テーブル名＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\n\u003c/span\u003e\u003cspan class=\"err\"\u003eout:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003etype:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003es\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003ebucket:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜S\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"err\"\u003eバケット名＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003epath_prefix:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e＜S\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"err\"\u003eプレフィックス＞\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003efile_ext:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e.csv\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003eformatter:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n    \u003c/span\u003e\u003cspan class=\"err\"\u003etype:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003ecsv\u003c/span\u003e\u003cspan class=\"w\"\u003e\n  \u003c/span\u003e\u003cspan class=\"err\"\u003eauth_method:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003einstance\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"260:1-261:39\"\u003e以下で定義ファイルをプレビューできます。\u003cbr\u003e\n内容が正しいか確認します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"262:1-264:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk preview config.yml\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"266:1-266:45\"\u003e正しければ、実際に実行します。\u003c/p\u003e\n\u003cdiv class=\"code-frame\" data-lang=\"bash\" data-sourcepos=\"267:1-269:3\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre\u003e\u003ccode\u003eembulk run config.yml\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp data-sourcepos=\"271:1-272:71\"\u003eしばらく待つとコンソール上に色々メッセージが出力されます。\u003cbr\u003e\n特段エラーがなさそうなので、S3を確認してみます。\u003c/p\u003e\n\u003cp data-sourcepos=\"274:1-275:122\"\u003e無事にファイルが出力されていました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F047beac1-cecb-436e-b714-69fa248c3df7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cfccade0242aaab1cf813f39f7ffebca\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F047beac1-cecb-436e-b714-69fa248c3df7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=cfccade0242aaab1cf813f39f7ffebca\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2F047beac1-cecb-436e-b714-69fa248c3df7.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=531c1048024c35c5ea0b26d1c22db26b 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/047beac1-cecb-436e-b714-69fa248c3df7.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp data-sourcepos=\"277:1-278:122\"\u003e中身も確認しましたが、テーブルの情報も取得できていました。\u003cbr\u003e\n\u003ca href=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2Fff1b1d63-2b19-4adf-b74e-153bb8d7b1f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=164e78e318debdf2d02c21118dc3476d\" target=\"_blank\" rel=\"nofollow noopener\"\u003e\u003cimg src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2Fff1b1d63-2b19-4adf-b74e-153bb8d7b1f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;s=164e78e318debdf2d02c21118dc3476d\" alt=\"image.png\" srcset=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3776083%2Fff1b1d63-2b19-4adf-b74e-153bb8d7b1f2.png?ixlib=rb-4.0.0\u0026amp;auto=format\u0026amp;gif-q=60\u0026amp;q=75\u0026amp;w=1400\u0026amp;fit=max\u0026amp;s=c78e3fbd1df4008a68e7f2042ed8493d 1x\" data-canonical-src=\"https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/ff1b1d63-2b19-4adf-b74e-153bb8d7b1f2.png\" loading=\"lazy\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 data-sourcepos=\"280:1-280:14\"\u003e\n\u003cspan id=\"おわりに\" class=\"fragment\"\u003e\u003c/span\u003e\u003ca href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\"\u003e\u003ci class=\"fa fa-link\"\u003e\u003c/i\u003e\u003c/a\u003eおわりに\u003c/h1\u003e\n\u003cp data-sourcepos=\"281:1-282:81\"\u003e今回は、Embulkを自分で設定して利用してみました。\u003cbr\u003e\nEmbulkは以前少し紹介したTROCCOでも利用されている技術です。\u003c/p\u003e\n\u003cp data-sourcepos=\"284:1-284:99\"\u003eEmbulkを知ることでTROCCOを利用する際にイメージが湧きやすくなりました。\u003c/p\u003e\n\u003cp data-sourcepos=\"286:1-287:132\"\u003e今後のアップデートはあまり期待できない状況ではありますが、\u003cbr\u003e\n閉域網での利用だったり、最大限コストを抑えたい場合などではまだまだ使えるかなと思います。\u003c/p\u003e\n\u003cp data-sourcepos=\"289:1-289:60\"\u003eこのエントリが誰かの役に立てば幸いです。\u003c/p\u003e\n","body":"# はじめに\n今回使うEmbulkとはバルクデータローダーです。\nバルクロードとは、簡単に言うとデータをまとめてロードすることです。\nbulkの意味が分かればなんとなくイメージつくかなと思います。(大量とか、まとめてとかそんなイメージ)\n\nOSSなので、だれでも無料で利用することができます。\n\nhttps://www.embulk.org/\n\nサイトに記載されている通り、Embulkはプラグインを利用することでさまざまなサービスと接続して、サービス間のデータ転送を行うことができます。\n\u003e様々なデータベース、ストレージ、ファイル形式、クラウドサービスなどの間でのデータ転送をサポートします。\n\n# ⚠注意点\nEmbulkはメンテナンスモードに移行しています。\n今後のアップデートはあまり期待できない状況なので注意してください。\n\nhttps://www.embulk.org/articles/2025/11/10/embulk-into-the-maintenance-mode.html\n\n# 今回やること\n- AWSのAmazon Linux2023にEmbulkを導入\n- Embulkを今まで通り使えるようにエイリアスを作成\n- Azure上の踏み台サーバを経由(SSH)して、プライベートのAzure SQL Serverのデータを抽出\n- 抽出したデータをcsv形式でAmazon S3にアップロード\n\n# この記事の前提\nこの検証を行う際に、すでにAzure上の設定とAWSのEC2作成は完了していたので、説明を省きます。\n以下を用意しておいてください。\n\n- Azure 仮想マシン\n  - SSH接続用のユーザ作成\n  - SSH用の秘密鍵生成\n  - ネットワークセキュリティグループの設定\n    - AWSのEC2からSSHを許可(インバウンドルール)\n    - Azure SQL ServerへのJDBC接続を許可(アウトバウンドルール)\n　\n- Azure SQL Server\nプライベートエンドポイント\n　\n- Amazon EC2\n  - パブリックIPv4アドレスの付与\n  - S3バケット操作用のIAMロールのアタッチ\n  - 2GB以上のメモリ\n\nなお、Azureの仮想マシンとAWSのEC2はパブリックの通信を前提とします。\n\n# 実際にやってみる\n## IAMロールの確認\n一応IAMロールと、IAMロールに割り当てるIAMポリシーを確認しておきます。\nS3バケットにファイルをアップロードするため、S3操作権限を割り当てる必要があります。\n\n　まずこちらがEC2にアタッチするロールです。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/74750274-08d1-42b3-a4b7-18acc8eaf8dd.png)\n\n　EC2がこのロールを使えるようにプリンシパルにEC2サービスを指定します。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/8c3e3efa-a697-4b88-b3a8-2244a431928b.png)\n\n　そして、こちらがIAMロールに割り当てているIAMポリシーです。\n ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/63f56219-04ef-42a4-849d-3088274e4a8f.png)\n\n　EC2インスタンスにもアタッチされていますね。これでEC2の設定は終わりです。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/6bede269-60a0-4abc-9ef3-67730d07f06a.png)\n\n## ユーザの作成\nEC2の起動が完了したらユーザの作成をしておきます。\nお好きなようにでOKです。\nsudoできるように設定も入れておきましょう。\n\n ```bash\nsudo useradd ＜ユーザ名＞\nsudo passwd ＜ユーザ名＞\nsudo usermod -aG wheel ＜ユーザ名＞\nsudo visudo\n ```\n\nsudo visudoをしたら以下を末尾に追加しておきます。\n```\n＜ユーザ名＞ ALL=(ALL:ALL) NOPASSWD:ALL\n```\n\n## Javaのインストール\n使うユーザにまずスイッチしておきましょう。\n\n```bash\nsu - ＜ユーザ名＞\n```\n\ndnf updateを実行します。\n```bash\nsudo dnf update\n```\n\nJavaをインストールします。\nなお、ここでインストールするバージョンはJava8にしてください。\nEmbulk v0.11ではJava8を公式サポートしているためです。\nそれ以降のバージョンでも動くようですが、変なエラーが出ても嫌なので、いったん公式通りにしておきます。\n```bash\nsudo dnf install java-1.8.0-openjdk\n```\n\n以下コマンドでバージョンが表示されればOKです。\n```bash\njava -version\n```\n## Embulkのインストール\n\n```bash\nmkdir -p ~/.embulk/bin\ncd ~/.embulk/bin\ncurl -OL https://github.com/embulk/embulk/releases/download/v0.11.5/embulk-0.11.5.jar\nchmod +x embulk-0.11.5.jar\n```\n\n## エイリアスの作成\nEmbulkv0.9以降では、java -jar embulk-X.XX.X.jar ~~という呼び出し方法に変わっているのですがさすがに長すぎるので、エイリアスを作成しておきます。\n\n```bash\nvi ~/.bashrc\n```\n以下を最終行に追記して保存します。\n一応、以下のように指定しておきます。\n```\nalias embulk='java -jar $(find $HOME/.embulk/bin -name \"embulk-*.jar\" | head -1)'\n```\n\n反映しておきましょう。これで「embulk」でコマンド実行できるようになりました。\n```bash\nsource ~/.bashrc\n```\n\n## jrubyのインストール\nEmbulk v0.9からjrubyプラグインがインストールされていません。\nEmbulk gemを利用したい場合は、jrubyを自身でインストールする必要があります。\nEmbulkでは9.Xのバージョンで動作できるようなので、9系の新しいバージョンをインストールすることにします。\njrubyが古いとEmbulkが正常に動作しない場合があります。\n```bash\ncd ~/\ncurl -OL https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.4.14.0/jruby-complete-9.4.14.0.jar\n```\n\nRuby gemもインストールしておきます。\n```bash\nembulk gem install embulk -v 0.11.5 # ここで指定するバージョンはEmbulkと同じバージョンを指定してください。\nembulk gem install msgpack\nembulk gem install bundler\nembulk gem install liquid\n```\n\nembulkがjrubyを認識できるようにプロパティファイルを作成します。\n```bash\nvi ~/.embulk/embulk.properties\n```\n\n以下を定義ファイルに入力して保存します。\n適宜調整してください。\nJVMのオプションが必要であればここに記載してもOKだそうです。\n```\njruby=file:///home/testuser/jruby-complete-9.4.14.0.jar\n```\n\n## プラグインのインストール\nプラグインはembulk gem install 'パッケージ名'もしくは、embulk install 'パッケージ名'でインストールします。\n特に何も設定していないと、embulk installを実行した場合、リモートのMavenリポジトリを参照します。\n\n今回は、SQL Serverから情報を取得したいのと、S3に情報を出力したいので、以下のプラグインを利用します。\nインストールします。\n```bash\nembulk install 'org.embulk:embulk-input-sqlserver:0.13.2'\nembulk install 'org.embulk:embulk-output-s3:1.7.1'\n```\n\n検証の中でSQL Server用のプラグインだけうまく認識できなかったので、プロパティに記載しておきます。\n```bash\nvi ~/.embulk/embulk.properties\n```\n\n以下を追記します。\n```\nplugins.input.sqlserver=maven:org.embulk:sqlserver:0.13.2\n```\n\n## JDBCドライバーのインストール\nJDBCドライバーをインストールします。\nうまいこと持ってこれなかったので、S3を一度経由しました。\n以下からダウンロードしてください。\n\nhttps://learn.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver17\n\nダウンロードが完了したら解凍して、jarファイルを配置します。\n今回はjava8なのでjava8用のドライバーを作成します。\n```bash\nmkdir -p ~/.embulk/lib/drivers\ncp ＜解凍後のファイルパス＞ ~/.embulk/lib/drivers/\nchmod +x ~/.embulk/lib/drivers/*.jar\n```\n\n## SSHトンネルの作成\nSSH経由でSQL Serverへ通信を行うため、SSHの設定を行います。\n踏み台サーバで作成した秘密鍵の内容をコピーしておいてください。\n\n以下はEC2で作業します。\nなお、ここまでの作業とは別のターミナルを起動しておいた方がすっきりします。\n```bash\nmkdir ~/.ssh\nvi ~/.ssh/\u003c暗号鍵名\u003e\nchmod 600 ~/.ssh/\u003c暗号鍵名\u003e\n```\nこれでコピーしておいた内容を張り付けてSSH用の鍵を作成します。\n\nここまで完了したらSSHを行います。\n```bash\nssh -f -N -L 1433:＜SQL ServerのFQDN＞:1433 -i ~/.ssh/\u003c暗号鍵名\u003e ＜踏み台サーバのユーザ名＞@＜踏み台サーバのIPアドレス＞\n```\n\n## embulkの実行\nやっとembulkの実行です。\n以下のQuick Startにある通りやってみましょう。\n\nhttps://www.embulk.org/\n\n以下でサンプルファイルを生成します。\n```bash\nembulk example ./try1\n```\n\nseed.ymlを修正します。\nseed.ymlの内容を推察していい感じにconfig.ymlを作成してくれます。\n私はよくわからないまま触っていたので、ここでサンプルのまま出力させて直接config.ymlを修正していました。\n```bash\nembulk guess ./try1/seed.yml -o config.yml\n```\n\n情報はマスキングしますが、定義ファイルの内容はこのようにしました。\nhostの部分はlocalhostを指定します。\nローカルポートフォワーディングを行っているためです。\n\nauth_methodはinstanceを指定するとインスタンスプロファイル(IAMロール)の権限に従います。\nそれ以外では、アクセスキー／シークレットアクセスキーによる認証もサポートしています。\n```json\nin:\n  type: sqlserver\n  driver_path: ＜ローカルのjarファイルパス＞\n  host: localhost\n  port: 1433\n  user: ＜データベースユーザ名＞@＜SQL Serverのサーバ名＞\n  password: \"＜データベースユーザのパスワード＞\"\n  database: ＜データベース名＞\n  schema: ＜スキーマ名＞\n  table: ＜テーブル名＞\n\nout:\n  type: s3\n  bucket: ＜S3バケット名＞\n  path_prefix: ＜S3プレフィックス＞\n  file_ext: .csv\n  formatter:\n    type: csv\n  auth_method: instance\n  ```\n\n以下で定義ファイルをプレビューできます。\n内容が正しいか確認します。\n```bash\nembulk preview config.yml\n```\n\n正しければ、実際に実行します。\n```bash\nembulk run config.yml\n```\n\nしばらく待つとコンソール上に色々メッセージが出力されます。\n特段エラーがなさそうなので、S3を確認してみます。\n\n無事にファイルが出力されていました。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/047beac1-cecb-436e-b714-69fa248c3df7.png)\n\n中身も確認しましたが、テーブルの情報も取得できていました。\n![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/ff1b1d63-2b19-4adf-b74e-153bb8d7b1f2.png)\n\n# おわりに\n今回は、Embulkを自分で設定して利用してみました。\nEmbulkは以前少し紹介したTROCCOでも利用されている技術です。\n\nEmbulkを知ることでTROCCOを利用する際にイメージが湧きやすくなりました。\n\n今後のアップデートはあまり期待できない状況ではありますが、\n閉域網での利用だったり、最大限コストを抑えたい場合などではまだまだ使えるかなと思います。\n\nこのエントリが誰かの役に立てば幸いです。\n","coediting":false,"comments_count":0,"created_at":"2025-11-28T16:56:07+09:00","group":null,"id":"803cb03dce60866d266f","likes_count":2,"private":false,"reactions_count":0,"stocks_count":0,"tags":[{"name":"Linux","versions":[]},{"name":"AWS","versions":[]},{"name":"Azure","versions":[]},{"name":"Embulk","versions":[]},{"name":"ETL","versions":[]}],"title":"Embulk v0.11をAmazon Linux2023で使ってみる","updated_at":"2025-11-28T17:08:38+09:00","url":"https://qiita.com/coco_co/items/803cb03dce60866d266f","user":{"description":"SnowflakeやAWSなどを触っていたりします。データ系の発信が多いです。","facebook_id":"","followees_count":8,"followers_count":6,"github_login_name":null,"id":"coco_co","items_count":21,"linkedin_id":"","location":"東京","name":"安倍 航太","organization":"BeeX Inc.","permanent_id":3776083,"profile_image_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3776083/67a9cdf819112cbad0e951ebf3648f8e6e3ec89b/x_large.png?1759807783","team_only":false,"twitter_screen_name":"_coco_se","website_url":"https://techblog.beex-inc.com/archive/author/beex-kota-abe"},"page_views_count":null,"team_membership":null,"organization_url_name":"beex-inc","slide":false}]