<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4877487320781767952</id><updated>2026-07-25T01:44:34.795+08:00</updated><category term="生活"/><category term="Python"/><category term="網購"/><category term="好書"/><category term="物聯網"/><category term="好站"/><category term="網頁技術"/><category term="樹莓派"/><category term="電腦"/><category term="還書"/><category term="機器學習"/><category term="ESP8266"/><category term="Raspberry Pi"/><category term="Arduino"/><category term="評論"/><category term="MicroPython"/><category term="主機"/><category term="ESP32"/><category term="理財"/><category term="能源"/><category term="人工智慧"/><category term="jQuery"/><category term="PHP"/><category term="食譜"/><category term="Java"/><category term="網路爬蟲"/><category term="Javascript"/><category term="音樂"/><category term="量化投資"/><category term="旅行"/><category term="LLM"/><category term="小狐狸"/><category term="Linux"/><category term="網路"/><category term="歷史"/><category term="NLP"/><category term="其他"/><category term="EasyUI"/><category term="語言學"/><category term="醫藥"/><category term="手機"/><category term="Streamlit"/><category term="索引"/><category term="工作"/><category term="資料科學"/><category term="雲端"/><category term="Google"/><category term="HTML5"/><category term="R 語言"/><category term="GAE"/><category term="硬體"/><category term="Django"/><category term="Mapleboard"/><category term="自動化"/><category term="OpenAI"/><category term="jQuery UI"/><category term="電子零件"/><category term="App"/><category term="C 語言"/><category term="PyTorch"/><category term="資料視覺化"/><category term="Ubuntu"/><category term="Bootstrap"/><category term="創客"/><category term="筆電"/><category term="Windows"/><category term="飛控"/><category term="jQuery Mobile"/><category term="單晶片"/><category term="tkinter"/><category term="戲劇"/><category term="AIGC"/><category term="Flask"/><category term="ChatGPT"/><category term="數學"/><category term="木工"/><category term="Praat"/><category term="ExtJS"/><category term="農業"/><category term="TensorFlow"/><category term="修行"/><category term="小狐狸生態"/><category term="科學"/><category term="養生"/><category term="Telegram"/><category term="WordPress"/><category term="無人機"/><category term="Line"/><category term="vibe coding"/><category term="♥"/><category term="♥♥♥"/><category term="專案"/><category term="Excel"/><category term="Gemini"/><category term="電子學"/><category term="Fintech"/><category term="Node.js"/><category term="p5.js"/><category term="AWS"/><category term="Stable Diffusion"/><category term="gradio"/><category term="教育"/><category term="邏輯設計"/><category term="SQL"/><category term="旅遊"/><category term="架站"/><category term="AutoIt"/><category term="Gemini CLI"/><category term="Ollama"/><category term="Antigravity"/><category term="保險"/><category term="線上工具"/><category term="電腦技術"/><category term="Android"/><category term="C++"/><category term="Git"/><category term="Julia"/><category term="Matplotlib"/><category term="英文"/><category term="Azure"/><category term="Jetson"/><category term="LangChain"/><category term="LoRa"/><category term="ASP"/><category term="Banana Pi"/><category term="CSS"/><category term="LINE Bot"/><category term="MacOS"/><category term="新軟體"/><category term="物理學"/><category term="Chatbot"/><category term="IC 設計"/><category term="♥♥"/><category term="多媒體"/><category term="統計學"/><category term="計算語言學"/><category term="語音辨識"/><category term="資安"/><category term="韓劇"/><category term="GAS"/><category term="Pandas"/><category term="日文"/><category term="深度學習"/><category term="演算法"/><category term="生活雜記"/><category term="讀書劄記"/><category term="遠端桌面"/><category term="Claude Code"/><category term="Colab"/><category term="GitHub"/><category term="借書"/><category term="軟體開發"/><category term="Blynk"/><category term="Bokeh"/><category term="Micro:bit"/><category term="OpenCV"/><category term="Vue"/><category term="大數據"/><category term="好文"/><category term="影像處理"/><category term="機器人"/><category term="自作專案"/><category term="資料庫"/><category term="D3.js"/><category term="GCP"/><category term="Lua"/><category term="Nginx"/><category term="Plotly"/><category term="Swift"/><category term="TCP/IP"/><category term="占星術"/><category term="書籤"/><category term="量子計算"/><category term="Altair"/><category term="NLTK"/><category term="WSH"/><category term="信號處理"/><category term="語音技術"/><category term="Appfog"/><category term="DSP"/><category term="GPU"/><category term="SDD"/><category term="SciPy"/><category term="Seaborn"/><category term="SpaCy"/><category term="scikit-learn"/><category term="區塊鏈"/><category term="相術"/><category term="系統"/><category term="紫微斗數"/><category term="統計"/><category term="AMB82"/><category term="Corona"/><category term="Firebase"/><category term="Hugging Face"/><category term="Joomla"/><category term="MQTT"/><category term="MongoDB"/><category term="Node-RED"/><category term="OpenSpec"/><category term="React"/><category term="SQLite"/><category term="Transformer"/><category term="UAV"/><category term="WebGL"/><category term="tensorflow.js"/><category term="動畫"/><category term="排版"/><category term="繪圖"/><category term="虛擬幣"/><category term="通訊"/><category term="Chart.js"/><category term="Cheatsheet"/><category term="Highcharts"/><category term="JSP"/><category term="Keras"/><category term="Mathematics"/><category term="Midjourney"/><category term="Numpy"/><category term="OpenClaw"/><category term="RAG"/><category term="STM32"/><category term="Verilog"/><category term="Wireshark"/><category term="ml5.js"/><category term="reflex"/><category term="備忘"/><category term="影像辨識"/><category term="比特幣"/><category term="股市"/><category term="藝術"/><category term="API"/><category term="AngularJS"/><category term="Anime"/><category term="Big Data"/><category term="CKeditor"/><category term="Canva"/><category term="Claude"/><category term="DALL-E"/><category term="Data Mining"/><category term="FPGA"/><category term="FastAPI"/><category term="Gimini"/><category term="Go"/><category term="Home Assistant"/><category term="JavaFX"/><category term="Kali"/><category term="Kotlin"/><category term="MCP"/><category term="Make"/><category term="Masonite"/><category term="Next.js"/><category term="NoSQL"/><category term="NotebookLM"/><category term="Notion"/><category term="OrangePi"/><category term="Ruby"/><category term="Scrapy"/><category term="Three.js"/><category term="TinyMCE"/><category term="TinyML"/><category term="VHDL"/><category term="VoIP"/><category term="YOLO"/><category term="brython"/><category term="bubble.io"/><category term="jqPlot"/><category term="mermaid.js"/><category term="no-code"/><category term="render.com"/><category term="中醫"/><category term="人工"/><category term="保養品"/><category term="儀錶板"/><category term="八字學"/><category term="出版"/><category term="園藝"/><category term="控制系統"/><category term="新產品"/><category term="新知識"/><category term="易經"/><category term="智慧音箱"/><category term="監控"/><category term="線上學習"/><category term="線上課程"/><category term="線性代數"/><category term="論文"/><category term="運動"/><category term="電路學"/><category term="韓文"/><title type='text'>小狐狸事務所</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default?start-index=26&amp;max-results=25'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6409</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-1028732927283931996</id><published>2026-07-24T22:51:33.012+08:00</published><updated>2026-07-24T22:51:33.013+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="旅遊"/><title type='text'>岡山之旅 Day 1 (7/24) : 出發</title><content type='html'>&lt;div&gt;今天中午 12:40 從小港機場出發前往岡山自助旅行, 此行是應老同事阿中要求規劃的, 他在三月團旅第一次出國到日本之後便迷上那裏的美景, 有點日文根基的他開始拿回日語課本複習, 拜託我帶他在炎夏時跑一趟日本水蜜桃故鄉岡山, 從訂機票旅館, 登錄 VJW 到常用旅遊 App 用法都要手把手教會他, 學會後就能想飛就飛.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;由於暑假到日本旅遊的人多, 所以我破天荒地在兩個月之前的五月中旬便完成了行程規劃 (之前都是拖到 1~2 周前, 細部行程更是前一天晚上才確定), 一起買好機票訂好旅館, 並預約了水蜜桃觀光果園的採果課程. 以往訂機票與旅館都是水某會處理, 這回得自己做, 對我也是一種學習. 行程規劃紀錄在這篇 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/05/2026.html&quot; target=&quot;_blank&quot;&gt;2026 岡山之旅規劃 (07-24~07-29)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;虎航周一, 三, 五有班機直飛岡山桃太郎機場, 中午 12:40 起飛只要早上 10:30 前報到即可. 早上 9 點多水某載我到凹子底坐捷運到小港機場與阿中會合後辦理出境登機, 這也是我首次出國搭捷運. 抵達岡山已下午 16:30, 第一天就只是交通而已, 行程表如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIQNbNmt9hlLl0217RpsFPttp42DZLhzTk3PWYV-6Y_IAhE4WYFG3CfcggEvLivzfPYby6C7frXbOpJ5KIF_yRbmHeGaPqOTJukoVUVWdhzfVea6PQBZ2aY1UVWsK41Z8MSFjj5J4HwM_Fnys6TuPr_x2gFRph0tQuDbcGgxgI2pLsB3QFnULBPr_nsDRS/s1304/2026-%E5%B2%A1%E5%B1%B1%E4%B9%8B%E6%97%85%E8%A1%8C%E7%A8%8B%20Day%201.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;566&quot; data-original-width=&quot;1304&quot; height=&quot;139&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIQNbNmt9hlLl0217RpsFPttp42DZLhzTk3PWYV-6Y_IAhE4WYFG3CfcggEvLivzfPYby6C7frXbOpJ5KIF_yRbmHeGaPqOTJukoVUVWdhzfVea6PQBZ2aY1UVWsK41Z8MSFjj5J4HwM_Fnys6TuPr_x2gFRph0tQuDbcGgxgI2pLsB3QFnULBPr_nsDRS/s320/2026-%E5%B2%A1%E5%B1%B1%E4%B9%8B%E6%97%85%E8%A1%8C%E7%A8%8B%20Day%201.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/1028732927283931996/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/1028732927283931996' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1028732927283931996'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1028732927283931996'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/day-1-724.html' title='岡山之旅 Day 1 (7/24) : 出發'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIQNbNmt9hlLl0217RpsFPttp42DZLhzTk3PWYV-6Y_IAhE4WYFG3CfcggEvLivzfPYby6C7frXbOpJ5KIF_yRbmHeGaPqOTJukoVUVWdhzfVea6PQBZ2aY1UVWsK41Z8MSFjj5J4HwM_Fnys6TuPr_x2gFRph0tQuDbcGgxgI2pLsB3QFnULBPr_nsDRS/s72-c/2026-%E5%B2%A1%E5%B1%B1%E4%B9%8B%E6%97%85%E8%A1%8C%E7%A8%8B%20Day%201.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-5578317673347240391</id><published>2026-07-23T12:44:06.001+08:00</published><updated>2026-07-23T12:44:06.001+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="旅行"/><title type='text'>岡山之旅 Day 0 (7/23) : 虎航自助報到</title><content type='html'>&lt;div&gt;昨天接到虎航預辦登機通知 Email, 原來在出發前兩天就可以線上辦理自助報到, 上傳護照內頁圖檔驗證內容 (姓名, 生日, 護照號碼, 到期日等) 無誤後就可以下載電子登機證, 屆時到機場櫃台就可以直接託運行李, 不需要排隊報到了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按 Email 底下的 &quot;預辦登機&quot; 鈕 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2Ry-Y9DlEgn-yD_ZGnEHc6CAhCxT0_ibksa0gT7CybqDhMDsN503qMebE5rCeYg4lqo-czi9WqVdiDCPMUNAlJrgbKZJnx1Ceku9svNrgc1v8pG7EU6SFuRpsQI23dcfCBMg8Xe-qrxP9X6hp5GfM09nWKU0AMbgS15VA7NTKNJIDf89dO7v8WiSyZp1/s1423/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-9.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1423&quot; data-original-width=&quot;854&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2Ry-Y9DlEgn-yD_ZGnEHc6CAhCxT0_ibksa0gT7CybqDhMDsN503qMebE5rCeYg4lqo-czi9WqVdiDCPMUNAlJrgbKZJnx1Ceku9svNrgc1v8pG7EU6SFuRpsQI23dcfCBMg8Xe-qrxP9X6hp5GfM09nWKU0AMbgS15VA7NTKNJIDf89dO7v8WiSyZp1/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-9.jpg&quot; width=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;填寫當初購票時取得之訂位代號 (Email 標題就有), 護照英文姓名 (不用輸入 -, 輸入也會被去除), 按 &quot;開始報到&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPvEFHAQu9e59cccGCWHgAiPU_emaoiDEbwxkDHloJlsceSJc5y8qb3hFtjKR8CZqQJxRNofeP3WxvJGFKN6VIH4seMC53YEvj6J-L0pFyfYdvu9YB7VLhPpEgCbk5ykaPj0hUfuCUWml9sENGFrkNDVp4KuKIid286xgEt85l1UH6-_RDzhvaM0o855QU/s1787/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1787&quot; data-original-width=&quot;915&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPvEFHAQu9e59cccGCWHgAiPU_emaoiDEbwxkDHloJlsceSJc5y8qb3hFtjKR8CZqQJxRNofeP3WxvJGFKN6VIH4seMC53YEvj6J-L0pFyfYdvu9YB7VLhPpEgCbk5ykaPj0hUfuCUWml9sENGFrkNDVp4KuKIid286xgEt85l1UH6-_RDzhvaM0o855QU/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-1.jpg&quot; width=&quot;164&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按去程航班右邊的 &quot;可報到&quot; 鈕 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipdCM9-wZaQLQ2ygtT2j1YQHt5FI2dJi1kxfkMkav-lPl8B8hg6FCfnCZtoYKLeaDX7AdjdzMhqppzXu-tWdxOE5fO6FL83n165LC7Jdk3b-rslLHDj5Q3y2abrMLn1izgDgQOsySG3d6UCRtf2Gc6-VTZwOg7HXAWseREUsoLhsoYvonmUby_HY8ZJK3y/s1207/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1207&quot; data-original-width=&quot;1080&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipdCM9-wZaQLQ2ygtT2j1YQHt5FI2dJi1kxfkMkav-lPl8B8hg6FCfnCZtoYKLeaDX7AdjdzMhqppzXu-tWdxOE5fO6FL83n165LC7Jdk3b-rslLHDj5Q3y2abrMLn1izgDgQOsySG3d6UCRtf2Gc6-VTZwOg7HXAWseREUsoLhsoYvonmUby_HY8ZJK3y/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-2.jpg&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;接下來是行李託運與安檢相關規定事項, 閱讀後勾選底下 &quot;我已完整閱讀並同意以上事項&quot; 後按 &quot;下一步&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5deEPt1nfYWkoOiMhua6hq1jKedKC9t_KeWKusZVdSTbhAE0EM16pVkSMot6FORpgzYaH_6BK-OZ2-EZriV1g5JGz8x9f1MEh-p0-nsg-_FeDoxjFpDNn8XIrnWaMFC-VUX1f3nUbwhOmhrchkUGA1H6RPnnEsvAevTg4aIlQbAx6AyDIHr9qeCTQz1vB/s1366/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1366&quot; data-original-width=&quot;915&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5deEPt1nfYWkoOiMhua6hq1jKedKC9t_KeWKusZVdSTbhAE0EM16pVkSMot6FORpgzYaH_6BK-OZ2-EZriV1g5JGz8x9f1MEh-p0-nsg-_FeDoxjFpDNn8XIrnWaMFC-VUX1f3nUbwhOmhrchkUGA1H6RPnnEsvAevTg4aIlQbAx6AyDIHr9qeCTQz1vB/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-3.jpg&quot; width=&quot;214&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi31rfUnQrgYbYQ53ennKGOJQhyphenhyphenI_klNvUJ4RixTb1JMgVo9Kslq05ne9NJD3LBop-qHjENhbIryaPYWNnPv460zCGX1sYXvMnrOXFZ6rT6iNAAMxTmTM1VRZEm1-iLcFkdGESr94eIjjGvSIu8SaRtEP_tI57BS8UjdvIigXQ7CyIExDC6yym3FzYmk9fW/s1229/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1229&quot; data-original-width=&quot;914&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi31rfUnQrgYbYQ53ennKGOJQhyphenhyphenI_klNvUJ4RixTb1JMgVo9Kslq05ne9NJD3LBop-qHjENhbIryaPYWNnPv460zCGX1sYXvMnrOXFZ6rT6iNAAMxTmTM1VRZEm1-iLcFkdGESr94eIjjGvSIu8SaRtEP_tI57BS8UjdvIigXQ7CyIExDC6yym3FzYmk9fW/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-4.jpg&quot; width=&quot;238&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuDlWv8yhE6HgI9n_AKgXUg2zgGAM7B_Z6riMt9YlYuXdNoHNz_0mVWCdriA9deZ_o3_deWLoQGALqOSO-maZKZQRPS2HZTslCuZuDajRd_woFRbQX5Ec0nyE8S9Z1aEPbyhgg_H1Rep7_iSJMP8NJSfGIlv4aZ5D6TfRUsikevp1h_JN5XJr0dDPZPJ_J/s1524/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1524&quot; data-original-width=&quot;913&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuDlWv8yhE6HgI9n_AKgXUg2zgGAM7B_Z6riMt9YlYuXdNoHNz_0mVWCdriA9deZ_o3_deWLoQGALqOSO-maZKZQRPS2HZTslCuZuDajRd_woFRbQX5Ec0nyE8S9Z1aEPbyhgg_H1Rep7_iSJMP8NJSfGIlv4aZ5D6TfRUsikevp1h_JN5XJr0dDPZPJ_J/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-5.jpg&quot; width=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;接下來是要輸入護照資料, 如果可以用影印機掃描護照內頁最好, 辨識成功率較高 (但也要仔細檢查), 用手機拍照要橫拍, 光線也要注意才能順利辨識, 如果都失敗就用手動輸入 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2vlNkk431me7lrNQ8sk6d_Vhu5IGT9nhoB_nLHAAfaX_3u61jaARNJQL-CS6YZ_z3rzXhefTi9gz62dMwsDxhmmXwBZex2eQUe9mZuTTM2Vhi34Js9B-oBMSv7CbocjdR1pAWvVN7y7l1xBA-kZCejLHcWxEtZTGBHfW5y7MzLaRH4cdabrq2QIlabCAJ/s1234/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1234&quot; data-original-width=&quot;914&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2vlNkk431me7lrNQ8sk6d_Vhu5IGT9nhoB_nLHAAfaX_3u61jaARNJQL-CS6YZ_z3rzXhefTi9gz62dMwsDxhmmXwBZex2eQUe9mZuTTM2Vhi34Js9B-oBMSv7CbocjdR1pAWvVN7y7l1xBA-kZCejLHcWxEtZTGBHfW5y7MzLaRH4cdabrq2QIlabCAJ/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-6.jpg&quot; width=&quot;237&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;檢視辨識資料是否正確 (錯誤資料可能影響登機) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3ByWfHjHz7OgD_XSQZ8IYlRLXixVo-xVMmdXsTsIa5EYmj0FffHVpz-A1mZ61YKBervJoDVK1MwyN_G-VCt0-u_9dby7AcfCB8bphnZLVIb-lZBX09kfydLyvQ3LwIIhLUFJRo7hfXh3D96IG_NhIOvX798ll4bMDB3LmCxaL0S4QKWJvPOI_lMsvrpq/s1482/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1482&quot; data-original-width=&quot;913&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3ByWfHjHz7OgD_XSQZ8IYlRLXixVo-xVMmdXsTsIa5EYmj0FffHVpz-A1mZ61YKBervJoDVK1MwyN_G-VCt0-u_9dby7AcfCB8bphnZLVIb-lZBX09kfydLyvQ3LwIIhLUFJRo7hfXh3D96IG_NhIOvX798ll4bMDB3LmCxaL0S4QKWJvPOI_lMsvrpq/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-7.jpg&quot; width=&quot;197&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;資料驗證過關後顯示已加購項目, 此處還可再加購, 若不需要就按左邊 &quot;不加購到下一步&quot; 鈕完成自助報到, 並顯示電子登機證下載超連結 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1tDuOB7buBHBd5SIPP_8OkUbAs0PfqVawKEfgap6WWHlgJBDejDlxuGMcVYhkyPdRb26zoUbhiu_YWBiNbsp3WrOD-yI2n16kkKzYLo4PakB7k2lVMyTDtRCwGCQNhlJRNB38C3HiVD3mFbD_c_DZS2afSU1kZs4F7kKCwYk6y1Fz5YNkuSyytzVhiNh3/s1574/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1574&quot; data-original-width=&quot;1040&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1tDuOB7buBHBd5SIPP_8OkUbAs0PfqVawKEfgap6WWHlgJBDejDlxuGMcVYhkyPdRb26zoUbhiu_YWBiNbsp3WrOD-yI2n16kkKzYLo4PakB7k2lVMyTDtRCwGCQNhlJRNB38C3HiVD3mFbD_c_DZS2afSU1kZs4F7kKCwYk6y1Fz5YNkuSyytzVhiNh3/s320/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-8.jpg&quot; width=&quot;211&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;完成自助報到後, 虎航也會寄一封包含電子登機證 pdf 檔的 Email, 將此 pdf 存入手機, 有印表機最好也列印出來作為備份.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/5578317673347240391/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/5578317673347240391' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/5578317673347240391'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/5578317673347240391'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/day-0-723.html' title='岡山之旅 Day 0 (7/23) : 虎航自助報到'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2Ry-Y9DlEgn-yD_ZGnEHc6CAhCxT0_ibksa0gT7CybqDhMDsN503qMebE5rCeYg4lqo-czi9WqVdiDCPMUNAlJrgbKZJnx1Ceku9svNrgc1v8pG7EU6SFuRpsQI23dcfCBMg8Xe-qrxP9X6hp5GfM09nWKU0AMbgS15VA7NTKNJIDf89dO7v8WiSyZp1/s72-c/%E8%99%8E%E8%88%AA%E7%B7%9A%E4%B8%8A%E8%87%AA%E5%8A%A9%E5%A0%B1%E5%88%B0-9.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-1802047887516933676</id><published>2026-07-23T10:27:51.512+08:00</published><updated>2026-07-23T10:29:53.337+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="手機"/><category scheme="http://www.blogger.com/atom/ns#" term="旅遊"/><title type='text'>iPhone 手機加入 eSIM 的方法</title><content type='html'>&lt;div&gt;明天要跟老同事阿中前往日本岡山採水蜜桃, 主要是應其要求, 教他如何在日本自助旅行. 前天已購買中華電信行動漫遊方案 (暑假日本定量型 10 天 10GB 688 元), 今天上 KLOOK 為備用手機 iPhone SE2 買 eSIM 卡 (軟銀 6 天每日 1GB) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgnMi4c0vJ4D-paX4yV4YNrgUemo5gSdXMYFpsTiGb4uDJZvhS2JBEo5lfhpQzX7O2DOro7fR-A5Vr_zxgMEe-AllZBIwnNZiwo8-LsrMD7sBgu5a51ZFg5MQa4HFfuCn1S0Kowu1s4LfH32VLxzUbnpcq2lVbVRYPi7PSzw_CjWRogzcK3KBe_oxsof2B/s1080/KLOOK-eSIM-1GB-Daily.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;685&quot; data-original-width=&quot;1080&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgnMi4c0vJ4D-paX4yV4YNrgUemo5gSdXMYFpsTiGb4uDJZvhS2JBEo5lfhpQzX7O2DOro7fR-A5Vr_zxgMEe-AllZBIwnNZiwo8-LsrMD7sBgu5a51ZFg5MQa4HFfuCn1S0Kowu1s4LfH32VLxzUbnpcq2lVbVRYPi7PSzw_CjWRogzcK3KBe_oxsof2B/s320/KLOOK-eSIM-1GB-Daily.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;付款完成後點右下角的 &quot;帳戶&quot; 點選 &quot;我的訂單&quot; 按此訂單進去就會出現 eSIM 卡的 QR 碼, 把它截圖印出來, 或傳送到同行家人手機 LINE 備用.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;到達目的地機場後, 開啟 iPhone 的 WiFi 功能連到家人或機場的免費 WiFi :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcZ4DWCZfCCvnZ1XHCq721e6DuKI46kHc_p5SEeE4wvm6YaKRTnhnSScnZUBAKYR4MvJeJzkbo66tUysDijpurkjBECjCtZvqiL7G5OU7yiANGMQpThcFtIA-kUAKthSwY0W-t8otEOQXA-9tT9IA0G-V8qvJUPSQiRCT0ArKJBJGFXbrbWxOtmE8ALjBH/s869/iPhone-add-eSIM-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;869&quot; data-original-width=&quot;750&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcZ4DWCZfCCvnZ1XHCq721e6DuKI46kHc_p5SEeE4wvm6YaKRTnhnSScnZUBAKYR4MvJeJzkbo66tUysDijpurkjBECjCtZvqiL7G5OU7yiANGMQpThcFtIA-kUAKthSwY0W-t8otEOQXA-9tT9IA0G-V8qvJUPSQiRCT0ArKJBJGFXbrbWxOtmE8ALjBH/s320/iPhone-add-eSIM-1.png&quot; width=&quot;276&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;進入 &quot;行動服務&quot;, 按底下的 &quot;加入 eSIM&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-oy5xLp2esaWr2RAqI3u89C_MSGE-XcmY-xwr0ugRvzSW0ewmPZIYFkBC046mVRpH7G3oeSsTCNqgvDh3ytAT9wKwSOWrhCxZ1NWJS81u_HL99mx7aZLhd_UMUFi-xtu2UAXunp7adTW7tb-okshXPYo5kHm-LINdWdwU_uWSRDKc6poxQ-ROifOmaYVz/s1173/iPhone-add-eSIM-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1173&quot; data-original-width=&quot;750&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-oy5xLp2esaWr2RAqI3u89C_MSGE-XcmY-xwr0ugRvzSW0ewmPZIYFkBC046mVRpH7G3oeSsTCNqgvDh3ytAT9wKwSOWrhCxZ1NWJS81u_HL99mx7aZLhd_UMUFi-xtu2UAXunp7adTW7tb-okshXPYo5kHm-LINdWdwU_uWSRDKc6poxQ-ROifOmaYVz/s320/iPhone-add-eSIM-2.png&quot; width=&quot;205&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按 &quot;使用行動條碼&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsRmSlXixqqbNa5nJeOaek4gCI2Adj6J_3CxCIBw4xZ7H5qMSD96C4go26qkEVAZiGvhGbBpSJ8Q2QRxd5x_JG1oXymZ5NlpJJ_oRlKV2tI6zbYIODgC1-a4qmhgMHjWoQyiNvrJEgTA-rhDrp1C5XGty8vjje0y5LAHvOSE3mdI31G9y0TRzTrj45RLIo/s1009/iPhone-add-eSIM-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1009&quot; data-original-width=&quot;750&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsRmSlXixqqbNa5nJeOaek4gCI2Adj6J_3CxCIBw4xZ7H5qMSD96C4go26qkEVAZiGvhGbBpSJ8Q2QRxd5x_JG1oXymZ5NlpJJ_oRlKV2tI6zbYIODgC1-a4qmhgMHjWoQyiNvrJEgTA-rhDrp1C5XGty8vjje0y5LAHvOSE3mdI31G9y0TRzTrj45RLIo/s320/iPhone-add-eSIM-3.png&quot; width=&quot;238&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;拿出列印的 QR 碼或家人手機中的 QR 碼, 按 &quot;掃描行動條碼&quot; 掃描即可 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO71jA6YJ2bPT8h6ij9O5RtxQnw7catOq4ldEcfHCo2YgAQ_xfOyk1nJUX7oKlhVFzfrQi0im6plAbdpcJfhYeoYCsh8nDO8kXC6xvI2EiMwpG8RzuCH94ImbOXkusFIZhEwh1mAspTpJvufSbUWtjh_n9yGGmh161V6ay_jHVqnqgFyKtdjXuyetH7bqR/s967/iPhone-add-eSIM-4.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;967&quot; data-original-width=&quot;737&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO71jA6YJ2bPT8h6ij9O5RtxQnw7catOq4ldEcfHCo2YgAQ_xfOyk1nJUX7oKlhVFzfrQi0im6plAbdpcJfhYeoYCsh8nDO8kXC6xvI2EiMwpG8RzuCH94ImbOXkusFIZhEwh1mAspTpJvufSbUWtjh_n9yGGmh161V6ay_jHVqnqgFyKtdjXuyetH7bqR/s320/iPhone-add-eSIM-4.png&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;掃描完成後開啟行動行動數據選擇此 eSIM 即可上網.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/1802047887516933676/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/1802047887516933676' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1802047887516933676'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1802047887516933676'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/iphone-esim.html' title='iPhone 手機加入 eSIM 的方法'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgnMi4c0vJ4D-paX4yV4YNrgUemo5gSdXMYFpsTiGb4uDJZvhS2JBEo5lfhpQzX7O2DOro7fR-A5Vr_zxgMEe-AllZBIwnNZiwo8-LsrMD7sBgu5a51ZFg5MQa4HFfuCn1S0Kowu1s4LfH32VLxzUbnpcq2lVbVRYPi7PSzw_CjWRogzcK3KBe_oxsof2B/s72-c/KLOOK-eSIM-1GB-Daily.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-7050508983413242943</id><published>2026-07-23T09:42:40.384+08:00</published><updated>2026-07-23T09:42:40.385+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="手機"/><title type='text'>iPhone 手機螢幕截圖方法</title><content type='html'>&lt;div&gt;我的備用手機 iPhone SE2 有時需要螢幕截圖 (例如紀錄如何啟用 eSIM), 因為它有 HOME 鍵, 所以傳統截圖是同時按電源 + HOME 鍵即可, 但要同時按兩個鍵不方便, 也不好控制, 我今天問 Gemini , 原來可以用輕點背面 2 或 3 下方式截圖, 設定方法如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;打開設定, 點選 &quot;輔助使用&quot; :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy4wdr21zZmN0fY4jzk45UBIfxV0gRs5xY4VV83HOleQw7w6xeYstjkRWPDVdQUiU8TZglOhhb37r4kwjXkWn3sBl7AT5py0s_k4lJITl-V4_YmjiKyAlTjHSLg3a8ps4ggetBr0Kq3gClrsDx-WkcO0_E4onlwnrSzB5-j83fBTPt1dWd5lD2gtfh9PwB/s971/iPhone-get-screen-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;971&quot; data-original-width=&quot;750&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy4wdr21zZmN0fY4jzk45UBIfxV0gRs5xY4VV83HOleQw7w6xeYstjkRWPDVdQUiU8TZglOhhb37r4kwjXkWn3sBl7AT5py0s_k4lJITl-V4_YmjiKyAlTjHSLg3a8ps4ggetBr0Kq3gClrsDx-WkcO0_E4onlwnrSzB5-j83fBTPt1dWd5lD2gtfh9PwB/s320/iPhone-get-screen-1.png&quot; width=&quot;247&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;點選身體動作項目下的 &quot;觸控&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-aBwA_YTjx-k8BWKASvC7Mi5FlUi-5ZRxbVxfoGPge-CHxVGKJUpEg4ghuL9-IlwKtljHeWL4WGZUPcNQ-7TpY9AmPVFUW6DBovoCQDg2VceYkry2YqaPtdyrJMZJE9XtkAkolsvnccYuZoE3G74iewd7RERigo_G2x6iwFjJ977uYKFjiG5FYeDc7FvS/s849/iPhone-get-screen-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;849&quot; data-original-width=&quot;746&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-aBwA_YTjx-k8BWKASvC7Mi5FlUi-5ZRxbVxfoGPge-CHxVGKJUpEg4ghuL9-IlwKtljHeWL4WGZUPcNQ-7TpY9AmPVFUW6DBovoCQDg2VceYkry2YqaPtdyrJMZJE9XtkAkolsvnccYuZoE3G74iewd7RERigo_G2x6iwFjJ977uYKFjiG5FYeDc7FvS/s320/iPhone-get-screen-2.png&quot; width=&quot;281&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;開啟 &quot;背面輕點&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPxojsHf1WVIHN2WqBosmaWUiZg2VoCFZDvwlgfQFkSNh_FLNLt5ms9rLVewd-q_PoEx9nWLYXTFx_CKgZf7FGDljZjpQW4sCoadUeSXZ482N5rizJmOm3lQuQqmjXTYNrCnJbhQswxXQWH3QTk9SfIoemrYxxJKI8HHO1t_9eNc4dulH5oQy1dyaK061/s987/iPhone-get-screen-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;987&quot; data-original-width=&quot;747&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPxojsHf1WVIHN2WqBosmaWUiZg2VoCFZDvwlgfQFkSNh_FLNLt5ms9rLVewd-q_PoEx9nWLYXTFx_CKgZf7FGDljZjpQW4sCoadUeSXZ482N5rizJmOm3lQuQqmjXTYNrCnJbhQswxXQWH3QTk9SfIoemrYxxJKI8HHO1t_9eNc4dulH5oQy1dyaK061/s320/iPhone-get-screen-4.png&quot; width=&quot;242&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按點兩下或點三下, 勾選 &quot;截圖&quot; 即可 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphNsV9MtMWS_P7VwiTuQ0jx8CTL7RizIz0GiglG5_ETxzV_dKsKu3mnGP_oHDFb9QlPDJcgW768Psr4d2qCyZYOjizCNaMmPzE8wSHHGXopFqketwo3rI2x7riux3ASYFJ5H9YOQruI2E_mBfH68BuEonz7dDfDz9bSKaVlPz2C88kmwv62vcfutPnYbD/s750/iPhone-get-screen-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;679&quot; data-original-width=&quot;750&quot; height=&quot;290&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphNsV9MtMWS_P7VwiTuQ0jx8CTL7RizIz0GiglG5_ETxzV_dKsKu3mnGP_oHDFb9QlPDJcgW768Psr4d2qCyZYOjizCNaMmPzE8wSHHGXopFqketwo3rI2x7riux3ASYFJ5H9YOQruI2E_mBfH68BuEonz7dDfDz9bSKaVlPz2C88kmwv62vcfutPnYbD/s320/iPhone-get-screen-5.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;設定好後, 手指在手機背板輕敲兩下就可截圖了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/7050508983413242943/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/7050508983413242943' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7050508983413242943'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7050508983413242943'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/iphone.html' title='iPhone 手機螢幕截圖方法'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy4wdr21zZmN0fY4jzk45UBIfxV0gRs5xY4VV83HOleQw7w6xeYstjkRWPDVdQUiU8TZglOhhb37r4kwjXkWn3sBl7AT5py0s_k4lJITl-V4_YmjiKyAlTjHSLg3a8ps4ggetBr0Kq3gClrsDx-WkcO0_E4onlwnrSzB5-j83fBTPt1dWd5lD2gtfh9PwB/s72-c/iPhone-get-screen-1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-4221556262752409540</id><published>2026-07-22T16:01:48.075+08:00</published><updated>2026-07-23T17:33:06.332+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Antigravity"/><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><title type='text'>Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (六)</title><content type='html'>&lt;div&gt;前一篇在 Mapleboard 上成功地佈署了新版 serverless 平台, 驗證 API Key 功能正常, 整個專案重構來作業已近尾聲, 本篇要將專案提交上傳更新 GitHub 上的 repo (儲存庫).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;本系列全部文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/google-antigravity_01637717863.html&quot; target=&quot;_blank&quot;&gt;Google Antigravity 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;8. 提交新版 serverless 與上傳 GitHub :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在提交之前, 我回顧了前面的測試過程, 發現剛開始時是從&amp;nbsp;https://github.com/tony1966/serverless.git 複製專案到&amp;nbsp;D:\antigravity_cli\projects 底下, 然後將其打上 tag 標記後建立一個新分支 api-token-auth, 再叫 agy 用 Claude 模型去重構此專案, 這就形成了 Nested Repository (巢狀儲存庫) :&amp;nbsp;serverless 資料夾內自成一國 (裡面有自己的 .git), 而外層的 antigravity_cli 也有自己的 .git 現象.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;站在 D:\antigravity_cli 的角度看 projects/serverless 時, Git 預設只會把 serverless 當成一個被忽略的子目錄或是一個未追蹤的 gitlink, 兩邊的 Commit 完全是分開互不干擾的. 在 serverless 下提交並 push 時會上傳到&amp;nbsp;https://github.com/tony1966/serverless 上, 而非 Antigravity CLI 的 repo 庫https://github.com/tony1966/antigravity_cli. 雖然這種國中有國的情況並不少見, 但我想讓專案資料夾與儲存庫的關係單純點, 所以將此 serverless 專案剪下來貼到 D:\ 下, 與 D:\antigravity_cli\projects 分家.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;分家後的 serverless 也要有自己的 .gitignore, 所以我把 Antigravity CLI 大倉庫下的 .gitignore 複製一份來給它用 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;# Python 相關快取與編譯檔案&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;__pycache__/&lt;/div&gt;&lt;div&gt;*.py[cod]&lt;/div&gt;&lt;div&gt;*$py.class&lt;/div&gt;&lt;div&gt;.pytest_cache/&lt;/div&gt;&lt;div&gt;.poetry/&lt;/div&gt;&lt;div&gt;.venv/&lt;/div&gt;&lt;div&gt;venv/&lt;/div&gt;&lt;div&gt;ENV/&lt;/div&gt;&lt;div&gt;env/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;# 專案實務資料與測試產出&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;*.json&lt;/div&gt;&lt;div&gt;*.db&lt;/div&gt;&lt;div&gt;*.log&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;# 開發工具與編輯器暫存檔&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;.vscode/&lt;/div&gt;&lt;div&gt;.idea/&lt;/div&gt;&lt;div&gt;*.swp&lt;/div&gt;&lt;div&gt;*.bak&lt;/div&gt;&lt;div&gt;.DS_Store&lt;/div&gt;&lt;div&gt;Thumbs.db&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;# 敏感資料與環境變數 (絕對不能上傳)&lt;/div&gt;&lt;div&gt;# ==========================================&lt;/div&gt;&lt;div&gt;.env&lt;/div&gt;&lt;div&gt;.env.local&lt;/div&gt;&lt;div&gt;.env.*.local&lt;/div&gt;&lt;div&gt;*.env&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;分家後的 serverless 專案結構如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;tree serverless /f&amp;nbsp;&lt;/span&gt;&lt;/b&gt; &amp;nbsp;&lt;/div&gt;&lt;div&gt;列出磁碟區 新增磁碟區 的資料夾 PATH&lt;/div&gt;&lt;div&gt;磁碟區序號為 0000027B 1258:16B8&lt;/div&gt;&lt;div&gt;D:\SERVERLESS&lt;/div&gt;&lt;div&gt;│&amp;nbsp; .env&lt;/div&gt;&lt;div&gt;│&amp;nbsp; .gitignore&lt;/div&gt;&lt;div&gt;│&amp;nbsp; Procfile&lt;/div&gt;&lt;div&gt;│&amp;nbsp; requirements.txt&lt;/div&gt;&lt;div&gt;│&amp;nbsp; serverless.db&lt;/div&gt;&lt;div&gt;│&amp;nbsp; serverless.py&lt;/div&gt;&lt;div&gt;│&amp;nbsp; serverless_error.log&lt;/div&gt;&lt;div&gt;│&lt;/div&gt;&lt;div&gt;└─functions&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; add_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; add_table.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; clear_stats.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; delete_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; delete_record.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; drop_table.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; edit_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; execute_sql.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; export_table.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; hello.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; list_functions.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; list_tables.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; save_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; show_schema.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; show_stats.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; update_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; view_table.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&amp;nbsp; __init__.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; │&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; └─apps_backup&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; add.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hello.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; linebot_gemini.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; linebot_gpt.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; send_books_messages.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; send_ksml_books_messages.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; update_ksml_books.py&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這樣便可進行 Git 提交作業了, 首先切換到專案目錄下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;S D:\&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;cd serverless&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後用 git add . 指令將所有變更加入暫存區,&amp;nbsp;把修改過的程式碼與新增的 .gitignore 檔加入追蹤 (.gitignore 內所舉的檔案除外) :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;git add .&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;warning: in the working copy of &#39;functions/save_function.py&#39;, LF will be replaced by CRLF the next time Git touches it&lt;/div&gt;&lt;div&gt;warning: in the working copy of &#39;functions/update_function.py&#39;, LF will be replaced by CRLF the next time Git touches it&lt;/div&gt;&lt;div&gt;PS D:\serverless&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;報出的 warning 可以忽略.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後建立 Commit 紀錄,&amp;nbsp;將變更封裝並附上明確的功能說明 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;git commit -m &quot;feat: implement serverless API core with API Key auth&quot;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;[feature/api-token-auth df845ce] feat: implement serverless API core with API Key auth&lt;/div&gt;&lt;div&gt;&amp;nbsp;5 files changed, 172 insertions(+), 37 deletions(-)&lt;/div&gt;&lt;div&gt;&amp;nbsp;create mode 100644 .gitignore&lt;/div&gt;&lt;div&gt;&amp;nbsp;create mode 100644 functions/hello.py&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;接下來是推送到 GitHub 遠端倉庫的 feature/api-token-auth 分支 (-u 參數會自動建立本地與遠端分支的追蹤關係) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;git push -u origin feature/api-token-auth&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;Enumerating objects: 23, done.&lt;/div&gt;&lt;div&gt;Counting objects: 100% (23/23), done.&lt;/div&gt;&lt;div&gt;Delta compression using up to 16 threads&lt;/div&gt;&lt;div&gt;Compressing objects: 100% (18/18), done.&lt;/div&gt;&lt;div&gt;Writing objects: 100% (18/18), 8.71 KiB | 1.24 MiB/s, done.&lt;/div&gt;&lt;div&gt;Total 18 (delta 7), reused 0 (delta 0), pack-reused 0 (from 0)&lt;/div&gt;&lt;div&gt;remote: Resolving deltas: 100% (7/7), completed with 4 local objects.&lt;/div&gt;&lt;div&gt;remote:&lt;/div&gt;&lt;div&gt;remote: Create a pull request for &#39;feature/api-token-auth&#39; on GitHub by visiting:&lt;/div&gt;&lt;div&gt;remote:&amp;nbsp; &amp;nbsp; &amp;nbsp; https://github.com/tony1966/serverless/pull/new/feature/api-token-auth&lt;/div&gt;&lt;div&gt;remote:&lt;/div&gt;&lt;div&gt;To https://github.com/tony1966/serverless.git&lt;/div&gt;&lt;div&gt;&amp;nbsp;* [new branch]&amp;nbsp; &amp;nbsp; &amp;nbsp; feature/api-token-auth -&amp;gt; feature/api-token-auth&lt;/div&gt;&lt;div&gt;branch &#39;feature/api-token-auth&#39; set up to &lt;span style=&quot;background-color: #fcff01;&quot;&gt;track&lt;/span&gt; &#39;origin/feature/api-token-auth&#39;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見&amp;nbsp;18 個檔案物件已成功打包上傳 (其中包含新的 .gitignore 與 code), 且在 GitHub 成功建立獨立的 feature/api-token-auth 分支與追蹤關係. 這時到 GitHub 去察看此 repo :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8gFr4WP6Me7BwWNGBaknZIzC3iR6bufRfcFNPz094_TiKATYKHNAvXFXSc_Qm2sezC9ij-ghAlXfQALHmHeDHMxdvvhonSO80J5mWDVrFIsMMTj5C46ZmjQ5td_HK46_bHcZQmWXCvGHUnb4UvbFlbuDoOVStMCUz7h3ZCv9hI6tcu2R_crj-XUe8E2_E/s1768/agy-serverless-refator-22.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;924&quot; data-original-width=&quot;1768&quot; height=&quot;167&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8gFr4WP6Me7BwWNGBaknZIzC3iR6bufRfcFNPz094_TiKATYKHNAvXFXSc_Qm2sezC9ij-ghAlXfQALHmHeDHMxdvvhonSO80J5mWDVrFIsMMTj5C46ZmjQ5td_HK46_bHcZQmWXCvGHUnb4UvbFlbuDoOVStMCUz7h3ZCv9hI6tcu2R_crj-XUe8E2_E/s320/agy-serverless-refator-22.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見 GitHub 遠端倉庫 tony1966/serverless 已經順利接收到了最新的變更, 而下方的是 main 分支 (正式生產環境) 的檔案列表, 顯示它依然維持 6 個月前的穩定版本, 只要此 feature/api-token-auth 分支尚未合併到 main 分支就不會影響目前依賴此 repo 的線上服務 (例如 render.com).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;目前暫時先做到這裡, 後續若準備好要把 API Key 驗證功能部署到 Render.com 時, 只要按右上角的 &quot;Compare &amp;amp; pull request&quot; 鈕,&amp;nbsp;檢查變更內容沒問題後按 &quot;Create pull request&quot; 鈕, 再按 &quot;Merge pull request&quot; 與 &quot;Confirm merge&quot; 鈕即可合併的 main 分支, 完成升版的最後一塊拼圖.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果要在終端機下指令合併, 順序如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# 切換到 main 分支&lt;/div&gt;&lt;div&gt;git checkout main&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 拉取遠端最新 main（確保同步）&lt;/div&gt;&lt;div&gt;git pull origin main&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 將 feature 分支合併進 main&lt;/div&gt;&lt;div&gt;git merge feature/api-token-auth&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 推送回 GitHub main 分支（會觸發 Render 自動部署）&lt;/div&gt;&lt;div&gt;git push origin main&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/4221556262752409540/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/4221556262752409540' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/4221556262752409540'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/4221556262752409540'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/google-antigravity-serverless_01315924711.html' title='Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (六)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8gFr4WP6Me7BwWNGBaknZIzC3iR6bufRfcFNPz094_TiKATYKHNAvXFXSc_Qm2sezC9ij-ghAlXfQALHmHeDHMxdvvhonSO80J5mWDVrFIsMMTj5C46ZmjQ5td_HK46_bHcZQmWXCvGHUnb4UvbFlbuDoOVStMCUz7h3ZCv9hI6tcu2R_crj-XUe8E2_E/s72-c/agy-serverless-refator-22.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-6922478677171087085</id><published>2026-07-22T11:04:25.005+08:00</published><updated>2026-07-22T20:41:05.806+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="render.com"/><category scheme="http://www.blogger.com/atom/ns#" term="主機"/><title type='text'>註冊第三個 render.com 帳戶</title><content type='html'>&lt;div&gt;上週完成 serverless 改版後本想先佈署到 Mapleboard 上, 做實際驗證後再提交上傳 GitHub, 但由於 Mapleboard 站台設定引發疑似光世代數據機的雞肋防火牆阻擋問題, 導致本地的圖書館爬蟲要更新 Mapleboard 的 serverless 資料庫時偶而被阻擋, 這讓我對自架網站可靠性動搖. 反觀我架在 render.com 上的 serverless 只要定時 trigger 卻很穩定在運行, 可見雲端還是比較可靠, 所以今天又註冊了一個 render.com 帳戶來做測試.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列全部測試文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2025/10/rendercom.html&quot; target=&quot;_blank&quot;&gt;render.com 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;首先到 render.com 官網按右上角的 Sign Up 鈕進入註冊頁面 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://render.com/&quot; target=&quot;_blank&quot;&gt;https://render.com/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這次使用 Google 帳戶註冊, 過程比用 email 簡單 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVn5NHVsvghbofktC0qyJQ9D6j27nwmnQsLe0CcW5CeO45QGcVVkuwnvGmEOSzYioSDuInCvc7fj4yqxRmmJ0ITIhV9owr8oCAaUGsifohJGsoOc9YgscATMY2KS5YyCRQdUWT28k1BE7f3DNyr7EiwnQqtMiV0yIPFXsB9oEj9hcEM5SxLivVLZCaJc7o/s1922/render.com-signup3-gmail-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1206&quot; data-original-width=&quot;1922&quot; height=&quot;201&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVn5NHVsvghbofktC0qyJQ9D6j27nwmnQsLe0CcW5CeO45QGcVVkuwnvGmEOSzYioSDuInCvc7fj4yqxRmmJ0ITIhV9owr8oCAaUGsifohJGsoOc9YgscATMY2KS5YyCRQdUWT28k1BE7f3DNyr7EiwnQqtMiV0yIPFXsB9oEj9hcEM5SxLivVLZCaJc7o/s320/render.com-signup3-gmail-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;選擇 Google 帳戶後按 &quot;繼續&quot; 即可 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWAN5Fl2t39XDB3hC_3sgCQ-ZzTP8cMDUWxUIZQHc3aUpHuEDU0_c5cEG7sRw0zC3F6Xjd1FVbGuHQb24CyAQYO0D_TmMLNoRvM0cjmovjbC6-n6G5yf4bLApcWCtoRxjanJgO676t8IuL0MJCRTm-1AMiNbwWWH4xmLhL5t0tlIWt5RmusxmY8XVCXr8w/s1898/render.com-signup3-gmail-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;966&quot; data-original-width=&quot;1898&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWAN5Fl2t39XDB3hC_3sgCQ-ZzTP8cMDUWxUIZQHc3aUpHuEDU0_c5cEG7sRw0zC3F6Xjd1FVbGuHQb24CyAQYO0D_TmMLNoRvM0cjmovjbC6-n6G5yf4bLApcWCtoRxjanJgO676t8IuL0MJCRTm-1AMiNbwWWH4xmLhL5t0tlIWt5RmusxmY8XVCXr8w/s320/render.com-signup3-gmail-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZke3E45gzTvzcUww1JZeq6vz6ZqXo-OUogogyd8Fm2wrHiVjqgHKrB9IMeSkVtI9Co6qHRFx9XTShX_Z9OsBOfWtPAkcI49lNIOKQ7loHMvr0fKQgXZmveTReeUhUWQ5WwQBfg4p4hzESBW0GvJUxK7Hul-QwEtuzPchW3WM8zkPGCi044igCyQjH1Pv/s1759/render.com-signup3-gmail-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;992&quot; data-original-width=&quot;1759&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZke3E45gzTvzcUww1JZeq6vz6ZqXo-OUogogyd8Fm2wrHiVjqgHKrB9IMeSkVtI9Co6qHRFx9XTShX_Z9OsBOfWtPAkcI49lNIOKQ7loHMvr0fKQgXZmveTReeUhUWQ5WwQBfg4p4hzESBW0GvJUxK7Hul-QwEtuzPchW3WM8zkPGCi044igCyQjH1Pv/s320/render.com-signup3-gmail-3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;註冊成功直接進入 Dashboard 頁面 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6RfX4phUbw6kMiLMSjEH3JOjNp0rViTWk1FAvBUrc5IS2SvlKu7vUtI7xkxiqkecTib65V8p0ZhB-XNU4ldmp0hyqUIN1HXv5Xlk0fy8mGgesf7r1dWfN3wD__wqhczo4lw_IZYx4ydPII9ctEIWVXjO2jNvH0JPDtldwWRNFgpk2Bpas2vQFxZ1_xsn/s2461/render.com-signup3-gmail-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1042&quot; data-original-width=&quot;2461&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6RfX4phUbw6kMiLMSjEH3JOjNp0rViTWk1FAvBUrc5IS2SvlKu7vUtI7xkxiqkecTib65V8p0ZhB-XNU4ldmp0hyqUIN1HXv5Xlk0fy8mGgesf7r1dWfN3wD__wqhczo4lw_IZYx4ydPII9ctEIWVXjO2jNvH0JPDtldwWRNFgpk2Bpas2vQFxZ1_xsn/s320/render.com-signup3-gmail-4.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/6922478677171087085/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/6922478677171087085' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/6922478677171087085'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/6922478677171087085'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/rendercom.html' title='註冊第三個 render.com 帳戶'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVn5NHVsvghbofktC0qyJQ9D6j27nwmnQsLe0CcW5CeO45QGcVVkuwnvGmEOSzYioSDuInCvc7fj4yqxRmmJ0ITIhV9owr8oCAaUGsifohJGsoOc9YgscATMY2KS5YyCRQdUWT28k1BE7f3DNyr7EiwnQqtMiV0yIPFXsB9oEj9hcEM5SxLivVLZCaJc7o/s72-c/render.com-signup3-gmail-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-177056715904236751</id><published>2026-07-20T18:07:21.077+08:00</published><updated>2026-07-20T18:08:00.699+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="好站"/><category scheme="http://www.blogger.com/atom/ns#" term="旅行"/><title type='text'>好站 : 萊斯特的岡山遊記</title><content type='html'>&lt;div&gt;上週水某在 YT 找到萊斯特的岡山旅遊影片, 裡面介紹許多好吃的岡山美食 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lVvJfjaRC_8&quot; target=&quot;_blank&quot;&gt;【第一次去日本岡山玩透透✈️】岡山城 後樂園 吉備津神社｜岡山2天自由行攻略&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/lVvJfjaRC_8&quot; width=&quot;320&quot; youtube-src-id=&quot;lVvJfjaRC_8&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=4ECRCZV1GCw&quot; target=&quot;_blank&quot;&gt;【岡山倉敷二日遊怎麼安排？】不只有倉敷美觀地區！兒島牛仔褲街、鷲羽山瀨戶大橋也值得去&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/4ECRCZV1GCw&quot; width=&quot;320&quot; youtube-src-id=&quot;4ECRCZV1GCw&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;旅程前四天要來看一下別人的遊記, 隨時補充或修正行程規劃.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/177056715904236751/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/177056715904236751' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/177056715904236751'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/177056715904236751'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/blog-post_20.html' title='好站 : 萊斯特的岡山遊記'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/lVvJfjaRC_8/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-686885740870064149</id><published>2026-07-19T19:50:14.024+08:00</published><updated>2026-07-19T19:50:14.024+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="好書"/><category scheme="http://www.blogger.com/atom/ns#" term="網購"/><title type='text'>博客來買書一本 : Gemini 投資理財全攻略</title><content type='html'>&lt;div&gt;今天在博客來看到這本旗標的書 66 折, 這種好康當然不錯過 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.books.com.tw/products/0011055845&quot; target=&quot;_blank&quot;&gt;Gemini 投資理財全攻略：小資族看過來！完全零門檻的 AI 智慧選股×財報分析×資金管理&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTt_ER-XZaYx4sN4_MBL0q0ikO_0dveLfWTxLdGh52GIUkpaXl93wYVkTGsCckaRA9a-_T1FMLEp180AKifDz3dwOM8XVPTyoO1HMGsKEet35PcsClDWNH9ey7AX2IGJRLe-f0j6HuPY7gYck9DKP5xDKmvgczfeazwqALtvftpsYdW-hdHYe3m7RzbUZs/s2100/%E5%8D%9A%E5%AE%A2%E4%BE%86%E8%B2%B7%E6%9B%B8%E4%B8%80%E6%9C%AC-Gemini%20%E6%8A%95%E8%B3%87%E7%90%86%E8%B2%A1%E5%85%A8%E6%94%BB%E7%95%A5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;769&quot; data-original-width=&quot;2100&quot; height=&quot;117&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTt_ER-XZaYx4sN4_MBL0q0ikO_0dveLfWTxLdGh52GIUkpaXl93wYVkTGsCckaRA9a-_T1FMLEp180AKifDz3dwOM8XVPTyoO1HMGsKEet35PcsClDWNH9ey7AX2IGJRLe-f0j6HuPY7gYck9DKP5xDKmvgczfeazwqALtvftpsYdW-hdHYe3m7RzbUZs/s320/%E5%8D%9A%E5%AE%A2%E4%BE%86%E8%B2%B7%E6%9B%B8%E4%B8%80%E6%9C%AC-Gemini%20%E6%8A%95%E8%B3%87%E7%90%86%E8%B2%A1%E5%85%A8%E6%94%BB%E7%95%A5.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OpenPoint 折 55 點, 實付 340 元 (約 56 折), 至興店取貨.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/686885740870064149/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/686885740870064149' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/686885740870064149'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/686885740870064149'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/gemini.html' title='博客來買書一本 : Gemini 投資理財全攻略'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTt_ER-XZaYx4sN4_MBL0q0ikO_0dveLfWTxLdGh52GIUkpaXl93wYVkTGsCckaRA9a-_T1FMLEp180AKifDz3dwOM8XVPTyoO1HMGsKEet35PcsClDWNH9ey7AX2IGJRLe-f0j6HuPY7gYck9DKP5xDKmvgczfeazwqALtvftpsYdW-hdHYe3m7RzbUZs/s72-c/%E5%8D%9A%E5%AE%A2%E4%BE%86%E8%B2%B7%E6%9B%B8%E4%B8%80%E6%9C%AC-Gemini%20%E6%8A%95%E8%B3%87%E7%90%86%E8%B2%A1%E5%85%A8%E6%94%BB%E7%95%A5.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-7100982352411887455</id><published>2026-07-19T19:39:13.156+08:00</published><updated>2026-07-19T19:39:13.156+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="生活"/><title type='text'>2026 年第 27 周記事</title><content type='html'>&lt;div&gt;過去一周主要在忙著把我之前寫的 serverless 專案用 agy 重構 (選用 Claude 模型), Claude 的 Coding 能力真的沒話說, 三兩下就搞定了. 周末這兩天我把新版程式佈署到 Mapleboard 時遇到站台設定衝突的干擾, 我已一年多未接觸 Mapleboard 網站設定, 印象有點模糊了, 好在透過 Gemini 協助全面修正設定後已解決, serverless 平台重構算是告一段落了. 這如果是像剛開始創建時手刻的話, 恐怕要花上個把月, 現在沒 AI 真是沒法過日子了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;週五下午請假載爸去署立醫院回診, 先去小太陽掛號拿降血壓藥, 半路上 QRV 居然熄火, 最近有兩三次怠速熄火紀錄, 只要重啟引擎即可, 但卻回卻出現引擎異常標誌, 所幸休息一下還能發動. 從署醫拿藥出來順路開到附近的 Nissan 保養廠, 初步檢修是曲軸位置與角度感知器異常造成, 因已四點多需留廠, 想說乾脆就順便做 15.5 萬公里保養, 原本也是預約周六要去大中廠保養的. 廠長先載我跟爸回家. 週六保養的技師來電, 表示檢查發現剎車分泵漏油須換, 四條輪胎胎紋已淺, 且雨刷不良建議更換, 這一次維修總共花了 22000, 真是大手筆. 廠長週六下午把車開回來, 說以後就近在他們廠保養就好, 不用去大中廠,我也覺得這樣較方便. 但若八月買 RAV4 的話, QRV 變成備用車, 保養週期會變長, 我可能會改到八百屋去做例行保養.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本周向福利會寄出諮詢單後, 國都的業務已打電話報價 124 萬, 似乎是可以接受的價格, 下周聯繫時再談. 週四去高都賞車時業務提到希望 8/15 前能決定, 因為目前有銷售競賽. 如果高都下周打電話來, 就用這價格跟她往下談, 可以的話在高都買交車較方便.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;下周五要帶阿中去岡山了, 所以這幾天要複習一下行程並整理行李.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/7100982352411887455/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/7100982352411887455' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7100982352411887455'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7100982352411887455'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/2026-27_0561589578.html' title='2026 年第 27 周記事'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-3824193335074422164</id><published>2026-07-19T00:40:53.031+08:00</published><updated>2026-07-20T16:44:43.178+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Antigravity"/><category scheme="http://www.blogger.com/atom/ns#" term="Mapleboard"/><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><title type='text'>Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (五)</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;經過前面的測試已驗證了重構後的程式碼基本上達成了讓平台具備 API Key 功能的目標, 在提交到 GitHub 之前, 想要先佈署到 Mapleboard 上更新 serverless 到具有 API Key 功能的最新版. 關於 Mapleboard 筆記參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2023/02/mapleboard-mp510-50.html&quot; target=&quot;_blank&quot;&gt;Mapleboard MP510-50 測試筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列全部文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/google-antigravity_01637717863.html&quot; target=&quot;_blank&quot;&gt;Google Antigravity 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;7. 在 Mapleboard 佈署新版 serverless :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;先用 VNC Cloud 遠端連線到 Mapleboard 桌面, 開啟終端機, 切換到 serverless 專案目錄下, 用 zip 指令把整個專案除指定之敏感檔案外全部壓縮成 zip 檔 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;tony1966@LX2438:~/flask_apps/serverless$ &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;zip -r serverless_v4.zip . -x &quot;serverless.db&quot; &quot;serverless_error.log&quot; &quot;*.pyc&quot; &quot;__pycache__/*&quot; &quot;.env&quot;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;參數 -r 表示要遞迴壓縮, 即連同所有子資料夾 (如 functions/) 一起打包.&amp;nbsp;serverless_backup.zip 是壓縮結果的檔檔名. 後面的 .&amp;nbsp;. 代表壓縮當前目錄下的所有東西,&amp;nbsp;-x 參數後面接的是排除 (不壓縮) 名單, 這裡排除了本地資料庫 (serverless.db), 日誌檔 (serverless_error.log), Python 快取檔, 以及含有敏感密碼的 .env 檔.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後用 WinSCP 連線 Mapleboard, 注意, 之前安裝 fail2ban 時為了提升資安, 已修改 SSH 埠 (不再是預設的 22), 埠號可用下列指令查得 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;tony1966@LX2438:~/flask_apps/serverless$ &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;sudo nano /etc/fail2ban/jail.local&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;設定 WinSCP 連線時除了要輸入固定 IP 外, 還要更改 SSH 埠號, 如果用 22 埠是無法連線的. 連線成功後, 先將上面備份的 zip 檔傳送至本地保存. 完成後將本地的 serverless.py 主程式與 functions 資料夾上傳到 Mapleboard 的 serverless 專案目錄下覆蓋舊版程式檔.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;由於主程式 serverless.py 有更改, 所以須用下例指令重啟服務才會運行新版程式 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;tony1966@LX2438:~/flask_apps/serverless$ &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;sudo systemctl restart serverless&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;用瀏覽器測試 hello.py 函式 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3iII6nvIf0svVzgaEhBF1XvmXoGgUlaRd_X9CWBqfx5gll8xF4QrUxTYGd55GlBnkugNBl8ODIedhuu_OPwcG1sIJdfbjluwA3wZOwyU1l78AYbnGtImxhniysHgU5fyhe2EWmPqo898w8K3hFFi6-s85ar19p4_faygSwOZTnk4ZlmnGeRZEAaAsNRLu/s1090/agy-serverless-refator-18.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;268&quot; data-original-width=&quot;1090&quot; height=&quot;79&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3iII6nvIf0svVzgaEhBF1XvmXoGgUlaRd_X9CWBqfx5gll8xF4QrUxTYGd55GlBnkugNBl8ODIedhuu_OPwcG1sIJdfbjluwA3wZOwyU1l78AYbnGtImxhniysHgU5fyhe2EWmPqo898w8K3hFFi6-s85ar19p4_faygSwOZTnk4ZlmnGeRZEAaAsNRLu/s320/agy-serverless-refator-18.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6c2sZFfz23UrejYvPCDdHfIH_2fvRy4RpPV8qutjjxcXPbV1NtVZMbbQnaqjYV8QeaN-V9AJUBHGdAFlOQ4EX92yxVKyUWPMvQM8pZRnBzpS7Xk1kHyKwSnH6QECSqjrxbBZzKbBPm7nylI7ehpfOaeWEoTyhKlH1yVc4NfBa0fxtXpFq_J19bSpmNQc/s1020/agy-serverless-refator-19.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;262&quot; data-original-width=&quot;1020&quot; height=&quot;82&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6c2sZFfz23UrejYvPCDdHfIH_2fvRy4RpPV8qutjjxcXPbV1NtVZMbbQnaqjYV8QeaN-V9AJUBHGdAFlOQ4EX92yxVKyUWPMvQM8pZRnBzpS7Xk1kHyKwSnH6QECSqjrxbBZzKbBPm7nylI7ehpfOaeWEoTyhKlH1yVc4NfBa0fxtXpFq_J19bSpmNQc/s320/agy-serverless-refator-19.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl3RkGoPbUwQrAQtnRGaG8z1s_BEdzVIqY43wxzBkhL66v3Bokr_rWoSyY4YTRBOO5X6K810u6eULtvhNlELz8Dx5n_ASJ-N1TbqE4m4kLOsWyjIQfOsZ6NU9UJqFvhyphenhyphen2nZc8ZsQl06JEnxYvuQq5POP8RSPbuQ42pWLX6InfL7aVgc_fkwxvVTiJxho9n/s891/agy-serverless-refator-20.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;265&quot; data-original-width=&quot;891&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl3RkGoPbUwQrAQtnRGaG8z1s_BEdzVIqY43wxzBkhL66v3Bokr_rWoSyY4YTRBOO5X6K810u6eULtvhNlELz8Dx5n_ASJ-N1TbqE4m4kLOsWyjIQfOsZ6NU9UJqFvhyphenhyphen2nZc8ZsQl06JEnxYvuQq5POP8RSPbuQ42pWLX6InfL7aVgc_fkwxvVTiJxho9n/s320/agy-serverless-refator-20.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;在有登入情況下, 對函式的請求無需攜帶 API Key 即可順利執行;&amp;nbsp; 如果沒有登入就會收到 401 錯誤, 例如 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoNHfClMHsrE5YHb7Y5N3Y6E5IFT8y9KVdeUYXDlPqtlRgYB-bgizQgp9NLjz2-wBCD0gykT0D69i6gDkqxDHr586uxUoQObHULXet-hxjI_oJQSqO0jHta-rybZ19tecz7kX4gKn460M71X9DKc4JmjHzusfSdKgQdDcBDSOObaDLQ68aXgSfbBlgtl-r/s1060/agy-serverless-refator-21.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;296&quot; data-original-width=&quot;1060&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoNHfClMHsrE5YHb7Y5N3Y6E5IFT8y9KVdeUYXDlPqtlRgYB-bgizQgp9NLjz2-wBCD0gykT0D69i6gDkqxDHr586uxUoQObHULXet-hxjI_oJQSqO0jHta-rybZ19tecz7kX4gKn460M71X9DKc4JmjHzusfSdKgQdDcBDSOObaDLQ68aXgSfbBlgtl-r/s320/agy-serverless-refator-21.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;但修改前一篇的 deploy.py 的 URL 想要進行本地佈署 hello.py 卻出現連線異常與 404 等錯誤, 經查原來我的 Mapleboard 之前在架站時 Nginx 與站台 (主要是 hello 站台與 flask.tony1966.cc) 設定出現埠的衝突, 重啟 Nginx 出現 2~3 個 warning. 經過與 Gemini 討論後, 修改站台設定後終於解決此問題, Nginx 設定檔就徹底理順了, 摘要如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;reject_ip 盡職地守在大門口擋掉所有奇奇怪怪的 IP 掃描.&lt;/li&gt;&lt;li&gt;flask.tony1966.cc 安全地走 HTTPS 連線, 讓新版 Serverless 平台, 樹莓派爬蟲與電腦部署都能順暢通訊.&amp;nbsp;&lt;/li&gt;&lt;li&gt;hello 站台也成功轉型, 乾乾淨淨地留在 443 埠當作你的 is_alive 測試通道 (Port 8080/8081).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;站台清單檢視指令 : ls -l /etc/nginx/sites-enabled/&lt;/div&gt;&lt;div&gt;重啟 Nginx 伺服器指令 : sudo nginx -t&lt;/div&gt;&lt;div&gt;重新載入 Nginx 指令&amp;nbsp; :&amp;nbsp;sudo systemctl reload nginx&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;佈署程式 deploy.py 的 URL 要改成 https://flask.tony1966.cc, 下面是佈署市圖爬蟲伺服端程式 update_ksml_books.py 的範例 (&lt;span style=&quot;background-color: #fcff01;&quot;&gt;伺服端程式都不必為 serverless 升版做任何改變&lt;/span&gt;) :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;SERVER_URL=&quot;https://flask.tony1966.cc&quot;&lt;/div&gt;&lt;div&gt;API_TOKEN=&quot;your-api-key&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 2. 定義要佈署的函式名稱與本地檔案路徑&lt;/div&gt;&lt;div&gt;TARGET_FUNCTION_NAME=&quot;update_ksml_books&quot;&lt;/div&gt;&lt;div&gt;LOCAL_FILE_PATH=&quot;update_ksml_books.py&quot;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;再次執行 deploy.py 就順利將函式發佈到 serverless 平台上了 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;D:\python\test&amp;gt;&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;python deploy.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;🚀 正在將 update_ksml_books.py 更新至 https://flask.tony1966.cc...&lt;/div&gt;&lt;div&gt;✅ 函式更新成功！&lt;/div&gt;&lt;div&gt;伺服器回應: {&#39;func_name&#39;: &#39;update_ksml_books&#39;, &#39;message&#39;: &#39;模組 update_ksml_books 已成功更新&#39;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;deploy.py 的完整內容如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# deploy.py&lt;/div&gt;&lt;div&gt;import os&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 1. 設定伺服器資訊與 API Token&lt;/div&gt;&lt;div&gt;# 地端測試可用 http://127.0.0.1:5000，上雲端後改成你的 Render 網址&lt;/div&gt;&lt;div&gt;SERVER_URL=&quot;https://flask.tony1966.cc&quot;&lt;/div&gt;&lt;div&gt;API_TOKEN=&quot;your-api-key&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 2. 定義要佈署的函式名稱與本地檔案路徑&lt;/div&gt;&lt;div&gt;TARGET_FUNCTION_NAME=&quot;update_ksml_books&quot;&lt;/div&gt;&lt;div&gt;LOCAL_FILE_PATH=&quot;update_ksml_books.py&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;def function_exists(func_name):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;檢查遠端伺服器上的函式是否已存在（透過 GET 探測）&quot;&quot;&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/{func_name}&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; headers={&quot;X-API-Key&quot;: API_TOKEN}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response=requests.get(url, headers=headers)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 404 表示不存在，其他狀態（200/400/500）表示檔案存在&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return response.status_code != 404&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.RequestException:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return False&amp;nbsp; # 連線失敗時保守假設不存在&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;def deploy_function():&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 檢查本地檔案是否存在&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if not os.path.exists(LOCAL_FILE_PATH):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ 找不到本地檔案: {LOCAL_FILE_PATH}&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 讀取本地最新的程式碼內容&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; with open(LOCAL_FILE_PATH, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new_code=f.read()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; headers={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;X-API-Key&quot;: API_TOKEN,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Content-Type&quot;: &quot;application/json&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; payload={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;func_name&quot;: TARGET_FUNCTION_NAME,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;code&quot;: new_code&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 3. 自動判斷：函式已存在 → update，不存在 → save（新增）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if function_exists(TARGET_FUNCTION_NAME):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/update_function&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action=&quot;更新&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/save_function&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action=&quot;新增&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;🚀 正在將 {LOCAL_FILE_PATH} {action}至 {SERVER_URL}...&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response=requests.post(url, json=payload, headers=headers)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 新增成功是 201，更新成功是 200&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if response.status_code in (200, 201):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;✅ 函式{action}成功！&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;伺服器回應:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ {action}失敗 (狀態碼: {response.status_code})&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;錯誤原因:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except ValueError:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;非 JSON 回應內容:&quot;, response.text)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.RequestException as e:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;💥 連線發生異常: {e}&quot;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;if __name__ == &quot;__main__&quot;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; deploy_function()&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;市圖爬蟲程式本機版則需要配合 serverless 添加 API Key 功能而升版, 否則請求都會被 401 拒絕, 這部分記在另一篇.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/3824193335074422164/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/3824193335074422164' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3824193335074422164'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3824193335074422164'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/google-antigravity-serverless_02085178204.html' title='Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (五)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3iII6nvIf0svVzgaEhBF1XvmXoGgUlaRd_X9CWBqfx5gll8xF4QrUxTYGd55GlBnkugNBl8ODIedhuu_OPwcG1sIJdfbjluwA3wZOwyU1l78AYbnGtImxhniysHgU5fyhe2EWmPqo898w8K3hFFi6-s85ar19p4_faygSwOZTnk4ZlmnGeRZEAaAsNRLu/s72-c/agy-serverless-refator-18.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-6963481959084120459</id><published>2026-07-18T18:00:14.839+08:00</published><updated>2026-07-18T18:02:11.168+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Antigravity"/><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><title type='text'>Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (四)</title><content type='html'>&lt;div&gt;&lt;div&gt;前面的測試已驗證了重構後的程式碼基本上達成了讓平台具備 API Key 功能的目標, 本篇要來測試本地自動化佈署功能, 在此過程中發現了原系統的一些缺陷, 都利用 agy 請 Claude Sonnet 修正, 除了主程式 serverless.py 外, 還包括 functions 下的 update_function.py 與 save_function.py.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列全部文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/google-antigravity_01637717863.html&quot; target=&quot;_blank&quot;&gt;Google Antigravity 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;6. 本地自動化佈署 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;第一版的 serverless 系統在新增或修改函式時都需登入平台, 透過手動操作網頁來完成, 在本次重構加上 API Key 機制後, 系統安全性增強, 可以在本地撰寫一個自動化佈署程式, 攜帶 API Key 經過驗證完成函式的佈署. 只要寫一個 Python 函式讀取要佈署的函式檔, 然後攜帶 API key 呼叫 update_function 或 save_function 即可完成函式的佈署.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;(1). 與 Claude 討論 :&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt; 我執行下列佈署程式 :&lt;/div&gt;&lt;div&gt;&amp;nbsp; # deploy.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; import os&lt;/div&gt;&lt;div&gt;&amp;nbsp; import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; # 1. 設定伺服器資訊與 API Token&lt;/div&gt;&lt;div&gt;&amp;nbsp; # 地端測試可用 http://127.0.0.1:5000，上雲端後改成你的 Render 網址&lt;/div&gt;&lt;div&gt;&amp;nbsp; SERVER_URL=&quot;http://127.0.0.1:5000&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; API_TOKEN=&quot;new-test-token&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; # 2. 定義要更新的函式名稱與本地檔案路徑&lt;/div&gt;&lt;div&gt;&amp;nbsp; TARGET_FUNCTION_NAME=&quot;hello&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; LOCAL_FILE_PATH=&quot;hello.py&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; def deploy_function():&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; # 檢查本地檔案是否存在&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if not os.path.exists(LOCAL_FILE_PATH):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ 找不到本地檔案: {LOCAL_FILE_PATH}&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; # 讀取本地最新的程式碼內容&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; with open(LOCAL_FILE_PATH, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new_code=f.read()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; # 3. 準備發送給 update_function 的端點與資料&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; # 路由設計是動態載入的 /function/update_function&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/update_function&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; headers={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;X-API-Key&quot;: API_TOKEN,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Content-Type&quot;: &quot;application/json&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; payload={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;func_name&quot;: TARGET_FUNCTION_NAME,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;code&quot;: new_code&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;🚀 正在將 {LOCAL_FILE_PATH} 部署至 {SERVER_URL}...&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 發送 POST 請求更新遠端函式&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response=requests.post(url, json=payload, headers=headers)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 檢查伺服器回應狀態&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if response.status_code == 200:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;✅ 函式更新成功！&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;伺服器回應:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ 更新失敗 (狀態碼: {response.status_code})&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;錯誤原因:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except ValueError:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;非 JSON 回應內容:&quot;, response.text)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; except requests.exceptions.RequestException as e:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;💥 連線發生異常: {e}&quot;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; deploy_function()&lt;/div&gt;&lt;div&gt;&amp;nbsp; ===&lt;/div&gt;&lt;div&gt;&amp;nbsp; 出現如下錯誤 :&lt;/div&gt;&lt;div&gt;&amp;nbsp; D:\python\test&amp;gt;python deploy.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; 🚀 正在將 hello.py 部署至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;&amp;nbsp; ❌ 更新失敗 (狀態碼: 401)&lt;/div&gt;&lt;div&gt;&amp;nbsp; 錯誤原因: {&#39;error&#39;: &#39;Authentication required&#39;, &#39;login_url&#39;: &#39;/login&#39;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; ===&lt;/div&gt;&lt;div&gt;&amp;nbsp; 在提供有效 API Key 情況下應該要能通過不受 login 阻攔, 請修改&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;▸ Thought for 29s&lt;/div&gt;&lt;div&gt;&amp;nbsp; The user is experiencing a 401 error with the message &quot;Authentication required&quot; ...&lt;/div&gt;&lt;div&gt;&amp;nbsp; 問題很清楚。看一下目前的驗證順序：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 根本原因找到了：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 步驟 1（L165）先攔截， update_function&amp;nbsp; 在&amp;nbsp; PROTECTED_FUNCTIONS&amp;nbsp; 裡，API Client 沒有 Session →&lt;/div&gt;&lt;div&gt;&amp;nbsp; 直接 401，根本輪不到步驟 2 的 Token 驗證。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 解法：將兩層驗證合併，一次判斷 Session 或 Token 擇一通過，同時可以移除&amp;nbsp; TOKEN_PROTECTED_FUNCTIONS&lt;/div&gt;&lt;div&gt;&amp;nbsp; （已不需要）：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py)&lt;/div&gt;&lt;div&gt;&amp;nbsp; if __name__ == &quot;__main__&quot;:&lt;/div&gt;&lt;div&gt;● Edit(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 完成。來驗證最終結果：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 還有一個小問題：L184 的步驟編號&amp;nbsp; # 3.&amp;nbsp; 與 L182 的&amp;nbsp; # 3.&amp;nbsp; 重複了，順手修正：&lt;/div&gt;&lt;div&gt;● Edit(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 完成。以下是這次修改的完整說明：&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 問題根源&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 原本流程（有 Bug）：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 步驟 1：update_function 在 PROTECTED_FUNCTIONS？ → 是&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_auth() = False（API Client 無 Session）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;→ 直接 401 ❌ （Token 驗證根本輪不到）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 修正後的流程&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 新流程（handle_function 前三步）：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 步驟 1：一次性完成雙重驗證&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is_session_auth = check_auth()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if 無 Session → 嘗試讀 X-API-Key → 查資料庫 → is_token_auth&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is_authorized = is_session_auth OR is_token_auth&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 步驟 2：管理模組 → 需要 is_authorized，否則 401&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 步驟 3：一般函式 → 需要 is_authorized，否則 401&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 各情境結果&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;呼叫者&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Session&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | API Key&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 結果&lt;/div&gt;&lt;div&gt;&amp;nbsp; -----------------------------|----------------------|----------------------|----------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;瀏覽器管理者（update/save） | ✅&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ❌&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ✅ 放行&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; deploy.py&amp;nbsp; API Client&amp;nbsp; &amp;nbsp; &amp;nbsp; | ❌&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ✅ 有效&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ✅ 放行&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;未認證請求&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ❌&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ❌&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ❌ 401&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;無效 Token&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ❌&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ❌ 無效&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ❌ 401&lt;/div&gt;&lt;div&gt;────────────────────────────────────────────────────────────&lt;/div&gt;&lt;div&gt;&amp;gt; 成功了, 但出現連線異常:&lt;/div&gt;&lt;div&gt;&amp;nbsp; D:\python\test&amp;gt;python deploy.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; 🚀 正在將 hello.py 部署至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;&amp;nbsp; ✅ 函式更新成功！&lt;/div&gt;&lt;div&gt;&amp;nbsp; 💥 連線發生異常: Expecting value: line 1 column 1 (char 0)&lt;/div&gt;&lt;div&gt;&amp;nbsp; 這要修改 deploy.py 還是系統的 update_function.py 較好?&lt;/div&gt;&lt;div&gt;▸ Thought for 27s&lt;/div&gt;&lt;div&gt;&amp;nbsp; The user is seeing a successful update (✅) but then a connection error. Let me...&lt;/div&gt;&lt;div&gt;&amp;nbsp; 先看清楚錯誤發生在哪一行：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;deploy.py&amp;nbsp; 收到 200 → 印出 ✅ → 再執行&amp;nbsp; response.json()&amp;nbsp; 時爆炸，代表&amp;nbsp; update_function.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; 回傳的是 HTML 而非 JSON。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 讓我確認&amp;nbsp; update_function.py&amp;nbsp; 的完整內容：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/functions/update_function.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 問題找到了，而且有兩個 bug 同時存在：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;# | 問題&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 說明&lt;/div&gt;&lt;div&gt;&amp;nbsp; ---|--------------|-------------------------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;1 | 欄位名稱不符 |&amp;nbsp; deploy.py&amp;nbsp; 送&amp;nbsp; func_name ，但&amp;nbsp; update_function.py&amp;nbsp; 讀&amp;nbsp; module_name&amp;nbsp; →&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 讀到空字串&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;2 | 輸入格式不符 |&amp;nbsp; deploy.py&amp;nbsp; 送 JSON body，但&amp;nbsp; update_function.py&amp;nbsp; 只讀&amp;nbsp; request.form&amp;nbsp; →&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 永遠讀不到資料&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;3 | 回應格式不符 | 成功時回傳 HTML， deploy.py&amp;nbsp; 呼叫&amp;nbsp; response.json()&amp;nbsp; 爆炸&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 修哪個？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 修&amp;nbsp; update_function.py ，理由：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; • 這是 server 端的問題（不認識 JSON 輸入、不回傳 JSON）&lt;/div&gt;&lt;div&gt;&amp;nbsp; • 瀏覽器用表單呼叫、API Client 用 JSON 呼叫，server 應該兩者都支援&lt;/div&gt;&lt;div&gt;&amp;nbsp; •&amp;nbsp; deploy.py&amp;nbsp; 的設計是正確的，不需要改&lt;/div&gt;&lt;div&gt;● Edit(D:/antigravity_cli/projects/serverless/functions/update_function.py)&lt;/div&gt;&lt;div&gt;● Create(D:/antigravity_cli/projects/serverless/functions/update_function.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 完成。以下是修改摘要：&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 修改的檔案&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; ### update_function.py&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 修正了三個問題：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;# | 問題&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 修正方式&lt;/div&gt;&lt;div&gt;&amp;nbsp; ---|--------------------------------------|-------------------------------------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;1 | 只讀&amp;nbsp; request.form ，不懂 JSON&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 用&amp;nbsp; request.is_json&amp;nbsp; 判斷，JSON 時改讀&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | request.get_json()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;2 | 只認&amp;nbsp; module_name ，不認&amp;nbsp; func_name&amp;nbsp; | JSON 輸入時同時嘗試讀取&amp;nbsp; func_name&amp;nbsp; 與&amp;nbsp; module_name&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;3 | 成功時只回傳 HTML&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | JSON 請求時回傳&amp;nbsp; {&quot;message&quot;: &quot;...&quot;, &quot;func_name&quot;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &quot;...&quot;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 預期執行結果&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; D:\python\test&amp;gt;python deploy.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 🚀 正在將 hello.py 部署至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ✅ 函式更新成功！&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 伺服器回應: {&#39;func_name&#39;: &#39;hello&#39;, &#39;message&#39;: &#39;模組 hello 已成功更新&#39;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;────────────────────────────────────────────────────────────&lt;/div&gt;&lt;div&gt;&amp;gt; update_function 是更新已有的函式, 如果要新增函式則是使用 add_function 與 save_function,&lt;/div&gt;&lt;div&gt;&amp;nbsp; 如果要佈署新函式, deploy.py 要怎麼改? 同時請分析 add_function.py 與 save_function.py 在執行 deploy.p&lt;/div&gt;&lt;div&gt;&amp;nbsp; 佈署方面是否有需要配合修改之處?&lt;/div&gt;&lt;div&gt;▸ Thought for 1s&lt;/div&gt;&lt;div&gt;&amp;nbsp; The user wants to understand the deployment flow for new functions. Let me first...&lt;/div&gt;&lt;div&gt;&amp;nbsp; 先讀取三個相關檔案：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/functions/add_function.py)&lt;/div&gt;&lt;div&gt;● Read(D:/antigravity_cli/projects/serverless/functions/save_function.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&amp;nbsp; 分析完畢。以下是完整報告：&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 架構釐清&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; add_function&amp;nbsp; → 純 UI 頁面，回傳 HTML 表單，action 指向 save_function&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; save_function → 實際寫檔（新增），只接受 form POST&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; update_function → 實際寫檔（覆蓋），已修改支援 JSON&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; deploy.py 要新增函式，只需呼叫&amp;nbsp; save_function ，不需碰&amp;nbsp; add_function （那是給瀏覽器用的 UI）。&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## save_function.py 的問題（與 update_function 一樣）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;#&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 問題&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 影響&lt;/div&gt;&lt;div&gt;&amp;nbsp; -----------------------------|--------------------------------------|-----------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 只讀&amp;nbsp; request.form ，不懂 JSON&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| API Client 送來的資料讀不到&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 只認&amp;nbsp; module_name ，不認&amp;nbsp; func_name&amp;nbsp; | deploy.py 欄位名稱不符&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 成功/失敗都回傳 HTML&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; response.json()&amp;nbsp; 會爆炸&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 修改計劃&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 修改&amp;nbsp; save_function.py ：與&amp;nbsp; update_function.py&amp;nbsp; 相同邏輯，支援 JSON/form 雙輸入。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 修改&amp;nbsp; deploy.py ：加入「新增 or 更新」判斷邏輯，自動選擇呼叫&amp;nbsp; save_function&amp;nbsp; 或&amp;nbsp; update_function&lt;/div&gt;&lt;div&gt;&amp;nbsp; 。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 開始修改：&lt;/div&gt;&lt;div&gt;● Create(D:/antigravity_cli/projects/serverless/functions/save_function.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 現在修改&amp;nbsp; deploy.py ，加入自動判斷新增或更新：&lt;/div&gt;&lt;div&gt;● Create(D:/python/test/deploy.py) (ctrl+o to expand)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 完成。以下是完整摘要：&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 修改了哪些檔案&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;檔案&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 修改內容&lt;/div&gt;&lt;div&gt;&amp;nbsp; --------------------------------|-----------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;save_function.py&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 支援 JSON/form 雙輸入、相容&amp;nbsp; func_name / module_name 、回傳&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | JSON（201）或 HTML&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;deploy.py&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 新增&amp;nbsp; function_exists()&amp;nbsp; 探測，自動選&amp;nbsp; save_function&amp;nbsp; 或&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | update_function&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; functions/update_function.py&amp;nbsp; | 上一輪已修改，本次不動&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; add_function.py&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 不需修改，它只是瀏覽器 UI 頁面&lt;/div&gt;&lt;div&gt;&amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## deploy.py 新流程&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 執行 deploy.py&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; function_exists()：GET /function/{func_name}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ├─ 404 → 函式不存在 → POST /function/save_function&amp;nbsp; → 回 201 ✅&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; └─ 其他 → 函式已存在 → POST /function/update_function → 回 200 ✅&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ──────&lt;/div&gt;&lt;div&gt;&amp;nbsp; ## 預期執行結果&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 第一次佈署（函式不存在）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 🚀 正在將 hello.py 新增至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ✅ 函式新增成功！&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 伺服器回應: {&#39;func_name&#39;: &#39;hello&#39;, &#39;message&#39;: &#39;模組 hello 已成功建立&#39;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 第二次佈署（函式已存在）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 🚀 正在將 hello.py 更新至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ✅ 函式更新成功！&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 伺服器回應: {&#39;func_name&#39;: &#39;hello&#39;, &#39;message&#39;: &#39;模組 hello 已成功更新&#39;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;(2). 本地佈署測試 :&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;上面程序中 Claude 已經修改 serverless.py, update_function.py, 以及 save_function.py, 且修正了原先使用的佈署程式 deploy.py. 接下來要實測看看是否可在本機用佈署程式 deploy.py 將 hello.py 發布到後端平台上.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;先複習一下 serverless 平台的函式檔基本架構 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# func_module.py&lt;/div&gt;&lt;div&gt;def main(request, **kwargs):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; config=kwargs.get(&#39;config&#39;, {})&amp;nbsp; # 預設為空 dict&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; result=&#39;do something&#39;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; return result&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意, main() 的參數一定要傳入 request 與關鍵字參數 **kwargs :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;request :&lt;br /&gt;用來接收 HTTP 請求的相關資訊 (例如前端傳進來的 Payload, Query Parameters, Headers等).&lt;/li&gt;&lt;li&gt;**kwargs 與 config :&lt;br /&gt;這是一個極具擴充性的設計, 透過 kwargs.get(&#39;config&#39;, {}) 可以在伺服器端 (Flask 主程式) 執行該函式時動態注入系統級的配置或環境變數 (例如資料庫連線字串, 加密金鑰等), 而不需要把這些敏感資訊寫死在 hello.py 裡面.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;為了展示此架構中 main() 的兩個參數用途, 先開啟 .env 檔, 添加一個環境變數 DB_TIMEOUT :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;DB_TIMEOUT=30&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後按照上面的函式架構寫了一個新的 hello.py 函式檔 (其實只是加上讀取環境變數 DB_TIMEOUT 而已) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# hello.py&lt;/div&gt;&lt;div&gt;def main(request, **kwargs):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 讀取系統注入的設定（如果有的話）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; config=kwargs.get(&#39;config&#39;, {})&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 這裡可以安全地取得環境變數&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; db_timeout=config.get(&#39;DB_TIMEOUT&#39;, 30)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 先從請求字串擷取 name 參數 (?name=)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; name=request.args.get(&#39;name&#39;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if not name:&amp;nbsp; &amp;nbsp;# 請求字串沒有 name 參數&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 嘗試從 RESTful 子路徑 (例如 /function/hello/Tony) 中擷取 name 參數&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subpath=request.view_args.get(&#39;subpath&#39;, &#39;&#39;)&amp;nbsp; &amp;nbsp;# 取得 Flask 傳入的 subpath 參數&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parts=subpath.strip(&#39;/&#39;).split(&#39;/&#39;)&amp;nbsp; &amp;nbsp;# 拆解成串列例如 [&#39;Tony&#39;]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if parts:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=parts[0]&amp;nbsp; &amp;nbsp;# 取第一段作為 name (例如 &#39;Tony&#39;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 從 request 也沒有找到&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if not name:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=&#39;World&#39;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; result=f&quot;Hello {name}! Database timeout is set to {db_timeout}s.&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; return result&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後用下列 Claude 修正過的 deploy.py 程式來佈署此新的 hello.py (注意 API_TOKEN 必須填入有效的 API Key) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# deploy.py&lt;/div&gt;&lt;div&gt;import os&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 1. 設定伺服器資訊與 API Token&lt;/div&gt;&lt;div&gt;# 地端測試可用 http://127.0.0.1:5000，上雲端後改成你的 Render 網址&lt;/div&gt;&lt;div&gt;SERVER_URL=&quot;http://127.0.0.1:5000&quot;&lt;/div&gt;&lt;div&gt;API_TOKEN=&quot;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;new-test-token&lt;/span&gt;&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 2. 定義要佈署的函式名稱與本地檔案路徑&lt;/div&gt;&lt;div&gt;TARGET_FUNCTION_NAME=&quot;hello&quot;&lt;/div&gt;&lt;div&gt;LOCAL_FILE_PATH=&quot;hello.py&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;def function_exists(func_name):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;檢查遠端伺服器上的函式是否已存在（透過 GET 探測）&quot;&quot;&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/{func_name}&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; headers={&quot;X-API-Key&quot;: API_TOKEN}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response=requests.get(url, headers=headers)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 404 表示不存在，其他狀態（200/400/500）表示檔案存在&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return response.status_code != 404&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.RequestException:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return False&amp;nbsp; # 連線失敗時保守假設不存在&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;def deploy_function():&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 檢查本地檔案是否存在&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if not os.path.exists(LOCAL_FILE_PATH):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ 找不到本地檔案: {LOCAL_FILE_PATH}&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 讀取本地最新的程式碼內容&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; with open(LOCAL_FILE_PATH, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new_code=f.read()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; headers={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;X-API-Key&quot;: API_TOKEN,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Content-Type&quot;: &quot;application/json&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; payload={&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;func_name&quot;: TARGET_FUNCTION_NAME,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;code&quot;: new_code&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 3. 自動判斷：函式已存在 → update，不存在 → save（新增）&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if function_exists(TARGET_FUNCTION_NAME):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/update_function&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action=&quot;更新&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url=f&quot;{SERVER_URL}/function/save_function&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action=&quot;新增&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;🚀 正在將 {LOCAL_FILE_PATH} {action}至 {SERVER_URL}...&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response=requests.post(url, json=payload, headers=headers)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 新增成功是 201，更新成功是 200&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if response.status_code in (200, 201):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;✅ 函式{action}成功！&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;伺服器回應:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;❌ {action}失敗 (狀態碼: {response.status_code})&quot;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;錯誤原因:&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except ValueError:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;非 JSON 回應內容:&quot;, response.text)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.RequestException as e:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(f&quot;💥 連線發生異常: {e}&quot;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;if __name__ == &quot;__main__&quot;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; deploy_function()&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見 Claude 修改後的 deploy.py 是透過讀取 functions 資料夾下有無該函式來判斷是要新增 (無) 還是更新 (有), 目前 functions 下有 hello.py, 所以執行&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;執行結果 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;D:\python\test&amp;gt;&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;python deploy.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;🚀 正在將 hello.py 部署至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;✅ 函式更新成功！&lt;/div&gt;&lt;div&gt;伺服器回應: {&#39;func_name&#39;: &#39;hello&#39;, &#39;message&#39;: &#39;模組 hello &lt;span style=&quot;background-color: #fcff01;&quot;&gt;已成功更新&lt;/span&gt;&#39;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;接下來驗證此新佈署的 hello.py 函式功能是否正確 :&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN-HEaExlVwlgV3DME7MaxyAnCd1lH1-Y6d9WfUuS4StcVMwM0EDFFvjAYiHXO3zJ2BUWgWwqiAoAJIOSupnf11VQDVjk3JpbHwnc2tHcyB13ahu-8j2cfH8QmwvuNupr8hLQ30QvFeA9bYEj68L07FIccAqQaCzcwfMjcX_pmkkMVZDIj_KNvg2-iiqU8/s1047/agy-serverless-refator-15.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;252&quot; data-original-width=&quot;1047&quot; height=&quot;77&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN-HEaExlVwlgV3DME7MaxyAnCd1lH1-Y6d9WfUuS4StcVMwM0EDFFvjAYiHXO3zJ2BUWgWwqiAoAJIOSupnf11VQDVjk3JpbHwnc2tHcyB13ahu-8j2cfH8QmwvuNupr8hLQ30QvFeA9bYEj68L07FIccAqQaCzcwfMjcX_pmkkMVZDIj_KNvg2-iiqU8/s320/agy-serverless-refator-15.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-SwjZnUobhrEEn-1yDBul_q-6X6VRt4nBLDM3mCrFCmRg1u7KaAvTnf1l_faHVR2oqJYOtwkeees04gRvSJXmObKarX17eoUJe1rbLWQZ63HzDLxgxF4Xmgx8EOFQIXazlzGb8SJWXz2FDvVbKgYqgu5mBO4PEvm5UlSL17ySLHRPeFmwOOg8dJ5O2SmR/s1031/agy-serverless-refator-16.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;266&quot; data-original-width=&quot;1031&quot; height=&quot;83&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-SwjZnUobhrEEn-1yDBul_q-6X6VRt4nBLDM3mCrFCmRg1u7KaAvTnf1l_faHVR2oqJYOtwkeees04gRvSJXmObKarX17eoUJe1rbLWQZ63HzDLxgxF4Xmgx8EOFQIXazlzGb8SJWXz2FDvVbKgYqgu5mBO4PEvm5UlSL17ySLHRPeFmwOOg8dJ5O2SmR/s320/agy-serverless-refator-16.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH8jJvAVh-o6V25bg1UjXFUv1qwVZNc__wIYyx34bb0KhS5v5AtSDVWXJaDqIk3QFyss9IyHK10uVuorHFTr6C3BmkiUrbYXfGBM4k5xBJhGHPVFePJ3pKoCyWQ38pa1OuCC1DyRJXOGVFpYaLg5LCtWYT92jLgXCzaJfQ9b0y_Jcujd6WCOzWAOqL504j/s897/agy-serverless-refator-17.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;269&quot; data-original-width=&quot;897&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH8jJvAVh-o6V25bg1UjXFUv1qwVZNc__wIYyx34bb0KhS5v5AtSDVWXJaDqIk3QFyss9IyHK10uVuorHFTr6C3BmkiUrbYXfGBM4k5xBJhGHPVFePJ3pKoCyWQ38pa1OuCC1DyRJXOGVFpYaLg5LCtWYT92jLgXCzaJfQ9b0y_Jcujd6WCOzWAOqL504j/s320/agy-serverless-refator-17.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見不同的參數傳遞方式功能都正確, 且 .env 中的環境變數 DB_TIMEOUT 也正確讀到了. 接下來測試 save_function 是否能順利佈署新函式, 先把 functions 底下的 hello.py 刪除, 然後再執行一次 deploy.py :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;D:\python\test&amp;gt;&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;python deploy.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;🚀 正在將 hello.py 新增至 http://127.0.0.1:5000...&lt;/div&gt;&lt;div&gt;✅ 函式新增成功！&lt;/div&gt;&lt;div&gt;伺服器回應: {&#39;func_name&#39;: &#39;hello&#39;, &#39;message&#39;: &#39;模組 hello &lt;span style=&quot;background-color: #fcff01;&quot;&gt;已成功建立&lt;/span&gt;&#39;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;檢視 functions 下果然 hello.py 已被建立, 再次執行網頁測試結果相同.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/6963481959084120459/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/6963481959084120459' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/6963481959084120459'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/6963481959084120459'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/google-antigravity-serverless_01680857755.html' title='Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (四)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN-HEaExlVwlgV3DME7MaxyAnCd1lH1-Y6d9WfUuS4StcVMwM0EDFFvjAYiHXO3zJ2BUWgWwqiAoAJIOSupnf11VQDVjk3JpbHwnc2tHcyB13ahu-8j2cfH8QmwvuNupr8hLQ30QvFeA9bYEj68L07FIccAqQaCzcwfMjcX_pmkkMVZDIj_KNvg2-iiqU8/s72-c/agy-serverless-refator-15.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-17001687674995874</id><published>2026-07-18T07:00:14.245+08:00</published><updated>2026-07-18T16:07:06.370+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Antigravity"/><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><title type='text'>Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (三)</title><content type='html'>&lt;div&gt;&lt;div&gt;在前一篇測試中利用 Antigravity CLI (agy) 完成 serverless 函式執行平台的重構, 為其加上 API Key 認證機制, 所有請求必須在標頭中攜帶有效的 X-API-Key 屬性值, 否則請求將被拒絕, 使用 curl.exe 驗證新版 serverless 功能確實符合要求, 本篇則要改用 requests 套件來測試, 這是在實際應用中最常見用法.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列全部文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/google-antigravity_01637717863.html&quot; target=&quot;_blank&quot;&gt;Google Antigravity 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;5. 使用 requests 提出請求 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;使用 requests 套件發送請求時, 要將 API Key 放進 headers 參數中的&amp;nbsp;X-API-Key 欄位傳送給伺服器, 請求的 HTTP 方法可以使用 GET 或 POST, 分別呼叫 requests.get() 與 requests.post() 函式.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意, 在前一篇測試中我們已將 API Key 更新如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUt155lo0tkBrri5GfHDk_cmODgrjk8Edbn6i4ewytvuWjXwsycZu8IAxqn-x90-oylc9zacf5N1jRhWf2MugQDBrAKYxyly1hQEUy-33TpGuvbsyOvN5KHvEHz-4lkQzsQ3fWD5gBEeARXywyQTNjOV7UTvikBTxbrs24He0d3_d-TlD8cUK30agf3nCI/s1703/agy-serverless-refator-14.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;575&quot; data-original-width=&quot;1703&quot; height=&quot;108&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUt155lo0tkBrri5GfHDk_cmODgrjk8Edbn6i4ewytvuWjXwsycZu8IAxqn-x90-oylc9zacf5N1jRhWf2MugQDBrAKYxyly1hQEUy-33TpGuvbsyOvN5KHvEHz-4lkQzsQ3fWD5gBEeARXywyQTNjOV7UTvikBTxbrs24He0d3_d-TlD8cUK30agf3nCI/s320/agy-serverless-refator-14.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;以下測試將使用&amp;nbsp;&amp;nbsp;new-test-token 這個 API Key.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;(1). 使用 GET 方法 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GET 方法不帶 Body, 只需要單純將 API Key 放入 headers 中的 X-API-Key 欄位, 然後在呼叫 requests.get() 時傳入 headers 參數即可, 例如 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# serverless_api_key_get_ok.py&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;url=&quot;http://localhost:5000/function/hello&quot;&lt;/div&gt;&lt;div&gt;headers={&quot;X-API-Key&quot;: &quot;new-test-token&quot;}&lt;/div&gt;&lt;div&gt;response=requests.get(url, headers=headers)&lt;/div&gt;&lt;div&gt;if response.status_code == 200:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(&quot;回應:&quot;, response.text)&lt;/div&gt;&lt;div&gt;else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;錯誤 {response.status_code}:&quot;, response.text)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;此處因為 hello.py 傳回值是純文字, 所以用 resposne.text 而非 response.json() 取得回應值, 執行結果如下, 因為傳送了有效的 API Key, 所以伺服器回應 200 OK :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; %&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;Run serverless_api_key_get_ok.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;回應: Hello World!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果沒有傳送有效的 API Key, 請求會被拒絕而得到 401 回應, 例如 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# serverless_api_key_get_ng.py&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;url=&quot;http://localhost:5000/function/hello&quot;&lt;/div&gt;&lt;div&gt;response=requests.get(url)&lt;/div&gt;&lt;div&gt;if response.status_code == 200:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(&quot;回應:&quot;, response.text)&lt;/div&gt;&lt;div&gt;else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;錯誤 {response.status_code}:&quot;, response.text)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;執行結果如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; %&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;Run serverless_api_key_get_ng.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;錯誤 401: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;error&quot;: &quot;Missing API token&quot;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;hint&quot;: &quot;Provide X-API-Key header&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;(2). 使用 POST 方法 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;呼叫 requests.post() 時傳入有效的 API Key 就可順利取得 200 OK 回應, 例如 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# serverless_api_key_post_ok.py&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;url=&quot;http://localhost:5000/function/hello&quot;&lt;/div&gt;&lt;div&gt;headers={&quot;X-API-Key&quot;: &quot;new-test-token&quot;}&lt;/div&gt;&lt;div&gt;response=requests.post(url, headers=headers)&lt;/div&gt;&lt;div&gt;if response.status_code == 200:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 先嘗試用 JSON 解析&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;回應 (JSON):&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.JSONDecodeError:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 如果不是 JSON 就印出純文字&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;回應 (純文字):&quot;, response.text)&lt;/div&gt;&lt;div&gt;else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;錯誤 {response.status_code}:&quot;, response.text)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;此例使用 try catch 來判斷回應物件型態是 JSON 格式字串還是純文字, 前者呼叫 response.json() 取得回應內容, 後者則用 response.text, 執行結果如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; %&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;Run serverless_api_key_post_ok.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;回應 (純文字): Hello World!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果呼叫 requests.post() 時沒有傳入有效的 API Key 就會收到 401 錯誤, 例如 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# serverless_api_key_post_ng.py&lt;/div&gt;&lt;div&gt;import requests&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;url=&quot;http://localhost:5000/function/hello&quot;&lt;/div&gt;&lt;div&gt;response=requests.post(url)&lt;/div&gt;&lt;div&gt;if response.status_code == 200:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 先嘗試用 JSON 解析&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;回應 (JSON):&quot;, response.json())&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except requests.exceptions.JSONDecodeError:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 如果不是 JSON 就印出純文字&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;回應 (純文字):&quot;, response.text)&lt;/div&gt;&lt;div&gt;else:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; print(f&quot;錯誤 {response.status_code}:&quot;, response.text)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;執行結果如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt;&amp;gt; %&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;Run serverless_api_key_post_ng.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;錯誤 401: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;error&quot;: &quot;Missing API token&quot;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;hint&quot;: &quot;Provide X-API-Key header&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以上測試說明重構後的 serverless 平台確實已改為 API Key 版本, 任何請求必須攜帶 API Key 才可能取得 200 OK 回應, 否則請求都會被拒絕, 收到 401 錯誤.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;6. 主程式原始碼異動摘要 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;經過上面測試, 我們確認了此重購專案已達成了預期目標, 以下做個 Code Review, 將主程式 serverless.py 的異動摘要如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;首先是在 init_db() 函式中添加了一個儲存 API Key 的認證資料表 api_tokens :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # API Token 認證表&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; cursor.execute(&quot;&quot;&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CREATE TABLE IF NOT EXISTS api_tokens (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;INTEGER PRIMARY KEY AUTOINCREMENT,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; token&amp;nbsp; &amp;nbsp; &amp;nbsp; TEXT&amp;nbsp; &amp;nbsp; NOT NULL UNIQUE,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; owner&amp;nbsp; &amp;nbsp; &amp;nbsp; TEXT&amp;nbsp; &amp;nbsp; NOT NULL,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is_active&amp;nbsp; INTEGER NOT NULL DEFAULT 1,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; created_at TEXT&amp;nbsp; &amp;nbsp; NOT NULL DEFAULT (datetime(&#39;now&#39;))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其次是添加了一個 TOKEN_PROTECTED_FUNCTIONS 清單 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# 需要 API Token 驗證的函式列表（儲存/更新 function 及所有一般函式執行）&lt;/div&gt;&lt;div&gt;TOKEN_PROTECTED_FUNCTIONS=[&#39;save_function&#39;, &#39;update_function&#39;]&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這兩個系統函式 save_function 與 update_function 用來將函式內容寫進檔案中, 屬於最高權限的敏感操作, 必須通過 API Key 驗證.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其三是新增了一個 require_api_token() 函式來檢查請求標頭中是否有攜帶有效之 API Key, 有就傳回所呼叫的函式, 否則傳回 401 錯誤 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;def require_api_token(f):&amp;nbsp; # 裝飾器：驗證請求 Header 中的 X-API-Key&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; @wraps(f)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; def decorated(*args, **kwargs):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; token=request.headers.get(&#39;X-API-Key&#39;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not token:&amp;nbsp; # Header 遺失&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return jsonify({&#39;error&#39;: &#39;Missing API token&#39;, &#39;hint&#39;: &#39;Provide X-API-Key header&#39;}), 401&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conn=sqlite3.connect(DB_PATH)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor=conn.cursor()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor.execute(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;SELECT id FROM api_tokens WHERE token=? AND is_active=1&#39;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (token,)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; row=cursor.fetchone()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conn.close()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not row:&amp;nbsp; # Token 不存在或已停用&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return jsonify({&#39;error&#39;: &#39;Invalid or inactive API token&#39;}), 401&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return f(*args, **kwargs)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; return decorated&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後是在&amp;nbsp;handle_function() 函式中添加雙軌互補驗證 (Session 或 Token 擇一通過) 機制 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # 2. API Token 驗證：已登入管理者直接放行；否則需提供有效 Token&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; #&amp;nbsp; &amp;nbsp; 觸發範圍：TOKEN_PROTECTED_FUNCTIONS（save/update）及所有一般函式&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if func_name in TOKEN_PROTECTED_FUNCTIONS or func_name not in PROTECTED_FUNCTIONS:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not check_auth():&amp;nbsp; # 管理者已登入 → 信任，跳過 Token 驗證&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; token=request.headers.get(&#39;X-API-Key&#39;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not token:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return jsonify({&#39;error&#39;: &#39;Missing API token&#39;, &#39;hint&#39;: &#39;Provide X-API-Key header&#39;}), 401&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conn=sqlite3.connect(DB_PATH)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor=conn.cursor()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor.execute(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;SELECT id FROM api_tokens WHERE token=? AND is_active=1&#39;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (token,)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; row=cursor.fetchone()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conn.close()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not row:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return jsonify({&#39;error&#39;: &#39;Invalid or inactive API token&#39;}), 401&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;這段程式碼採用了巢狀條件設計, 提供了兩道過濾網 :&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;第一層 (判定範圍) :只要呼叫的函式是敏感的系統功能 (save/update_function) 或任何使用者自訂函式 (不在白名單內) 就會觸發此區塊.&lt;/li&gt;&lt;li&gt;第二層 (身份切換) :&lt;/li&gt;&lt;ul&gt;&lt;li&gt;情境 A (管理員) :&lt;br /&gt;瀏覽器帶著 Cookie 請求, check_auth() 回傳 True. 此時 if not check_auth() 判定不成立, 直接跳過整個 Token 檢查與資料庫查詢, 此安排讓管理員登入後線上操作函式更新與存檔不因為沒帶 API Key 而被 401 擋掉.&amp;nbsp;&lt;/li&gt;&lt;li&gt;情境 B (外部 API 呼叫/排程腳本) :&lt;br /&gt;本機 Python 腳本或 curl 請求沒有瀏覽器 Session, 呼叫 check_auth() 會回傳 False, 程式進入 if 內部強制執行後續的 X-API-Key 擷取與 SQLite 比對.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;if not check_auth() 是檢查使用者是否有登入, 沒有登入就要接受 API Key 查驗, 檢查 HTTP 請求的 Header 有沒有帶 X-API-Key 欄位, 沒有帶就直接拒絕請求, 回傳 401 Unauthorized 狀態碼. 如果已登入, 則程式會直接跳過整個 if not check_auth(): 內部的所有程式碼,&amp;nbsp;直接放行去執行該函式.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意此處使用了 SQLite 的參數化查詢 token=? 並把變數包在元組 (token,) 裡傳進去, 這樣可以徹底杜絕駭客在 Header 亂寫 SQL 語法, 利用 SQL Injection 來破解驗證.&amp;nbsp;如果資料庫回傳 None, 表示 API Key 不存在, 或存在但被停用 (is_active 不是 1), 那就回傳 401 錯誤拒絕請求; 反之就是通過了驗證, 准許呼叫此函式, 放行讓後續的業務邏輯繼續執行.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/17001687674995874/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/17001687674995874' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/17001687674995874'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/17001687674995874'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/google-antigravity-serverless_0994186443.html' title='Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (三)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUt155lo0tkBrri5GfHDk_cmODgrjk8Edbn6i4ewytvuWjXwsycZu8IAxqn-x90-oylc9zacf5N1jRhWf2MugQDBrAKYxyly1hQEUy-33TpGuvbsyOvN5KHvEHz-4lkQzsQ3fWD5gBEeARXywyQTNjOV7UTvikBTxbrs24He0d3_d-TlD8cUK30agf3nCI/s72-c/agy-serverless-refator-14.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-1238654690755055072</id><published>2026-07-18T00:00:35.791+08:00</published><updated>2026-07-18T06:40:00.560+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Antigravity"/><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><title type='text'>Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (二)</title><content type='html'>&lt;div&gt;在前一篇測試中, 我已將 serverless 第一版原始碼從 GitHub 上複製到本機 Antigravity CLI 的專案目錄下, 並做好前置處理, 包含將原專案打上標籤, 建立新分支, 建立隔離資料夾並移動應用 App, 最後提交 Git 紀錄. 本篇要用 agy 來進行重構, 為 serverless 平台加上 API Token 認證機制.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列全部文章索引參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/google-antigravity_01637717863.html&quot; target=&quot;_blank&quot;&gt;Google Antigravity 學習筆記索引&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;2. 用 agy 重構專案 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;切換到專案目錄下後輸入 agy 啟動 Antigravity CLI 介面, 這次仍然使用 Claude Sonnet 模型來完成此重構計劃. 輸入下列提示詞 :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;我們正在 feature/api-token-auth 分支上，要為這個 serverless 專案加上 API Token 認證機制。請協助修改 serverless.py，完成以下任務：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 初始化資料庫：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;在系統啟動時（或初始化 DB 的地方），自動建立 `api_tokens` 資料表（欄位包含：id, token, owner, is_active, created_at）。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. 實作驗證裝飾器（Decorator）：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;撰寫一個 `@require_api_token` 裝飾器，從請求的 Header 中讀取 `X-API-Key`。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;- 若 Header 遺失或 Token 不存在於資料庫中（且 is_active 必須為 1），回傳 401 Unauthorized。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. 保護 API 路由：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;將這個裝飾器套用到「儲存/更新 function」以及「執行 function」的 Flask Route 上。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;請先分析原始專案的架構, 提出你的重構計劃, 讓我看過後再修改程式碼。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDVdM9ffD5RRCE0j0Mhbb9nwTpqqi_uj7xmFDBI_jXvSln7wkki4vz5MlCRW_xrjavHAhu85D-Bi1VoFkB0JJM4Kn4jrauftcANzvpxSvo9Bm0Z_dOomd8hi41KzPARIpJH8l6EVi1FiBrAwiPXEYmQYdCvHVtJejc7vuXMiD_d2hfkzVn8v9YxNgQLWE/s1973/agy-serverless-refator-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;989&quot; data-original-width=&quot;1973&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDVdM9ffD5RRCE0j0Mhbb9nwTpqqi_uj7xmFDBI_jXvSln7wkki4vz5MlCRW_xrjavHAhu85D-Bi1VoFkB0JJM4Kn4jrauftcANzvpxSvo9Bm0Z_dOomd8hi41KzPARIpJH8l6EVi1FiBrAwiPXEYmQYdCvHVtJejc7vuXMiD_d2hfkzVn8v9YxNgQLWE/s320/agy-serverless-refator-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Claude 閱讀原專案後規劃結果如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;gt; &lt;span style=&quot;color: #2b00fe;&quot;&gt;我們正在 feature/api-token-auth 分支上，要為這個 serverless 專案加上 API Token 認證機制。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 請協助修改 serverless.py，完成以下任務：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 1. 初始化資料庫：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;在系統啟動時（或初始化 DB 的地方），自動建立 `api_tokens` 資料表（欄位包含：id, token, owner,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; is_active, created_at）。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 2. 實作驗證裝飾器（Decorator）：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;撰寫一個 `@require_api_token` 裝飾器，從請求的 Header 中讀取 `X-API-Key`。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 若 Header 遺失或 Token 不存在於資料庫中（且 is_active 必須為 1），回傳 401 Unauthorized。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 3. 保護 API 路由：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;將這個裝飾器套用到「儲存/更新 function」以及「執行 function」的 Flask Route 上。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 請先分析原始專案的架構, 提出你的重構計劃, 讓我看過後再修改程式碼。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;▸ Thought for 2s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; Let me first explore the project structure to understand the codebase before mak...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● ListDir(D:/antigravity_cli/projects/serverless)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● ListDir(D:/antigravity_cli/projects/serverless/functions)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/requirements.txt)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/functions/save_function.py)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/functions/update_function.py) (ctrl+o to expand)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 已完整閱讀專案架構，以下是我的分析與重構計劃。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Create(C:/Users/tony1/.gemini/antigravity-...-a43e-cfa6fbc204e5/refactor_plan.md) (ctrl+o to expand)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 以下是重構計劃的摘要：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ## 架構分析結論&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 現有系統有兩層認證：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 1. Session Cookie — 管理者透過&amp;nbsp; /login&amp;nbsp; 密碼登入，保護&amp;nbsp; PROTECTED_FUNCTIONS&amp;nbsp; 清單&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 2. 一般函式執行 — 完全沒有保護，任何人只要知道 URL 就能呼叫&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ## 三個關鍵設計決策&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 1.&amp;nbsp; init_db()&amp;nbsp; 修正&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 移除&amp;nbsp; if not os.path.exists(DB_PATH)&amp;nbsp; 判斷，改用&amp;nbsp; CREATE TABLE IF NOT EXISTS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ，確保每次啟動都檢查表是否存在，不會因 DB 已建立但缺表而漏掉建立&amp;nbsp; api_tokens 。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 2.&amp;nbsp; @require_api_token&amp;nbsp; 裝飾器&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 讀取&amp;nbsp; X-API-Key&amp;nbsp; Header → 查詢&amp;nbsp; api_tokens&amp;nbsp; 表（ is_active=1 ）→ 不符合一律回 401 JSON。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 3. 保護路由的方案&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 因為&amp;nbsp; save_function 、 update_function&amp;nbsp; 與一般函式執行共用同一個&amp;nbsp; handle_function()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 路由，無法直接套裝飾器。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 採用方案 A：在路由內部邏輯中呼叫驗證輔助函式，改動最小且與現有 Session 機制並存。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 計劃文件已整理完畢，請確認後按「Proceed」或告訴我需要調整的地方，即可開始撰寫程式碼。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;此計劃看來很周到, 輸入 Proceed 按 Enter 看它表演即可 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt; &lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;Proceed&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;▸ Thought for 1s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; The user wants to proceed with the refactoring plan. Let me implement the change...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 好的，開始實作！&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Edit(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 修改成功，來驗證最終結果：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Read(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 內容正確。最後修正一個步驟編號的小問題（step 2 重複出現）：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;● Edit(D:/antigravity_cli/projects/serverless/serverless.py) (ctrl+o to expand)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 所有修改完成，以下是完整摘要：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ## ✅ 修改完成摘要&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 檔案：serverless.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 變更一覽&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;#&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 位置&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 修改內容&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ---------------|---------------|------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L6&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 新增&amp;nbsp; from functools import wraps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L16–37&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; init_db()&amp;nbsp; 改為冪等執行，新增&amp;nbsp; api_tokens&amp;nbsp; 資料表&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L56–73&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 新增&amp;nbsp; require_api_token(f)&amp;nbsp; 裝飾器（備用，可掛在未來獨立路由上）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L105–106&amp;nbsp; &amp;nbsp; &amp;nbsp; | 新增&amp;nbsp; TOKEN_PROTECTED_FUNCTIONS&amp;nbsp; 常數&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L167–181&amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; handle_function()&amp;nbsp; 步驟 2 加入 API Token 驗證邏輯&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;6&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| L207–208&amp;nbsp; &amp;nbsp; &amp;nbsp; | 移除&amp;nbsp; __main__&amp;nbsp; 區塊重複的&amp;nbsp; init_db()&amp;nbsp; 呼叫&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 認證邏輯流程（修改後）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; /function/&amp;lt;func_name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ├─ func_name 在 PROTECTED_FUNCTIONS？&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp; &amp;nbsp;└─ 未登入 Session → 401 (Authentication required)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ├─ func_name 在 TOKEN_PROTECTED_FUNCTIONS（save/update）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp; OR func_name 不在 PROTECTED_FUNCTIONS（一般函式）？&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp; &amp;nbsp;├─ 無 X-API-Key Header → 401 (Missing API token)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp; &amp;nbsp;└─ Token 無效或 is_active=0 → 401 (Invalid or inactive API token)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; └─ 驗證通過 → 動態載入並執行函式&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 快速測試方式&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; # 插入測試 Token&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; sqlite3 serverless.db &quot;INSERT INTO api_tokens (token, owner) VALUES (&#39;test-token-123&#39;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &#39;developer&#39;);&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; # ✅ 正確呼叫&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; curl http://localhost:5000/function/hello -H &quot;X-API-Key: test-token-123&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; # ❌ 無 Token → 401&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; curl http://localhost:5000/function/hello&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不到三分鐘就完成重構了, 這若是照以前人工來改程式碼, 恐怕得花上一周或更久. 我叫 Claude 說明它改了哪些地方 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;gt; &lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;解釋你修改了哪些檔案? 哪個部分(函式)?&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;▸ Thought Process&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; The user wants a clear explanation of which files and which functions were modif...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 這次只修改了 1 個檔案，共改動 4 個區塊：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ## 修改的檔案&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### serverless.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 1. Import 區塊（L1–8）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; + from functools import wraps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 新增&amp;nbsp; wraps ，讓裝飾器能保留被包裝函式的原始名稱與文件字串。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 2.&amp;nbsp; init_db()&amp;nbsp; 函式（L16–37）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 改動前：用&amp;nbsp; if not os.path.exists(DB_PATH)&amp;nbsp; 判斷，只有 DB 不存在時才建表，且只建&amp;nbsp; call_stats&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 一張表。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 改動後：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; • 移除&amp;nbsp; os.path.exists&amp;nbsp; 條件判斷，改為每次啟動都執行（ CREATE TABLE IF NOT EXISTS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 本身就是冪等的，不會重複建表）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; • 新增&amp;nbsp; api_tokens&amp;nbsp; 資料表，欄位為&amp;nbsp; id, token, owner, is_active, created_at&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 3. 新增&amp;nbsp; require_api_token()&amp;nbsp; 裝飾器（L56–73）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 全新函式，位於&amp;nbsp; record_call()&amp;nbsp; 之後、 app = Flask(...)&amp;nbsp; 之前。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 功能：從 Request Header 讀取&amp;nbsp; X-API-Key ，查詢資料庫確認 Token 存在且&amp;nbsp; is_active=1 ，否則回傳&amp;nbsp; 401&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; │ 此裝飾器目前定義為備用，供未來掛在獨立路由上使用。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 4.&amp;nbsp; handle_function()&amp;nbsp; 路由函式（L163–181）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 在原有的 Session 驗證之後，插入第二層 API Token 驗證邏輯（步驟 2）：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; 觸發條件（滿足其一即驗證）：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; A. func_name 在 TOKEN_PROTECTED_FUNCTIONS → save_function、update_function&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; B. func_name 不在 PROTECTED_FUNCTIONS → 所有一般使用者自訂函式&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; 兩種情況都會檢查&amp;nbsp; X-API-Key&amp;nbsp; Header，並查詢&amp;nbsp; api_tokens&amp;nbsp; 表，不符合就回傳&amp;nbsp; 401 。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ──────&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; ### 未修改的部分&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp;未動到的檔案/函式&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 原因&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; -------------------------------------------------|------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; functions/&amp;nbsp; 目錄下所有模組&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 驗證邏輯集中在&amp;nbsp; serverless.py ，子模組不需變動&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; check_auth()&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| Session 登入機制保持原樣&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; record_call()&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 呼叫統計邏輯不變&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;&amp;nbsp; &amp;nbsp; /login 、 /logout&amp;nbsp; 路由&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 管理者登入流程不變&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這個說明後續可以開啟主程式 serverless.py 來檢視.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;3. 功能測試 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;上面 agy 已完成重構, 接下來實地測試 Claud 實作的 API Token 是否能正常運作. 在進行測試之前, 須在專案目錄下建立一個純文字檔 .env, 紀錄管理者的 token 與 key, 前者是自己容易記的密碼, 後者是用工具函式產生的一長串金鑰, 可以用 Python 內建的 secrets 模組來產生, 參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2025/08/mapleboard-mp510-50-http-api-3.html&quot; target=&quot;_blank&quot;&gt;Mapleboard MP510-50 測試 (三十七) : HTTP API 函式執行平台 (3)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在專案目錄下用記事本編輯一個 .env 檔, 輸入如下內容 (範例) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;SECRET_TOKEN=admin123&lt;/div&gt;&lt;div&gt;SECRET_KEY=fKFQPound41lv8FrWzU-lmFywxAT47uMwfvmBbiuLTE&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其中的 SECRET_KEY 可在 Thonny 的 Python 互動環境匯入 secrets 模組後呼叫 secrets.token_urlsafe(32) 函式產生, 例如 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;import secrets&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;secrets.token_urlsafe(32)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&#39;fKFQPound41lv8FrWzU-lmFywxAT47uMwfvmBbiuLTE&#39;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;由於我主要的測試環境主要是使用 Thonny 自帶的 Python, 所有 requirements.txt 中的套件在此開發環境都有安裝 (此專案主要是用到 Flask), 所以按 Thonny 的 &quot;工具/開啟系統終端機&quot; 開啟命令提示字元視窗, 切換到專案目錄下, 用下列指令啟動 Flask 開發伺服器 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;D:\antigravity_cli\projects\serverless&amp;gt;&lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;python serverless.py&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;* Serving Flask app &#39;serverless&#39;&lt;/div&gt;&lt;div&gt;&amp;nbsp;* Debug mode: on&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;伺服器運行起來後, serverless.py 就會建立一個 SQlite 資料庫 serverless.db, 執行下列指令在此系統資料庫裡的 api_tokens 資料表填入測試用的權杖 test-token-123 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\antigravity_cli\projects\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;python -c &quot;import sqlite3; conn = sqlite3.connect(&#39;serverless.db&#39;); conn.execute(&#39;INSERT INTO api_tokens (token, owner, is_active) VALUES (?, ?, ?)&#39;, (&#39;test-token-123&#39;, &#39;developer&#39;, 1)); conn.commit(); conn.close(); print(&#39;🎉 測試 Token 寫入成功！&#39;)&quot;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;🎉 測試 Token 寫入成功！&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後在瀏覽器網址列輸入 Flask 開發伺服器預設網址 http://localhost:5000/ 會看到 serverless 平台網站已順利運行, 按 &quot;登入系統&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk6YF0JQ1w7HpLa6R02hveAKn6NAC4-9B3kTwEtYQYQJSeZXbPkNTHZsCU8v-HnDE7HV6O71b2vTkdBigzs-QprGst6Cxbd4dZ1UANQj37Mz8YditYIEAVYH9I9kp999fh0rCyX6608fah6jXzTJRhIjVvSFEQ3DG563IkLer6dPPABW3bw7wwjcwRvM8O/s666/agy-serverless-refator-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;266&quot; data-original-width=&quot;666&quot; height=&quot;128&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk6YF0JQ1w7HpLa6R02hveAKn6NAC4-9B3kTwEtYQYQJSeZXbPkNTHZsCU8v-HnDE7HV6O71b2vTkdBigzs-QprGst6Cxbd4dZ1UANQj37Mz8YditYIEAVYH9I9kp999fh0rCyX6608fah6jXzTJRhIjVvSFEQ3DG563IkLer6dPPABW3bw7wwjcwRvM8O/s320/agy-serverless-refator-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;輸入 .env 檔案中設定的 SECRET_TOKEN 密碼, 按 &quot;登入&quot; 鈕 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTD2WlGMyfhRzGCK2U5eOR4ugouaBwlMjv4DSaa1Tt4jSO0E1AfZc1lw4a_ss1v-yEE5zuZJsWnsU2-DSQ8BU1xjv0mzsYvKJxnrMt-al67VOL4rQiFW3rn-OJje6iaCp1udHfLM0QYLHewetAkiJkAJ6tNL4yVuxN_u4hMCtefE-PjsQjdIWoFFvhpx9R/s726/agy-serverless-refator-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;438&quot; data-original-width=&quot;726&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTD2WlGMyfhRzGCK2U5eOR4ugouaBwlMjv4DSaa1Tt4jSO0E1AfZc1lw4a_ss1v-yEE5zuZJsWnsU2-DSQ8BU1xjv0mzsYvKJxnrMt-al67VOL4rQiFW3rn-OJje6iaCp1udHfLM0QYLHewetAkiJkAJ6tNL4yVuxN_u4hMCtefE-PjsQjdIWoFFvhpx9R/s320/agy-serverless-refator-3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;登入成功後按 &quot;函式列表&quot; 進入管理頁面首頁 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUkaZVYurqaIo3Y4jSp9NXFCbLVoa2tIfwzHT8n63BqW_1eQtmQZcFfBsdUn6euFhwiDKM9owKAPyqihB0S6R51Y42VEHyTmg3DtqXxI8IH06oMqKWFdd3L0wnaKTpesvTQXB_lZoFdTrGiU19iMPYvyt0l5KVhtGIpeXPrlKF7VaEvR45RlhZp_Qdazof/s721/agy-serverless-refator-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;268&quot; data-original-width=&quot;721&quot; height=&quot;119&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUkaZVYurqaIo3Y4jSp9NXFCbLVoa2tIfwzHT8n63BqW_1eQtmQZcFfBsdUn6euFhwiDKM9owKAPyqihB0S6R51Y42VEHyTmg3DtqXxI8IH06oMqKWFdd3L0wnaKTpesvTQXB_lZoFdTrGiU19iMPYvyt0l5KVhtGIpeXPrlKF7VaEvR45RlhZp_Qdazof/s320/agy-serverless-refator-4.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;按 &quot;資料表&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV37EdkMrN1HdTdc4KyHw_qTvAHvCyvOg-wMNO1gBNGb7cCS9X-OnTLp5JoKqjSeatbKZzUWLWHRd4HXAoyHYFSWrbRFRlRUqQnBpwN1F45LWQy5UmAdUFc0ovTUPmMiuVFs4T5ZAYT3I05m4EItzLVlUtoUtutwqyE9pZbWiph-U0MdlKxV2GmR03-P2L/s1025/agy-serverless-refator-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;597&quot; data-original-width=&quot;1025&quot; height=&quot;186&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV37EdkMrN1HdTdc4KyHw_qTvAHvCyvOg-wMNO1gBNGb7cCS9X-OnTLp5JoKqjSeatbKZzUWLWHRd4HXAoyHYFSWrbRFRlRUqQnBpwN1F45LWQy5UmAdUFc0ovTUPmMiuVFs4T5ZAYT3I05m4EItzLVlUtoUtutwqyE9pZbWiph-U0MdlKxV2GmR03-P2L/s320/agy-serverless-refator-5.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見多了一個 api_tokens 的資料表, 這就是 Claude 重構此平台時所添加, 用來儲存 API Key (token) 的資料表, 按 &quot;檢視&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9g-ZEkKT1ggR7_rp2QgrcXhlI27Noh6akJY7ti0YE1ToJ4zHDCpbBPBPY4BVVEFYV463zb2hNLKQ_eYWy2UA0ug7MGk-gPhWMbx2cff2ZcCMOX8vicHFkZ_hN4ZpnZ2wv5ilyF4Yv7kEveVwFO2rINnanhNienjmbmdsBYnhfG6JuPZ8-NntY9k2iGb57/s928/agy-serverless-refator-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;475&quot; data-original-width=&quot;928&quot; height=&quot;164&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9g-ZEkKT1ggR7_rp2QgrcXhlI27Noh6akJY7ti0YE1ToJ4zHDCpbBPBPY4BVVEFYV463zb2hNLKQ_eYWy2UA0ug7MGk-gPhWMbx2cff2ZcCMOX8vicHFkZ_hN4ZpnZ2wv5ilyF4Yv7kEveVwFO2rINnanhNienjmbmdsBYnhfG6JuPZ8-NntY9k2iGb57/s320/agy-serverless-refator-6.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;顯示前面用 Python 指令寫入 api_tokens 資料表的測試用權杖 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn5On2dlAvA5E8zH4EMgUSkXbYiLtlGhBF_W2wpAhsV1o8TVk10_F1NMpsqOqW7vHsz62zyYzvFPqaE0trQWT-KyUeeBgta_8PGt4Kq_iexLXbzZUT9BmeaIdt_NYHWJUimO_U8bBXTYYhAQDcs69RNnBpgOYsr4IPVWSHBM9IxZdrRPFHJnZGxkaPO8B6/s1198/agy-serverless-refator-7.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;670&quot; data-original-width=&quot;1198&quot; height=&quot;179&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn5On2dlAvA5E8zH4EMgUSkXbYiLtlGhBF_W2wpAhsV1o8TVk10_F1NMpsqOqW7vHsz62zyYzvFPqaE0trQWT-KyUeeBgta_8PGt4Kq_iexLXbzZUT9BmeaIdt_NYHWJUimO_U8bBXTYYhAQDcs69RNnBpgOYsr4IPVWSHBM9IxZdrRPFHJnZGxkaPO8B6/s320/agy-serverless-refator-7.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;接下來用 curl.exe 測試沒帶 token 的情況, 這樣的請求會被拒絕 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\antigravity_cli\projects\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;curl.exe -i http://localhost:5000/function/hello&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;HTTP/1.1 &lt;span style=&quot;background-color: #fcff01;&quot;&gt;401 UNAUTHORIZED&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Server: Werkzeug/2.3.7 Python/3.10.11&lt;/div&gt;&lt;div&gt;Date: Fri, 17 Jul 2026 11:36:12 GMT&lt;/div&gt;&lt;div&gt;Content-Type: application/json&lt;/div&gt;&lt;div&gt;Content-Length: 73&lt;/div&gt;&lt;div&gt;Connection: close&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;error&quot;: &quot;Missing API token&quot;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &quot;hint&quot;: &quot;Provide X-API-Key header&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見未攜帶 token 的請求會回應 &quot;401 UNAUTHORIZED&quot;. 主體 (body) 內容為 JSON 訊息, error 鍵之值表示沒有收到 API token; 而 hit 鍵之值則表示必須在標頭攜帶 X-API-Key, 可在 curl.exe 指令中用 -H 參數指定此 token, 例如 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS D:\antigravity_cli\projects\serverless&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #2b00fe;&quot;&gt;curl.exe -i http://localhost:5000/function/hello &lt;span style=&quot;background-color: #fcff01;&quot;&gt;-H&lt;/span&gt; &quot;X-API-Key: test-token-123&quot;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;HTTP/1.1 &lt;span style=&quot;background-color: #fcff01;&quot;&gt;200 OK&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Server: Werkzeug/2.3.7 Python/3.10.11&lt;/div&gt;&lt;div&gt;Date: Fri, 17 Jul 2026 15:41:03 GMT&lt;/div&gt;&lt;div&gt;Content-Type: text/html; charset=utf-8&lt;/div&gt;&lt;div&gt;Content-Length: 12&lt;/div&gt;&lt;div&gt;Connection: close&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;Hello World!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可見若有攜帶正確的 X-API-Key 就會執行該函式, 回應 200 OK.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;4. 線上管理 API Key :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在第一版的 serverless 函式執行平台就已實作了線上管理 serverless.db 的功能, 除了提供超連結可刪除資料表與紀錄外, 還可以執行 SQL 指令以新增, 更新, 或刪除紀錄.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按資料表列表頁面下方的 &quot;執行 SQL&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhisif0aQkhdlAfTvouRM4Q2lCl8eCwt8a80LQrJvcDm0fjx3PHho7sPnRFQ3RsdWAe8gCs3u5h5JaR2P-P6gFEQMmsoaVKBwGH2n9cAwrxOA25TIc4wax7r16D5Xa7JMwi5exw8YnAyp2w3666OCxegSPaD03_yCBWgGp1MfUhKIvLanpLfc-iV1t0lnTQ/s921/agy-serverless-refator-8.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;921&quot; height=&quot;167&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhisif0aQkhdlAfTvouRM4Q2lCl8eCwt8a80LQrJvcDm0fjx3PHho7sPnRFQ3RsdWAe8gCs3u5h5JaR2P-P6gFEQMmsoaVKBwGH2n9cAwrxOA25TIc4wax7r16D5Xa7JMwi5exw8YnAyp2w3666OCxegSPaD03_yCBWgGp1MfUhKIvLanpLfc-iV1t0lnTQ/s320/agy-serverless-refator-8.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;輸入 SQL 指令後按 &quot;執行&quot; 即可, 例如要修改 owner=developer 使用中的 token 的 SQL 指令 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;UPDATE api_tokens&amp;nbsp;&lt;/div&gt;&lt;div&gt;SET token = &#39;new-test-token&#39; WHERE owner=&#39;developer&#39; AND is_active=1;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXz7anoIJJC-QB41gKKQKAvs2f4ggZRW1Z5Jzy9iU9spgfpli1mlF5qhLuDoCLUAja_P4VhNFxfhuRXEjkpOaVAoWyr_79_YgPWfQe350t-zWa3Bq6J7-PaznXKPd-tlbRHwHkmb3lQ3KcG5pJf-41pH-fhvHrJg4EJeIixBSCiRw4y6PVEBscM47o_uRR/s1369/agy-serverless-refator-9.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;599&quot; data-original-width=&quot;1369&quot; height=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXz7anoIJJC-QB41gKKQKAvs2f4ggZRW1Z5Jzy9iU9spgfpli1mlF5qhLuDoCLUAja_P4VhNFxfhuRXEjkpOaVAoWyr_79_YgPWfQe350t-zWa3Bq6J7-PaznXKPd-tlbRHwHkmb3lQ3KcG5pJf-41pH-fhvHrJg4EJeIixBSCiRw4y6PVEBscM47o_uRR/s320/agy-serverless-refator-9.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;執行結果為成功 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhnIzi_hfcRhUwozy719kf1A5a4nwKjdNylABcrO5DDzqLl5BolhGGwjlAXbuhBbt7lWtm8DtddsjNlTxPtV5uKj3WxQeU7vZdASYicJqGDbhcSgakXgSuNt26Lx5lDlyTKBj-vr4Qhhz8QL9pI743GaYzoGemDrv0wC5QoMPG1DFcrR5PNn65AGRlnSaj/s1542/agy-serverless-refator-9.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;440&quot; data-original-width=&quot;1542&quot; height=&quot;91&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhnIzi_hfcRhUwozy719kf1A5a4nwKjdNylABcrO5DDzqLl5BolhGGwjlAXbuhBbt7lWtm8DtddsjNlTxPtV5uKj3WxQeU7vZdASYicJqGDbhcSgakXgSuNt26Lx5lDlyTKBj-vr4Qhhz8QL9pI743GaYzoGemDrv0wC5QoMPG1DFcrR5PNn65AGRlnSaj/s320/agy-serverless-refator-9.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;返回資料表內容檢視頁面可知 API Key (token 欄位) 已經更新了 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHrWpsIwZfLqNLYhC9nsMeispmlPCrBHFeR8UzGs6YEOGSpitpydalQDdGDaikC9swTbxxdLuDwtTuZWHF067LB_3BPbzGPoff2oieQOCxrmc2Oh2XHLm0VTGexQFI3wKZsygSm5_hTTmCDLQj5YmnS58oZM_APvjNR84XvrvYZexxVhJyQKbVIayEVLzf/s1196/agy-serverless-refator-10.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;663&quot; data-original-width=&quot;1196&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHrWpsIwZfLqNLYhC9nsMeispmlPCrBHFeR8UzGs6YEOGSpitpydalQDdGDaikC9swTbxxdLuDwtTuZWHF067LB_3BPbzGPoff2oieQOCxrmc2Oh2XHLm0VTGexQFI3wKZsygSm5_hTTmCDLQj5YmnS58oZM_APvjNR84XvrvYZexxVhJyQKbVIayEVLzf/s320/agy-serverless-refator-10.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;新增 API key 的 SQL 例如 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;INSERT INTO api_tokens (token, owner, is_active)&amp;nbsp;&lt;/div&gt;&lt;div&gt;VALUES (&#39;fKFQPound41lv8FrWzU-lmFywxAT47uMwfvmBbiuLTE&#39;, &#39;proj-a&#39;, 1);&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXYJ-M686wt5dr5_yIATOLP7ZO40y6eayZokeFZ3KENOdB4bLwlOrOVhd-R8SOo58pV5fhutVAIXZ6zPi0uqyOj9BkwE3RcCVXC9wBDUPUjmf7-Uvy5D0BMpsyh-6FSRCRrZdnVCT2MTGdRrv-FfjZ4kry6bBuYYz-c7kiwO6x2Fmn9h5bkYW5_KRMQp-/s1368/agy-serverless-refator-11.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;789&quot; data-original-width=&quot;1368&quot; height=&quot;185&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXYJ-M686wt5dr5_yIATOLP7ZO40y6eayZokeFZ3KENOdB4bLwlOrOVhd-R8SOo58pV5fhutVAIXZ6zPi0uqyOj9BkwE3RcCVXC9wBDUPUjmf7-Uvy5D0BMpsyh-6FSRCRrZdnVCT2MTGdRrv-FfjZ4kry6bBuYYz-c7kiwO6x2Fmn9h5bkYW5_KRMQp-/s320/agy-serverless-refator-11.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiIvDyzdQTQ9VcyqO5xMV63RT_-nIDyOMMRBf8lSA9fk9x1wDyhgGJiY5Ks9G-Dm7azXPwnhMt4YBlQ0SY_-ZqMkb_pygyDekACFYD4xKQZfxRetnopkA0VO3AKxyHhSmAq4NXp3gNk_Bc-H9eFbuh2cDEaHsXcSNcrRdMC6LjBE6SYNldFfcYOcNaw8Zq/s2042/agy-serverless-refator-12.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;446&quot; data-original-width=&quot;2042&quot; height=&quot;70&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiIvDyzdQTQ9VcyqO5xMV63RT_-nIDyOMMRBf8lSA9fk9x1wDyhgGJiY5Ks9G-Dm7azXPwnhMt4YBlQ0SY_-ZqMkb_pygyDekACFYD4xKQZfxRetnopkA0VO3AKxyHhSmAq4NXp3gNk_Bc-H9eFbuh2cDEaHsXcSNcrRdMC6LjBE6SYNldFfcYOcNaw8Zq/s320/agy-serverless-refator-12.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdeb_iYH7jo2IF2H9oT0HfZY9DANbSzlSQQzoB1JJkEu3_1fWTQoGIO0UOYL15dgbIH3EAUXDk6bWWU9L4KjPkvJ9229Zy9_HmLtqPTb0SMPD-Pyi1YZJzMHvo0tIt6dYyxFn_PMYPqo53Gf5IYnzxH2hi_nJ265R8jqK1DXUjKGv400RPfsEYBbI5hikK/s1698/agy-serverless-refator-13.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;749&quot; data-original-width=&quot;1698&quot; height=&quot;141&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdeb_iYH7jo2IF2H9oT0HfZY9DANbSzlSQQzoB1JJkEu3_1fWTQoGIO0UOYL15dgbIH3EAUXDk6bWWU9L4KjPkvJ9229Zy9_HmLtqPTb0SMPD-Pyi1YZJzMHvo0tIt6dYyxFn_PMYPqo53Gf5IYnzxH2hi_nJ265R8jqK1DXUjKGv400RPfsEYBbI5hikK/s320/agy-serverless-refator-13.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;只要以管理員身分登入, 就可以線上管理 API Key 了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以上測試顯示 agy 的重構確實達成了預期的目標, 讓 serverless 平台升級為需要 API Key 才能使用的網路服務, 避免伺服器被濫用或遭到攻擊.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/1238654690755055072/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/1238654690755055072' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1238654690755055072'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1238654690755055072'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/google-antigravity-serverless_01449819010.html' title='Google Antigravity 學習筆記 : 重構 serverless 函式執行平台 (二)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDVdM9ffD5RRCE0j0Mhbb9nwTpqqi_uj7xmFDBI_jXvSln7wkki4vz5MlCRW_xrjavHAhu85D-Bi1VoFkB0JJM4Kn4jrauftcANzvpxSvo9Bm0Z_dOomd8hi41KzPARIpJH8l6EVi1FiBrAwiPXEYmQYdCvHVtJejc7vuXMiD_d2hfkzVn8v9YxNgQLWE/s72-c/agy-serverless-refator-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-3601451723049476057</id><published>2026-07-17T23:59:36.341+08:00</published><updated>2026-07-18T00:00:20.699+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="vibe coding"/><category scheme="http://www.blogger.com/atom/ns#" term="網購"/><title type='text'>購買 Hahow 課程 : AI Coding 無痛上手</title><content type='html'>&lt;div&gt;昨天在 Hahow 購買了 Kai 老師的 &quot;AI Coding 無痛上手&quot; 課程募資 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK7e2rQ6aiwPXf4R_bI8TRvBehas5n9BQORIw9BQ7QdfLYsRQggw5B-z5ggO2F5QAGEiohkfgnBETDdOsC6Lbn5xCHViAQbn8Z3XbCVar3-9ED_GmA0i7YWCoOFJAFTHJiIkA7C3IhdWzIz-tZNuIA-YEkQLIZEImMr-I2wPM8pQ-6iIQ_pN0JPzr8PUJk/s1236/%E8%B3%BC%E8%B2%B7%20Hahow%20%E8%AA%B2%E7%A8%8B-AI%20Coding%20%E7%84%A1%E7%97%9B%E4%B8%8A%E6%89%8B-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1236&quot; data-original-width=&quot;1080&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK7e2rQ6aiwPXf4R_bI8TRvBehas5n9BQORIw9BQ7QdfLYsRQggw5B-z5ggO2F5QAGEiohkfgnBETDdOsC6Lbn5xCHViAQbn8Z3XbCVar3-9ED_GmA0i7YWCoOFJAFTHJiIkA7C3IhdWzIz-tZNuIA-YEkQLIZEImMr-I2wPM8pQ-6iIQ_pN0JPzr8PUJk/s320/%E8%B3%BC%E8%B2%B7%20Hahow%20%E8%AA%B2%E7%A8%8B-AI%20Coding%20%E7%84%A1%E7%97%9B%E4%B8%8A%E6%89%8B-1.jpg&quot; width=&quot;280&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYoKsagdMRgQ4EwD1kIlwY_-FQTO2HFlYeNqfwO29MQq607EPvVXvDD0FzeoK8jqqU1cNrsOnXZa5UVRfWphz2jHotBAw2fI0U8EuB-fc9MniLFVfpyLYl6xoVsYvK8HEaq3ihAga_HnlV5ZHgsYMDMTkM2a5av01BhqhF85fzEY_OClolBIQu7cbDVaWj/s1080/%E8%B3%BC%E8%B2%B7%20Hahow%20%E8%AA%B2%E7%A8%8B-AI%20Coding%20%E7%84%A1%E7%97%9B%E4%B8%8A%E6%89%8B-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1049&quot; data-original-width=&quot;1080&quot; height=&quot;311&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYoKsagdMRgQ4EwD1kIlwY_-FQTO2HFlYeNqfwO29MQq607EPvVXvDD0FzeoK8jqqU1cNrsOnXZa5UVRfWphz2jHotBAw2fI0U8EuB-fc9MniLFVfpyLYl6xoVsYvK8HEaq3ihAga_HnlV5ZHgsYMDMTkM2a5av01BhqhF85fzEY_OClolBIQu7cbDVaWj/s320/%E8%B3%BC%E8%B2%B7%20Hahow%20%E8%AA%B2%E7%A8%8B-AI%20Coding%20%E7%84%A1%E7%97%9B%E4%B8%8A%E6%89%8B-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;雖然我平常就在用 Vibe coding, 但看到課程介紹就很想去了解人家的作法, 不同的老師有不同的方法論, 值得花點學費去了解別人的 AI 工作術. 但我最近似乎買太多課程了, 月底從岡山回來後, 八月份起要來好好上課了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/3601451723049476057/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/3601451723049476057' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3601451723049476057'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3601451723049476057'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/hahow-ai-coding.html' title='購買 Hahow 課程 : AI Coding 無痛上手'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK7e2rQ6aiwPXf4R_bI8TRvBehas5n9BQORIw9BQ7QdfLYsRQggw5B-z5ggO2F5QAGEiohkfgnBETDdOsC6Lbn5xCHViAQbn8Z3XbCVar3-9ED_GmA0i7YWCoOFJAFTHJiIkA7C3IhdWzIz-tZNuIA-YEkQLIZEImMr-I2wPM8pQ-6iIQ_pN0JPzr8PUJk/s72-c/%E8%B3%BC%E8%B2%B7%20Hahow%20%E8%AA%B2%E7%A8%8B-AI%20Coding%20%E7%84%A1%E7%97%9B%E4%B8%8A%E6%89%8B-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-4095219826957720722</id><published>2026-07-17T23:47:30.698+08:00</published><updated>2026-07-17T23:47:30.698+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="人工智慧"/><category scheme="http://www.blogger.com/atom/ns#" term="網購"/><category scheme="http://www.blogger.com/atom/ns#" term="量化投資"/><title type='text'>購買 MasterTalk 課程 (補記)</title><content type='html'>&lt;div&gt;今天查看 LINE 紀錄才想起上周三 (7/8) 請假陪水某與菁菁去大甲鎮瀾宮拜拜, 在自強號上滑手機時看到 MasterTalk 平台的新課程通知 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://mastertalks.tw/products/ai-taiwan-stock&quot; target=&quot;_blank&quot;&gt;不會寫程式，也能 用 AI 打造你的 台股看盤＋盯盤系統&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT0DxV8gng41n9piSZUpgLj7rMpN5ORcPDswEkYGUWPbIAt50s6i0srHMCmE1JBzHFeiJJRzOo6rAxvvf8SK0ojxe7tNaDfvmvPZPzNFv5HUbIWVMmJ8-LfgHlhzNtP-O86bIXgWSQvI1XwWNw8btV1qqsRDSLUR1fSVT11gow59724A0nE9ziXw2FMJv4/s2528/%E4%B8%8D%E6%9C%83%E5%AF%AB%E7%A8%8B%E5%BC%8F%E4%B9%9F%E8%83%BD%20%E7%94%A8%20AI%20%E6%89%93%E9%80%A0%E4%BD%A0%E7%9A%84%20%E5%8F%B0%E8%82%A1%E7%9C%8B%E7%9B%A4%E7%9B%AF%E7%9B%A4%E7%B3%BB%E7%B5%B1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;762&quot; data-original-width=&quot;2528&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT0DxV8gng41n9piSZUpgLj7rMpN5ORcPDswEkYGUWPbIAt50s6i0srHMCmE1JBzHFeiJJRzOo6rAxvvf8SK0ojxe7tNaDfvmvPZPzNFv5HUbIWVMmJ8-LfgHlhzNtP-O86bIXgWSQvI1XwWNw8btV1qqsRDSLUR1fSVT11gow59724A0nE9ziXw2FMJv4/s320/%E4%B8%8D%E6%9C%83%E5%AF%AB%E7%A8%8B%E5%BC%8F%E4%B9%9F%E8%83%BD%20%E7%94%A8%20AI%20%E6%89%93%E9%80%A0%E4%BD%A0%E7%9A%84%20%E5%8F%B0%E8%82%A1%E7%9C%8B%E7%9B%A4%E7%9B%AF%E7%9B%A4%E7%B3%BB%E7%B5%B1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;有點數折換打 9 折, 實付 3492 元.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/4095219826957720722/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/4095219826957720722' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/4095219826957720722'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/4095219826957720722'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/mastertalk.html' title='購買 MasterTalk 課程 (補記)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT0DxV8gng41n9piSZUpgLj7rMpN5ORcPDswEkYGUWPbIAt50s6i0srHMCmE1JBzHFeiJJRzOo6rAxvvf8SK0ojxe7tNaDfvmvPZPzNFv5HUbIWVMmJ8-LfgHlhzNtP-O86bIXgWSQvI1XwWNw8btV1qqsRDSLUR1fSVT11gow59724A0nE9ziXw2FMJv4/s72-c/%E4%B8%8D%E6%9C%83%E5%AF%AB%E7%A8%8B%E5%BC%8F%E4%B9%9F%E8%83%BD%20%E7%94%A8%20AI%20%E6%89%93%E9%80%A0%E4%BD%A0%E7%9A%84%20%E5%8F%B0%E8%82%A1%E7%9C%8B%E7%9B%A4%E7%9B%AF%E7%9B%A4%E7%B3%BB%E7%B5%B1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-123795642051406344</id><published>2026-07-15T12:35:17.017+08:00</published><updated>2026-07-15T12:35:17.017+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="網購"/><title type='text'>蝦皮購買 iPhone SE2 磁吸式手機殼</title><content type='html'>&lt;div&gt;今天上蝦皮幫我的備用手機 iPhone SE 買磁吸殼, 方便出國時直接將行動電源吸附充電免拉線 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://shopee.tw/%E9%AB%98%E7%B4%9A%E9%80%8F%E6%98%8E%E8%98%8B%E6%9E%9C1716-15-14-13-12-11-xs-xr%E6%89%8B%E6%A9%9F%E6%AE%BB%E7%A3%81%E5%90%B8%E5%85%85%E9%9B%BBiPhone7P%E9%98%B2%E6%91%948%E4%BB%A3%E5%85%A8%E5%8C%85SE2%E8%BB%9F%E9%82%8ASE3-i.586037576.28769925557&quot; target=&quot;_blank&quot;&gt;高級透明蘋果1716/15/14/13/12/11/xs/xr手機殻磁吸充電iPhone7P防摔8代全包SE2軟邊SE3&lt;/a&gt;&amp;nbsp;$119&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkucDTWDjfy89BkE8etkiVcptrGyfYbYVTeiDQ_7msEZ1-uk_-xGRHIvcEjMGl9hNAJ1xbohlvXy4b79r9-vQn7JavYozInRBbzQCR5XLDMlqPUo1WTMpHH722jjdmRfcS7kEjTn2rNndtE_Q42DJ5PcvsxK84xF2R_vIvy1pikuSJ7JXNB_uULpoEuN0X/s1944/%E8%9D%A6%E7%9A%AE%E8%B3%BC%E8%B2%B7%20iPhone%20SE2%20%E7%A3%81%E5%90%B8%E5%BC%8F%E6%89%8B%E6%A9%9F%E6%AE%BC.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;759&quot; data-original-width=&quot;1944&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkucDTWDjfy89BkE8etkiVcptrGyfYbYVTeiDQ_7msEZ1-uk_-xGRHIvcEjMGl9hNAJ1xbohlvXy4b79r9-vQn7JavYozInRBbzQCR5XLDMlqPUo1WTMpHH722jjdmRfcS7kEjTn2rNndtE_Q42DJ5PcvsxK84xF2R_vIvy1pikuSJ7JXNB_uULpoEuN0X/s320/%E8%9D%A6%E7%9A%AE%E8%B3%BC%E8%B2%B7%20iPhone%20SE2%20%E7%A3%81%E5%90%B8%E5%BC%8F%E6%89%8B%E6%A9%9F%E6%AE%BC.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;明華智取店取付 238 元.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/123795642051406344/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/123795642051406344' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/123795642051406344'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/123795642051406344'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/iphone-se2.html' title='蝦皮購買 iPhone SE2 磁吸式手機殼'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkucDTWDjfy89BkE8etkiVcptrGyfYbYVTeiDQ_7msEZ1-uk_-xGRHIvcEjMGl9hNAJ1xbohlvXy4b79r9-vQn7JavYozInRBbzQCR5XLDMlqPUo1WTMpHH722jjdmRfcS7kEjTn2rNndtE_Q42DJ5PcvsxK84xF2R_vIvy1pikuSJ7JXNB_uULpoEuN0X/s72-c/%E8%9D%A6%E7%9A%AE%E8%B3%BC%E8%B2%B7%20iPhone%20SE2%20%E7%A3%81%E5%90%B8%E5%BC%8F%E6%89%8B%E6%A9%9F%E6%AE%BC.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-2314988667064813995</id><published>2026-07-14T23:08:02.937+08:00</published><updated>2026-07-14T23:08:02.937+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="旅行"/><category scheme="http://www.blogger.com/atom/ns#" term="網購"/><title type='text'>參加嘖嘖 ORIVA 隨行烘乾機募資預購</title><content type='html'>&lt;div&gt;最近在 FB 看到嘖嘖的 ORIVA 隨行烘乾機募資廣告, 覺得對出國旅行衣物烘乾很方便, 就參加預購了, 但要八月才開始出貨, 趕不上月底跟阿中的岡山之旅 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.zeczec.com/projects/oriva-tw&quot; target=&quot;_blank&quot;&gt;https://www.zeczec.com/projects/oriva-tw&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjckc9hldgW_4Tbst79RIyZ0FzZqoIdZCDfTa7ECMHBbBr7LBLOL-P06Cfli0gasf8MNZ7tjw70Vn2sEus6Ym1RLm8w2Z4HHgvK8NsB31uBBQwXR3K8sR8A4TqcVEW8S8MJk9-safhb0ZgYwUwGThQXYoiWApcOKndwTh2PsImT56INuF11NLTUnvvW9Uc7/s2472/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;955&quot; data-original-width=&quot;2472&quot; height=&quot;124&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjckc9hldgW_4Tbst79RIyZ0FzZqoIdZCDfTa7ECMHBbBr7LBLOL-P06Cfli0gasf8MNZ7tjw70Vn2sEus6Ym1RLm8w2Z4HHgvK8NsB31uBBQwXR3K8sR8A4TqcVEW8S8MJk9-safhb0ZgYwUwGThQXYoiWApcOKndwTh2PsImT56INuF11NLTUnvvW9Uc7/s320/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh61kGZPIB8eFVQ8UqhW9Yv-ft36UnILN6qXhfgRe8egJas8xe07xyRWuGOuRici21vZ1YtPM9iM9ifbYP4aVpiEI_xNH5POjFB6d_9mnDd5FnOOqt-KJRPr1U2g1J2i-tfXYTZyNCfSv4BIbF_YcqLZupSwdiK5a0BQAa5DmAeU7Vge1TqgcKMas2q5EPY/s1787/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1787&quot; data-original-width=&quot;915&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh61kGZPIB8eFVQ8UqhW9Yv-ft36UnILN6qXhfgRe8egJas8xe07xyRWuGOuRici21vZ1YtPM9iM9ifbYP4aVpiEI_xNH5POjFB6d_9mnDd5FnOOqt-KJRPr1U2g1J2i-tfXYTZyNCfSv4BIbF_YcqLZupSwdiK5a0BQAa5DmAeU7Vge1TqgcKMas2q5EPY/s320/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-2.jpg&quot; width=&quot;164&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqYAqVZWMZDG3c_k0a7ZsTSw4Yvy3UP_6AnW5GNRsetVlzl4fQKwkW3YUrrpdV1V_z5Ju5GLKDQylB58adZA1a7fDHyr62OhRNYFUZk-mf4JRsYD4wiRTGiXnDo8j-uWlhEDmkYIwmIXGrNqHGddTKTFdnNpZ58tPbvRe6npRAZp7FqycYDReg5tk7fKNV/s1080/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1073&quot; data-original-width=&quot;1080&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqYAqVZWMZDG3c_k0a7ZsTSw4Yvy3UP_6AnW5GNRsetVlzl4fQKwkW3YUrrpdV1V_z5Ju5GLKDQylB58adZA1a7fDHyr62OhRNYFUZk-mf4JRsYD4wiRTGiXnDo8j-uWlhEDmkYIwmIXGrNqHGddTKTFdnNpZ58tPbvRe6npRAZp7FqycYDReg5tk7fKNV/s320/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/2314988667064813995/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/2314988667064813995' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/2314988667064813995'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/2314988667064813995'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/oriva.html' title='參加嘖嘖 ORIVA 隨行烘乾機募資預購'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjckc9hldgW_4Tbst79RIyZ0FzZqoIdZCDfTa7ECMHBbBr7LBLOL-P06Cfli0gasf8MNZ7tjw70Vn2sEus6Ym1RLm8w2Z4HHgvK8NsB31uBBQwXR3K8sR8A4TqcVEW8S8MJk9-safhb0ZgYwUwGThQXYoiWApcOKndwTh2PsImT56INuF11NLTUnvvW9Uc7/s72-c/%E5%98%96%E5%98%96ORIVA%E9%9A%A8%E8%A1%8C%E7%83%98%E4%B9%BE%E6%A9%9F%E5%8B%9F%E8%B3%87-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-597581210399410781</id><published>2026-07-14T08:13:12.002+08:00</published><updated>2026-07-14T08:13:12.002+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="人工智慧"/><category scheme="http://www.blogger.com/atom/ns#" term="好書"/><category scheme="http://www.blogger.com/atom/ns#" term="還書"/><title type='text'>市圖還書 1 本 : 超有料!職場第一實用的AI工作術</title><content type='html'>&lt;div&gt;此書被預約須還 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;h2 style=&quot;background-color: white; color: #333333; font-family: Lato, &amp;quot;PingFang TC&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, 微軟正黑體, 新細明體, Arial, sans-serif; font-size: 1.25em; font-weight: normal; line-height: 1.3em; margin: 0px 0px 10px; padding: 0px;&quot;&gt;&lt;a href=&quot;https://webpacx.ksml.edu.tw/bookDetail/1772677&quot; id=&quot;seq_1&quot; style=&quot;background-color: transparent; box-shadow: none; color: #dd1f03; cursor: pointer; outline: 0px; transition: 0.5s;&quot; title=&quot;&quot;&gt;超有料!職場第一實用的AI工作術&lt;/a&gt;&lt;/h2&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;旗標出版的書內容質感都不錯 (個人評價 No.1), 此書亦然. 此書對於剛要步入職場的社會新鮮人實用度非常高, 從 AI 製做簡報, 影片修圖, 處理郵件+合約, 到廣宣文案生成等等, 涵蓋面足敷剛踏入職場的新手應付工作所需.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/597581210399410781/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/597581210399410781' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/597581210399410781'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/597581210399410781'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/1-ai.html' title='市圖還書 1 本 : 超有料!職場第一實用的AI工作術'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-7957580979843993109</id><published>2026-07-13T23:47:22.800+08:00</published><updated>2026-07-22T10:10:57.097+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="生活"/><title type='text'>申請中國信託和泰聯名卡</title><content type='html'>&lt;div&gt;由於最近打算買新車 (豐田 RAV4 旗艦版), 我詢問 Gemini 付款方式, 它說可以辦車貸, 若資金充足建議全款付清, 不用給銀行賺利息. 我算是個小田僑, 當然是全款付清啦! 他說那這樣可以先辦一張中國信託和泰聯名卡, 這樣尾款可以刷這張卡 (綁定和泰 Pay),&amp;nbsp;全額刷卡可以現賺 0.6% 的和泰 Points 點數 (無上限, 刷 120 萬可拿到 7200 點, 1 點等於 1 元),&amp;nbsp;可以直接拿來折抵 RAV4 年底前的原廠定期保養費用 (目前點數計算方式 1 點等於 1 元在 2026-12-31 前有效).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;刷卡購車點數回饋辦法 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.ctbcbank.com/content/dam/minisite/long/creditcard/Hotai/index.html&quot; target=&quot;_blank&quot;&gt;Lexus、TOYOTA購車全額享0.6%和泰Points回饋無上限&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPDUZV9nkCSAvNoyCVuFjNuxUPor_oYO_WxREmF7KqY6ebQQyKcUeOfgAP44a0rqHoao6z0N_sKUlV1u4lj-8_VMhcI1yBK0JutuNIkLVZ6a-ECqcobsUV2cbPdz59tISGyG0Kr9x6WDevJ6y-qEh0fTnM5aELpUrJoaA97D7a3Je92ILte7W8apsaAx0q/s1997/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1178&quot; data-original-width=&quot;1997&quot; height=&quot;189&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPDUZV9nkCSAvNoyCVuFjNuxUPor_oYO_WxREmF7KqY6ebQQyKcUeOfgAP44a0rqHoao6z0N_sKUlV1u4lj-8_VMhcI1yBK0JutuNIkLVZ6a-ECqcobsUV2cbPdz59tISGyG0Kr9x6WDevJ6y-qEh0fTnM5aELpUrJoaA97D7a3Je92ILte7W8apsaAx0q/s320/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;線上申辦網址 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://www.ctbcbank.com/content/dam/minisite/long/creditcard/Hotai/index.html&quot; target=&quot;_blank&quot;&gt;中國信託和泰聯名卡&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;填寫姓名與生日, 勾選卡片類型 (可綁悠遊卡), 馬上就辦好了, 實體卡約需五天寄達, 但現在就可以下載和泰 Pay app 綁定此張信用卡消費了 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSvp_KmwmCNhQDf6wo8E11snGWuk9iofcLGPa7dQ2LqrdwkuMRwuKS5T-JqTHycZs2-inBq6wXu5DUgaIduccj5_XDxTU9n1IMgPwrjDd51Wt-8m7pYam_iiH54aFy_Kbf28mAhg82ATzzyHyg9Q2ktF3xNEaNviv7OGjXAoHfizFMo6wKgEKqTNWjFQOv/s1168/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1054&quot; data-original-width=&quot;1168&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSvp_KmwmCNhQDf6wo8E11snGWuk9iofcLGPa7dQ2LqrdwkuMRwuKS5T-JqTHycZs2-inBq6wXu5DUgaIduccj5_XDxTU9n1IMgPwrjDd51Wt-8m7pYam_iiH54aFy_Kbf28mAhg82ATzzyHyg9Q2ktF3xNEaNviv7OGjXAoHfizFMo6wKgEKqTNWjFQOv/s320/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDKToz5eiNzMziXwK4L5E6u6rnWsDbGyiTHIXPLcjh_2iCjS-ERH7rzFPmG3uX1ku6rm25UT0y0DtsVXXZ66D4Dujt-YOjuuJZLG5ElgBl54AjvmiA4qZU4-jcrwRtTDmFpMCYAylh7SJNokEzyC5Mr4i7VKenW9-On-ZbsvRVBfqc4nJechhqYGCP4lHx/s1590/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;585&quot; data-original-width=&quot;1590&quot; height=&quot;118&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDKToz5eiNzMziXwK4L5E6u6rnWsDbGyiTHIXPLcjh_2iCjS-ERH7rzFPmG3uX1ku6rm25UT0y0DtsVXXZ66D4Dujt-YOjuuJZLG5ElgBl54AjvmiA4qZU4-jcrwRtTDmFpMCYAylh7SJNokEzyC5Mr4i7VKenW9-On-ZbsvRVBfqc4nJechhqYGCP4lHx/s320/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;現在刷聯名卡有洗車優惠 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI9pszknavPTyoI7ZprV01ynE1SFnC5nR9tpl-AYAbSjxM86nsK6jAJorMU19noD5mcZ_laTK5dtDPCYXya_aTqrwSUHFSyaNEBnswpLgY0t3XhDTBS2GsRQZO0iUtVB-iMGFcnrWCs60WNB8saoGEmrUXP2rJOvLV1mygfxtNMomI78ToThToc3WfOpHD/s1594/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;858&quot; data-original-width=&quot;1594&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI9pszknavPTyoI7ZprV01ynE1SFnC5nR9tpl-AYAbSjxM86nsK6jAJorMU19noD5mcZ_laTK5dtDPCYXya_aTqrwSUHFSyaNEBnswpLgY0t3XhDTBS2GsRQZO0iUtVB-iMGFcnrWCs60WNB8saoGEmrUXP2rJOvLV1mygfxtNMomI78ToThToc3WfOpHD/s320/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-4.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia9pLv_vl9uJVFdCw6qqKdNVCpd7QLVH2dW3Q6WDr1sMypAnvSwDxDsgvlw_T2wTDsFMKDphRXhLKCN_BM5HZ9_2joClRcZ3V9ZD56piMHZYXzEzzUoKD09DLrYwfjyUothyDQPfQ5fHcQjigAaHCM8dgxc8eeBL6IyEQCuefEZDZ18AoPmbKlxYWJTAcR/s2367/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;970&quot; data-original-width=&quot;2367&quot; height=&quot;131&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia9pLv_vl9uJVFdCw6qqKdNVCpd7QLVH2dW3Q6WDr1sMypAnvSwDxDsgvlw_T2wTDsFMKDphRXhLKCN_BM5HZ9_2joClRcZ3V9ZD56piMHZYXzEzzUoKD09DLrYwfjyUothyDQPfQ5fHcQjigAaHCM8dgxc8eeBL6IyEQCuefEZDZ18AoPmbKlxYWJTAcR/s320/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-5.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果前段的訂金與後段的規費+保險也可刷這張卡, 回饋是 1%; 中段的高額尾款 (約 120 萬) 回饋比率是 0.6%, 以 5 萬元訂金計算可得 500 點, 合計 7700 點.&amp;nbsp;在刷卡付尾款前一天先打電話給中國信託客服, 表示明天買新車要刷和泰 Pay 尾款 120 萬, 現在直接轉帳 120 萬進中信指定帳戶, 要求客服幫我溢繳調高臨額 (人話 : 預存現金然後叫銀行暫時放寬刷卡上限) 即可.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2026-07-14 補充 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;已下載 My Toyota app, 等收到信用卡再綁定. 很巧昨日剛好收到公司福利會寄來的 Toyota 購車優惠 DM, RAV4 Adventure 價格寫 12? 萬 (我猜是 127~129), 雖沒寫旗艦版價格, 估計可能 123~125, 已填寫諮詢單回傳, 等業務員電話來時再詳細詢問.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2026-07-22 補充 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7/20 收到卡了, 已綁定和泰 Pay :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5j5Emtvfi017vADwEPJIECjmYRkT7k95U1ySoUb_loJhe0vyoq6eBfi7dReFWdf140UY0-4WoH2HKnZGQbSmhsUZ823N32wp3Q4DDfZAFTiCY4n6wzxJRL4TLzZvmdSE4hlSYw8AB7saGezTpPhXt_PXz4nvpwEn6atSDmeNSHf3n4Gt6-CUoyuIsFTeV/s1282/%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;862&quot; data-original-width=&quot;1282&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5j5Emtvfi017vADwEPJIECjmYRkT7k95U1ySoUb_loJhe0vyoq6eBfi7dReFWdf140UY0-4WoH2HKnZGQbSmhsUZ823N32wp3Q4DDfZAFTiCY4n6wzxJRL4TLzZvmdSE4hlSYw8AB7saGezTpPhXt_PXz4nvpwEn6atSDmeNSHf3n4Gt6-CUoyuIsFTeV/s320/%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/7957580979843993109/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/7957580979843993109' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7957580979843993109'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/7957580979843993109'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/blog-post_747.html' title='申請中國信託和泰聯名卡'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPDUZV9nkCSAvNoyCVuFjNuxUPor_oYO_WxREmF7KqY6ebQQyKcUeOfgAP44a0rqHoao6z0N_sKUlV1u4lj-8_VMhcI1yBK0JutuNIkLVZ6a-ECqcobsUV2cbPdz59tISGyG0Kr9x6WDevJ6y-qEh0fTnM5aELpUrJoaA97D7a3Je92ILte7W8apsaAx0q/s72-c/%E7%94%B3%E8%AB%8B%E4%B8%AD%E5%9C%8B%E4%BF%A1%E8%A8%97%E5%92%8C%E6%B3%B0%E8%81%AF%E5%90%8D%E5%8D%A1-3.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-2088872968256323057</id><published>2026-07-13T15:19:26.450+08:00</published><updated>2026-07-14T00:38:04.267+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="音樂"/><title type='text'>古風的辭九門回憶</title><content type='html'>&lt;div&gt;今天偶然在 fb 聽到這首歌, 搜尋發現是中國歌手鄧寓君唱的 &quot;辭九門回憶&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=3TjRpJmbsgc&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/watch?v=3TjRpJmbsgc&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/3TjRpJmbsgc&quot; width=&quot;320&quot; youtube-src-id=&quot;3TjRpJmbsgc&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;也有動感的 DJ 版 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=O5nZZLkfOcM&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/watch?v=O5nZZLkfOcM&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/O5nZZLkfOcM&quot; width=&quot;320&quot; youtube-src-id=&quot;O5nZZLkfOcM&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;除了優美的古風旋律外, 它的詞也填得很美 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;作詞：蟲二顛&amp;nbsp; &amp;nbsp; &amp;nbsp;作曲：妖狐公子&amp;nbsp; &amp;nbsp; 編 曲：唯 子&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一曲定重樓&lt;/div&gt;&lt;div&gt;一眼半生籌&lt;/div&gt;&lt;div&gt;看的全都是那詭譎雲湧&lt;/div&gt;&lt;div&gt;入得此門不回首&lt;/div&gt;&lt;div&gt;無需宣之於口&lt;/div&gt;&lt;div&gt;我對案再拜那風雨瓢潑的殘陋&lt;/div&gt;&lt;div&gt;再聚首&lt;/div&gt;&lt;div&gt;戲子多秋&lt;/div&gt;&lt;div&gt;可憐一處情深舊&lt;/div&gt;&lt;div&gt;滿座衣冠皆老朽&lt;/div&gt;&lt;div&gt;黃泉故事無止休&lt;/div&gt;&lt;div&gt;戲無骨難左右&lt;/div&gt;&lt;div&gt;換過一折又重頭&lt;/div&gt;&lt;div&gt;只道最是人間不能留&lt;/div&gt;&lt;div&gt;誤闖天家&lt;/div&gt;&lt;div&gt;勸餘放下手中砂&lt;/div&gt;&lt;div&gt;張口欲唱聲卻啞&lt;/div&gt;&lt;div&gt;粉面披衣叫個假&lt;/div&gt;&lt;div&gt;憐余來安座下&lt;/div&gt;&lt;div&gt;不敢沾染佛前茶&lt;/div&gt;&lt;div&gt;只作凡人赴雪月風花&lt;/div&gt;&lt;div&gt;繞過胭脂樓&lt;/div&gt;&lt;div&gt;打散結髮扣&lt;/div&gt;&lt;div&gt;唱的全都是那情深不壽&lt;/div&gt;&lt;div&gt;入得此門不回首&lt;/div&gt;&lt;div&gt;無需宣之於口&lt;/div&gt;&lt;div&gt;我對鏡遮掩那風雨瓢潑的殘陋&lt;/div&gt;&lt;div&gt;碑已舊&lt;/div&gt;&lt;div&gt;戲子多秋&lt;/div&gt;&lt;div&gt;可憐一處情深舊&lt;/div&gt;&lt;div&gt;滿座衣冠皆老朽&lt;/div&gt;&lt;div&gt;黃泉故事無止休&lt;/div&gt;&lt;div&gt;戲無骨難左右&lt;/div&gt;&lt;div&gt;換過一折又重頭&lt;/div&gt;&lt;div&gt;只道最是人間不能留&lt;/div&gt;&lt;div&gt;誤闖天家&lt;/div&gt;&lt;div&gt;勸餘放下手中砂&lt;/div&gt;&lt;div&gt;送那人御街打馬&lt;/div&gt;&lt;div&gt;才子佳人斷佳話&lt;/div&gt;&lt;div&gt;憐餘來苦咽下&lt;/div&gt;&lt;div&gt;求不得佛前茶&lt;/div&gt;&lt;div&gt;只留三寸土種二月花&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;歌詞大概是描寫戲子愛上了身份高貴的人, 但門戶的不匹配, 注定了這是一場悲劇. 情郎似乎科舉及第, 還能在宮門前騎馬, 從此飛黃騰達, 而身份低微的戲子只能對名份與愛情痛苦地絕望,&amp;nbsp;只希望死後墳上的三寸荒土能在二月開春時節開出美麗的花, 真是淒美啊. 這首歌讓我想起梅艷芳與張國榮主演的香港電影 &quot;胭脂扣&quot;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/2088872968256323057/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/2088872968256323057' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/2088872968256323057'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/2088872968256323057'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/blog-post_13.html' title='古風的辭九門回憶'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/3TjRpJmbsgc/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-8100766046755207806</id><published>2026-07-12T21:04:00.627+08:00</published><updated>2026-07-12T22:32:28.015+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="生活"/><title type='text'>2026 年第 27 周記事</title><content type='html'>&lt;div&gt;週三請了一天假陪水某與菁菁去大甲鎮瀾宮參拜, 這是我第一次造訪大甲, 其實台中對我來說通常只是路過而已, 我家在台中只有姑姑一房親戚, 小時候祖母常帶我們兄弟去清泉崗眷村的姑姑家, 當兵休假與在台北工作時, 偶而也會去住一兩天, 直到表哥他們搬離那裏. 這次去大甲給我印象非常好, 鎮瀾宮外都是美食, 有火車經過交通很便利.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;中颱巴威周六襲台, 周五台北放颱風假, 在台北開便當店的小阿姨打電話說沒甚麼風雨, 她還跑去泡溫泉哩. 新聞說股市休市一天市值蒸發 100 多億, 可能是被上回內湖淹水嚇到了, 畢竟年底選舉的腳步近了. 我覺得其實沒甚麼好擔心的, 恕我直言, 就算不放颱風假, 萬安還是會連任的啦.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;經過一周努力, 周六終於把舊筆電 INHON Carbonbook 救活, 順利重灌 Win11 與開發環境後做了還原點與映像備份, 據 CrystalDiskInfo 分析資訊, SSD 使用度算是年輕級的, 應該還可以再用好幾年, 將做為備用筆電用. 兩個月來的舊筆電拯救活動終於在本周告一段落了, 下周要全力投入 agy 專案開發.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/8100766046755207806/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/8100766046755207806' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/8100766046755207806'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/8100766046755207806'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/2026-27.html' title='2026 年第 27 周記事'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-8906552087987118398</id><published>2026-07-12T08:05:30.334+08:00</published><updated>2026-07-14T00:41:29.765+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="生活"/><title type='text'>Nissan e-Power vs Toyota RAV4</title><content type='html'>&lt;div&gt;前陣子周遭朋友與同學陸續換車, 我的 QRV Serenna 也開了 20 年了, 雖然車況還不錯, 但老車總有一些小毛病, 有時感到很困擾 (目前是偶而怠速熄火, 後車箱門有時要按兩次才會解鎖等等). 峰大師去年換 Nissan X-Trail&amp;nbsp; e-Power (二代五人座), 曾開來鄉下家讓我試乘, 我那時非常喜歡這台車, 覺得它的設計理念很獨特, 但 QRV 又開得好好的, 還不需要換車, 等退休前 2~3 年再說, QRV 至少還可以再開五年以上. 但最近想到, 退休前的這 5 年可能會較頻繁往返城市與鄉下, QRV 油耗太高了, 應該換一台較省油的車來開. 以下是我這兩天與 Gemini 討論後整理的心得.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;X-Trail&amp;nbsp; e-Power 是 100% 馬達驅動的油電車, 它給我的第一感覺是車內靜音做得非常好 (前擋與雙前座雙層隔音玻璃, 全車使用大量吸音棉), 有電車的平穩舒適 (e-4ORCE 馬達精準控制帶來的穩定性), 但沒有一般電車的里程焦慮. 它並不是一般需要外接充電的純電動車, 而是配備一具 1.5 公升 VC-Turbo 引擎作為發電機, 只負責為鋰電池充電. 目前台灣上市的是 2026 小改款的二代, 建議售價 151 萬, 平均油耗是 17.5km/L (同學說它開了一年實際約 14km/L). 聽說明年將推出第三代 e-power, 油耗提升至 21.0 km/L, 且提供第三排座椅選配成為 5+2 空間配置, 蠻符合我家偶而全家 6 人出遊的需求 (但 5+2 的第三排空間較窄, 通常較適合小孩或短途應急, 大人坐久會像坐板凳, 舒適度不足, 不適合長途旅行), 參考 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://tw.news.yahoo.com/nissan-%E6%96%B0-%E4%BB%A3-x-trail-064300384.html&quot; target=&quot;_blank&quot;&gt;Nissan 新一代 X-Trail 換上全新造型明年問世！尺碼增大空間更寬敞&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;豐田 RAV4 則是油電混合車 (Hybrid), 搭載最新世代的 THS 油電科技, 引擎與馬達共同負責驅動車輪, 在低速時主要由馬達驅動, 高速巡航時引擎所占比例提高, 馬達仍會依需求輔助驅動或回收能量, 這是目前全世界最成熟, 市佔率最高的油電架構. 今年初大改款後價格非常誘人, 最受歡迎的旗艦版建議售價 130萬, 平均油耗高達每公升 24.0 km, 是我的 QRV 的 2~3 倍! 此款油電混合車配備 2.5L 排氣量與兩顆馬達 (發電馬達 MG1 與驅動馬達 MG2), 它沒有使用傳統變速箱來換檔, 而是透過一個叫 &quot;行星齒輪&quot; 的結構 (E-CVT, 電子控制無段變速器) 將引擎和馬達結合在一起互相截長補短, 創造出舒適與省油兼具的駕車體驗.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一般情況下, RAV4 在起步與市區低速行駛時, 若高壓電池電量足夠, 引擎通常會熄火, 由 MG2 驅動車輛, 高壓鋰電池 (以下簡稱大電池) 放電驅動馬達 (MG2) 推動前輪,&amp;nbsp;這時它的行駛感受非常接近純電動車, 安靜且平順; 當踩油門超車或爬坡時,&amp;nbsp;引擎和馬達同時使勁推動前輪, 提供最高約 229 匹的系統綜效動力; 在高速公路行駛時,&amp;nbsp;引擎在最省油的轉速下巡航, 它輸出的動力會分兩路, 一路直接推動輪子前進, 另一路拿去帶動發電機 (MG1) 發電, 把電充回大電池備用; 當鬆開油門滑行或煞車減速時引擎會熄火, 車子的前進慣性會反向帶動驅動馬達 (MG2) 旋轉, 馬達此時變身為發電機, 把減速的動能換成電能灌回大電池充電. 參考 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=uPawJvwkpL0&quot; target=&quot;_blank&quot;&gt;台灣最熱賣進口休旅再進化 Toyota RAV4旗艦車型試駕&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=w8R_r0Rm2mk&quot; target=&quot;_blank&quot;&gt;【RAV4 怎麼選才不後悔？】全車型配備差異一次看懂！&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=p7yIx8w7WRI&quot; target=&quot;_blank&quot;&gt;想買RAV4必看！Toyota RAV4旗艦版徹底剖析&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=dP6dIBSqbpQ&quot; target=&quot;_blank&quot;&gt;RAV4竟然從無聊的交通工具變成有趣的車？&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=HGSPObo9QAY&quot; style=&quot;background-color: #fcff01;&quot; target=&quot;_blank&quot;&gt;Toyota 第六代Rav4 分享影片，好壞都會講，你們會喜歡&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;RAV4 旗艦版主要配備 :&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;影音 : 搭載 12.9 吋日本原裝 Arene 軟體平台車機, 支援智能語音與 OTA.&lt;/li&gt;&lt;li&gt;主動安全 :&amp;nbsp;標配 TSS 4.0 (全速域 ACC 與車道維持 LTA), 旗艦版含電子後視鏡.&lt;/li&gt;&lt;li&gt;舒適性 : 雙前座通風/加熱椅, 足踢尾門&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;雖然 e-Power 在隔音方面極致安靜, 但著眼於省油考量 (還有雙前座通風椅在炎夏帶來的涼爽), 我應該會選 RAV4 旗艦版. RAV4 最大的優勢其實不是省油, 而是全球累積超過數千萬套的實際道路驗證. 豐田車安全, 省油, 好養業界知名, 其 Hybrid 系統耐用度與二手殘值傲視市場其他廠牌, 例行保養是全台公認最強的國產價, 零件 (如機油芯, 冷氣濾網) 由於與多款車型共用, 外頭民間廠也都會修, 原廠常規小保養通常在 2,500~3,500 元之間, 每 4 萬或 6 萬公里的大保養費用也能控制在 5,000~6,500 元左右, 保養成本較低. 大條維修方面, RAV4 的 2.5L 自然進氣引擎構造相對傳統簡單, 構造相對成熟, 長期維修風險相對較低; 豐田成熟的油電大電池, 原廠提供 8 年或 16 萬公里保固, 過保後如果需要自費更換, 目前行情大約在 5~6 萬元左右. 總之, 豐田模式的保養特點是 : 便宜, 據點多, 零件到處都有, 目前大電池更換成本已比早年大幅降低, 對長期持有者而言負擔已不像過去那麼高.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;e-Power 常規保養並不會貴, 只比 RAV4 稍高一點, 小保養約 3,000~4,000 元, 4 萬公里的大保養原廠報價一般約 5,000~10,000元, 視保養項目而定. 大電池原廠提供 8 年或 16 萬公里保固, 然而因為是進口高規格組件, 過保後的自費更換價格預估會比 Toyota 貴 (過往經驗推估在 8~10 萬元以上). 其次, 那具負責發電的 1.5L 引擎是 VC-Turbo (可變壓縮比渦輪引擎), 這是一項能根據發電需求自動切換引擎壓縮比的精密黑科技, 雖然效率極高, 但構造較為複雜, 未來高里程過保後. 這具引擎的周邊傳感器或渦輪系統預期維修成本可能會比 RAV4 高. 另外,&amp;nbsp;它的車頭搭載了非常具有科技感的全新分離式/貫穿式 LED 燈組, 萬一發生碰撞, 車身鈑件加上進口零件的單價非常高,&amp;nbsp;乙式車體險絕對不能省.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不過在稅金方面 RAV4 的 2.5 L 引擎似乎較吃虧, 因為剛好跨過 2400cc 級距, 每年的稅費比 e-Power 多出 10490 元 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUeA0LZeJGFhcbeeWIIQXQSfB7dxEi26rvfRZgHR8DIuyTSJoWkr7ovmN_6vxn6v2eG-H47GAHTnCeN0_1EAn2qlSU64HpuZdZ5LAvI4de_MRO9dypmEUuQUl7Hn-rvEId7igCyus78bFwJ0gAQE48vckyV-R8Yfm12kdqb7IqK9JUVlaMmGiLhT3MX1Y1/s1408/RAV4-vs-XTrail_ePower-tax-comparison.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;551&quot; data-original-width=&quot;1408&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUeA0LZeJGFhcbeeWIIQXQSfB7dxEi26rvfRZgHR8DIuyTSJoWkr7ovmN_6vxn6v2eG-H47GAHTnCeN0_1EAn2qlSU64HpuZdZ5LAvI4de_MRO9dypmEUuQUl7Hn-rvEId7igCyus78bFwJ0gAQE48vckyV-R8Yfm12kdqb7IqK9JUVlaMmGiLhT3MX1Y1/s320/RAV4-vs-XTrail_ePower-tax-comparison.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不過車價價差 15~20 萬, 足以繳 15~20 年的 RAV4 稅金差額, 加上 RAV4 高油耗省下來的油錢其實從總持有成本 (車價 + 稅金 + 油錢) 來看也沒有那麼吃虧.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;月底跟阿中從岡山回來後, 找個周六上午跟水某去 TOYOTA 北高雄賞車與試駕看看.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2026-07-12 補充 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;買 e-Power 還有一個車廠財務體質的顧慮, Nissan 近兩年出現巨額虧損, 2025 財年到 2026 年初全球累計虧損已突破 $1.2 兆日圓 (約數十億美元). 原廠被迫啟動名為 Re:Nissan 的激進重整計畫, 全球大裁員兩萬人, 甚至關閉了 7 座生產基地與設計工作室, 就連現任執行長在 2026年 3 月接受外媒訪問時都坦言不排除在未來將公司出售或尋求併購.&amp;nbsp;雖然台灣的 Nissan 是由實力雄厚的裕隆日產代理, 短期內在台灣的保養與據點不會受到影響, 但 X-Trail e-Power 是進口車, 車上搭載的是新技術的專利黑科技 &quot;VC-Turbo 可變壓縮比引擎&quot;, 如果母廠為了省錢削減研發, 精簡海外零件供應鏈, 過保固後的有可能增加特殊零件等待時間或成本. 反觀豐田目前的財務狀況與全球市佔率依然是世界第一, 發生零件斷料的風險相對最低.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其次是電池方面, 上回曾聽同學峰大師說他自己的案例, 他開 e-Power 去露營時晚上爽爽吹冷氣, 但早上起來發現車子竟然發不動, 它不是有顆大電池嗎? 我將此案例貼給 AI 詢問可能原因, 以下是依據 AI 與公開資料整理出的可能原因, 實際情況仍須視車輛狀態與當時使用方式而定. AI 推測由於 e-Power 是 100% 靠馬達驅動, 它的行車電腦對大電池的電量安全感極低,&amp;nbsp;當車宿吹冷氣時, 只要電池電量稍有下降, 那具 1.5L 的渦輪發電機引擎就會馬上打火發電,&amp;nbsp;依氣溫與冷氣設定, 以及電池 SOC 不同, 一般可能每隔 5 到 10 分鐘就會啟動一次, 而且因為它是渦輪引擎, 為了快速拉高轉速發電, 啟動時的低頻噪音和震動在安靜的野外夜裡會非常明顯,&amp;nbsp;睡眠品質會大打折扣.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;而 e-Power 在車宿長時間 READY 吹冷氣情境下可能存在相對不利的使用特性.&amp;nbsp;元兇不是那顆負責驅動車子的大電池沒電, 而是車上另一顆負責控制系統大腦的 12V 傳統小電瓶被吸乾了.&amp;nbsp;這是許多油電或電動車車宿新手最容易犯的錯誤,&amp;nbsp;很多人晚上要睡覺時為了省電, 按點火開關時沒有踩煞車, 只把車子切換到 ACC (通電) 或 ON 模式, 以為這樣就可以單純吹冷氣與聽音樂.&amp;nbsp;在這種類似紅火的狀態下, 車子誤以為你只是暫時停在路邊, 因此大電池的電力是不會輸出來幫 12V 小電瓶充電的, 此時車上的螢幕, 冷氣風扇, 車內燈, 甚至行車紀錄器全都是直接去吸那顆小電瓶的電, 不到幾個小時就會徹底被吸乾, 小電池一旦沒電, 車子的大腦無法開機, 就算大電池還有滿滿的電, 車子也會鎖死完全無法啟動 (無法進入 READY 狀態).&amp;nbsp;正確做法是跟平常開車一樣踩著煞車按啟動, 讓儀表板亮起 READY 燈號, 此時大電池的發電系統才會正式啟動, 一邊吹冷氣, 一邊隨時幫 12V 小電瓶補電.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;但 e-Power 在車宿情境下仍有一項值得注意的使用特性, 即使車宿吹冷氣時有正確進入 READY 狀態,&amp;nbsp;e-Power 為降低重量與成本, 搭載容量較小的高壓電池, 主要依靠引擎即時發電維持能源供應, 因此吹冷氣可能不到 10 分鐘引擎就必須啟動打火一次幫大電池補電,&amp;nbsp;每次打火發動的那一瞬間需要極大的瞬間電流, 這主要都是靠 12V 鉛酸小電池來提供, 問題就出在引擎頻繁打火可能會造成 12V 小電池來不及補滿電, 特別是冷氣開得很強耗電快,&amp;nbsp;引擎啟動發電的時間又太短, 大電池很快充飽了, 但負責回充給 12V 小電池的直流轉換器來不及把小電池充飽, 10 分鐘後就又被下一次的打火給消耗掉電力,&amp;nbsp;這樣反覆折騰到後半夜, 那顆 12V 小電池就會因為頻繁打火而徹底虛脫耗盡電力, 結果就是隔天早上小電池宣告陣亡, 整台車癱瘓.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;RAV4 相對來說比較不會發生 12V 電池耗盡這種事, 因為在 READY 狀態下, 大電池的電力非常雄厚, 它不需要頻繁打火, 大電池供應冷氣 30~40 分鐘引擎才發動一次 (依外界氣溫, 空調設定及 SOC 而異), 一整個晚上頂多打火 10 幾次而已. 重點是, 豐田的 DC-DC (直流轉換器) 控電邏輯非常保守且安全, 它的行車電腦有一個相當保守的保護機制, 在 READY 狀態下, 當它偵測到 12V 小電池的電壓偏低, 其保守的 DC-DC 控電策略通常能持續維持 12V 系統正常供電. 萬一遇到大電池電量也過低, 且引擎因為特殊狀況 (例如油箱快沒油或系統保護) 無法發動時, RAV4 會在螢幕上跳出警告並自動切斷大燈, 音響與冷氣風扇等周邊耗電, 目的是要保留最後一口氣, 不讓 12V 小電池走到深度放電的死路, 所以豐田油電車在 READY 狀態下車宿吹冷氣機幾乎還沒聽說過隔天小電池會沒電的.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;此外, 一般車 (包括 X-Trail e-Power) 的 12V 小電池通常放在引擎室裡面, 南部的夏天非常炎熱, 引擎運轉時的高溫動輒 70~80 度, 而高溫正是鉛酸電池短命的元兇之一. RAV4 為了平衡車身前後配重, 把 12V 小電池移到了後行李廂的右側內板裡 (也就是室內空間), 這正是讓 12V 電池變長壽的巧妙設計. 由於它位於車室後方, 工作環境通常比引擎室溫和, 有助於降低高溫對鉛酸電池壽命的影響, 許多車主開到 4~5 年才需要預防性更換. 注意, RAV4 的 12V 鉛酸電池唯一的任務就是提供微弱的電流, 幫車上的行車電腦 (ECU) 開機, 把儀表板點亮並將大電池的高壓繼電器接通, 只要能讓車子顯示出 READY, 小電池的任務就 100% 功成身退了, 它不必像一般油車的 12V 電池還要負責輸出大電流來啟動引擎, RAV4 負責發動引擎的是那顆高壓大馬達 MG1,&amp;nbsp;大電池會用它那超級大電量, 瞬間把引擎轉速直接拉到 1000 轉以上點火發動引擎, 完全用不到 12V 小電池的電力.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果是要每天開車通勤, 重視駕車質感與靜肅性, e-Power 的駕馭體驗確實很吸引人; 但以我希望一台車再開十幾二十年, 退休後降低維修與使用成本的需求來看, RAV4 Hybrid 提供了更成熟的技術, 更完善的維修體系, 以及較低的長期持有風險. 因此這次我的選擇不是因為 e-Power 不夠好, 而是 RAV4 更符合我的用車需求.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/8906552087987118398/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/8906552087987118398' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/8906552087987118398'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/8906552087987118398'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/nissan-e-power-vs-toyota-rav4.html' title='Nissan e-Power vs Toyota RAV4'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUeA0LZeJGFhcbeeWIIQXQSfB7dxEi26rvfRZgHR8DIuyTSJoWkr7ovmN_6vxn6v2eG-H47GAHTnCeN0_1EAn2qlSU64HpuZdZ5LAvI4de_MRO9dypmEUuQUl7Hn-rvEId7igCyus78bFwJ0gAQE48vckyV-R8Yfm12kdqb7IqK9JUVlaMmGiLhT3MX1Y1/s72-c/RAV4-vs-XTrail_ePower-tax-comparison.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-1963779296013390173</id><published>2026-07-12T00:14:49.784+08:00</published><updated>2026-07-12T00:37:17.985+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="筆電"/><category scheme="http://www.blogger.com/atom/ns#" term="索引"/><title type='text'>舊筆電維修筆記索引</title><content type='html'>&lt;div&gt;最近兩個月把三台舊筆電陸續升版與修復到可用狀態, 最先是 ASUS X550C, 這台因為錯過 Win8 升版為 Win10 最後期限, 一些軟體卡在 Win8 而無法安裝, 最後利用 Win10 ISO 檔直接安裝升版.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其次是 DELL Vostro 2520 筆電, 此機為 Win7 專業版, 但卡在多年未用丟失管理員密碼, 連日期時間都無法修改, 最後用 Rufus 製作 Ubuntu Linux 開機 USB, 直接抹除管理員密碼而恢復掌控.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後是這兩天修復的 INHON Carbonbook 筆電 (之前是因為系統毀損無法開機而換 ACER Swift 5), 拆機發現 SSD 是特規無法找到替代品, 原本準備放棄, 哪知清潔金手指接點後居然可以讀到 SSD 了, 這幾天用 Win10 安裝 USB 重灌後恢復正常使用.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;為了以後查找方便, 將維修筆記整理索引如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/asus-x550c-win10.html&quot; target=&quot;_blank&quot;&gt;ASUS X550C 筆電升版為 Win10&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/dell-vostro-2520.html&quot; target=&quot;_blank&quot;&gt;DELL 老筆電 Vostro 2520 修復 (失敗)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/dell-vostro-2520_0522440810.html&quot; target=&quot;_blank&quot;&gt;DELL 老筆電 Vostro 2520 修復 (成功)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;# I&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/inhon.html&quot; target=&quot;_blank&quot;&gt;NHON 應宏 Carbonbook 筆電維修 (一)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (二)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (三)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0806124385.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (四)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0700740172.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (五)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0577435743.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (六)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_01051194699.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (七)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;比較可惜的是&amp;nbsp;ACER Swift 5, 兩年多前因為銀幕橫線退役後被我當作下載用的桌機, 原本用得好好的, 不料六月時遭到阿咪尿攻而無法開機, 前陣子拆機發現電源模組附近腐蝕嚴重, 修復機會渺茫, 只好讓它安息主懷.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/1963779296013390173/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/1963779296013390173' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1963779296013390173'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/1963779296013390173'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/blog-post_12.html' title='舊筆電維修筆記索引'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-5147563634315371494</id><published>2026-07-11T15:44:43.541+08:00</published><updated>2026-07-11T15:44:43.541+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="筆電"/><title type='text'>INHON 應宏 Carbonbook 筆電維修 (七)</title><content type='html'>&lt;div&gt;今天終於完成 INHON Carbonbook 筆電的重灌, 讓老筆電重獲新生. 本篇要用 CrystalDiskInfo 來取得 SSD 硬碟的健檢資訊, 讓 Gemini 提出分析報告.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;本系列之前的文章參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;# I&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/inhon.html&quot; target=&quot;_blank&quot;&gt;NHON 應宏 Carbonbook 筆電維修 (一)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (二)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (三)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0806124385.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (四)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0700740172.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (五)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0577435743.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (六)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;CrystalDiskInfo 是一款小巧的 HDD/SSD 健康檢測軟體, 可從微軟商店免費下載安裝, 參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/04/hddssd-crystaldiskinfo.html&quot; target=&quot;_blank&quot;&gt;HDD/SSD 健康狀態檢測軟體 CrystalDiskInfo&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;INHON Carbonbook 的 SSD 健檢數據如下 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_I7SGsfYIPvzS6dZWYuNRwRkLy5-fwQkqBG1s6j5hmvUmGZEZ1Ee32P1CLZ48ZLyW_mH6Q28yEnmCVmVDW60yvfuGVOmdXcvRwB5p9s7u-6_1HVb1sT0FVb-PA_R273fC4xNJ7zZaJcutFfz8Bv9HxDBqEchBRpFFmr5qCQKvj-RsZ3Q5vvUdXPcxdhGJ/s670/INHON-CrystalDiskInfo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;574&quot; data-original-width=&quot;670&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_I7SGsfYIPvzS6dZWYuNRwRkLy5-fwQkqBG1s6j5hmvUmGZEZ1Ee32P1CLZ48ZLyW_mH6Q28yEnmCVmVDW60yvfuGVOmdXcvRwB5p9s7u-6_1HVb1sT0FVb-PA_R273fC4xNJ7zZaJcutFfz8Bv9HxDBqEchBRpFFmr5qCQKvj-RsZ3Q5vvUdXPcxdhGJ/s320/INHON-CrystalDiskInfo.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gemini 的分析結果如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;========================================&lt;/div&gt;&lt;div&gt;&lt;p data-path-to-node=&quot;1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;1&quot;&gt;這顆硬碟根本沒有壞軌，它健康得很！這台筆電之前的死機，100% 只是純粹的軟體與磁區結構毀損！&lt;/b&gt;&lt;/p&gt;&lt;p data-path-to-node=&quot;2&quot;&gt;從工程師與架構師的數據觀點來看，這顆掛著 &lt;code data-index-in-node=&quot;21&quot; data-path-to-node=&quot;2&quot;&gt;Inhon_128GB&lt;/code&gt; 的 SSD 數據非常漂亮，可以說是以一種極其健康的姿態存活著。以下是關鍵數據的深度拆解：&lt;/p&gt;&lt;h3 data-path-to-node=&quot;3&quot;&gt;📊 核心健康數據分析&lt;/h3&gt;&lt;ul data-path-to-node=&quot;4&quot;&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;磁碟健康狀態：藍色「良好」&lt;/b&gt;
這是最直觀的指標。如果 SSD 晶片有發生嚴重的區塊損壞、或是壽命將盡，這邊會直接顯示黃色的「警告」或紅色的「不良」。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;4,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;01 底層資料讀取錯誤率：原始值為 &lt;code data-index-in-node=&quot;18&quot; data-path-to-node=&quot;4,1,0&quot;&gt;000000000000&lt;/code&gt;&lt;/b&gt;
這行是判定硬碟有沒有「壞軌/讀取物理障礙」的最核心數據。它的原始值是全零，代表這顆 SSD &lt;b data-index-in-node=&quot;77&quot; data-path-to-node=&quot;4,1,0&quot;&gt;從底層硬體晶片來看，從來沒有發生過任何一次讀取失敗。&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;4,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;已用時間總計：4673 小時&lt;/b&gt;
這顆硬碟只使用了 4600 多個小時，換算下來大約只有 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;4,2,0&quot;&gt;194 天&lt;/b&gt; 的連續運轉時間。對一顆一般的 SSD 來說（通常設計壽命在數萬小時以上），這顆硬碟目前正值&lt;b data-index-in-node=&quot;94&quot; data-path-to-node=&quot;4,2,0&quot;&gt;青壯年時期&lt;/b&gt;，離老化還非常遙遠。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;4,3,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0&quot;&gt;已用次數總計：6478 次&lt;/b&gt;
通電次數偏高（平均一小時通電 1.3 次），這非常符合「老筆電被拿來開開關關、或者頻繁進出睡眠/休眠模式」的使用軌跡，對硬碟本身的健康沒有太大負面影響。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;4,4,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,0&quot;&gt;F1 SSD 總寫入量：原始值為 &lt;code data-index-in-node=&quot;17&quot; data-path-to-node=&quot;4,4,0&quot;&gt;000000001C9C&lt;/code&gt;&lt;/b&gt;
十六進位的 &lt;code data-index-in-node=&quot;36&quot; data-path-to-node=&quot;4,4,0&quot;&gt;1C9C&lt;/code&gt; 換算成十進位大約是 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;4,4,0&quot;&gt;7324&lt;/b&gt;。根據這個特規控制器的顆粒計量，它的總寫入量非常低，遠低於這顆 SSD 的寫入壽命極限（TBW）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-path-to-node=&quot;6&quot;&gt;💡 最終診斷與 PM 效率驗證&lt;/h3&gt;&lt;p data-path-to-node=&quot;7&quot;&gt;既然硬碟硬體健康度是完美的 100% 良好，那為什麼前幾天會突然死機、修復開不起來？&lt;/p&gt;&lt;blockquote data-path-to-node=&quot;8&quot;&gt;&lt;p data-path-to-node=&quot;8,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0&quot;&gt;結論：&lt;/b&gt; 當年 Windows 8 升級到 Win 10 的過程中，底層舊的 MBR 分割表與新系統的 EFI 導引產生了衝突（也就是我們一開始抓到的那個 BIOS 鎖定問題）。再加上老系統長年累積的「不安全關機次數（原始值 68 次，代表突然沒電或強制拔電源）」，最終導致微軟的系統檔案崩潰，讓硬碟「誤以為自己壞了」。&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-path-to-node=&quot;9&quot;&gt;現在您透過 Rufus 強制改用 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;9&quot;&gt;GPT/UEFI 格式&lt;/b&gt;，重新洗牌刪除了全部分割區，等於是&lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;9&quot;&gt;用正確的鑰匙打開了這顆原本就沒病的硬碟&lt;/b&gt;。&lt;/p&gt;&lt;p data-path-to-node=&quot;10&quot;&gt;您可以徹底放心了！這顆 128GB 的硬碟還能陪這台筆電再戰好幾年。現在把「還原點」跟「映像備份」做起來，這台機器在硬體與軟體層面上，都已經達到最完美的完全體狀態了！&lt;/p&gt;&lt;/div&gt;&lt;div&gt;========================================&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;原來本機 SSD 還頭好壯壯, 只是金手指接點髒污接觸不良而已, 擦一擦裝回去就能讀到且順利重灌, 還好沒去蝦皮買規格不太確定能否合用的二手 SSD 來重灌, 否則現在應該懊悔白花錢了.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/5147563634315371494/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/5147563634315371494' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/5147563634315371494'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/5147563634315371494'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_01051194699.html' title='INHON 應宏 Carbonbook 筆電維修 (七)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_I7SGsfYIPvzS6dZWYuNRwRkLy5-fwQkqBG1s6j5hmvUmGZEZ1Ee32P1CLZ48ZLyW_mH6Q28yEnmCVmVDW60yvfuGVOmdXcvRwB5p9s7u-6_1HVb1sT0FVb-PA_R273fC4xNJ7zZaJcutFfz8Bv9HxDBqEchBRpFFmr5qCQKvj-RsZ3Q5vvUdXPcxdhGJ/s72-c/INHON-CrystalDiskInfo.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4877487320781767952.post-3173065131995073181</id><published>2026-07-11T15:23:56.435+08:00</published><updated>2026-07-11T15:23:56.435+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="筆電"/><title type='text'>INHON 應宏 Carbonbook 筆電維修 (六)</title><content type='html'>今天巴威颱風來襲, 屋外風狂雨驟, 只能窩在書房裡繼續做 Carbonbook 復原的收尾工作 : 建立還原點與備份映像檔.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;本系列之前的文章參考 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;# I&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/06/inhon.html&quot; target=&quot;_blank&quot;&gt;NHON 應宏 Carbonbook 筆電維修 (一)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (二)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (三)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;# &lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0806124385.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (四)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;#&amp;nbsp;&lt;a href=&quot;https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0700740172.html&quot; target=&quot;_blank&quot;&gt;INHON 應宏 Carbonbook 筆電維修 (五)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;1. 建立還原點 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;所謂還原點其實就是系統核心的快照, 若電腦不小心因為灌錯驅動程式, 中毒, 或是 Windows Update 更新後死機, 就可以從還原點復原, 一鍵讓電腦仿佛時光倒流般當時的健康狀態.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;建立還原點作法如下 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;按 Win+S&amp;nbsp;輸入 &quot;建立還原點&quot; :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyw5IE1BeuemyUcQaHcGGGBA0rzOSXNbh8GfOdhhpkZv2ek_xNDGhJ_eg1-GvqapAvU733Hwcn_4UkAwGlY-5VHTaLOJDIdJ18NtrOvbhvHCaj4ulRGl2tqsRUjPPcHx32M6ZKP4iaOzsHe1U72N4469GP0woOwuwbT7uA0lTMNf6ynio09xLlspwTml_t/s720/WIN10-RESTORE-POINT-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;523&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyw5IE1BeuemyUcQaHcGGGBA0rzOSXNbh8GfOdhhpkZv2ek_xNDGhJ_eg1-GvqapAvU733Hwcn_4UkAwGlY-5VHTaLOJDIdJ18NtrOvbhvHCaj4ulRGl2tqsRUjPPcHx32M6ZKP4iaOzsHe1U72N4469GP0woOwuwbT7uA0lTMNf6ynio09xLlspwTml_t/s320/WIN10-RESTORE-POINT-1.jpg&quot; width=&quot;232&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;點選 &quot;本機磁碟 C:&quot; 按 &quot;設定&quot; 鈕 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rmvBdmHSd5aMbbD4zkWGPRMQGBYHcYMDplzj_aQlZxRpRVD0pph-HqbKluDP9yxT-mMis0PhjxwauxTqlCn3-EGLJo5NWoUNQ4p2upXhtobKBGLvkQIVLndBQoHtOqipAd2qNFtqrroCHw-feQJiN9xrCG0851Ln3W8UpAgVVEud3Km4oMI8SjUKBY8B/s532/WIN10-RESTORE-POINT-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;532&quot; data-original-width=&quot;486&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rmvBdmHSd5aMbbD4zkWGPRMQGBYHcYMDplzj_aQlZxRpRVD0pph-HqbKluDP9yxT-mMis0PhjxwauxTqlCn3-EGLJo5NWoUNQ4p2upXhtobKBGLvkQIVLndBQoHtOqipAd2qNFtqrroCHw-feQJiN9xrCG0851Ln3W8UpAgVVEud3Km4oMI8SjUKBY8B/s320/WIN10-RESTORE-POINT-2.jpg&quot; width=&quot;292&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;預設是停用系統保護 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzctwq6gnfY8A7OMvLQpPYjsUS32ABYSdsd2AUeUYiP_F0vsSk1vWADdsAKN8j9bHy1FIkHSG6EKlQ9RJxLsyl538CI6QEg3MrirHT7dbc5UFT9TonxzpwJ3xSQ367DfspOCxqH87CVmkl9hZ3O_CwOplmJrsyJbp02X7-XOeeQAtRbdn6-RW8WFxx6I10/s533/WIN10-RESTORE-POINT-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;533&quot; data-original-width=&quot;479&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzctwq6gnfY8A7OMvLQpPYjsUS32ABYSdsd2AUeUYiP_F0vsSk1vWADdsAKN8j9bHy1FIkHSG6EKlQ9RJxLsyl538CI6QEg3MrirHT7dbc5UFT9TonxzpwJ3xSQ367DfspOCxqH87CVmkl9hZ3O_CwOplmJrsyJbp02X7-XOeeQAtRbdn6-RW8WFxx6I10/s320/WIN10-RESTORE-POINT-3.jpg&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;勾選 &quot;開啟系統保護&quot;, 拉動下面滑桿將磁碟用於系統保護的容量設為 5~10% 後按 &quot;確定&quot; 鈕 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj52_jbEzpPEvVvnpQczi3TW4W7t08D5uTowcGH1-06OFvmbojyF4YbodRyOJKtZhg6HQTx5T8Pj19dH_uzOk3RHrhZwMOaOdWvl2EVqprOjciENeZ7eUuD6eiu80zddfprMbmak6K1h6pZS53GXwbn874-FueZsqom88WDsD52k6CjFskJX-JTEUhqp7_J/s533/WIN10-RESTORE-POINT-4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;533&quot; data-original-width=&quot;481&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj52_jbEzpPEvVvnpQczi3TW4W7t08D5uTowcGH1-06OFvmbojyF4YbodRyOJKtZhg6HQTx5T8Pj19dH_uzOk3RHrhZwMOaOdWvl2EVqprOjciENeZ7eUuD6eiu80zddfprMbmak6K1h6pZS53GXwbn874-FueZsqom88WDsD52k6CjFskJX-JTEUhqp7_J/s320/WIN10-RESTORE-POINT-4.jpg&quot; width=&quot;289&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;回到系統保護頁面時, 原本灰色的 &quot;建立&quot; 鈕就可以按了, 按下後會彈出視窗, 在文字框輸入還原點名稱後按 &quot;建立&quot; 鈕就會開始建立還原點 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6PxhfAf-2I7MKe5QQAJDTDYr9FxYZoaC_RvNZslVw_1126LRhRQa1Pnt71JxgMzsa92nYutXRxak0ZFKSKIxO2gE50Rr61kFPCB8uRtl3pAzK6EGtqP3iHjYXc-oGqc2u-uWtE_V97B1uvmylcH_ZDWPd0UYEzjSF04AhYphsCRZ8d_HePmXTfkZtq-z1/s583/WIN10-RESTORE-POINT-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;583&quot; data-original-width=&quot;506&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6PxhfAf-2I7MKe5QQAJDTDYr9FxYZoaC_RvNZslVw_1126LRhRQa1Pnt71JxgMzsa92nYutXRxak0ZFKSKIxO2gE50Rr61kFPCB8uRtl3pAzK6EGtqP3iHjYXc-oGqc2u-uWtE_V97B1uvmylcH_ZDWPd0UYEzjSF04AhYphsCRZ8d_HePmXTfkZtq-z1/s320/WIN10-RESTORE-POINT-5.jpg&quot; width=&quot;278&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6MVge879LObz6Ms9bI8csR5cZVNL8a4F00zG26fPWekZfOqABwiBQ6U3xBBDsCnWHKTqzI-7RmmsRdR7NwJiIeUmO_cNBhMULVLN1QrDTYVtxXachPp0eoMa1yYzcvKhsLcba6R2Qi-xGnQMI8p6R1nyxElTAwiSUXBnWU20MKyVTGxDcNPpehpdbgHLB/s534/WIN10-RESTORE-POINT-6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;534&quot; data-original-width=&quot;485&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6MVge879LObz6Ms9bI8csR5cZVNL8a4F00zG26fPWekZfOqABwiBQ6U3xBBDsCnWHKTqzI-7RmmsRdR7NwJiIeUmO_cNBhMULVLN1QrDTYVtxXachPp0eoMa1yYzcvKhsLcba6R2Qi-xGnQMI8p6R1nyxElTAwiSUXBnWU20MKyVTGxDcNPpehpdbgHLB/s320/WIN10-RESTORE-POINT-6.jpg&quot; width=&quot;291&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;完成後按關閉即可 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAtMLNO_kSJKBP0R6T04fI7IOMylZ11QQuMO46dAifw6FAdeIJiFtQVOJDFd96RHOSmMF-clwCcvxFDd57QSBnFpL7pm2ftBVyMNFZ4vASoGQZJ8rDXhx03u59wbR-VnsRXdvWvHWJ0pAz6p299ee6Axmx5EBVwOYBYG9bVaTf36yiruVRUg8QO-UEiX_c/s534/WIN10-RESTORE-POINT-7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;534&quot; data-original-width=&quot;487&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAtMLNO_kSJKBP0R6T04fI7IOMylZ11QQuMO46dAifw6FAdeIJiFtQVOJDFd96RHOSmMF-clwCcvxFDd57QSBnFpL7pm2ftBVyMNFZ4vASoGQZJ8rDXhx03u59wbR-VnsRXdvWvHWJ0pAz6p299ee6Axmx5EBVwOYBYG9bVaTf36yiruVRUg8QO-UEiX_c/s320/WIN10-RESTORE-POINT-7.jpg&quot; width=&quot;292&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;未來若要回到還原點, 按 &quot;系統還原&quot; 鈕後按下一步 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJrFOKPB_M2vQBspqeQJFwzbAsYcHUxChJadN6P4xz70n15B5Q7AL_RSB0-g10_SJItfouLcjFu2PQ25zIcfQ19EVIUTm_ZMcn9m0N8nMEGfTaudTWIe20UY8q7GETPzdUNbdHsGfDABJH65cjHPVhQ1L-XaTIhdNuFX7RBjcLl8qCg6lIppP6vTD6qpNF/s1131/WIN10-RESTORE-POINT-8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;532&quot; data-original-width=&quot;1131&quot; height=&quot;151&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJrFOKPB_M2vQBspqeQJFwzbAsYcHUxChJadN6P4xz70n15B5Q7AL_RSB0-g10_SJItfouLcjFu2PQ25zIcfQ19EVIUTm_ZMcn9m0N8nMEGfTaudTWIe20UY8q7GETPzdUNbdHsGfDABJH65cjHPVhQ1L-XaTIhdNuFX7RBjcLl8qCg6lIppP6vTD6qpNF/s320/WIN10-RESTORE-POINT-8.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後在還原點清單中點選要還原的時間, 按下一步即可 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkJudeUDIMRh9CC_SAOO9BFdJXUEPCPJ7Oa5wqjfbCEeYoIGRkjovK3iEjZ_YUvgFcuYmHT4otdaBUmGNPPT9OXikpCIwFuWwuYUhkmv9hm4ltl2MUalRRcrdjjgPlEATvoHPcmxXts3h4iX_AGSua43Ipcl_Soc7fPiNOfdH6bEBcQSP3eILeKYbQ5ad/s658/WIN10-RESTORE-POINT-9.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;517&quot; data-original-width=&quot;658&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkJudeUDIMRh9CC_SAOO9BFdJXUEPCPJ7Oa5wqjfbCEeYoIGRkjovK3iEjZ_YUvgFcuYmHT4otdaBUmGNPPT9OXikpCIwFuWwuYUhkmv9hm4ltl2MUalRRcrdjjgPlEATvoHPcmxXts3h4iX_AGSua43Ipcl_Soc7fPiNOfdH6bEBcQSP3eILeKYbQ5ad/s320/WIN10-RESTORE-POINT-9.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;比較建立還原點前後 C 碟大小, 原先 C 碟為 33.6GB, 目前 C 碟為 35.8GB, 還原點大約用掉 2.2GB.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fce5cd; color: #990000;&quot;&gt;2. 備份系統映像 :&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;系統映像是 C 碟的完整備份, 當系統出現問題, 連還原點也受損時, 除了重灌之外, 最快復原系統的方法就是從系統映像還原. 由於此筆電只有一個 C 碟, 備份映像需儲存在另一顆硬碟,因此我找了一顆水某很久以前的紅色 My Passport 隨身硬碟 (512GB) 連接到 USB 槽.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;開啟控制台 (可用 Win+S 搜尋), 將右上角的檢視方式改為大圖示或小圖示 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjDCKHLZ2tSsN1esINUj6dGt0dwOnivJrQ2tsNBurDOFazAcgxiV9y0nS3L3rfk0Jk3okXBh3ffcny_2wq75ivjbiCMM58-sC4fchHje08691bHlaj4EuQoBkozujKoK99keb_AOi-DkzB5VsKFwsxpljlUiPnW-Z3Ce38fvKOehC6SSMEwPTFLm61F3ML/s936/WIN10-Create-Image-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;398&quot; data-original-width=&quot;936&quot; height=&quot;136&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjDCKHLZ2tSsN1esINUj6dGt0dwOnivJrQ2tsNBurDOFazAcgxiV9y0nS3L3rfk0Jk3okXBh3ffcny_2wq75ivjbiCMM58-sC4fchHje08691bHlaj4EuQoBkozujKoK99keb_AOi-DkzB5VsKFwsxpljlUiPnW-Z3Ce38fvKOehC6SSMEwPTFLm61F3ML/s320/WIN10-Create-Image-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;點選 &quot;備份與還原 (Windows 7)&quot; :&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTBvxjaNvYWIhGaEVjSZx54PJ_dQwCuekwerLeeBZ0v53ymTihPmq0P_fbmfrkHEtKpWd_y-m8jtCyMsjV_GNWtIk42f64QMiXg9tBhVgi6BIxtF1hkAabH1xowoQ8klrxx8MOOoyKKlQ5rCrqC261kpu8I8IhhEiuqUkwDHvXA6OqIC1OwQQ4o8BDbSkV/s874/WIN10-Create-Image-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;420&quot; data-original-width=&quot;874&quot; height=&quot;154&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTBvxjaNvYWIhGaEVjSZx54PJ_dQwCuekwerLeeBZ0v53ymTihPmq0P_fbmfrkHEtKpWd_y-m8jtCyMsjV_GNWtIk42f64QMiXg9tBhVgi6BIxtF1hkAabH1xowoQ8klrxx8MOOoyKKlQ5rCrqC261kpu8I8IhhEiuqUkwDHvXA6OqIC1OwQQ4o8BDbSkV/s320/WIN10-Create-Image-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;按左上角的 &quot;建立系統備份&quot; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ2a0tYmlMv4q3cP4pZ3PDcXXnD_MKzR9LiYgYozucz2vqtL8N53dFYUYr53JsIwJeJXr0bWd0LMHmrgO74peQhXHpFZ7b6wMe0g-pAkwgZcrKw1C8Xv_ciYTFUo7w80SQCpTQrYgr7rthuVhmQadZoRfST2NcCSYjSCKuiKfo37UHGL624geFf5MQy_Z/s825/WIN10-Create-Image-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;265&quot; data-original-width=&quot;825&quot; height=&quot;103&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ2a0tYmlMv4q3cP4pZ3PDcXXnD_MKzR9LiYgYozucz2vqtL8N53dFYUYr53JsIwJeJXr0bWd0LMHmrgO74peQhXHpFZ7b6wMe0g-pAkwgZcrKw1C8Xv_ciYTFUo7w80SQCpTQrYgr7rthuVhmQadZoRfST2NcCSYjSCKuiKfo37UHGL624geFf5MQy_Z/s320/WIN10-Create-Image-3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這時系統會去尋可用來儲存映像的硬碟, 找到我插在 USB 槽的隨身硬碟, 其容量只要大於目前 C 碟系統所占大小即可 (加上還原點約 35.8GB), 按下一步即開始備份映像到此外接硬碟上 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMEkB2rrDv7jwnbAfgRr0OZRzz61fssDCLCU1hqQ0adyDzzYl_A-aZndFcyALy3pLS5wKD5psb2sSdFwAMcdR1HK64diJlFsmCYve__M9bPx8HcYl7tvHKs7OjsM_E4BXHJW9acWe51LQzmjYewoiJQ1MRn3HK7eljGSdKy4YgUFz7HWsVIlQngZ6gRsp2/s627/WIN10-Create-Image-4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;580&quot; data-original-width=&quot;627&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMEkB2rrDv7jwnbAfgRr0OZRzz61fssDCLCU1hqQ0adyDzzYl_A-aZndFcyALy3pLS5wKD5psb2sSdFwAMcdR1HK64diJlFsmCYve__M9bPx8HcYl7tvHKs7OjsM_E4BXHJW9acWe51LQzmjYewoiJQ1MRn3HK7eljGSdKy4YgUFz7HWsVIlQngZ6gRsp2/s320/WIN10-Create-Image-4.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPGl8F-VMO4nu8zDtj0H3_in3GaFinLrhTGNzvuxBVLJrv-xl36KiCZHWO8XiiSBRxq0DMoz7j0E_Rhllx8FAtXsccltSPA_g22_EcV0XLzMUvdEnxChKMCeAbz0pElBS_yLGGUQEzhQ-GcGzRZSdrkIRAuaBGNAUChUyAn6N1fJo8hu0pxeZXv6HpB1vu/s542/WIN10-Create-Image-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;289&quot; data-original-width=&quot;542&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPGl8F-VMO4nu8zDtj0H3_in3GaFinLrhTGNzvuxBVLJrv-xl36KiCZHWO8XiiSBRxq0DMoz7j0E_Rhllx8FAtXsccltSPA_g22_EcV0XLzMUvdEnxChKMCeAbz0pElBS_yLGGUQEzhQ-GcGzRZSdrkIRAuaBGNAUChUyAn6N1fJo8hu0pxeZXv6HpB1vu/s320/WIN10-Create-Image-5.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_lTd8MgOTHcavFnYhLOkcIO37Qg3Q5NZBSTqVJgaePqPUo8LtRNntE6g8BfXKBe8Zgl_AWeRRgg7DoYyN-Hi99OzhfiU5X0ptbIaJ6LvIf-FBHPNXjpsada9v0zAlpHfsKp3CtjF2y3quTHCK_9qyLohk2gwCZD41_QHOcbKFLuRAWSwrP51VZTLsXOhk/s539/WIN10-Create-Image-6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;288&quot; data-original-width=&quot;539&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_lTd8MgOTHcavFnYhLOkcIO37Qg3Q5NZBSTqVJgaePqPUo8LtRNntE6g8BfXKBe8Zgl_AWeRRgg7DoYyN-Hi99OzhfiU5X0ptbIaJ6LvIf-FBHPNXjpsada9v0zAlpHfsKp3CtjF2y3quTHCK_9qyLohk2gwCZD41_QHOcbKFLuRAWSwrP51VZTLsXOhk/s320/WIN10-Create-Image-6.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;備份完成詢問是否要建立系統修復碟, 按否 :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfgHNxW7xifJPzoekoCw5TmBTDRQ3BMFBrJiJvPgqkOw0xFJLSO66JEr1QC_xFr6BtP1BeMs5wXSFf2tphcrHunn_FHY6maMcjEQn3p329DTyxGGyMSmASQDjScY1gyJj148RfpjqZiGl-9lO_TfHPMKlQ44UBo-OGgBG6Yy-h9rnk_FA5PQe4DYPE-uoB/s536/WIN10-Create-Image-7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;286&quot; data-original-width=&quot;536&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfgHNxW7xifJPzoekoCw5TmBTDRQ3BMFBrJiJvPgqkOw0xFJLSO66JEr1QC_xFr6BtP1BeMs5wXSFf2tphcrHunn_FHY6maMcjEQn3p329DTyxGGyMSmASQDjScY1gyJj148RfpjqZiGl-9lO_TfHPMKlQ44UBo-OGgBG6Yy-h9rnk_FA5PQe4DYPE-uoB/s320/WIN10-Create-Image-7.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這時外接硬碟上會多出一個 WindowsImageBackup 資料夾, 這就是所建立的備份映像, 注意,&amp;nbsp;絕對不要去修改這個資料夾的名稱, 也不要搬移它或修改裡面的檔案, 日後要從備份映像復原系統時, Windows 只認這個特定的資料夾名字.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;為了辨別這是哪台主機的映像, 可以在資料夾名稱後面加註, 例如改為&amp;nbsp;WindowsImageBackup_INHON_WIN10, 萬一要復原時再去掉加註改回&amp;nbsp;WindowsImageBackup 即可. 總之, WindowsImageBackup 必須放在硬碟根目錄, 裡面的檔案目錄不要動.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://yhhuang1966.blogspot.com/feeds/3173065131995073181/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/4877487320781767952/3173065131995073181' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3173065131995073181'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4877487320781767952/posts/default/3173065131995073181'/><link rel='alternate' type='text/html' href='https://yhhuang1966.blogspot.com/2026/07/inhon-carbonbook_0577435743.html' title='INHON 應宏 Carbonbook 筆電維修 (六)'/><author><name>小狐狸事務所</name><uri>http://www.blogger.com/profile/09435160519044041137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyw5IE1BeuemyUcQaHcGGGBA0rzOSXNbh8GfOdhhpkZv2ek_xNDGhJ_eg1-GvqapAvU733Hwcn_4UkAwGlY-5VHTaLOJDIdJ18NtrOvbhvHCaj4ulRGl2tqsRUjPPcHx32M6ZKP4iaOzsHe1U72N4469GP0woOwuwbT7uA0lTMNf6ynio09xLlspwTml_t/s72-c/WIN10-RESTORE-POINT-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>