[Gemini][MCP] 在 Cline 上面使用 Gemini 來呼叫 MCP 的功能

What is Model Context Protocol (MCP)? How it simplifies AI ...

前情提要

最近 MCP 是非常熱門的討論話題,但是大家提到 MCP 不免會想到 Anthropic 的 Claude 或是其他語言的模型。這一篇文章要告訴大家關於 MCP 的一些基礎原理,並且如何使用 Google Gemini 來呼叫 MCP 。希望能給大家一些整理。

什麼是 MCP(Model Context Protocol)

根據 Anthropic 的文件上面有提到: MCP 是一個開放協議,用於標準化應用程式如何為大型語言模型(LLM)提供上下文。您可以將 MCP 想像成 AI 應用程式的 USB-C 接口。就像 USB-C 為您的設備提供了一個標準化的方式來連接各種外圍設備和配件一樣,MCP 為 AI 模型提供了一個標準化的方式來連接不同的數據源和工具。

這邊也分享 YT https://www.youtube.com/watch?v=McNRkd5CxFY&t=17s 上面的架構圖,讓大家更容易理解

Google Chrome 2025-03-23 16.41.43

(圖片來源 技术爬爬虾 TechShrimp :MCP是啥?技术原理是什么?一个视频搞懂MCP的一切。Windows系统配置MCP,Cursor,Cline 使用MCP

這邊可以看出來, 透過 MCP 這邊提到的 AI 客戶端(大家常使用的 ChatGPT, Claude, Gemini 的等等)都可以透過 MCP 架構直接來對這些服務做「操作」。

MCP 服務中的架構圖

image-20250323164924676

(架構圖: MCP Core architecture)

這個架構圖,有清楚的敘述出關於 MCP 的 Client Server 的架構,這邊再強調一下。

  • MCP Host: 使用這些 MCP 服務的應用,可能是 Cline, Windsurf 或是 Claude Desktop)
  • MCP Server: 許多地方應該都要介紹過,這裡不太贅述。之後也會有範例程式碼。就是一個萬用的溝通協定,讓每一個 MCP Host 可以更容易去使用一些外部功能。並且變成一個共通的協定。
  • MCP Client: 在每一個 Host 中,確定使用某個 MCP Server 後。在 Host 中,會有其相關的 client 這裡將會是用 Prompt 存在著。接下來會詳細敘述。

MCP 運作細節

完整細節可以參考網路上這位的說明,不過我將內容改成 Google Gemini 相關的應用。除了換掉影片中使用的 DeepSeek 之外,也可以讓整個使用更符合資訊安全相關的應用。

參考影片:

技术爬爬虾 TechShrimp MCP是怎么对接大模型的?抓取AI提示词,拆解MCP的底层原理

透過 CloudFlare 建立 AI API Gateway

(如果要查看相關細節,需要使用 OpenRouter 或是 OpenAI Compatible )

如果要查看 MCP 溝通細節,就得使用 OpenAI 或是 OpenRouter 。這裡查看影片可以看到完整教學。這裡將直接貼出相關細節。

Code 2025-03-23 17.35.03

以上是透過 Cloudflare 抓取封包後,來解析 MCP 的溝通機制:

  • 你會發現 MCP Server 所有安裝的 Server 跟功能都被當作 Promopt 輸入給該模型。
  • 每一個 MCP Server 能做什麼,會寫在 Prompt 之中(圖片可以看到 Github Repository MCP Server)

以上這些資料很重要,稍後會在下一個章節 MCP 跟 Function Call 來討論。

MCP 跟 Function Call 的差別

Expanding AI Horizons: The Rise of Function Calling in LLMs

原本 LLM 有一些模型會透過 Function Calling 來決定要如何呼叫一些工具,這裡其實需要 Model 額外的支持,雖然說大家常見的 LLM 提供商 OpenAI, Google, Anthropic 都已經支援 Function Calling ,但是每一次都要為了這些工具額外去寫相關的 Function Calling App 還是很讓人頭痛。

