グラぽ

名古屋グランパスについて語り合うページ

メニュー

AIはどこまでできる? 忍者x侍x記者のAI対談 #やわらかめコラム

AIはどこまでできる? 忍者x侍x記者のAI対談 #やわらかめコラム

2025年7月31日時点での名古屋グランパスの成績(順位、スタッツ)をどう評価するか?

名古屋グランパスの2025年7月31日時点での成績を評価する上で、順位だけでなく、スタッツも重要な要素です。例えば、得点数や失点数、ボール支配率などのデータは、チームの実力を測る指標になります。しかし、単に数値だけで見ると、見逃してしまう側面もあるのではないでしょうか?サポーターの感情やチームのプレースタイルも考慮に入れないと、真の評価にはならないと思います。皆さんはどう思いますか?特に、スタッツの中で何に注目していますか?

名古屋グランパスの現状、冷静に見定めねばなるまい。2025年7月31日時点、順位は15位に留まる。これは昨季の11位から後退したことを意味し、チームの成長が見られぬ状況である。得点平均1.2は11位、失点は明らかに改善が必要とされるレベル、シュート数も上位には及ばず、攻撃の迫力が欠如している証拠であろう。特筆すべきは、クロスの成功率が17位と最下位圏にあり、効果的な攻撃がなされていない。サポーターの期待を裏切り続けている現状、果たしてこのままでは何を得られるというのか?(´・ω・`)

本当にそうでしょうか?侍の意見に対して少し疑問を呈したいと思います。確かに順位やスタッツは重要ですが、チームの成績が必ずしもサポーターの期待と直結しているとは限らないのでは?例えば、試合ごとのパフォーマンスや選手の成長、若手選手の台頭など、数字で表せないポジティブな要素も多いです。失点数が多いという指摘も、守備の構築に時間がかかる場合もありますし、戦術の変更による影響も考慮すべきです。具体的に、どのようなデータを見れば名古屋の未来に希望を持てると考えているのでしょうか?

拙者の見解を述べるでござる。数字だけが全てではないが、名古屋グランパスの未来に希望を持つためには、以下の要素に注目すべきでござるよ。
まずは、選手の個々のパフォーマンススタッツ、特にシュート成功率やアシスト数でござる。これにより、攻撃陣の成長や連携の向上が見えてくるでござる。また、若手選手の出場時間や成績も重要で、未来の柱となる選手が育っているかどうかが鍵でござる。
さらに、チームのビルドアップやプレスの成功率も注目すべきでござる。これらが改善されれば、攻撃的なスタイルが確立され、結果につながる可能性が高まるでござる。
最後に、サポーターの反応や選手のメンタル面も忘れてはならぬ。チーム全体がポジティブな雰囲気を持てば、パフォーマンスも向上するであろう。こうした要因を総合的に考慮し、希望を見出すことができると思うでござるよ。ニンニン

名古屋グランパスの未来に希望を見出すためには、冷静な分析が必要であろう。選手のシュート成功率やアシスト数は確かに重要な指標であるが、それだけでは不十分。若手選手の成長を促す環境が整っているか、また選手の出場時間がどれほど確保されているかも見逃せぬ要素である。 しかし、現状のデータを見れば、名古屋は攻撃面での創造性に欠け、シュート数も多くない。ビルドアップの課題も大きく、プレスの成功率も低迷している。これではポジティブな雰囲気を作ることも難しく、選手たちのメンタルに悪影響を及ぼすであろう。 数字が全てではないが、数字が示す現実を受け止めて改善を図ることが、名古屋の未来に明るい光をもたらす唯一の道であろう。成敗!(Say-Bye!)

侍のその意見、実に興味深いですね。ただ、ここで再度考えたいのは、数字が示す現実さえも、解釈の仕方によって変わるということです。たとえば、シュート数の少なさが、単に選手の能力不足から来ているのか、あるいは戦術的な選択によるものなのかは、深く掘り下げる必要があります。 また、若手選手の成長環境が整っているかという点についても、具体的なデータが必要です。たとえば、若手選手の出場時間や、何試合でスタメンに選ばれているか、さらには彼らのパフォーマンスがチーム全体にどのように影響しているのかも評価する必要があります。選手たちのメンタル面や、サポーターとの関係性も、数字だけでは測れません。 そこで、皆さんはどのような具体的なデータや指標を元に、名古屋グランパスの未来に希望を持てると考えていますか?

現在のチームの強みと弱点をデータからどう分析するか?

強みとして挙げられるのは、名古屋グランパスの得点力ではないでしょうか。最近の試合データを見ても、シュート数やゴール期待値(xG)が高いことが確認できます。しかし、逆に守備面では失点率が目立つかもしれませんね。具体的なデータを元に、例えば失点の傾向やセットプレーからの失点が多いのか、カウンターに弱いのか、詳細を見ていく必要があります。 皆さん、実際のデータを基にした分析をどのように進めていくのが効果的だと思いますか?また、他に強みや弱点として気になるポイントはありますか?

名古屋グランパスの現状において、得点力は確かに一つの強みであろう。しかし、冷静にデータを分析すれば、守備面の弱点が浮き彫りとなる。失点数はリーグ内で18位という低迷ぶりで、特にセットプレーからの失点が多いことは重大な問題である。セットプレーから7失点は、全体の21.2%を占め、これでは試合を勝ち抜くことは難しかろう。カウンターに対する脆弱性も加味すれば、守備的な戦術の見直しが急務であろう。
データ分析を進めるには、試合ごとの失点経緯を詳細に追い、どのシチュエーションで脆さが出るのかを浮き彫りにする必要があるであろう。果たして、これを解決するための戦略は何か、チーム全体での取り組みが求められるなか、果たして名古屋は立ち直れるのか、冷静に見極める必要があるであろう。

その分析は的確ですが、少し待ってください。守備の弱点が強調されていますが、攻撃面でも改善の余地はないでしょうか?得点力があるとはいえ、シュートの精度や決定機の数に差があることは、試合の結果に大きく影響します。例えば、得点が多い試合と少ない試合でのシュート数やxGを比較してみると、どのような傾向が見られるのか、興味深いですね。
また、失点の多くがセットプレーからという点に関しては、選手同士の連携やポジショニングの問題も考慮する必要があります。これらのデータをもとにした改善策が、果たしてどれほど効果を発揮するのでしょうか?データの具体的な数字を交えながら、さらに深掘りしていく必要があると思いますが、侍さんはどう思われますか?

その通りであろう。攻撃面に目を向けることも重要である。得点数はあるものの、シュート精度は低く、決定機の数が少ないことが問題であろう。例えば、シュート数が多い試合と少ない試合でのxGを比較すれば、得点力の源泉を明らかにできるであろう。特に、シュート数が少ない試合では、相手の守備に苦しんでいる証拠かもしれぬ。
また、失点の多くがセットプレーからというデータは、選手同士の連携やポジショニングが不十分である証拠でもあろう。これを解決するためには、守備陣の組織力向上が求められる。果たして、名古屋グランパスはこの課題をどう克服できるのか、期待と不安が入り混じるであろう。データをもとに、次なる戦略を練る必要があるであろう。

確かに、その点は非常に重要です。しかし、シュート精度の低さや決定機の不足は、果たして選手個々の技術や判断力だけの問題でしょうか?チーム全体の戦術や連携が影響している可能性もありますよね。たとえば、ボールを保持する時間が短い試合では、攻撃の組織が乱れがちで、結果的にシュートチャンスが減少することも考えられます。
ですので、攻撃と守備の両面をデータから分析することで、相互の関係性を理解する必要があります。名古屋グランパスは、どのようにしてこれらの課題を解決し、次の試合に向けた戦術を構築していくのか、非常に興味深いですね。どのような改善策が考えられると思いますか、侍さん?

それに関しては、まさにその通りであろう。選手個々の技術や判断力だけでなく、全体の戦術や連携が攻撃力に大きく影響していることは明白である。ボール保持の時間が短ければ、攻撃の組織力は低下し、シュートチャンスの創出も難しくなるであろう。
改善策としては、まずはボール保持の時間を増やすためのパス回しやポジショニングの見直しが急務であろう。特に中盤でのボール支配を強化し、選手同士の連携を高めることが必要である。また、失点を減らすためには、守備陣のポジショニングの徹底や、セットプレー時のマークの確認も欠かせぬ。
データ分析を活用し、相手チームの弱点を突いた戦術を構築することも重要であろう。名古屋グランパスがこれらの課題を克服し、次の試合で結果を出すことができるか、冷静に見守る必要があるであろう。成敗!(Say-Bye!)

シーズン後半戦、順位を上げるために何が必要か?

私は選手層の厚さやコンディション管理が重要だと思います。
特に疲労が溜まりやすい後半戦では、ベンチ選手の起用が勝敗を左右します。データを見ると、上位チームは交代選手のパフォーマンスが高い傾向がありますが、逆に下位チームは交代選手が活躍できていない場合が多いです。これに関して、侍や忍者はどう思いますか?選手交代の重要性について、具体的な例やデータを挙げて考察してみてください。

順位を上げるためには、選手交代が鍵でござる。特に名古屋グランパスは、選手層が厚く、ベンチからの投入選手が試合の流れを変える力を持っているでござるよ。たとえば、過去の試合で交代選手が得点に絡んだケースが多く見受けられた。平均交代選手のゴール期待値(xG)を分析すると、上位チームと比べて、名古屋も劣らず活躍しているデータが出ておるでござる。
このため、後半戦では早めの交代や状況に応じた選手起用を徹底し、選手同士の連携を強化することが重要でござる。また、試合中のフォーメーション変更を駆使することで、相手チームの戦術に対抗できる柔軟性も求められるでござるよ。例えば、4-4-2から4-2-3-1への可変システムを試みることで、相手のプレスに対抗しつつ、攻撃の幅を広げることができるでござる。このように、選手交代と戦術変更を巧みに組み合わせ、チーム全体のパフォーマンスを向上させることが、順位を上げるための鍵でござるね!ニンニン

なるほど、忍者の意見は興味深いですね。しかし、選手交代や戦術変更が果たして全ての試合で効果があるのでしょうか?逆に、交代選手が期待に応えられず、試合のリズムを崩すこともありますよね。具体的なデータを見ても、交代選手のパフォーマンスが低下している場合も多く、例えば、ある試合での交代選手のxGがマイナスだったケースもありました。 選手交代に対するリスク管理や、どのタイミングで交代すべきかに関して、どう考えますか?また、交代選手の選び方や起用方法についても、より具体的な戦略があれば教えてください。

選手交代のタイミングやリスク管理は、戦術の中でも非常に重要な要素でござる。交代は単に選手を替えるだけでなく、試合の流れや相手の状況を見極める必要があるでござるよ。たとえば、相手が疲労してきた後半20分以降にスピードのある選手を投入することで、相手のディフェンスを崩しやすくなるでござる。
また、交代選手はチームの戦術にフィットする選手を選ぶことが大切でござる。例えば、中盤を支配したい場合は、ボール奪取力の高い選手を起用するのが良いでござるし、攻撃を活性化したい場合は、ドリブルやシュート力のある選手を選ぶべきでござる。サブメンバーのパフォーマンスを練習から観察し、状況に応じた起用を考えることが、リスクを減らすための一手でござるね!
さらに、交代を行う際には、選手間のコミュニケーションも重要でござる。選手同士が連携しやすいように、試合前から交代戦略を共有しておくことで、よりスムーズな交代が可能となるでござる。こうした戦略を実行することで、選手交代のリスクを最小限に抑えつつ、チーム全体のパフォーマンス向上を目指すことができるでござるよ!ニンニン

忍者、興味深い視点ですね。しかし、選手間のコミュニケーションや戦術の共有が十分でない場合、交代が逆効果になることもあるのではないでしょうか?例えば、選手が交代の意図を理解できず、逆にチーム全体のバランスを崩してしまうケースも見受けられます。 また、交代選手のパフォーマンスが期待に応えられない場合、どのようにリカバリーするかも重要です。具体的に、過去の試合で交代選手が機能しなかった際の対策や、その後の試合での改善策について、侍はどう考えますか?データや具体例を交えて教えてください。

選手のコミュニケーションが不足していると、確かに交代が逆効果になることもあるでござる。そこで、事前に戦術説明を行い、交代選手がどのようにチームに貢献すべきかを明確に伝えることが重要でござるよ。例えば、試合前に選手たちに具体的な役割や期待されるプレーを話し合うことで、交代選手が自信を持ってピッチに入れるようにすることができるでござる。
過去の試合で交代選手が機能しなかった場合、リカバリー策としては、試合中に柔軟にフォーメーションを変更することが一つの手でござる。例えば、相手のプレスに苦しんでいる場合、4-3-3から4-2-3-1にシフトすることで、中盤を厚くし、ボール支配率を上げることができるでござる。また、選手同士の連携を強化するために、選手間のコミュニケーションを促進するためのミーティングを行うことも効果的でござる。
さらに、データ分析を活用し、交代選手がどのようなプレーをしているかを振り返り、次の試合に向けて改善点を見出すことが重要でござるね。これにより、選手たちが自信を持ってプレーできる環境を整えることで、次回の交代選手のパフォーマンス向上にもつながるでござるよ!ニンニン

ネタばらし

あれ?なんかいつもの忍者さん・侍さんと違うような?

デスクはこの対談を見て一番最初に思ったのは「マジメか!」というツッコミでした

って皆さん思いましたよね。それもそのはず、これはAI(ChatGPT)に今年のやわらかめコラムを全部読み込ませ、テーマに沿って対談してください、というお願いをしてできたものなのです。このアイデアはグランパスファミリーTさんとCさんにいただきました。

だいぶそれっぽいことを喋ってくれていますが、ラグさん @Lagty_in_2D が描くキャラクターたちとは面白さが違うのではないでしょうか?AI、まだまだだな!

やれやれ、まだラクはさせてもらえなそうでござるよ ニンニン

おまけ

今回使用したコードを一部公開します。詳しい人は読んでみて。

import os
import random

# LangChainの主要コンポーネントをインポート
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import DirectoryLoader, TextLoader, CSVLoader, WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.history_aware_retriever import create_history_aware_retriever
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain.memory import ConversationBufferMemory
from langchain.schema.runnable import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser


# ==============================================================================
# Characterクラス: 個々の対話キャラクターを定義
# ==============================================================================
class Character:
    """キャラクターのRAGチェーンと情報をカプセル化するクラス。

    各キャラクターは、固有の知識、共有された会話ログ、ウェブからの情報を基に
    知識ベースを構築し、対話を行うためのRAGチェーンを保持します。

    Attributes:
        name (str): キャラクターの名前。
        rag_chain (Runnable): このキャラクターの発言を生成するためのRAGチェーン。
    """

    def __init__(self, name: str, private_docs_path: str, shared_logs_path: str, system_prompt_template: str, web_urls: list):
        """Characterオブジェクトを初期化します。

        Args:
            name (str): キャラクターの名前。
            private_docs_path (str): キャラクター固有の知識ファイルが格納されたディレクトリのパス。
            shared_logs_path (str): 全員が参照する共有会話ログが格納されたディレクトリのパス。
            system_prompt_template (str): キャラクターのペルソナや行動を定義するシステムプロンプト。
            web_urls (list): キャラクターが参照するウェブページのURLリスト。
        """
        # --- 1. キャラクターの基本情報を設定 ---
        self.name = name
        print(f"キャラクター「{self.name}」を構築中...")

        # --- 2. 知識ソースの読み込み ---
        # 2-1. キャラクター固有の知識(.txtファイル)を読み込む
        private_loader = DirectoryLoader(private_docs_path, glob="**/*.txt", loader_cls=TextLoader)
        private_docs = private_loader.load()

        # 2-2. 共有会話ログ(.csvファイル)を読み込む
        shared_docs = []
        # 共有ログファイルはキャラクター名で命名されていると想定(例: "忍者.csv")
        character_log_file = os.path.join(shared_logs_path, f"{self.name}.csv")
        if os.path.exists(character_log_file):
            try:
                # CSVローダーでログファイルを読み込む
                log_loader = CSVLoader(file_path=character_log_file, encoding='utf-8')
                shared_docs = log_loader.load()
            except Exception:
                # ファイルの読み込みに失敗した場合はスキップ
                pass

        # 2-3. ウェブページから情報を読み込む
        web_docs = []
        if web_urls:
            try:
                # WebBaseLoaderで指定されたURLリストからコンテンツを取得
                loader = WebBaseLoader(web_urls)
                web_docs = loader.load()
            except Exception:
                # ウェブからの取得に失敗した場合はスキップ
                pass

        # 2-4. 全てのドキュメントを結合して、キャラクターの知識ベースとする
        all_docs = private_docs + shared_docs + web_docs
        print(f"  > 合計 {len(all_docs)} 件のドキュメントで知識ベースを構築します。")

        # --- 3. RAGチェーンの構築 ---
        # 3-1. LLM、Embeddingモデル、テキスト分割器を準備
        llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
        embeddings = OpenAIEmbeddings()
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

        # 3-2. ドキュメントを分割し、ベクトル化してFAISSインデックスを作成
        split_docs = text_splitter.split_documents(all_docs)
        # MMR (Maximal Marginal Relevance) を使用して、多様な検索結果を取得するRetrieverを作成
        retriever = FAISS.from_documents(split_docs, embeddings).as_retriever(
            search_type="mmr", search_kwargs={'k': 5, 'fetch_k': 20}
        )

        # 3-3. 会話履歴を考慮して検索クエリを再生成するためのプロンプトとRetriever
        history_aware_prompt = ChatPromptTemplate.from_messages([
            MessagesPlaceholder(variable_name="chat_history"),
            ("user", "{input}"),
            ("user", "上記の発言を踏まえ、関連情報を検索するためのキーワードを生成してください。"),
        ])
        history_aware_retriever = create_history_aware_retriever(llm, retriever, history_aware_prompt)

        # 3-4. 最終的な回答を生成するためのプロンプト
        answer_prompt = ChatPromptTemplate.from_messages([
            ("system", system_prompt_template),
            MessagesPlaceholder(variable_name="chat_history"),
            ("user", "{input}"),
        ])

        # 3-5. RAGチェーンの各部品を結合
        # 取得した文書を整形してプロンプトに渡すチェーン
        document_chain = create_stuff_documents_chain(llm, answer_prompt)
        # 履歴考慮型Retrieverと文書チェーンを結合して最終的なRAGチェーンを作成
        self.rag_chain = create_retrieval_chain(history_aware_retriever, document_chain)
        print(f"キャラクター「{self.name}」の構築完了。")

    def speak(self, input_text: str, chat_history: list, summary: str, private_history: str) -> str:
        """入力、共有ログ、議論の要約に基づいて発言を生成します。

        Args:
            input_text (str): 直前の発言など、応答のトリガーとなるテキスト。
            chat_history (list): 全員が共有する会話履歴。
            summary (str): これまでの議論の要約。
            private_history (str): このキャラクター自身の過去の発言履歴。

        Returns:
            str: 生成された発言テキスト。
        """
        # RAGチェーンを実行し、結果の"answer"部分を返す
        result = self.rag_chain.invoke({
            "input": input_text,
            "chat_history": chat_history,
            "discussion_summary": summary,
            "private_history": private_history
        })
        return result["answer"]


# ==============================================================================
# DialogueManagerクラス: 対談全体の進行を管理
# ==============================================================================
class DialogueManager:
    """キャラクター間の対談進行を管理するクラス。

    対談のテーマ管理、発言順の決定、会話履歴の保持、議論の要約など、
    司会者としての役割を担います。

    Attributes:
        characters (list[Character]): 対談に参加するCharacterオブジェクトのリスト。
        topics (list[str]): 対談のテーマリスト。
        shared_history (list): 全員が共有する会話履歴。
        summarizer_llm (ChatOpenAI): 要約生成用のLLM。
        summarizer_chain (Runnable): 要約を生成するためのチェーン。
    """

    def __init__(self, characters: list, topics: list):
        """DialogueManagerオブジェクトを初期化します。

        Args:
            characters (list[Character]): 対談に参加するCharacterオブジェクトのリスト。
            topics (list[str]): 対談のテーマリスト。
        """
        self.characters = characters
        self.topics = topics
        self.shared_history = []

        # 議論の要約を生成するためのLLMと言語モデルチェーンを初期化
        self.summarizer_llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
        summarizer_prompt = ChatPromptTemplate.from_messages([
            ("system", "以下の会話履歴を、重要な論点がわかるように簡潔に要約してください。"),
            MessagesPlaceholder(variable_name="chat_history")
        ])
        # プロンプト、LLM、出力パーサーを連結して要約チェーンを作成
        self.summarizer_chain = summarizer_prompt | self.summarizer_llm | StrOutputParser()

    def _introduce_topic(self, topic: str) -> str:
        """新しいテーマを紹介し、最初の発言を促すメッセージを作成します。

        Args:
            topic (str): 新しい対談テーマ。

        Returns:
            str: 最初の発言者に渡すための入力テキスト。
        """
        print("\n" + "="*50); print(f"【新たなテーマ】: {topic}"); print("="*50 + "\n")
        # 司会者としてテーマ開始を宣言し、共有履歴に追加
        moderator_message = f"司会者: それでは、次のテーマ「{topic}」について議論を始めましょう。"
        self.shared_history.append(HumanMessage(content=moderator_message))
        # 最初の発言を促すメッセージを返す
        return f"最初の議題として、「{topic}」について、皆さんのご意見をお聞かせください。"

    def _summarize_discussion(self) -> str:
        """現在の共有会話履歴を要約します。

        Returns:
            str: 生成された要約テキスト。
        """
        # 履歴が空の場合は要約しない
        if not self.shared_history:
            return "まだ議論は開始されていません。"
        # 履歴が長くなりすぎないように最新10件などに絞ることも可能
        return self.summarizer_chain.invoke({"chat_history": self.shared_history})

    def run_discussion(self, turns_per_character: int = 3):
        """全テーマにわたる対談を実行します。

        Args:
            turns_per_character (int, optional): 各テーマにおける、一人のキャラクターあたりの発言回数。デフォルトは3。
        """
        # 定義された全てのテーマで対談ループを実行
        for topic in self.topics:
            # テーマが変わるたびに共有会話履歴をリセット
            self.shared_history.clear()
            # 新しいテーマを紹介し、最初の入力テキストを取得
            current_input = self._introduce_topic(topic)
            last_speaker = None
            # このテーマでの総発言回数を計算
            total_turns = len(self.characters) * turns_per_character
            print(f"今回のテーマでは、合計 {total_turns} 回の発言が予定されています。"); print("-" * 50 + "\n")

            # 総発言回数分のループを開始
            for turn in range(total_turns):
                # --- 発言者の決定ロジック ---
                if turn == 0:
                    # 最初のターンは「記者」が存在すれば優先的に指名
                    try:
                        speaker = next(c for c in self.characters if c.name == "記者")
                    except StopIteration:
                        # 「記者」がいなければランダムに選ぶ
                        speaker = random.choice(self.characters)
                else:
                    # 2ターン目以降は、直前の発言者以外からランダムに選ぶ(連続発言を避ける)
                    possible_speakers = [c for c in self.characters if c.name != last_speaker.name]
                    speaker = random.choice(possible_speakers)

                print(f"--- (ターン{turn + 1}/{total_turns}) {speaker.name}の発言 ---")

                # 発言の直前に、これまでの議論を要約する
                discussion_summary = self._summarize_discussion()

                # speakメソッドに要約を渡して発言を生成
                # 現状、個別の履歴は空文字列を渡しているが、将来的に個別履歴を管理する拡張も可能
                response = speaker.speak(current_input, self.shared_history, discussion_summary, "")

                print(response); print("-" * 20 + "\n")

                # --- 状態の更新 ---
                # 生成された発言を共有履歴に追加
                self.shared_history.append(AIMessage(content=response, name=speaker.name))
                # 現在の発言を次の入力とする
                current_input = response
                # 直前の発言者を記録
                last_speaker = speaker

About The Author

グラぽ編集長
大手コンピューターメーカーの人事部で人財育成に携わり、スピンアウト後は動態解析などの測定技術系やWebサイト構築などを主として担当する。またかつての縁で通信会社やWebメディアなどで講師として登壇することもあり。
名古屋グランパスとはJリーグ開幕前のナビスコカップからの縁。サッカーは地元市民リーグ、フットサルは地元チームで25年ほどプレーをしている。

Leave A Reply

*

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Share / Subscribe
Facebook Likes
Posts
Hatena Bookmarks
Pocket
Evernote
Feedly
Send to LINE