「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>LLMのユースケース#xdb8bb0e]] --[[生成AIを活用したプログラミング]] --[[生成AIを活用したシステム開発]] --生成AIを活用した設計書のブレークダウン *目次 [#g61fa808] #contents *概要 [#q09851f1] ココでは、SQL Server付属のNorthWind DBをベースに要件定義 ~ 詳細設計までを実施。 ※ なぜ、LLMに、こんなことができるのか?については[[コチラ>LLMのユースケース#xdb8bb0e]] **全体的な使用感 [#q18ea7f3] 端的に、意図しない設計ディシジョンの先に進むことが問題 -Claude Sonnet 4.6(フリープラン)のChatUIで「履歴をコンテキストに使用した推論エージェントによるブレークダウン」を行ったら直ぐにリミットに到達した。 -Claude は、DBにNOTNULLがあるので受注登録の下書きが出来ないので、ワークテーブルを用意するなどのガチ加減を見せたが、要る要らないはケースバイケース。 -概要の設計情報から詳細に渡る設計ディシジョンは多岐に渡るため、成果物に厳密性を求めるケースでは推論エージェントのオートパイロットはさせない。 -(最近のコーディング・エージェントは仕様確認をしてくるケースがあるので、これらが進歩し、更に人間が適切に回答を行えばクリアできる可能性はある) --最近のコーディング・エージェントは仕様確認をしてくるケースがあるので、これらが進歩し、更に人間が適切に回答を行えばクリアできる可能性はある。 --完全に手動で行うならば、チャットで仕様確認が発生する可能性のある部位を特定して、行間をプロンプトで補うことで対応することが出来る。 -そう考えると、ディシジョンが少ないユースケースでは、推論エージェントの出力する「解」の再利用性が高まる可能性がある。 --プログラミングでは、言語に依ってはディシジョンが多いが、最終的な挙動が一致すれば問題ない(使用感が同じでも許容される可能性がある)事を考えると自然言語の曖昧さが改題。 --設計のブレークダウンは、エージェントの仕様確認が完全でなければ、細かなプロンプト・エンジニアリングを手動で行い、エージェントが自動判断しない純LLMが良い。 **生成書類評価後の気付き [#a0e04dba] 簡単に使った感じでは「たたき台作成」程度の使用感 -出力には誤りもあるので人手によって修正が必要(後工程で顕在化)。 -段階的詳細化のため、都度のプロンプト追加は必要(DOA的にDDLなど) -出力体裁を揃えるために --定義書テンプレートなどが必要 -記載レベルを揃えるために --記載ルールの整備、用語集の作成、共通項の抽出などが必要 ---事前条件:「DBに接続可能であること。」「入力情報が取得済みであること。」 ---エラーハンドリング:業務続行可能/不可能、業務/システム/ランタイムなどのパターン化 --記載レベルを合わせるには関連定義書も入力した方が良いかも~ (例えば「x選択ドロップダウン変更」イベント定義など) -以下は生成AIの設計を修正したポイント。 --初回生成は1注文・1商品だった(n商品の明細化)。 --削除ボタンが編集モードにも実装されていた(不要)。 --ステータス管理で「キャンセル」の実装方法 **生成AI自身による見解 [#g444866c] -LLMは「仕様未確定部分を勝手に補完」する -設計は「探索問題」であり暴走し易い(「収束問題」は得意) -「LLM = 文書生成器」ではなく「構造補完・ドラフト生成器」 -ドメイン知識不足、コンテキスト不足、業務ルール未定義 ***LLM活用指針 [#k7c75abd] |項目|方針|h |要件定義|△(レビュー用途)| |基本設計|△(叩き台の作成)| |詳細設計|◯(限定的な使用)| |実装|◎(行間のない詳細設計通りに動作)| |設計ディシジョン|×(人間主導)→ △(AIエージェントによる仕様確認)| ***得手不得手(例) [#ba648636] -「低自由度ドメイン」は得意 --CRUD --定型帳票 --APIラッパー -「高自由度ドメイン」は苦手 --業務設計 --状態遷移 --権限設計 *詳細 [#le458761] -プロンプトヘッダは以下 (以下は)SQLServer付属のNorthWind DBを使用したサンプルアプリの ~ -コレに任意の指示を加えて実行 -途中からDDLから生成したテーブル定義を読み込ませた(段階的詳細化)。 **要件定義 [#e315b2fc] SQL Server付属のNorthWind DBを使用したサンプルアプリの機能要件を提案して下さい。 ***モジュール一覧 [#pa1125a8] |モジュール|主要テーブル|h |受注管理|Orders / Order Details| |顧客管理|Customers / Contacts| |商品管理|Products / Categories| |仕入先管理|Suppliers| |担当者管理|Employees| |配送管理|Shippers| |売上分析|Sales Dashboard| |在庫分析|Inventory Alerts| |パフォーマンス分析|Employee Performance| ***各モジュールの詳細 [#te1b2c97] |受注管理(Orders / Order Details&br;・受注一覧・検索・絞り込み&br;・受注詳細 (明細・小計・送料)&br;・ステータス管理 (出荷・配送)&br;・帳票出力 (納品書・請求書)|顧客管理(Customers / Contacts&br;・顧客一覧・検索 (国・地域別)&br;・顧客詳細・連絡先管理&br;・購買履歴・取引サマリ&br;・顧客ランキング分析|商品管理(Products / Categories&br;・商品一覧・カテゴリ絞り込み&br;・商品詳細・仕入先情報&br;・在庫数・発注点アラート&br;・廃番 (Discontinued) 管理| |仕入先管理(Suppliers&br;・仕入先一覧・国別フィルタ&br;・担当者・連絡先管理&br;・取扱商品一覧&br;・発注書の生成|担当者管理(Employees&br;・社員一覧・上司/部下ツリー&br;・担当受注・売上実績&br;・地域テリトリー管理&br;・個人別パフォーマンス|配送管理(Shippers&br;・運送会社一覧・実績比較&br;・配送コスト・遅延率分析&br;・出荷ステータス追跡&br;・配送先国別の実績集計&br;・分析・ダッシュボード| |売上分析(Sales Dashboard&br;・月次・四半期・年次売上推移&br;・商品カテゴリ別売上比率&br;・国別・地域別売上マップ&br;・前年同期比・成長率|在庫分析(Inventory Alerts&br;・在庫切れ・低在庫アラート一覧&br;・カテゴリ別在庫金額&br;・回転率・滞留在庫の可視化&br;・自動発注トリガー候補|パフォーマンス分析(Employee Performance&br;・担当者別売上ランキング&br;・受注件数・客単価の比較&br;・テリトリー別達成率&br;・目標設定・進捗トラッキング| **機能要件・画面仕様 [#j80a4980] 受注管理にフォーカス -機能一覧・画面遷移 以下はSQLServer付属のNorthWind DBを使用したサンプルアプリの提案された機能要件です。 {モジュール一覧} このうち、受注管理の機能一覧・画面遷移を教えてください。 -イベント一覧 (前述のチャットの会話履歴をそのまま利用し)画面のイベント一覧を作成してください。 -画面項目一覧 以下はSQLServer付属のNorthWind DBを使用したサンプルアプリの受注管理です {機能一覧・画面遷移、イベント一覧} 各画面の画面項目一覧を作成してください。 ***機能一覧 [#vff7bde5] -受注一覧表示 --受注の一覧を表示し、各受注の詳細情報を確認できる。 --検索機能(顧客名、受注日、受注ステータスなど) --ページネーション機能 -受注詳細表示 --選択した受注の詳細情報を表示。 --受注内容(商品、数量、単価、合計金額など) --顧客情報、配送情報の表示 -受注新規登録 --新しい受注を作成するためのフォーム。 --顧客選択、商品選択、数量入力、配送情報などの入力。 -受注の編集 --既存の受注情報を編集するためのフォーム。 --受注内容の変更、顧客情報の変更、配送情報の変更。 -受注の削除 --受注を削除する機能。 --削除確認ダイアログ。 --受注ステータスの更新 -受注ステータス更新:処理中、発送済み(出荷日が使えるがキャンセルは...) -受注の印刷:受注内容を印刷するための機能。 ***画面遷移 [#ze7afacf] -受注一覧画面 --受注新規登録:受注詳細画面(登録モード) --受注詳細:受注詳細画面(照会モード) -受注詳細画面 --受注編集:受注詳細画面(編集モード) --受注削除:確認ダイアログ(削除確認) --受注一覧に戻る:受注一覧画面 --受注印刷:印刷プレビュー画面 -受注詳細画面(登録モード) --受注作成:受注一覧画面 --キャンセル:受注一覧画面 -受注詳細画面(編集モード) --受注更新:受注詳細画面 --キャンセル:受注詳細画面 **画面項目とイベント一覧 [#rb6d755e] ***受注一覧画面 [#if70856c] -画面項目 --検索ボックス ---顧客名 ---受注日 ---受注ステータス --受注一覧テーブル ---受注ID ---顧客名 ---受注日 ---必要日 ---出荷日 ---合計金額 ---詳細ボタン --ページネーション ---前のページボタン ---次のページボタン ---現在のページ番号 -イベント一覧 --ページ読み込み:受注データを取得し、一覧を表示 --検索ボックス入力:入力内容に基づいて受注一覧をフィルタリング --ページネーションボタンクリック:次のページまたは前のページの受注一覧を表示 --受注行クリック:クリックした受注を受注詳細画面(照会モード)に遷移し表示 --登録ボタンクリック:受注詳細画面(登録モード)に遷移し入力 ***受注詳細画面(照会モード) [#je3461f8] -画面項目 --受注情報 ---受注ID ---顧客情報(顧客名、電話番号、住所) ---従業員情報(従業員名、職位、内線番号) ---受注日 ---必要日 ---出荷日 ---合計金額 --受注明細情報 ---商品情報(商品名、価格=単価-割引、在庫) ---数量 ---合計金額(割引適用後) --配送情報 ---配送業者情報(社名、電話番号) ---配送先名 ---配送先住所 ---配送先市 ---配送先地域 ---配送先郵便番号 ---配送先国 ---運送料(誰?) --アクションボタン ---編集ボタン ---削除ボタン ---印刷ボタン ---(一覧に)戻るボタン -イベント一覧 --ページ読み込み:選択された受注の詳細情報を取得し表示 --編集ボタンクリック:受注編集画面に遷移 --削除ボタンクリック:削除確認ダイアログを表示 --印刷ボタンクリック:印刷プレビュー画面に遷移 --戻るボタンクリック:受注一覧画面に遷移する。 ***受注詳細画面(登録モード) [#t54d0265] ※ 基本的に照会モードと同じだが、顧客名、従業員名、商品名、配送業者は、選択ドロップダウンになる。 -画面項目 --受注情報 --受注明細情報 --配送情報 --アクションボタン ---明細追加ボタン ---明細削除ボタン ---受注作成ボタン ---キャンセルボタン -イベント一覧 --ページ読み込み:顧客、従業員、商品、配送業者、選択ドロップダウンを表示 --顧客選択ドロップダウン変更:選択された顧客に基づいて、関連情報を表示 --従業員選択ドロップダウン変更:選択された従業員に基づいて、関連情報を表示 --明細追加ボタンクリック:明細(商品選択ドロップダウン、価格、在庫、数量入力)を追加 --明細削除ボタンクリック:明細を削除 --商品選択ドロップダウン変更:選択された商品に基づいて、価格や在庫情報を表示 --商品数量入力:価格と入力された数量に基づいて合計金額を計算し表示 --配送業者選択ドロップダウン変更:選択された配送業者に基づいて、関連情報を表示 --作成ボタンクリック:入力内容を検証し、受注、受注明細を作成し、受注詳細画面(照会モード)に遷移 --キャンセルボタンクリック:受注一覧画面に遷移 ***受注詳細画面(編集モード) [#b4987707] ※ 基本的に照会モードと同じだが、顧客名、商品名は、選択ドロップダウンになる。 -画面項目 --受注情報 --受注明細情報 --配送情報 --アクションボタン ---明細追加ボタン ---明細削除ボタン ---更新ボタン ---キャンセルボタン -イベント一覧 --ページ読み込み: ---編集対象の受注情報を取得し表示 ---顧客、従業員、商品、配送業者、選択ドロップダウンドロップダウンを表示 --顧客選択ドロップダウン変更:選択された顧客に基づいて、関連情報を表示 --従業員選択ドロップダウン変更:選択された従業員に基づいて、関連情報を表示 --明細追加ボタンクリック:明細(商品選択ドロップダウン、価格、在庫、数量入力)を追加 --明細削除ボタンクリック:明細を削除 --商品選択ドロップダウン変更:選択された商品に基づいて、価格や在庫情報を表示 --商品数量変更:価格と入力された数量に基づいて合計金額を計算し表示 --配送業者選択ドロップダウン変更:選択された配送業者に基づいて、関連情報を表示 --更新ボタンクリック:入力内容を検証し、受注、受注明細を更新し、受注詳細画面(照会モード)に遷移 --キャンセルボタンクリック:受注詳細画面(照会モード)に遷移 ***印刷プレビュー画面 [#s0911ccc] -画面項目 --受注情報 --受注明細情報 --配送情報 -アクションボタン --印刷ボタン --キャンセルボタン **テーブル定義書 [#ya93c88e] instnwnd.sqlのCREATE TABLEパートを使用して作成。 https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/databases/northwind-pubs/instnwnd.sql ***Orders テーブル [#yb30c595] 注文の情報を格納するテーブル。 |列名|解説|型|キー|他|h |OrderID|注文の一意識別子|整数|主キー|自動増分| |CustomerID|顧客ID|固定長文字列|外部キー|任意| |EmployeeID|従業員ID|整数|外部キー|任意| |OrderDate|注文日|日時||任意| |RequiredDate|必要日|日時||任意| |ShippedDate|出荷日|日時||任意| |ShipVia|配送業者ID|整数|外部キー|任意| |Freight|運送料|通貨||デフォルト0| |ShipName|配送先名|文字列||任意| |ShipAddress|配送先住所|文字列||任意| |ShipCity|配送先市|文字列||任意| |ShipRegion|配送先地域|文字列||任意| |ShipPostalCode|配送先郵便番号|文字列||任意| |ShipCountry|配送先国|文字列||任意| ***Order Details テーブル [#c6a9c736] 説明: 注文の詳細情報を格納するテーブル。 |列名|解説|型|キー|他|h |OrderID|注文ID|整数|主キー1、外部キー|必須| |ProductID|商品ID|整数|主キー2、外部キー|必須| |UnitPrice|単価|通貨||必須、デフォルト0| |Quantity|数量|小整数||必須、デフォルト1| |Discount|割引|実数||必須、デフォルト0| ***Products テーブル [#xdcf3af1] 説明: 商品の情報を格納するテーブル。 |列名|解説|型|キー|他|h |ProductID|商品の一意識別子|整数|主キー|自動増分| |ProductName|商品名|文字列||必須| |SupplierID|供給業者ID|整数|外部キー|任意| |CategoryID|カテゴリID|整数|外部キー|任意| |QuantityPerUnit|単位あたりの数量|文字列||任意| |UnitPrice|単価|通貨||デフォルト0| |UnitsInStock|在庫数量|小整数||デフォルト0| |UnitsOnOrder|注文中数量|小整数||デフォルト0| |ReorderLevel|再注文レベル|小整数||デフォルト0| |Discontinued|廃止フラグ|ビット||必須、デフォルト0| ***Customers テーブル [#e7749838] 説明: 顧客の情報を格納するテーブル。 |列名|解説|型|キー|他|h |CustomerID|顧客の一意識別子|固定長文字列|主キー|必須| |CompanyName|会社名|文字列||必須| |ContactName|担当者名|文字列||任意| |ContactTitle|担当者の職位|文字列||任意| |Address|住所|文字列||任意| |City|市|文字列||任意| |Region|地域|文字列||任意| |PostalCode|郵便番号|文字列||任意| |Country|国名|文字列||任意| |Phone|電話番号|文字列||任意| |Fax|FAX番号|文字列||任意| ***Categories テーブル [#cf8a7f74] 説明: 商品カテゴリの情報を格納するテーブル。 |列名|解説|型|キー|他|h |CategoryID|カテゴリの一意識別子|整数|主キー|自動増分| |CategoryName|カテゴリ名|文字列||必須| |Description|説明|テキスト||任意| |Picture|カテゴリの画像|画像||任意| ***Suppliers テーブル [#r145e7cc] 説明: 供給業者の情報を格納するテーブル。 |列名|解説|型|キー|他|h |SupplierID|供給業者の一意識別子|整数|主キー|自動増分| |CompanyName|会社名|文字列||必須| |ContactName|担当者名|文字列||任意| |ContactTitle|担当者の職位|文字列||任意| |Address|住所|文字列||任意| |City|市|文字列||任意| |Region|地域|文字列||任意| |PostalCode|郵便番号|文字列||任意| |Country|国名|文字列||任意| |Phone|電話番号|文字列||任意| |Fax|FAX番号|文字列||任意| |HomePage|ホームページ|テキスト||任意| ***Shippers テーブル [#b2482377] 説明: 配送業者の情報を格納するテーブル。 |列名|解説|型|キー|他|h |ShipperID|配送業者の一意識別子|整数|主キー|自動増分| |CompanyName|会社名|文字列||必須| |Phone|電話番号|文字列||任意| ***Employees テーブル [#dd959f8d] 説明: 従業員の情報を格納するテーブル。 |列名|解説|型|キー|他|h |EmployeeID|従業員の一意識別子|整数|主キー|自動増分| |LastName|従業員の姓|文字列||必須| |FirstName|従業員の名|文字列||必須| |Title|職位|文字列||任意| |TitleOfCourtesy|敬称|文字列||任意| |BirthDate|生年月日|日時||任意| |HireDate|雇用日|日時||任意| |Address|住所|文字列||任意| |City|市|文字列||任意| |Region|地域|文字列||任意| |PostalCode|郵便番号|文字列||任意| |Country|国|文字列||任意| |HomePhone|自宅電話番号|文字列||任意| |Extension|内線番号|文字列||任意| |Photo|写真|画像||任意| |Notes|メモ|テキスト||任意| |ReportsTo|上司の従業員ID|整数|外部キー|任意| |PhotoPath|写真のパス|文字列||任意| **イベント詳細定義書 [#h63e90da] -受注詳細画面(編集モード)にフォーカス 以下はSQLServer付属のNorthWind DBを使用したサンプルアプリの受注管理の受注詳細画面(編集モード)です {画面項目定義・イベント一覧} 以下のイベント詳細定義書を作成してください(概要、トリガー条件、事前条件、入力、出力、処理内容、検証内容、エラーハンドリング、依存関係)。 {・イベント名:イベント一覧に記載のイベント名} {・イベント概要:イベント一覧に記載の概要} ***ページ読み込み [#if7b4349] 概要:編集対象の受注情報を取得し、フォームに表示 -概要 --編集対象の受注情報を取得し、フォームに表示。 --このイベントは、受注詳細画面(編集モード)が初めて表示される際にトリガーされる。 --受注IDに基づいてDBから受注情報を取得し、各フォーム項目に適切に表示する。 -トリガー条件 --ユーザーが受注詳細画面(編集モード)にアクセスした際に自動的に発生 -事前条件 --NorthWind DBに接続可能であること。 --受注IDが取得済みであること。 -入力:受注ID -出力:フォームへの受注データ表示 --受注情報 --受注明細情報 --配送情報 -処理内容 --受注情報の取得:受注IDに基づいて受注情報、受注明細情報をNorthWind DBから取得 --合計金額の計算:受注合計金額、明細合計金額(割引適用後)を計算して表示する。 -検証内容 --受注詳細画面(編集モード)が正しく表示されること。 --受注IDに基づく受注情報、受注明細情報が各フォーム項目に適切に表示されること。 --受注合計金額、明細合計金額(割引適用後)が正しく計算され、表示されること。 -エラーハンドリング --DB接続エラーが発生した場合:エラーメッセージを表示し、ユーザーに再試行を促す --受注IDが無効または存在しない場合:エラーメッセージを表示し、受注一覧画面に戻る -依存関係 --顧客、商品のデータは、別のイベントによって更新される可能性がある ***選択ドロップダウン変更 [#r84c5f2a] 概要:選択された顧客、従業員、商品、配送業者IDに基づいて、情報を表示 -概要 --選択された顧客、従業員、商品、配送業者IDに基づいて、関連情報を表示。 --このイベントは、選択ドロップダウンの選択が変更された際にトリガー -トリガー条件 --選択ドロップダウンの選択が変更されたとき。 -入力 --選択ドロップダウンの選択値(ID) -出力 --フォームに表示される情報 -処理内容 --選択ドロップダウンから選択されたIDを取得 --IDを使用して、DBから情報を取得 --取得した情報を画面の対応するフィールドに表示 -検証内容 --入力に対応した出力であるか確認する。 -エラーハンドリング --DB接続エラーが発生した場合:エラーメッセージを表示 --IDが無効または存在しない場合:エラーメッセージを表示し画面を再初期化 -依存関係 --情報を取得するためのDB接続が必要。 --選択ドロップダウンにIDリストが事前にロードされていること。 ***数量入力変更 [#i5e848f1] 概要:入力された数量に基づいて合計金額を計算し表示 -概要:受注明細に入力された数量に基づいて合計金額を計算し、画面に表示する。 -トリガー条件:ユーザーが数量入力フィールドに新しい値を入力した際。 -事前条件 --受注詳細画面(編集モード)が表示されていること。 --商品が選択されていること(商品選択ドロップダウンで選択された状態)。 --単価が取得されていること(選択された商品の単価が表示されていること)。 -入力:数量入力フィールドに入力された数量(整数)。 -出力:受注合計金額、明細合計金額(割引適用後)(通貨形式)。 -処理内容 --数量入力フィールドの値を取得 --選択された商品の単価を取得 --合計金額を計算する。 ---合計金額 = 単価 × 数量 ---明細合計金額(割引適用後)を表示 ---明細を合計した受注合計金額を表示 -検証内容 --入力された数量が正の整数であることを確認 --数量が在庫数量を超えていないことを確認 -エラーハンドリング --単価が取得できない場合、エラーメッセージを表示 --数量が無効な場合(負の数や非整数の場合)、エラーメッセージを表示し、数量、合計金額表示フィールドをクリア --数量が在庫数量を超える場合、在庫が不足している旨のメッセージを表示し、数量、合計金額表示フィールドをクリア -依存関係 --商品選択ドロップダウンの選択状態(選択された商品が必要)。 --単価の取得(選択された商品の情報が必要)。 --在庫情報(選択された商品の在庫数量が必要)。 ***受注更新ボタンクリック [#nb92d92b] 概要:入力内容を検証し、受注情報を更新 -概要:入力内容を検証し、受注情報を更新 -トリガー条件:ユーザーが「受注更新ボタン」をクリック -事前条件: --受注詳細画面(編集モード)に更新情報が正しくフォームに入力されていること。 --必要なドロップダウン(顧客選択、商品選択)が正しく初期化されていること。 -入力 -出力 --受注情報、受注明細がDBに保存される。 --更新成功時のメッセージの表示。 --更新失敗時のエラーメッセージの表示。 -処理内容 --受注情報、受注明細の入力内容の検証を行う。 --顧客選択が行われているか。 --商品選択が行われているか。 --数量が正の整数であるか。 --数量が在庫数量を超えていないか。 --配送情報が入力されているか。 --検証が成功した場合、受注情報をOrders、受注明細情報をOrder Detailsに更新する。 --更新処理が成功した場合、成功メッセージを表示する。 --更新処理が失敗した場合、エラーメッセージを表示する。 -検証内容 --各入力フィールドが適切に入力されているかを確認 --数量が在庫数を超えていないかを確認 -エラーハンドリング --入力検証に失敗した場合、具体的なエラーメッセージを表示し、ユーザーに再入力を促す。 --DB更新処理に失敗した場合、エラーログを記録し、ユーザーにエラー内容を通知する。 -依存関係 --顧客・商品選択ドロップダウンの初期化が完了していること。 --在庫情報が最新であること(在庫情報は更新ロックでは同時実行性に問題があるため、タイムスタンプや 元値=指定するなどする。 ***キャンセルボタンクリック [#s60f118e] 概要:受注詳細画面に遷移 *参考 [#uab7f0e2] **[[ドキュメント標準のポイント>https://opentouryo.osscons.jp/index.php?%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E6%A8%99%E6%BA%96%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88]] [#kbc734fc]