這也是為什麼 MCP 會紅的原因,他讓原本的 Function Calling App 變成一個共用機制。每一個相關的應用廠商,都可以寫出自己的 MCP Servers ,也可以讓使用的服務變得更多人可以使用。

並且,很重要的:

  • MCP 讓不能使用 Function Calling 的 Model 也能使用 MCP Servers 做出類似 Function Calling 的應用
  • MCP 讓不能使用 Function Calling 的 Model 也能使用 MCP Servers 做出類似 Function Calling 的應用
  • MCP 讓不能使用 Function Calling 的 Model 也能使用 MCP Servers 做出類似 Function Calling 的應用

因為 技术爬爬虾 TechShrimp MCP是怎么对接大模型的?抓取AI提示词,拆解MCP的底层原理 影片中使用到的相關模型是 DeepSeekChat 其實還不支援 Function Calling ,但是他也是可以在透過 MCP Server 來互動。

使用 Cline 作為 MCP host

image-20250323175901298

(Refer: Cline Plugin)

Cline 是一個 VS Code 的 Plugin ,目前已經有相當多的類似 AI IDE Plugin 。但是由於 Cline 本身內建支援 MCP Server 的溝通機制,並且有一個內建的推薦清單,讓開發者可以很快速地連接 MCP Servers ,這裡很推薦使用 Cline 作為你第一個了解 MCP 的工具。

相關 Cline 設定流程,讓你使用 MCP Servers

  • 安裝 Cline Plugin
  • 選擇你需要的 MCP Servers image-20250323180151743
  • 設定你的模型,這裡使用 Google Gemini ,並且使用比較省錢的 Gemini-1.5-flashCode 2025-03-23 18.02.07

這裡比較建議大家可以先安裝最安全跟簡單的 “Time MCP Servers“,也可以從 Cline 的介面上來理解。

Code 2025-03-23 18.03.33

這裡可以看到 “Time MCP Servers” 支援兩個功能:

  • Get_current_time
  • Convert_time

這時候如果詢問,請問幾點?

image-20250323180956464

  • 他可能會先請你告訴他你所在區域
  • 然後決定要跑 MCP Server (會請求你同意)
  • 同意後,才會告訴你現在的結果。

如果你要換成 告訴我現在幾點?並且轉換成法國的時間? Code 2025-03-23 18.11.23

這時候就會呼叫轉換的 API ,這時候也會要求同意。完成後就可以跑出相關的工作。

未來發展:

本篇文章快速做了一個簡介,並且使用 Cline 搭配了 Gemini 1.5-flash model 來呼叫 MCP Server 做一個查詢時間的展示。接下來的文章將會告訴大家,該如何寫一個 MCP Server ,並且分享給大家可能有用的應用。

參考資料:

[Gemini] 讓 Gemini 根據你問題的關鍵字,透過 Google Custom Search 找到結果總結回覆

image-20250322104946355

前情提要

一直以來我們都知道透過 LLM 上的 function call ,是可以讓 LLM 有了使用工具的能力。可以去做網頁搜尋,或是查詢資料庫,甚至是做一些特殊的工作。

而在處理網頁搜尋的時候,通常是會使用到一些外部服務 SerpAPI 相關的付費服務。 如果你原本的服務是建置在 Google Cloud Platform 上面,有沒有想過是否有可以使用的服務呢? 本篇文章就來介紹一下,如何透過 Google Custom Search API 搜尋 Google 並且將結果總結回覆。

如何快速取的 Google Search 的網頁

以往來說,如果你是在本地端直接來呼叫,可以透過 https://www.google.com/search?q=YOUR_KEYWORD 來直接呼叫網址顯示相關的搜尋結果。 這個時候,你也可以透過一些 Crawler 來搜尋以下的結果,但是…. 但是

  • 如果你服務放在 GCP 不能直接爬 Google 網頁
  • 如果你服務放在 GCP 不能直接爬 Google 網頁
  • 如果你服務放在 GCP 不能直接爬 Google 網頁

這個時候,就應該要去思考有沒有其他的方式可以解決。

Google Custom Search JSON API

image-20250322105939265

(相關說明網址)

Google Custom Search JSON API 提供了免費提供每天 100 個搜尋查詢。如果您需要更多,請在 API 控制台中申請billing功能。額外要求的費用為每 1 千筆查詢 $5 美元,每日最多 1 萬次查詢。

接下來給大家一個範例程式碼,看要如何呼叫 Google Custom Search JSON API

def search_with_google_custom_search(keywords, search_api_key, cx, num_results=10):
    """
    使用 Google Custom Search API 根據關鍵字進行搜尋。

    :param keywords: 關鍵字列表
    :param search_api_key: Google Custom Search API 的 API 金鑰
    :param cx: 搜尋引擎 ID
    :param num_results: 要返回的搜尋結果數量,預設為 10
    :return: 搜尋結果列表,每個結果包含標題、連結和摘要
    """
    query = " ".join(keywords)  # 將關鍵字組合成搜尋查詢
    url = f"https://www.googleapis.com/customsearch/v1?key={search_api_key}&cx={cx}&q={query}&num={num_results}"

    try:
        logger.info(f"Searching for: {query}")
        response = requests.get(url)
        response.raise_for_status()  # 如果請求失敗,拋出異常
        result_data = response.json()

        # Check if there are search results
        if "items" not in result_data:
            logger.warning(f"No search results for query: {query}")
            return []

        results = result_data.get("items", [])
        formatted_results = []
        for item in results:
            formatted_results.append(
                {
                    "title": item.get("title", "No title"),
                    "link": item.get("link", ""),
                    "snippet": item.get("snippet", "No description available"),
                }
            )
        return formatted_results
    except requests.exceptions.RequestException as e:
        logger.error(f"Google Custom Search API 請求失敗:{e}")
        return []

這裡你會需要兩個數值:

取得關鍵字

另外一個需要詳細處理的部分在於,如果你的問題是一整句話,如果要放入 Google Search 的話,比較好的方式是找出「關鍵詞」。這個部分,我們會使用 Gemini 來處理。

def extract_keywords_with_gemini(text, gemini_api_key, num_keywords=5):
    """
    使用 Gemini API 從文字中提取關鍵字。

    :param text: 使用者輸入的文字
    :param gemini_api_key: Gemini API 的 API 金鑰
    :param num_keywords: 要提取的關鍵字數量,預設為 5
    :return: 提取的關鍵字列表
    """
    try:
        # 設定 API 金鑰
        current_key = genai.get_api_key()

        # Only configure if needed (prevent reconfiguring when already set correctly)
        if current_key != gemini_api_key:
            genai.configure(api_key=gemini_api_key)

        # 建立 Gemini 模型
        model = genai.GenerativeModel("gemini-1.5-flash")

        # 準備提示詞,要求模型提取關鍵字
        prompt = f"""從以下文字中提取 {num_keywords} 個最重要的關鍵字或短語,只需返回關鍵字列表,不要有額外文字:

{text}

關鍵字:"""

        # 生成回應
        response = model.generate_content(prompt)

        # 處理回應,將文字分割成關鍵字列表
        if response.text:
            # 清理結果,移除數字、破折號和多餘空白
            keywords_text = response.text.strip()
            # 分割文字得到關鍵字列表
            keywords = [kw.strip() for kw in keywords_text.split("\n")]
            # 移除可能的數字前綴、破折號或其他標點符號
            keywords = [kw.strip("0123456789. -\"'") for kw in keywords]
            # 移除空項
            keywords = [kw for kw in keywords if kw]
            return keywords[:num_keywords]  # 確保只返回指定數量的關鍵字
        return []
    except Exception as e:
        logger.error(f"Gemini API 提取關鍵字失敗:{e}")
        # If direct text contains useful terms, use it directly
        if len(text) < 100:  # If the text is short, it might be a good search query already
            return [text]
        return []

以上的程式碼,會根據你的詢問去抓取出最多五個關鍵詞,幫助做搜尋使用。這裡使用到的是 gemini-1.5-flash

資訊總結的部分:

資訊總結的部分,這裡使用 LangChain 來呼叫。大家可以快速參考一下相關程式碼:

def summarize_text(text: str, max_tokens: int = 100) -> str:
    '''
    Summarize a text using the Google Generative AI model.
    '''
    llm = ChatGoogleGenerativeAI(
        model="gemini-1.5-flash",
        temperature=0,
        max_tokens=None,
        timeout=None,
        max_retries=2,
    )

    prompt_template = """用台灣用語的繁體中文,簡潔地以條列式總結文章重點。在摘要後直接加入相關的英文 hashtag,以空格分隔。內容來源可以是網頁、文章、論文、影片字幕或逐字稿。

    原文: "{text}"
    請遵循以下步驟來完成此任務:

    # 步驟
    1. 從提供的內容中提取重要重點,無論來源是網頁、文章、論文、影片字幕或逐字稿。
    2. 將重點整理成條列式,確保每一點為簡短且明確的句子。
    3. 使用符合台灣用語的簡潔繁體中文。
    4. 在摘要結尾處,加入至少三個相關的英文 hashtag,並以空格分隔。

    # 輸出格式
    - 重點應以條列式列出,每一點應為一個短句或片語,語言必須簡潔明瞭。
    - 最後加入至少三個相關的英文 hashtag,每個 hashtag 之間用空格分隔。

    # 範例
    輸入:
    文章內容:
    台灣的報告指出,環境保護的重要性日益增加。許多人開始選擇使用可重複使用的產品。政府也實施了多項政策來降低廢物。

    摘要:

    輸出:
    - 環境保護重要性增加
    - 越來越多人使用可重複產品
    - 政府實施減廢政策
    #EnvironmentalProtection #Sustainability #Taiwan
    """

    prompt = PromptTemplate.from_template(prompt_template)

    summarize_chain = load_summarize_chain(
        llm=llm, chain_type="stuff", prompt=prompt)
    document = Document(page_content=text)
    summary = summarize_chain.invoke([document])
    return summary["output_text"]

未來發展

本來做這個只是為了讓我的「資訊小幫手」,希望他可以有更多基本功能來整合 Google Search 並且試著總結一些問題。 發現了有 Custom Search API 之後,或許之後可以有更多有趣的應用。

也歡迎大家自己部署自己的 「資訊小幫手」。如果你有一些更特別的應用,也歡迎告訴我。

[Python] 在 LangChain 中將 Gemini 換成使用 Vertex AI

image-20250305221818691

前情提要

前面提供相當多透過 LangChain 來打造一個 LINE Bot 的案例。但是如果希望使用更穩定的後台,並且希望使用更多 AI 相關的功能,那麼 Vertex AI 就是就是一個很好的選擇。接下來會開始逐步介紹整個移植過程並且介紹需要介紹的地方,還有可能會出現的問題。

範例程式碼:

https://github.com/kkdai/linebot-gemini-python

(透過這個程式碼,可以快速部署到 GCP Cloud Run)

透過 LangChain 與 Gemini 打造 LINE Bot 到 Vertex AI

首先先給各位一個簡單的 LangChain + Gemini 打造 LINE Bot 的範例程式碼:

處理 Webhook 相關程式碼:

    for event in events:
        if not isinstance(event, MessageEvent):
            continue

        if (event.message.type == "text"):
            # Process text message using LangChain
            msg = event.message.text
            response = generate_text_with_langchain(f'{msg}, reply in zh-TW:')
            reply_msg = TextSendMessage(text=response)
            await line_bot_api.reply_message(
                event.reply_token,
                reply_msg
            )

接下來解釋一下 generate_text_with_langchain 的內容:


# Initialize LangChain with Gemini
os.environ["GOOGLE_API_KEY"] = gemini_key

....

def generate_text_with_langchain(prompt):
    """
    Generate a text completion using LangChain with Gemini model.
    """
    # Create a chat prompt template with system instructions
    prompt_template = ChatPromptTemplate.from_messages([
        SystemMessage(
            content="You are a helpful assistant that responds in Traditional Chinese (zh-TW)."),
        HumanMessage(content=prompt)
    ])

    # Format the prompt and call the model
    formatted_prompt = prompt_template.format_messages()
    response = text_model.invoke(formatted_prompt)

    return response.content

這就是部分片段的透過 LangChain 加上 Gemini 來打造 LINE Bot 的程式碼,完成程式碼

什麼是 Vertex AI?有什麼特別功能?

Typora 2025-03-05 22.17.07

Vertex AI 是 Google Cloud 提供的一個全面性機器學習平台,旨在簡化模型的訓練、部署和管理。它特別適合需要企業級解決方案的開發者。與直接使用 Gemini API 不同,Vertex AI 提供了以下獨特功能:

  1. 整合 Gemini 模型與更多選擇 Vertex AI 支援 Gemini 系列模型(如 gemini-pro 和 gemini-1.5-flash),同時也支援其他模型(如 PaLM 和 Codey),讓你有更多選擇來滿足不同需求。
  2. 託管運行時與自動擴展 透過 Vertex AI 的 Reasoning Engine,你可以輕鬆部署 LangChain 應用程式,並享受自動擴展、安全性和監控功能,無需自行管理伺服器。
  3. 多模態支援 Vertex AI 的 Gemini 模型支援多模態輸入(文字、圖片、甚至影片),這對於打造功能豐富的 LINE Bot(如處理圖片訊息)非常有用。
  4. 企業級安全性與合規性 Vertex AI 提供 IAM(身份與存取管理)、資料加密和區域擴展功能,確保應用程式符合企業需求。
  5. 工具整合與函數調用 Vertex AI 支援 Function Calling,讓模型可以與外部 API 或工具互動,例如天氣查詢或資料庫搜尋,提升 LINE Bot 的實用性。

開始移植 Gemini 到 Vertex AI

首先會需要兩個主要參數

  • [Project_ID] : 你的 GCP Project ID
  • [Location] : Vertex AI 的地區! Vertex AI 的地區! Vertex AI 的地區! (很重要講三次)

接下來 這裡有一個很好的 Colab 可以讓你去了解一下。

主要程式碼如下:

import os
from google import genai
from google.genai.types import (
    FunctionDeclaration,
    GenerateContentConfig,
    GoogleSearch,
    HarmBlockThreshold,
    HarmCategory,
    MediaResolution,
    Part,
    Retrieval,
    SafetySetting,
    Tool,
    ToolCodeExecution,
    VertexAISearch,
)

PROJECT_ID = ""  # @param {type: "string", placeholder: "[your-project-id]", isTemplate: true}
if not PROJECT_ID or PROJECT_ID == "[your-project-id]":
    PROJECT_ID = str(os.environ.get("GOOGLE_CLOUD_PROJECT"))

LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "us-central1")

client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)

# 設定 model
MODEL_ID = "gemini-2.0-flash-001"  # @param {type: "string"}

# 產生輸出
response = client.models.generate_content(
    model=MODEL_ID, contents="What's the largest planet in our solar system?"
)

display(Markdown(response.text))

那該如何從 LangChain + Gemini 移植到 LangChain + VertexAI 呢?

跟據 LangChain 的文件上,主要使用 Google Vertex AI 會使用到 langchain_google_vertexai 裡面的 VertexAI ,需要注意的事情如下:

  • 如果放在 GCP 的 Cloud Run 就不需要放 Services Account 的 JSON 內容
  • 如果不是放在 GCP 上,就必須要將 JSON 內容放入 GOOGLE_APPLICATION_CREDENTIALS 系統參數中。

如果建立在 GCP 上面,以下是最基本的啟動方式。

# Create LangChain Vertex AI model instances
# For Vertex AI, we use "gemini-2.0-flash" instead of "gemini-2.0-flash-lite"
text_model = ChatVertexAI(
    model_name="gemini-2.0-flash-001",
    project=google_project_id,
    location=google_location,
    max_output_tokens=1024
)

接下來透過 LangChain 呼叫 Vertex AI 的程式碼如下:

def generate_text_with_langchain(prompt):
    """
    Generate a text completion using LangChain with Vertex AI model.
    """
    # Create a chat prompt template with system instructions
    prompt_template = ChatPromptTemplate.from_messages([
        SystemMessage(
            content="You are a helpful assistant that responds in Traditional Chinese (zh-TW)."),
        HumanMessage(content=prompt)
    ])

    # Format the prompt and call the model
    formatted_prompt = prompt_template.format_messages()
    response = text_model.invoke(formatted_prompt)

    return response.content

這樣就可以,本次只注重將 LangChain Gemini 在文字方面的部分,轉換成使用 Vertex AI 。但是因為 Vertex AI 上面針對圖片的使用都會透過 Google Cloud Storage ,所以本次將先不專注在相關的部分,想了解的可以

需要注意的問題:

  1. 關於以下錯誤該如何解決?

details = "Publisher Model `projects/PROJECT_ID/locations/asia-east1/publishers/google/models/gemini-2.0-flash` not found."

會發生這個問題,主要是因為如果你選擇了 asia-east1 作為你 Vertex AI 的區域。他目前是沒有支援 gemini-2.0 的相關模型喔。

需要改成 us-central1 才能正確地呼叫

[Python/Golang] 解決 Imgur 圖片下載轉址問題

Google Chrome 2025-02-12 08.33.04

最近的變動造成的問題

近期,Imgur 對其圖片連結進行了技術更新,導致直接訪問 i.imgur.com/{image_id}.jpeg 類型的 URL 時會被重定向到 imgur.com/{image_id} 頁面。這種行為使得在應用程式或網頁中直接顯示或下載圖片變得困難。此外,這種轉址機制也會影響到使用者腳本和瀏覽器擴充套件的正常運作,使得原本能夠阻止轉址的工具可能失效。因此,開發者需要找到新的方法來繞過這個限制。

解決思路

要解決這個問題,我們可以採用以下幾種策略:

  1. 設置正確的 HTTP 標頭特別是設定 Referer 標頭,以模擬從 Imgur 頁面訪問圖片。使用合理的 User-Agent 標頭,以避免被視為爬蟲請求。
  2. 使用 Imgur 官方 API透過官方 API 可以穩定地取得圖片直連 URL,但需要註冊並取得 Client ID 和 Client Secret。這種方法通常更可靠,但需要額外的手續和速率限制考量。
  3. 瀏覽器擴充套件或腳本更新更新 NoImgurRedirect 等擴充套件以適應最新變動,或撰寫自訂腳本來處理轉址問題。

範例程式碼

以下是一段 Python 程式碼示範如何設定正確標頭來下載 Imgur 圖片:

python
import requests

def download_img(image_id):
    # 構建 URL
    direct_url = f"https://i.imgur.com/{image_id}.jpeg"
    referer_url = f"https://imgur.com/{image_id}"
    
    # 設置請求頭
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Referer": referer_url
    }
    
    try:
        response = requests.get(direct_url, headers=headers)
        response.raise_for_status()
        
        if 'image' in response.headers.get('Content-Type', ''):
            filename = f"{image_id}.jpeg"
            with open(filename, 'wb') as f:
                f.write(response.content)
            print(f"圖片已成功下載:{filename}")
        else:
            print("下載失敗:返回內容不是圖片")
    
    except requests.RequestException as e:
        print(f"下載失敗:{e}")

# 測試下載(假設 image_id 為「example123」)
download_img("example123")

範例程式碼(Golang)

以下是一段 Golang 程式碼示範如何設定正確標頭來下載 Imgur 圖片:

go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func downloadImg(imageID string) error {
	directURL := fmt.Sprintf("https://i.imgur.com/%s.jpeg", imageID)
	refererURL := fmt.Sprintf("https://imgur.com/%s", imageID)

	req, err := http.NewRequest("GET", directURL, nil)
	if err != nil {
		return err
	}

	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
	req.Header.Set("Referer", refererURL)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("HTTP status code: %d", resp.StatusCode)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	filename := fmt.Sprintf("%s.jpeg", imageID)
	err = ioutil.WriteFile(filename, body, 0644)
	if err != nil {
		return err
	}

	fmt.Printf("圖片已成功下載:%s\n", filename)

	return nil
}

func main() {
	imageID := "example123"
	err := downloadImg(imageID)
	if err != nil {
		fmt.Println(err.Error())
	}
}

未來該如何小心類似的問題

  1. 關注平台更新通知 定期查看 Imgur 的官方公告和社群反饋,以便及時了解任何技術變動。
  2. 維護現有工具與庫版本 保持瀏覽器擴充套件、腳本以及相關庫版本是最新的,以確保它們能夠適應新出現的情況。
  3. 評估替代方案與備選策略 考慮使用其他第三方服務作為備選方案,並在必要時切換至不同的存儲平台以減少風險依賴性。
  4. 遵守服務條款與政策 在實施任何工作流程時,務必遵守相關平台提供者的服務條款與政策,以避免帳戶封禁等不利後果。

[生活] 日本旅遊零錢太多? 輕鬆存進 Suica 卡,手機也能用!

image-20250119115652394

(✨ 影片示範看這裡 ✨ https://youtube.com/shorts/ffbuUVK_bsE?si=LopZUGuQ7mEpRDcd)

還在為日本零錢煩惱嗎? ( ̄▽ ̄;)

每次去日本玩,是不是都有一樣的困擾? 🤔

  • 明明有 Suica 卡,卻還是收到一堆零錢! 😫
  • 日本物價高,零錢好難花! (。ŏ_ŏ) 怕麻煩乾脆不拿出來…

結果口袋越來越重,回國前還是剩一堆! 😰 別擔心!有了 Pocket Exchange,輕鬆告別零錢困擾! 😎

Pocket Exchange 是什麼?哪裡找? 🤔

image-20250119120221952

Pocket Exchange 就像個零錢 ATM,可以把你的硬幣通通存進 Suica 卡! 😮 超方便! 👍

我在成田機場第二航廈 61 登機口附近找到一台,就在咖啡廳旁邊! ☕ 其他地點可以參考官網:

常見問題 🙋‍♀️🙋‍♂️

Q:可以用手機 Suica 嗎?

A:當然可以囉! (๑•̀ㅂ•́)و✧

Q:1 元硬幣可以存嗎?

A:沒問題! ( • ̀ω•́ )✧

Q:其他硬幣呢?

A:大部分都可以,但有些可能不吃喔!建議參考機器上的說明。 😉

找不到 Pocket Exchange 怎麼辦? 😱

別慌!7-11 也有自助結帳機可以讓你清掉零錢! 😉 不過要注意,需要 1000 日圓以上才能存進卡片喔! 😅 如果零錢不夠多,那就… 買個東西花掉吧! ( ´∀`) (小心又會產生新的零錢喔! 🤣)

最後

希望這篇文章對你有幫助! 🥰 下次去日本玩,別再讓零錢成為你的負擔啦! 😄

[Playstation Portal] 如何透過 WiFi 路由器設定來讓 Portal 與 PS5 連線更加順暢

image-20250117150311115

前情提要

大家都知道,我大概一年前買入 PS Portal Remote 之後。大概也全破了不少款的遊戲。 但是原來的 TPLink 是 WiFi5 的 Router ,想要趁機換一台 WiFi6 的 Router 之後。但是卻發現讓連線狀況相當的不順,這一篇記錄一下,如何讓你的 PlayStation Portal Remote 可以更順暢的透過 WiFi 連線 Playstation 5 。

參考影片

自從把 TPLink 升級成 ASUS wifi6 router 後,一直無法讓 PS5 跟 Portal 連線順暢 用這招成功恢復速度

  1. 獨立 PS5 跟 Portal 用 5G
  2. ASUS router 對這兩個優化