&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stan Wu 吳信典</title><link>https://blog.stanwu.org/</link><description>拆解被包裝過的東西、數位自主權實踐、非典型理財觀</description><language>zh-TW</language><lastBuildDate>Mon, 06 Apr 2026 02:06:10 +0800</lastBuildDate><atom:link href="https://blog.stanwu.org/feed.xml" rel="self" type="application/rss+xml"/><item><title>美伊戰爭下的台美雙市場投資風險評估</title><link>https://blog.stanwu.org/posts/iran-war-taiwan-us-market-investment-risk-analysis/</link><pubDate>Mon, 06 Apr 2026 00:01:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/iran-war-taiwan-us-market-investment-risk-analysis/</guid><description>&lt;p&gt;2026年2月28日「史詩之怒行動」（Operation Epic Fury）開啟了二戰以來最大規模中東軍事衝突，荷姆茲海峽運量驟降94%，布蘭特原油峰值觸及每桶&lt;strong&gt;126美元&lt;/strong&gt;，全球能源供給面臨1970年代以來最嚴重中斷。本報告逐一驗證四個核心假設，以事實與數據為基底，建構長期投資風險框架。截至2026年3月26日，四個假設的結論可簡要歸納為：停火機率被低估的空間有限但正在擴大、台灣能源風險尚未充分被市場定價、通膨尚未對台灣資產構成系統性壓力但轉折點已近、油價技術性見頂的證據正在累積但結構性溢價已永久上移。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="假設一文件是否低估了停火機率"&gt;假設一：文件是否低估了停火機率&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;結論：停火機率確實正在上升，但短期內達成正式停火的可能性仍然有限。Polymarket數據顯示3月底停火機率約24%，4月底約58%，年底約78%。「4月9日終戰」的假設過於樂觀，「5月底50%停火」的評估大致合理但偏保守。&lt;/strong&gt; [搜尋]&lt;/p&gt;
&lt;p&gt;截至3月25日，局勢呈現「台面否認、暗中接觸」的矛盾格局。美國已透過巴基斯坦向伊朗遞交&lt;strong&gt;15點停火方案&lt;/strong&gt;，內容涵蓋一個月停火期、拆除三大核設施、停止鈾濃縮、暫停彈道飛彈計畫、全面重開荷姆茲海峽，交換條件為解除核制裁並協助民用核能。伊朗外長阿拉齊表示雙方「透過友好國家交換訊息」，但伊朗官方正式回應稱該方案「極端不合理」。[搜尋]&lt;/p&gt;
&lt;p&gt;外交斡旋管道已明確建立。&lt;strong&gt;巴基斯坦&lt;/strong&gt;總理夏里夫公開表態願主辦和談並已遞交停火方案；&lt;strong&gt;土耳其&lt;/strong&gt;正充當訊息傳遞中間人；&lt;strong&gt;埃及&lt;/strong&gt;外長對談判框架表達支持；&lt;strong&gt;阿曼&lt;/strong&gt;先前主持過戰前間接談判。[搜尋] 然而，真正的障礙在於結構性分歧：美國要求「零濃縮」，伊朗堅持濃縮權利。最高領袖哈梅內伊已於2月28日空襲中身亡，臨時三人領導委員會的談判授權範圍不明確，伊朗軍方發言人公開聲稱「不會與美國達成任何協議，現在不會，永遠不會」。[搜尋]&lt;/p&gt;
&lt;p&gt;值得注意的關鍵訊號是：3月24日一艘泰國籍船隻在伊朗許可下通過海峽，川普稱此為伊朗送出的「非常重要禮物」，並隨即推遲了對伊朗能源設施的進一步打擊。這暗示雙方已存在某種程度的默契。Polymarket上出現多筆可疑交易——10個同時創建的新帳戶投注16萬美元押注3月底停火（潛在回報超過100萬美元），另有一批新帳戶投注200萬美元押注4月底前美軍進入伊朗。[搜尋]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;荷姆茲海峽目前狀態：實質上已對大部分商業航運關閉。&lt;/strong&gt; 伊朗革命衛隊3月2日正式宣布海峽封閉，油輪通行量從戰前每日120艘暴跌至約7艘。馬士基、達飛、赫伯羅特、地中海航運全面暫停海峽通行。卡達能源公司對所有LNG出貨宣告不可抗力。保險業實質取消海峽航行保障。伊朗在拉拉克島以北開設自有航道，主要允許中國、印度、巴基斯坦籍船隻通過，單次通行費用據報高達&lt;strong&gt;200萬美元&lt;/strong&gt;。3月19日起美軍開始以武力重開海峽的軍事行動。[搜尋]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JCPOA狀態：已實質終止。&lt;/strong&gt; 2025年10月伊朗、俄羅斯、中國宣布JCPOA「已終止」。2025年6月及2026年2-3月兩輪空襲已嚴重破壞伊朗主要核設施（納坦茲、福爾多、伊斯法罕），國際科學與國際安全研究所評估伊朗目前「無法進行任何有意義的鈾濃縮」。但&lt;strong&gt;440公斤60%濃縮鈾下落不明&lt;/strong&gt;，IAEA無法進入遭轟炸設施確認。[搜尋]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;時間節點&lt;/th&gt;
&lt;th&gt;Polymarket停火機率&lt;/th&gt;
&lt;th&gt;評估&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3月31日&lt;/td&gt;
&lt;td&gt;~24%（3月21日前僅6%）&lt;/td&gt;
&lt;td&gt;極不可能正式停火&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4月30日&lt;/td&gt;
&lt;td&gt;~58%&lt;/td&gt;
&lt;td&gt;接近文件假設，大致合理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6月30日&lt;/td&gt;
&lt;td&gt;~78%（川普宣布終止軍事行動）&lt;/td&gt;
&lt;td&gt;最可能情境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12月31日&lt;/td&gt;
&lt;td&gt;~78-84%&lt;/td&gt;
&lt;td&gt;長期收斂&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;綜合評估：&lt;/strong&gt; 文件所設「4月9日終戰」假設過度樂觀，目前以色列軍方仍要求「再戰數週」，美國持續增兵（第82空降師1,000兵力及2,000餘名海軍陸戰隊已部署）。但「5月底50%停火」的預測與Polymarket 4月底58%數據大致吻合，甚至略為保守。&lt;strong&gt;停火機率正在快速上升，但主要風險在於伊朗權力真空導致的決策延遲。&lt;/strong&gt; [推導]&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="假設二台灣能源風險是否已被市場定價"&gt;假設二：台灣能源風險是否已被市場定價&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;結論：台灣能源脆弱性在結構面極為嚴峻，但市場定價明顯不足。台股近乎歷史新高的估值水準反映的是AI半導體週期，而非能源供給風險的適當折現。能源風險存在顯著的低估空間。&lt;/strong&gt; [推導]&lt;/p&gt;
&lt;p&gt;台灣的能源結構堪稱全球主要經濟體中最脆弱之一。&lt;strong&gt;整體能源進口依存度達95-98%&lt;/strong&gt;，天然氣進口依存度超過99%，LNG已佔發電量&lt;strong&gt;50.2%&lt;/strong&gt;（2026年1月數據），為有史以來最高。2025年台灣核電全面除役後，化石燃料佔總發電量達&lt;strong&gt;87%以上&lt;/strong&gt;，遠超亞洲平均62%與全球平均57%。[搜尋]&lt;/p&gt;
&lt;p&gt;更關鍵的是，台灣天然氣安全存量僅&lt;strong&gt;8至11天&lt;/strong&gt;——是東亞主要LNG進口國中最低。高盛估計台灣約&lt;strong&gt;37%的LNG進口經由荷姆茲海峽航線&lt;/strong&gt;，主要來自卡達（佔進口量33.7%）。卡達能源已宣告不可抗力暫停所有LNG出貨，直接衝擊台灣最大供氣來源。經濟部已確保替代氣源供應至4月，但5-6月供給安排仍在協商中，&lt;strong&gt;夏季用電尖峰（需求較冬季高40%）的風險敞口尚未覆蓋。&lt;/strong&gt; [搜尋]&lt;/p&gt;
&lt;p&gt;台電與中油的財務狀況令人憂慮。台電截至2025年底累積虧損約&lt;strong&gt;新台幣3,500億元&lt;/strong&gt;，負債比率高達&lt;strong&gt;94%&lt;/strong&gt;，年利息支出約300億元。中油累積虧損&lt;strong&gt;804億元&lt;/strong&gt;，自3月衝突開始以來每週吸收約&lt;strong&gt;20億元&lt;/strong&gt;的油氣價差。立法院先前已擋下1,000億元的台電補貼案及3,000億元的追加撥款申請。台北時報引述學者警告：「在資產負債表嚴重弱化的情況下，台電和中油能否取得足夠融資並在國際市場上競爭採購，令人存疑。」[搜尋]&lt;/p&gt;
&lt;p&gt;中油正在評估&lt;strong&gt;3,500億元的增資方案&lt;/strong&gt;，顯示政府已認識到國營能源公司的財務韌性正逼近臨界點。若衝突延續至9月，中油預估將額外虧損&lt;strong&gt;400億元&lt;/strong&gt;。[搜尋]&lt;/p&gt;
&lt;p&gt;台股方面，加權指數3月25日收在約&lt;strong&gt;33,439點&lt;/strong&gt;，接近歷史高位，本益比約&lt;strong&gt;26.5倍&lt;/strong&gt;（高於三年平均21.4倍）。「台塑四寶」因油價飆升而在2-3月大幅反彈——台塑化本益比高達&lt;strong&gt;52.98倍&lt;/strong&gt;（產業平均25.45倍），但2025年四家公司合計虧損109.3億元，基本面並不支撐當前估值。[搜尋]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;外資視角尚未系統性納入能源脆弱性。&lt;/strong&gt; 貝萊德3月20日報告指出中東戰爭「使市場從對通膨壓力的自滿中驚醒」，但並未特別針對台灣能源風險出具量化分析。美國商會台灣白皮書將電力供應列為外商投資疑慮，尤其影響北台灣的資料中心與高科技廠房選址。&lt;strong&gt;台灣淨燃料進口佔名目GDP約4%，為亞洲最高比率之一，但這一結構性弱點在當前市場估值中並未充分反映&lt;/strong&gt;——台股回檔幅度僅約5.58%，相對於能源供給中斷的規模明顯不成比例。[推導]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;風險盲點：&lt;/strong&gt; 夏季電力缺口的機率正在上升。台灣的再生能源佔比僅11-15.8%（遠低於20%目標），核電已全面退場，備用燃煤機組僅13GW。若荷姆茲中斷延續至Q3，台灣可能面臨自2017年815大停電以來最嚴重的電力危機。國安局另揭露2025年中國對台灣關鍵能源基礎設施的網路攻擊增加&lt;strong&gt;十倍&lt;/strong&gt;，日均入侵嘗試達263萬次。[搜尋]&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="假設三通膨是否已反映在台灣資產價格中"&gt;假設三：通膨是否已反映在台灣資產價格中&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;結論：截至目前，台灣的通膨水準溫和（CPI約1.75-1.80%），尚未對資產價格形成系統性壓力。資產價格主要反映的是AI驅動的生產力週期而非通膨預期。但轉折風險正在累積——若能源價格居高不下，Q2將成為通膨預期是否失錨的關鍵觀察點。&lt;/strong&gt; [推導]&lt;/p&gt;
&lt;p&gt;台灣通膨數據顯示「表面穩定、底部鬆動」的格局。2026年2月CPI年增率&lt;strong&gt;1.75%&lt;/strong&gt;，較1月的五年低點0.69%明顯回升（但1月受春節基期扭曲影響）。央行3月19日將2026年全年CPI預測從1.63%上修至&lt;strong&gt;1.80%&lt;/strong&gt;，主因納入中東能源風險。核心CPI約在0.98-1.0%的溫和區間。[搜尋]&lt;/p&gt;
&lt;p&gt;值得注意的是，&lt;strong&gt;住宅類CPI年增率為2.06%&lt;/strong&gt;，持續高於整體通膨；雜項商品與服務類年增&lt;strong&gt;5.06%&lt;/strong&gt;，顯示部分項目的價格壓力已在擴散。政府承諾吸收60%的原油價格上漲衝擊（由台電、中油承擔），有效壓抑了能源對CPI的傳導，但這本質上是以國營企業的財務惡化換取短期物價穩定。[搜尋]&lt;/p&gt;
&lt;p&gt;央行利率政策方面，重貼現率自2024年3月升至&lt;strong&gt;2.00%&lt;strong&gt;後已&lt;/strong&gt;連續八次凍結&lt;/strong&gt;。楊金龍總裁表態「尚未看到降息條件」，但也未預告進一步升息。實質利率（名目利率2.00%減CPI 1.75%）約為**+0.25%**，處於微幅正值區間。相較亞洲其他央行紛紛進入降息週期，台灣央行的立場屬於偏鷹。[搜尋]&lt;/p&gt;
&lt;p&gt;德意志銀行已將對台灣央行的預期從「可能降息」轉為「全年維持不變」；野村證券預期2026年終端利率維持2.00%。&lt;strong&gt;若油價持續在100美元以上，Q2央行轉向升息的機率將顯著升高&lt;/strong&gt;，這將是改變資產定價邏輯的關鍵變數。[搜尋]&lt;/p&gt;
&lt;p&gt;台股與房市的現況分別反映不同邏輯。&lt;strong&gt;台股加權指數在AI半導體週期驅動下持續創高&lt;/strong&gt;，2025年全年上漲5,928點（史上最大年度點數漲幅），2026年初突破30,000後一路攀升至33,500附近。台積電2025年漲幅44.18%，收在1,550元。市淨率達&lt;strong&gt;3.48倍&lt;/strong&gt;——遠超「過熱」閾值1.8倍，但這反映的是AI需求預期而非通膨驅動的名目價格膨脹。2025年台灣GDP成長&lt;strong&gt;8.68%&lt;/strong&gt;（15年最高），央行上修2026年GDP預測至&lt;strong&gt;7.28%&lt;/strong&gt;，實質經濟動能極強。[搜尋]&lt;/p&gt;
&lt;p&gt;房市則呈現冷卻趨勢。央行2024年9月祭出的第七波信用管制（「金龍海嘯」）效果顯著：2025年建物移轉量下降&lt;strong&gt;25.5%&lt;/strong&gt;，房價上漲速度明顯放緩，市場轉為買方市場。3月20日央行將第二戶房貸成數從50%微幅放寬至60%，但整體管制框架維持不變。[搜尋]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通膨調整滯後的評估：&lt;/strong&gt; 目前台灣資產價格並非由通膨驅動——台股估值基底是半導體超級週期帶來的獲利成長預期（台積電2026年EPS預估再增30%+），房市則受到政策管制的主動壓抑。&lt;strong&gt;真正的風險不在於「通膨已被忽略」，而在於「通膨尚未到來」——若能源價格衝擊在Q2-Q3傳導至CPI（突破2%甚至3%），屆時央行被迫升息將同時壓縮股市本益比與房市槓桿空間，形成雙殺格局。&lt;/strong&gt; 當前市場的樂觀定價，預設了政府能無限期吸收能源成本，這一假設的可持續性令人懷疑。[推導]&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="假設四油價高點是否已過"&gt;假設四：油價高點是否已過&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;結論：技術面證據顯示油價的短期峰值（~$126）大概率已過，期貨曲線的陡峭逆價差結構強烈暗示市場視當前高油價為暫時性地緣衝擊。但基本面分析揭示兩個時間尺度的矛盾：短期存在快速回落至$70-80的路徑，長期則需接受地緣風險溢價已永久上移$10-12的新現實。&lt;/strong&gt; [推導]&lt;/p&gt;
&lt;p&gt;截至3月25-26日，布蘭特原油報&lt;strong&gt;每桶99-103美元&lt;/strong&gt;，較峰值126美元回落約20%，但仍較戰前（2月底約62-71美元）高出40-50%。WTI約在90美元。[搜尋]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;期貨曲線呈現「極端逆價差」（steep backwardation）——這是本分析最重要的市場訊號之一。&lt;/strong&gt; 戰前期貨曲線處於正價差（contango），WTI遠月約在60美元中段。當前近月約99美元，2026年12月期貨約&lt;strong&gt;79.70美元&lt;/strong&gt;（較現貨折讓17%），2030年代中期遠月落在50美元高段。逆價差結構的經濟含義明確：&lt;strong&gt;市場共識認為這是事件驅動的暫時性價格飆升，而非結構性高油價的開端。&lt;/strong&gt; 但即使遠月價格也較戰前上移10-12美元，反映出「波斯灣地緣風險已被永久重新定價」（高盛語）。[搜尋]&lt;/p&gt;
&lt;p&gt;IEA 3月報告定性此次為**「全球石油市場史上最大供給中斷」&lt;strong&gt;——荷姆茲海峽日流量從2,000萬桶暴跌至「涓流」，海灣國家合計減產至少&lt;/strong&gt;1,000萬桶/日**，3月全球供給預估暴跌800萬桶/日。IEA成員國3月11日同意從戰略儲備釋放&lt;strong&gt;4億桶&lt;/strong&gt;原油。全球需求成長預測從85萬桶/日下修至&lt;strong&gt;64萬桶/日&lt;/strong&gt;，反映高油價對需求的抑制效應。[搜尋]&lt;/p&gt;
&lt;p&gt;美國原油庫存數據呈現出與全球緊張局勢脫節的畫面。EIA 3月25日報告顯示商業庫存&lt;strong&gt;4.562億桶&lt;/strong&gt;，僅略低於五年平均0.1%。更關鍵的是，庫存已&lt;strong&gt;連續五週增加&lt;/strong&gt;（合計增加約2,000萬桶），最新一週增加690萬桶（遠超預期的47.7萬桶增幅）。煉廠稼動率升至92.9%。分析師指出：「這份報告對當前油市幾乎不重要——全球有950萬桶/日的產能被關閉，但美國自身產量維持在1,360萬桶/日的高檔，危機主要影響亞洲航線而非美國。」[搜尋]&lt;/p&gt;
&lt;p&gt;OPEC+3月1日決議自4月起增產&lt;strong&gt;20.6萬桶/日&lt;/strong&gt;，由沙烏地（+6.2萬）、俄羅斯（+6.2萬）等八國分攤。這是2023年4月以來165萬桶/日自願減產的逐步回撤。但如Rystad指出：「這是一個訊號，不是解方」——20.6萬桶相較於1,000萬桶的關閉量微不足道，且沙烏地、科威特、阿聯酋、伊拉克的增產在海峽關閉期間&lt;strong&gt;根本無法出口&lt;/strong&gt;。沙烏地正透過東西輸油管線將部分原油轉運至紅海沿岸的延布港，但管線容量有限。[搜尋]&lt;/p&gt;
&lt;p&gt;非OPEC供給增量主要來自美洲。&lt;strong&gt;巴西&lt;/strong&gt;預計2026年產量增加約20萬桶/日至400萬桶/日；&lt;strong&gt;蓋亞那&lt;/strong&gt;烏阿魯項目新增約25萬桶/日，全國產量將超過100萬桶/日；&lt;strong&gt;阿根廷&lt;/strong&gt;Vaca Muerta頁岩產量預估81萬桶/日（年增70萬桶）；&lt;strong&gt;美國&lt;/strong&gt;產量預估1,360萬桶/日（因高油價略上修）。EIA預估一旦荷姆茲恢復正常，2026年全球供給將過剩&lt;strong&gt;190萬桶/日&lt;/strong&gt;，2027年過剩&lt;strong&gt;300萬桶/日&lt;/strong&gt;。[搜尋]&lt;/p&gt;
&lt;p&gt;主要機構最新價格預測反映分歧：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機構&lt;/th&gt;
&lt;th&gt;2026年布蘭特均價&lt;/th&gt;
&lt;th&gt;2026年Q4預估&lt;/th&gt;
&lt;th&gt;備註&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;高盛（3/22修訂）&lt;/td&gt;
&lt;td&gt;$85&lt;/td&gt;
&lt;td&gt;$71（基礎情境）/ $93（延長情境）&lt;/td&gt;
&lt;td&gt;戰前預測僅$64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EIA（3/10）&lt;/td&gt;
&lt;td&gt;近兩月&amp;gt;$95，Q3跌破$80&lt;/td&gt;
&lt;td&gt;~$70&lt;/td&gt;
&lt;td&gt;假設4月初恢復&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;巴克萊&lt;/td&gt;
&lt;td&gt;可能測試$120&lt;/td&gt;
&lt;td&gt;極端情境$150&lt;/td&gt;
&lt;td&gt;高度不確定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;綜合判斷：&lt;/strong&gt; 油價的地緣衝擊峰值（$120-126）大概率已過，三項證據支持此觀點：（1）陡峭逆價差顯示市場視為暫時性事件；（2）美國庫存持續累積顯示區域影響不對稱；（3）需求破壞效應已開始顯現（IEA下修需求64萬桶/日）。&lt;strong&gt;但若荷姆茲中斷延續超過兩個月，高盛警告Q4可能仍在93美元，極端尾部風險可能超越2008年歷史紀錄。&lt;/strong&gt; 結構面上，戰前「供給過剩→油價跌至55-65美元」的共識仍然成立，但需加上永久性的&lt;strong&gt;10-12美元地緣風險溢價&lt;/strong&gt;，意味著即使衝突結束，布蘭特的新均衡區間可能在&lt;strong&gt;70-80美元&lt;/strong&gt;而非55-65美元。[推導]&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="投資決策摘要風險框架"&gt;投資決策摘要：風險框架&lt;/h2&gt;
&lt;h3 id="台股長期部位的結構性觀點"&gt;台股長期部位的結構性觀點&lt;/h3&gt;
&lt;p&gt;台股當前的投資主題可簡化為**「AI天堂vs.能源地獄」的對立張力**。加權指數在33,500點、本益比26.5倍的估值水準，幾乎完全反映了半導體超級週期（台積電、AI供應鏈）的獲利預期，但對以下三重尾部風險的定價明顯不足：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;能源供給中斷風險（被低估）：&lt;/strong&gt; 僅8-11天的LNG安全存量、37%氣源經由荷姆茲航線、台電中油合計累積虧損超過4,300億元且融資能力受限——這些結構性脆弱性在台股的風險溢價中幾乎不存在。若荷姆茲中斷延續至夏季，限電風險將直接衝擊半導體製造（台積電單一晶圓廠日耗電可達數萬度），屆時AI敘事與能源現實的碰撞可能引發劇烈重定價。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;通膨—升息的非線性風險：&lt;/strong&gt; 目前CPI 1.75%、央行凍息的組合對股市友善。但政府以國營企業虧損吸收能源成本的模式不可持續。一旦CPI突破2.5-3%迫使央行啟動升息循環，「低利率+高成長」的定價邏輯將同步瓦解。Q2是這一情境的關鍵觀察窗口。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;油價回落的反射性機會：&lt;/strong&gt; 期貨曲線的逆價差結構暗示，若停火在Q2實現，油價可能快速回落至70-80美元區間。屆時台灣能源成本壓力大幅緩解，台電中油虧損收窄，CPI回落，央行維持凍息——這一情境對台股（尤其科技股）極為有利，可能推動指數挑戰35,000以上。風險框架的核心在於&lt;strong&gt;辨識轉折點&lt;/strong&gt;，而非單向押注。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="美股etf長期部位的結構性觀點"&gt;美股/ETF長期部位的結構性觀點&lt;/h3&gt;
&lt;p&gt;美股面臨的是**「地緣溢價重定價」與「需求破壞」的賽跑**。高盛已將美國經濟衰退機率上調至30%，並將聯準會首次降息預期從6月推遲至9月、核心PCE通膨預估上修至3.1%。S&amp;amp;P 500自衝突爆發以來下跌約6%。長期部位的風險框架應考慮：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;能源板塊的結構性機會：&lt;/strong&gt; 即使油價從當前水準回落，高盛認為波斯灣地緣風險溢價已&lt;strong&gt;永久上移10-12美元&lt;/strong&gt;。這意味著美國頁岩油生產商（損益平衡點30-60美元/桶）的獲利能力將獲得持久改善。但應注意產業資本紀律——企業傾向對沖鎖利而非立即擴產，產量增長可能低於預期。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;通膨敏感資產的重新配置邏輯：&lt;/strong&gt; 若油價維持在80美元以上的新常態，美國通膨中樞將上移。TIPS（抗通膨公債）、大宗商品ETF、具定價權的消費必需品龍頭企業在這一情境下具有相對優勢。反之，長天期公債與高估值科技股面臨實質利率上行的壓縮壓力。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;台灣風險的跨市場傳導：&lt;/strong&gt; 對持有台灣相關ETF（如EWT、INDA含台成分）的長期投資人而言，台灣能源風險是一個&lt;strong&gt;未被充分定價的系統性因子&lt;/strong&gt;。若能源危機在夏季爆發為限電事件，台積電生產中斷的級聯效應將遠超台灣本土——全球AI晶片供應鏈的單點故障風險是目前所有台灣相關資產估值中最大的「已知未知」。[推導/不確定]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心不確定性聲明：&lt;/strong&gt; 上述框架的有效性高度取決於荷姆茲海峽恢復時程（目前無法精確預測）、伊朗內部權力過渡的政治動態（哈梅內伊之子穆傑塔巴據報受傷、狀態不明）、以及美國國內政治對戰爭持續時間的容忍度。本報告所有標註[推導]之處均基於當前可得資訊的邏輯推演，不構成對未來走勢的確定性判斷。[不確定]&lt;/p&gt;</description></item><item><title>美國未來十年：帝國慣性與結構裂變的賽跑</title><link>https://blog.stanwu.org/posts/us-next-decade-imperial-inertia-structural-fracture-race/</link><pubDate>Mon, 06 Apr 2026 00:01:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/us-next-decade-imperial-inertia-structural-fracture-race/</guid><description>&lt;p&gt;&lt;strong&gt;底線前置（BLUF）：&lt;/strong&gt; 2026至2035年的美國正站在戰後秩序最劇烈的重組節點上。川普第二任期不僅是政策偏移，而是將美國國際主義的制度基礎——從同盟信任到開發援助到聯準會獨立性——進行系統性拆解。聯邦債務將在2030年突破二戰紀錄（GDP的106%），利息支出已超越國防預算，而2026年初爆發的美伊戰爭更將短期通膨風險與長期財政壓力同時推高。美中關係在脆弱的貿易休兵下暗流湧動，技術脫鉤正形成「兩個科技生態圈」的既成事實。然而，美國仍握有三張結構性底牌：美元的避險地位、AI前沿模型的領先優勢、以及全球最深厚的資本市場。未來十年的核心懸念不是美國是否衰落，而是&lt;strong&gt;衰落的速度是否快於對手崛起與制度自我修復的速度&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="第一部分地緣政治與國際秩序"&gt;第一部分：地緣政治與國際秩序&lt;/h2&gt;
&lt;h3 id="一同盟體系從美國領導的秩序到交易型夥伴關係"&gt;一、同盟體系：從「美國領導的秩序」到「交易型夥伴關係」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 川普第二任期正在將戰後七十年「美國提供安全傘、盟友提供合法性」的大交易，不可逆地改寫為「付費即服務」的交易型架構。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基準情境：同盟存續但本質質變&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2026年的北約在制度層面仍然存在，但其運作邏輯已根本改變。2025年海牙峰會將國防支出目標從GDP的2%提升至&lt;strong&gt;3.5%核心國防加1.5%關鍵基礎設施&lt;/strong&gt;（2035年達成），這一史無前例的承諾本身就說明了歐洲對美國安全承諾信心的崩塌程度。2026年《國防戰略》直稱盟友為「搭便車的依賴者」，明確要求歐洲承擔對俄常規嚇阻的「主要責任」，美國僅作為「後備」。&lt;/p&gt;
&lt;p&gt;歐洲的反應是雙軌並行：一方面加速軍事自主——EU「重新武裝歐洲」計畫動員&lt;strong&gt;8,000億歐元&lt;/strong&gt;，SAFE機制提供1,500億歐元長期貸款，19個成員國申請額度超過預算上限；另一方面進行經濟「去風險」——歐盟與南方共同市場簽署貿易協定，與印度、菲律賓、泰國推進談判，加拿大和英國首相均於2026年1月訪問北京尋求貿易機會。&lt;strong&gt;德國2025-2026年國防採購中僅8%流向美國系統&lt;/strong&gt;，丹麥在川普威脅格陵蘭後，刻意將90億美元的防空合約全數給予歐洲企業。&lt;/p&gt;
&lt;p&gt;印太同盟是美國外交最堅實的支柱，AUKUS通過了科比主導的五角大廈審查，四方安全對話（Quad）被魯比奧選為上任第一場外交活動。但信任侵蝕同樣在發生：日本取消了一場計畫中的2+2會議以回應美國的負擔分攤要求，&lt;strong&gt;71-75%的南韓民眾支持自主發展核武&lt;/strong&gt;（五年前僅50%），2026年美伊戰爭期間THAAD和愛國者系統從南韓抽調至中東，暴露了美國安全承諾的可替代性。菲律賓在維持美國同盟的同時，與日本簽署了《互惠准入協定》和《相互提供物資勞務協定》，約1,000名日本自衛隊將參加2026年肩並肩演習。&lt;/p&gt;
&lt;p&gt;皮尤研究中心2025年調查顯示，&lt;strong&gt;美國好感度中位數降至49%&lt;/strong&gt;，瑞典對川普的信任度從拜登時期的63%暴跌至15%。芝加哥全球事務委員會同期發現，美國公眾對北約的支持度反而達到歷史新高（73%支持維持或增加），但黨派分裂也達到前所未見的程度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險情境：北約實質解體&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前秘書長史乍堡2026年3月警告：「沒有人能保證北約能撐過川普的總統任期。」若川普在第二任期後半段進一步削減歐洲駐軍、在波羅的海或波蘭面對俄羅斯灰色地帶挑戰時拒絕啟動第五條、或直接退出北約，歐洲將面臨冷戰結束以來最嚴重的安全真空。波蘭已在討論自主核武器，德國與波蘭正探索共享核保護傘的可能性。在亞太，若美國在台海危機中的猶豫被視為放棄盟友，日本與南韓的核武裝將從民意願望轉為政策現實。[搜尋/推導]&lt;/p&gt;
&lt;h3 id="二美中戰略競爭脆弱休兵下的結構性對抗"&gt;二、美中戰略競爭：脆弱休兵下的結構性對抗&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 川普的個人外交創造了戰術性緩和（2025年10月釜山會議、互訪計畫），但技術脫鉤與軍事對峙正在形成不可逆的結構性分裂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基準情境：「管控型不確定」持續十年&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2025年的關稅戰是雙邊關係的分水嶺：四月峰值時美國對中關稅達145%，中國反制125%；經談判後降至互徵10%，2025年10月釜山會議鎖定一年期休戰。但&lt;strong&gt;美中雙邊商品貿易（2025年1-9月）較前年暴跌44.2%&lt;/strong&gt;，從5,829億美元降至3,244億美元。 然而，史丹佛/NBER研究揭示，直接貿易下降被越南、墨西哥等中間國的轉口貿易所抵消——這是「重新配置」而非「真正脫鉤」。中國嵌入美國消費鏈的價值實際上升至約&lt;strong&gt;2,100億美元&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;技術競爭正在形成「兩個生態圈」。美國的出口管制將140多家中國企業列入實體清單，Nvidia被迫就H20晶片出口繳納15%的利潤分成。但中國展現出超乎預期的韌性：&lt;strong&gt;DeepSeek於2025年1月推出的AI模型以極低成本達到與OpenAI匹敵的水準&lt;/strong&gt;，Nvidia執行長黃仁勳稱中國在AI領域「僅落後美國一奈秒」；華為海思計劃2026年將昇騰910C處理器產量翻倍至60萬顆；中芯國際據報使用DUV光刻機試產5nm等級晶片。 CSIS專家調查顯示，對未來美中關係走向的預測三分天下：約33%預測更加對抗、33%更加合作、33%維持現狀。&lt;/p&gt;
&lt;p&gt;軍事對峙的烈度則在顯著升高。&lt;strong&gt;2025年解放軍在台灣周邊的空中與海上活動創下歷史紀錄&lt;/strong&gt;——「正義使命2025」演習首日出動超過130架次軍機（90架次越過中線），27枚火箭從福建發射，其中10枚落入台灣24浬鄰接區內。中國的「十五五」規劃將「和平統一」中的「和平」二字刪除，改為「推進祖國統一大業」。中國核彈頭數量估計在低600枚，年增約200枚，預計2030年超過1,000枚。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險情境：台海軍事衝突&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CSIS專家調查中43%將南海列為2026年最可能的衝突引爆點（33%選擇台海）。若中國在習近平第四任期開始前（2027年）對台發動封鎖或灰色地帶升級，而美國因中東戰爭消耗了航母打擊群與攔截彈庫存（2025-2026年美伊行動已消耗約25%的THAAD攔截彈、20%的SM-3飛彈），回應能力將受到嚴重制約。這是十年內最具毀滅性的尾端風險。[搜尋/推導]&lt;/p&gt;
&lt;h3 id="三美國全球領導力制度性基礎的系統侵蝕"&gt;三、美國全球領導力：制度性基礎的系統侵蝕&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 軟實力的流失不是週期性波動，而是制度性基礎設施——USAID、國務院人員、研發經費、國際承諾——被系統性拆除後的結構性後果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基準情境：十年重建週期&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;USAID被實質解散，全球官方發展援助預計因此減少&lt;strong&gt;620億美元&lt;/strong&gt;（美國佔360億）。民主與治理計畫經費在FY2024至FY2025間被削減約&lt;strong&gt;75%&lt;/strong&gt;。NIH、NSF、NASA等聯邦研發經費的裁減，被史汀生中心評估為「長期經濟損害等同於一場重大衰退」。2025年《國家安全戰略》刪除了「國際法」和「基於規則的國際秩序」的引用。&lt;/p&gt;
&lt;p&gt;布魯金斯學會評估，即便未來民主黨政府上台，也「難以想像回到拜登時期的美國領導框架」，川普時代的一些主題——負擔轉移、批評國際機構、更狹隘的國家利益定義——很可能被保留。CFR的庫普坎（Kupchan）呼籲找到「介於國際主義過度擴張與民族主義退縮之間的中間路線」，但承認這需要跨黨派、跨地域、跨階級的廣泛政治聯盟——在當前極化環境下幾乎不可能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反轉條件：&lt;/strong&gt; 第一，中國或俄羅斯在美國核心利益區域的重大挑釁（如台海衝突）可能重新凝聚國內共識；第二，一位具有戰略眼光的繼任總統系統性重建外交與開發機構；第三，美國經濟表現持續優於歐洲和中國，維持「引力場效應」。但國務院的重建需要至少&lt;strong&gt;十年&lt;/strong&gt;，科學領導力若人才外流則需更久。[搜尋/推導]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險情境：不可逆轉的領導力讓渡&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;若2028年繼任總統延續孤立主義路線（無論共和黨或民主黨的民粹派），美國將失去在CPTPP（現已擴大至全球貿易15%）、數位治理、氣候金融等領域的規則制定權。屆時中國主導的RCEP與「一帶一路」將成為全球南方的默認選項，美國從規則制定者降格為規則接受者。[推導]&lt;/p&gt;
&lt;h3 id="四多極秩序的形成節奏不均但方向不可逆"&gt;四、多極秩序的形成：節奏不均，但方向不可逆&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 世界既不是回到冷戰式的兩極，也不是穩定的多極——而是一個「戰略多元主義」的混亂過渡期，中間大國的避險行為正在重塑國際秩序的底層邏輯。&lt;/p&gt;
&lt;p&gt;歐洲戰略自主的政治意志是真實的，但&lt;strong&gt;結構性依賴仍然巨大&lt;/strong&gt;：歐洲企業100%的相關雲端運算來自美國供應商，約60%的軍事裝備進口自美國，多數海底光纖電纜由美國擁有或控制，國際支付清算系統受美國司法管轄。27個碎片化的國防市場仍是常態。&lt;/p&gt;
&lt;p&gt;俄中軸心在深化但本質不對稱。中國占俄羅斯微晶片進口的&lt;strong&gt;89%&lt;/strong&gt;，4/5的俄羅斯無人機關鍵電子元件來自中國。俄羅斯則向中國轉移潛艇靜音技術、隱身飛機設計和飛彈能力。但北京「不願以限制自身戰略自主為代價，對俄做出可能導致與西方公開衝突的承諾」。這是一個「短於同盟的夥伴關係」。&lt;/p&gt;
&lt;p&gt;金磚擴大至11個正式成員國加11個夥伴國，代表全球&lt;strong&gt;47.9%的人口和約40%的GDP（PPP）&lt;/strong&gt;。「金磚支付」系統將俄羅斯SPFS、中國CIPS和印度UPI連接起來，據報已將金磚國內貿易的美元使用減少約三分之二。但印度明確拒絕去美元化修辭（外長蘇杰生：「我不認為我們有任何替代美元的政策」），內部在烏克蘭、對美關係等議題上分歧嚴重。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中間大國是決定性的搖擺力量。&lt;/strong&gt; 印度追求「戰略自主2.0」，在維持美俄雙邊關係的同時建構全球南方領導地位；印尼2025年正式加入金磚並購買45架中國戰鬥機，但仍高度依賴西方國防裝備；沙烏地阿拉伯在維持美國安全關係的同時深化與中國的外交和基礎設施合作。中間大國的GDP佔全球份額從1990年的15%翻倍至2022年的&lt;strong&gt;30%&lt;/strong&gt;，軍事支出佔比從7%升至15%。&lt;/p&gt;
&lt;h3 id="五俄烏戰爭無盡的準和平"&gt;五、俄烏戰爭：無盡的「準和平」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 戰爭已進入第五年，任何可見的結局都不是真正的和平，而是程度不同的「凍結」——問題在於凍結的條件對誰有利，以及歐洲安全架構能否在此基礎上重建。&lt;/p&gt;
&lt;p&gt;三輪美國斡旋談判（阿布達比、日內瓦、未公開地點）均未突破核心分歧：俄羅斯堅持領土讓步，烏克蘭要求安全保證先行。美方和平方案要求烏克蘭在憲法中承諾不加入北約、武裝力量上限60萬（現約88萬）、淨割讓約1,800平方英里領土、NATO不在烏克蘭駐軍，美國獲得美烏重建合資企業**50%**利潤。歐洲28點反提案則更有利於烏克蘭——允許未來加入北約的可能性，不限制軍隊規模。&lt;/p&gt;
&lt;p&gt;截至2026年3月底，談判因美伊戰爭爆發而&lt;strong&gt;暫時擱置&lt;/strong&gt;。卡內基國際和平基金會的評估一針見血：「只要普京在位、俄羅斯沒有爆發大規模抗議、預算中至少還有一些武器經費，戰爭就會繼續⋯⋯談判的模擬只能導致停火的模擬。」&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;對歐洲安全架構的影響：&lt;/strong&gt; 無論結局如何，歐洲正在經歷冷戰結束以來最大規模的軍事動員。NATO歐洲盟國加加拿大2025年集體投入&lt;strong&gt;5,740億美元&lt;/strong&gt;國防支出（較2024年實質增長20%）。波蘭以GDP的4.48%領跑，目標建成50萬人武裝力量；德國通過修憲放寬債務煞車，計畫至2029年國防預算達1,620億歐元（GDP的3.2-3.5%）。然而，北約秘書長魯特警告，俄羅斯可能在五年內重建足以威脅北約的軍事能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險：&lt;/strong&gt; 美伊戰爭消耗了大量西方防空攔截彈庫存——2025年6月的「午夜之錘行動」消耗約150枚THAAD攔截彈和80枚SM-3飛彈，2026年2-3月的「史詩之怒行動」進一步耗損。CSIS警告，歐洲和烏克蘭所需的美製攔截彈「可能根本無法供應」。這是同時在兩個戰區作戰的隱性成本。&lt;/p&gt;
&lt;h3 id="六中東美伊戰爭重塑區域格局"&gt;六、中東：美伊戰爭重塑區域格局&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 川普政府從「極限施壓」升級為直接軍事行動，消滅了伊朗最高領袖哈梅內伊及多名高級將領，但這場戰爭非但未能解決伊朗核問題，反而可能使其加速——「缺乏核武器被證明無法提供嚇阻」這一教訓將推動倖存政權走向真正的核武化。&lt;/p&gt;
&lt;p&gt;2025年6月美以聯合空襲（「午夜之錘行動」）打擊了福爾多、納坦茲、伊斯法罕核設施。2026年2月28日，更大規模的聯合打擊殺死了哈梅內伊、國防部長和革命衛隊指揮官。美國在中東的部署規模達到2003年伊拉克戰爭以來最大：&lt;strong&gt;3個航母打擊群、16艘以上水面艦艇、82空降師2,500人、2個海軍陸戰隊遠征單位&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;荷莫茲海峽自3月4日起實質關閉，承載全球約&lt;strong&gt;20%的石油和液化天然氣供應&lt;/strong&gt;。布倫特原油突破110美元，IEA稱其為「全球石油市場歷史上最大的供應中斷」。阿聯酋拒絕提供領空和基地，迫使美軍主要依賴以色列和航母為基地的作戰。&lt;/p&gt;
&lt;p&gt;以巴方面，2025年1月停火後3月即崩潰，10月達成新的20點和平計畫並獲安理會2803號決議背書，但停火以來以色列違規2,073次（包括973次轟炸），&lt;strong&gt;停火後仍有691名巴勒斯坦人死亡&lt;/strong&gt;。真主黨於2026年3月2日恢復對以攻擊，以色列擴大黎巴嫩入侵，已造成1,000多人死亡、100萬人流離失所。&lt;/p&gt;
&lt;p&gt;沙以建交仍然停滯。儘管川普向沙烏地出售F-35並授予「主要非北約盟友」地位，穆罕默德·本·薩勒曼堅持以巴兩國方案為前提。&lt;strong&gt;99%的沙烏地受訪者對以色列建交持負面態度&lt;/strong&gt;（2025年華盛頓研究所調查），正面態度從2020年的41%跌至13%。&lt;/p&gt;
&lt;h2 id="第二部分經濟與財政結構"&gt;第二部分：經濟與財政結構&lt;/h2&gt;
&lt;h3 id="七聯邦債務軌跡走向不可持續的算術確定性"&gt;七、聯邦債務軌跡：走向不可持續的算術確定性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 美國財政已進入「利息支出吞噬一切」的自我強化循環——每週110億美元的利息支出不是政策選擇的結果，而是過去二十年累積赤字的數學必然。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基準情境：緩慢惡化但無急性危機&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CBO 2026年2月基線預測刻畫了一幅令人不安的圖景：&lt;strong&gt;FY2026赤字1.9兆美元（GDP的5.8%）&lt;/strong&gt;，2026-2035年累計赤字&lt;strong&gt;23.1兆美元&lt;/strong&gt;，到2036年公共持有債務將達GDP的&lt;strong&gt;120%（56兆美元）&lt;/strong&gt;，超越二戰紀錄的時間點提前至2030年前後。十年平均赤字佔GDP的&lt;strong&gt;6.1%&lt;/strong&gt;，是被視為可持續的3%門檻的兩倍多。&lt;/p&gt;
&lt;p&gt;利息成本是最令人警覺的數字。FY2025淨利息支出已達&lt;strong&gt;9,700億美元（GDP的3.2%）&lt;/strong&gt;，到2036年將翻倍至&lt;strong&gt;2.1兆美元（GDP的4.6%）&lt;/strong&gt;。利息已是聯邦第二大支出項目（僅次於社會安全），&lt;strong&gt;每5美元稅收中就有近1美元用於支付過去的借貸利息&lt;/strong&gt;。CRFB警告，到十年末，聯邦債務的平均利率將超過名義GDP成長率（R&amp;gt;G），構成財政轉折點。&lt;/p&gt;
&lt;p&gt;結構性驅動力是人口老化與醫療成本：社會安全加醫療保險/醫療補助從2025年GDP的11.2%升至2036年的12.5%。社會安全退休信託基金將於&lt;strong&gt;FY2032破產&lt;/strong&gt;，屆時福利將被迫全面削減28%——一對60歲夫妻每年將損失約18,400美元。公路信託基金更早，&lt;strong&gt;FY2028&lt;/strong&gt;即將耗盡。&lt;/p&gt;
&lt;p&gt;2025年7月簽署的「一大美麗法案」（OBBBA）使情況進一步惡化：永久延長2017年減稅、擴大兒童稅收抵免、「小費免稅」等措施預計在2035年前增加&lt;strong&gt;4.7兆美元&lt;/strong&gt;赤字。CBO評估其將在2034年推高GDP 0.7%，但同時推升利率10-20個基點。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;為何短期內不會爆發危機：&lt;/strong&gt; 美元的儲備貨幣地位、國庫券市場的深度與流動性、以及全球避險需求（2026年美伊戰爭期間DXY突破100即為明證）為美國提供了其他國家不具備的緩衝。資本集團評估：「美國發生危機的近期可能性不高。」&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險情境：財政意外&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CRFB列出的觸發因素包括：經濟衰退耗盡財政空間、國庫券拍賣需求不足、信用評級再次下調（S&amp;amp;P已於2011年、Fitch於2023年下調）、或債務上限違約。若IEEPA關稅收入（已被最高法院推翻）無法以其他立法替代，2026-2035年將出現約1.7兆美元的收入缺口，債務可能在2036年達到GDP的&lt;strong&gt;131-134%&lt;/strong&gt;。最壞情境是「日本模式」——不是崩盤，而是長達二十年的年均0.5%低成長。[搜尋/推導]&lt;/p&gt;
&lt;h3 id="八關稅與保護主義保護了工廠犧牲了農場"&gt;八、關稅與保護主義：保護了工廠，犧牲了農場&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 關稅在低技術製造業創造了溫和的產出增長（+4.5%），但以先進製造業萎縮（-3.3%）、農業破產激增（+46%）、以及消費者實質購買力下降為代價——這是一筆虧損的帳。&lt;/p&gt;
&lt;p&gt;2025年4月2日「解放日」將美國平均有效關稅率推至&lt;strong&gt;27%以上&lt;/strong&gt;——一個多世紀以來最高。經系列談判與最高法院裁定IEEPA關稅違憲（2026年2月，6比3），當前有效關稅率回落至&lt;strong&gt;5.6-10.3%&lt;/strong&gt;（取決於第122條臨時關稅是否延長），仍為1972年以來最高。&lt;/p&gt;
&lt;p&gt;耶魯預算實驗室評估，即便在最高法院裁決後，&lt;strong&gt;美國長期GDP仍縮小0.07-0.13%&lt;/strong&gt;；若第122條延長，影響翻倍。關稅導致食品價格上漲2.8%、新車價格平均增加約4,000美元、每個家庭年均稅負增加600-1,500美元。低收入家庭承受的聯邦稅率增幅（1.1個百分點）反而大於高收入家庭（0.9個百分點）——這是累退稅。&lt;/p&gt;
&lt;p&gt;農業是最大輸家。2025年農場破產案達&lt;strong&gt;315件&lt;/strong&gt;，較2024年暴增46%，為疫情以來最高。美國大豆對華出口下降超過一半，巴西奪走了中國大豆市場的76%份額。農業輸入品的有效關稅率從1%躍升至12%。川普不得不批准120億美元的農民救助金，與第一任期280億美元的模式如出一轍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;關鍵發現：關稅未能改善貿易逆差。&lt;/strong&gt; 耶魯預算實驗室直言：「關稅並未實質改變貿易收支。」2025年貿易赤字僅減少21億美元，長期出口預計下降15-18%。&lt;/p&gt;
&lt;h3 id="九美元霸權緩慢侵蝕而非驟然崩塌"&gt;九、美元霸權：緩慢侵蝕而非驟然崩塌&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 美元佔全球外匯存底的份額已從1999年的71%降至2025年Q2的&lt;strong&gt;56.3%&lt;/strong&gt;（三十年低點），但在交易層面的主導地位（外匯交易88%、約99%的穩定幣為美元計價）幾乎未受影響——去美元化是真實的，但極其緩慢。&lt;/p&gt;
&lt;p&gt;去美元化的制度建設正在推進：mBridge跨境央行數位貨幣平台的累計交易量從2022年的2,200萬美元增至2025年11月的&lt;strong&gt;554.9億美元&lt;/strong&gt;（數位人民幣佔95%）；中國CIPS系統連接119個國家的4,800家銀行；全球央行2024年增持黃金1,045公噸（連續第三年超過1,000公噸），黃金佔官方儲備資產份額升至23-28%。&lt;/p&gt;
&lt;p&gt;然而，&lt;strong&gt;沒有任何單一替代方案具備取代美元的規模和流動性&lt;/strong&gt;。人民幣僅佔全球外匯存底的約2%和外匯交易量的7%。金磚統一貨幣仍停留在概念階段，連普京自己都承認「談這個為時尚早」。聯準會2025年7月報告的結論是：「除非發生大規模、持久的動盪⋯⋯美元在可見的未來仍將是世界主導的國際貨幣。」&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真正的威脅不是替代者的崛起，而是制度信譽的侵蝕。&lt;/strong&gt; OMFIF 2025年調查顯示，&lt;strong&gt;70%的受訪者表示美國政治環境使其不願投資美元資產&lt;/strong&gt;。聯準會獨立性受到威脅（見下節）、財政軌跡不可持續、以及制裁的武器化，正在累積性地削弱美元作為「安全港」的敘事基礎。CBO長期預測美元佔全球儲備份額可能在2055年降至45-50%。[搜尋/推導]&lt;/p&gt;
&lt;h3 id="十聯準會獨立性歷史性壓力測試"&gt;十、聯準會獨立性：歷史性壓力測試&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 川普政府正在通過司法部調查、嘗試解僱理事、以及對利率決策施加公開壓力，對聯準會獨立性發動戰後最嚴重的系統性挑戰。&lt;/p&gt;
&lt;p&gt;2026年1月30日，川普提名乍善（Kevin Warsh）接替鮑爾擔任聯準會主席（鮑爾任期至5月15日）。儘管乍善具有傳統資歷（前聯準會理事、胡佛研究所研究員），其任命的政治背景令人擔憂。司法部對鮑爾發出傳票，名義上是調查聯準會25億美元的總部翻修項目，鮑爾指控這是「藉口」以施壓聯準會配合川普的降息要求。2025年8月，川普嘗試以涉嫌抵押貸款欺詐為由解僱理事庫克（Lisa Cook），此案已上訴至最高法院。川普反覆要求利率應降至「1%甚至更低」，並稱聯準會主席「應該徵詢」總統意見。&lt;/p&gt;
&lt;p&gt;當前聯邦基金利率維持在&lt;strong&gt;3.50-3.75%&lt;/strong&gt;，核心PCE約3.0%。2026年美伊戰爭導致布倫特原油突破110美元，創造了「滯脹」的完美風暴條件——高油價推升通膨，同時抑制經濟成長。聯準會3月預測將2026年整體PCE通膨率上修至2.7%，GDP成長率維持2.4%，失業率4.4%。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾端風險：&lt;/strong&gt; 若乍善作為「順從型主席」系統性配合白宮降息要求，在通膨壓力未消退時過早放鬆貨幣政策，美國可能重演1970年代伯恩斯（Arthur Burns）時期的教訓——政策性通膨失控。國際投資者對美元資產的信心將加速流失。[推導]&lt;/p&gt;
&lt;h3 id="十一製造業回流真實但有限"&gt;十一、製造業回流：真實但有限&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 自2020年以來已有6,300億美元投入140多個項目、創造50萬個就業機會——這些數字令人印象深刻，但&lt;strong&gt;60萬個製造業職缺無人填補&lt;/strong&gt;的現實揭示了回流的硬性天花板。&lt;/p&gt;
&lt;p&gt;CHIPS法案推動了半導體領域的巨額投資：台積電亞利桑那投資&lt;strong&gt;1,650億美元&lt;/strong&gt;（6座晶圓廠、2座先進封裝廠、研發中心），第一座4nm廠已量產，第二座3nm廠設備遷入計畫2026年10月；三星泰勒廠投資超過170億美元；英特爾獲89億美元CHIPS資金加聯邦政府9.9%的股權。BCG/SIA估計，到2033年美國將持有全球先進邏輯晶片市場的&lt;strong&gt;28%&lt;/strong&gt;（無CHIPS法案僅8%）。&lt;/p&gt;
&lt;p&gt;但結構性限制嚴峻：美國晶圓廠建設成本是台灣的&lt;strong&gt;4-5倍&lt;/strong&gt;（台積電數據）；未來十年製造業需要380萬個工作崗位，預計190萬個將無法填補（德勤/製造業研究所）；35%的半導體高管擔憂美國電網無法承受需求；稀土礦物無法在國內以所需規模開採。&lt;/p&gt;
&lt;p&gt;2024年科爾尼回流指數在連續兩年正成長後下跌——製造商在關稅壓力下重新轉向低成本亞洲國家。實際上，&lt;strong&gt;只有三分之一受調查企業採取了「認真的」回流行動&lt;/strong&gt;。IRA的清潔能源製造激勵措施被川普政府在2025年初凍結撥款，導致累計8,698個工作崗位流失。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判斷：&lt;/strong&gt; 半導體和國防/航太的回流是真實的。消費電子、紡織、一般製造業的回流則大多停留在願景層面。完全脫離亞洲供應鏈在高頻寬記憶體、稀土和特定化學原料領域仍屬幻想。[推導]&lt;/p&gt;
&lt;h3 id="十二人工智慧巨額投資零可見產出但拐點將至"&gt;十二、人工智慧：巨額投資，零可見產出——但拐點將至&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 美國五大科技公司2026年計畫在AI基礎設施上投入&lt;strong&gt;7,000億美元&lt;/strong&gt;，但高盛首席經濟學家哈祖斯（Hatzius）在2026年3月直言：AI投資對2025年美國GDP成長的貢獻「基本為零」。&lt;/p&gt;
&lt;p&gt;這個悖論的解釋在於時間差。約6,000名高管的調查顯示，70%正在使用AI，但&lt;strong&gt;約80%報告對就業或生產力沒有可衡量的影響&lt;/strong&gt;。然而，在能夠量化特定AI用例的企業中，&lt;strong&gt;中位數生產力提升達30%&lt;/strong&gt;——收益真實存在，只是尚未擴散至整體經濟。高盛預測AI將從&lt;strong&gt;2027年&lt;/strong&gt;開始顯現可衡量的GDP/生產力影響，長期可能推動美國勞動生產力提升15%、全球GDP增加7%。&lt;/p&gt;
&lt;p&gt;美中AI競賽的格局正在變化。美國在前沿模型和高端晶片上仍領先——全球LLM網站訪問量的93%流向美國平台，Magnificent Seven中最低市值的特斯拉（1.46兆美元）仍超過中國BATX的合計市值（1.22兆美元）。但中國在成本效率（API價格為美國的1/6至1/4）、開源策略（阿里巴巴Qwen模型下載量超10億）和部署速度（AI醫療診斷準確率93%、DeepSeek部署至260家醫院）上展現優勢。Epoch AI評估中國LLM平均落後美國約&lt;strong&gt;7個月&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十年展望：&lt;/strong&gt; AI最可能的經濟效應不是立即的生產力革命，而是一個S曲線——2026-2027年為「投資期」（巨額資本支出、有限回報），2028-2032年為「部署期」（企業流程重構、生產力開始攀升），2033年後為「收穫期」（系統性經濟轉型）。&lt;strong&gt;能源是美國最不具競爭力的AI投入要素&lt;/strong&gt;——中國自2010年以來能源產量超過美國，這一結構性優勢難以短期逆轉。[搜尋/推導]&lt;/p&gt;
&lt;h2 id="第三部分台灣視角"&gt;第三部分：台灣視角&lt;/h2&gt;
&lt;h3 id="十三美國印太戰略的可靠性從戰略模糊到複合型模糊"&gt;十三、美國印太戰略的可靠性：從「戰略模糊」到「複合型模糊」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 川普拒絕明確承諾防衛台灣（「你得等到它發生才知道」），但其政府批准了史上最大對台軍售（110億美元），並在《國家安全戰略》中將嚇阻台海衝突列為「近期優先事項」——這種矛盾信號本身就是風險來源。&lt;/p&gt;
&lt;p&gt;全球台灣研究中心將此定義為「複合型戰略模糊」。正面信號包括：國務院刪除了「不支持台灣獨立」的措辭、《台灣保證實施法》（2025年12月簽署）要求定期檢討美台關係並探索取消自我設限的官方接觸紅線、第119屆國會提出了前所未有數量的台灣相關法案（包括將台灣比照「北約+」待遇加速武器轉讓的PORCUPINE法案）。&lt;/p&gt;
&lt;p&gt;負面信號同樣清晰：川普在釜山會議中&lt;strong&gt;未提及台灣議題&lt;/strong&gt;；2026年《國防戰略》未具體提及台灣海峽；美伊戰爭期間航母打擊群第五次從亞太抽調至中東。&lt;strong&gt;對台軍售積壓已達320億美元&lt;/strong&gt;——F-16 Block 70交機從2023年延至2026年（首批10架才於2025年3月下線）、AGM-154C飛彈從2023年延至2027-2028年、MK 48魚雷從2026年延至2028年。交付延遲比購買承諾更能真實反映安全承諾的可信度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;台灣的回應是有史以來最大規模的防衛建設：&lt;/strong&gt; 國防預算升至GDP的3.3%（2026年目標），並提出2026-2033年&lt;strong&gt;400億美元特別預算&lt;/strong&gt;用於非對稱戰力、T-Dome全島防空系統和區域拒止武器。義務兵役從4個月延長至12個月。漢光演習延長至10天10夜、動員22,000名後備軍人。與Anduril共同生產的梭魚-500巡弋飛彈（2025年9月宣布）標誌著台灣首次與外國企業聯合製造飛彈。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;外交避險加速：&lt;/strong&gt; 副總統蕭美琴成為首位在歐洲議會演講的台灣在任副總統（2025年11月），國安會秘書長吳釗燮在柏林發言——台灣正在系統性地建構歐洲連結作為對美依賴的避險。&lt;/p&gt;
&lt;h3 id="十四台積電地緣政治槓桿矽盾在變薄而非消失"&gt;十四、台積電地緣政治槓桿：「矽盾」在變薄，而非消失&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 台積電仍佔全球先進晶片（≤7nm）的&lt;strong&gt;約92%&lt;/strong&gt;，但其亞利桑那廠建成後將佔2nm及以上產能的30%——矽盾正在被「刻意重新平衡」而非自然侵蝕。&lt;/p&gt;
&lt;p&gt;台灣維持技術領先的「N-2法則」（海外廠不得使用落後國內不到兩個世代的技術）確保最先進製程留在島內。台積電已於2025年底/2026年初在台灣開始量產2nm晶片（GAAFET奈米片架構），而亞利桑那2nm廠要到2029年才投產。SemiAnalysis分析師評估，台灣的矽盾「至少到十年末仍然穩固」，4-5年的技術差距確保了台灣的優勢。&lt;/p&gt;
&lt;p&gt;但結構性變化已在發生。美國財政部長貝森特透露，台積電亞利桑那目前僅滿足美國晶片需求的&lt;strong&gt;7%&lt;/strong&gt;——這既說明台灣優勢之大，也暗示美國正在系統性地建構替代方案。到2030年的市場預測：台積電60-65%份額、三星10-15%、英特爾5-10%。完整的生態系統複製——工程人才、供應鏈密度、研發與製造的緊密整合——「在世界其他任何地方都無法以規模複製」（CSIS威廉·萊因施語）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有效期限判斷：&lt;/strong&gt; 短期（至約2030年）台灣的半導體優勢穩固無虞。中期（2030年後）隨著亞利桑那gigafab集群投產以及英特爾可能的復甦，集中度將逐步稀釋，但島內仍將保持最先進節點的壟斷地位。&lt;strong&gt;矽盾的有效期限大約還有8-10年的高度有效性，之後逐步降為中度&lt;/strong&gt;。[推導]&lt;/p&gt;
&lt;h3 id="十五台灣的風險對沖策略在鋼索上的平衡術"&gt;十五、台灣的風險對沖策略：在鋼索上的平衡術&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心張力：&lt;/strong&gt; 台灣需要同時做到：維持美國安全承諾的可信度、避免對中國的不必要挑釁、建構超越美國的多元夥伴關係、以及加速自身的非對稱嚇阻能力——這四個目標之間存在內在張力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;當前態勢：&lt;/strong&gt; 賴清德的「和平四支柱」框架試圖在嚇阻與對話之間維持平衡。兩岸經濟連結依然深厚——2025年1-11月雙邊貿易&lt;strong&gt;2,854億美元&lt;/strong&gt;（年增7.3%），新批台商登陸企業6,423家，實際利用台資17.5億美元（年增53%）。廈金航線2025年旅客量175萬人次（年增45.77%）。&lt;/p&gt;
&lt;p&gt;但結構性轉向正在發生。&lt;strong&gt;台灣對美出口在2018至2025年間成長341%&lt;/strong&gt;，2025年美國超越中國成為台灣最大出口市場（佔比30.9%）。2026年，台灣對美月度進口額首次超過中國——這是數十年來的首次。新南向政策目標國投資2024年達87億美元。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;策略建議綜合（基於多家智庫分析）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防衛：&lt;/strong&gt; 持續加速非對稱戰力建構，以「多域拒止、韌性防衛」為核心。將國防預算推向GDP 5%的目標。優先部署反艦飛彈、無人機、海上水雷和機動式防空系統，而非昂貴的傳統平台。重點解決武器交付延遲——與Anduril等企業的本土共同生產是正確方向。[搜尋/推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;外交：&lt;/strong&gt; 以歐洲為核心軸線進行多元避險——歐洲議會、捷克、波羅的海三國已是具體成果。但需避免「將所有避險雞蛋放入歐洲籃子」——印度、日本、澳洲、加拿大均應是深化對象。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;經濟：&lt;/strong&gt; 利用半導體槓桿在「有效期限內」最大化談判籌碼——將對美投資承諾（2,500億美元）與安全保證掛鉤。持續推動供應鏈分散化，但接受兩岸經貿完全脫鉤既不可能也不可取。[推導]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;社會韌性：&lt;/strong&gt; 漢光演習擴大至城市防衛、網路攻擊、通信中斷、社會動員等情境是關鍵進展。民防是最被低估的嚇阻工具。[搜尋/推導]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="結論與可信度評估"&gt;結論與可信度評估&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;核心判斷&lt;/th&gt;
&lt;th&gt;可信度&lt;/th&gt;
&lt;th&gt;來源類型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;美國同盟體系將存續但從「領導型」轉為「交易型」，這一轉變具有跨黨派持久性&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美中關係將維持「管控型競爭」而非滑向全面戰爭，但技術生態圈分裂不可逆&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋/推導&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美國聯邦債務將在2030年前後突破二戰紀錄，但短期內不會觸發主權債務危機&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美元霸權將緩慢侵蝕（至2035年儲備份額可能降至50%以下），但不會被單一貨幣取代&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋/推導&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;關稅政策的淨經濟效果為負，未能實質改善貿易逆差&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI將從2027-2028年開始顯現可衡量的生產力效應，長期推動美國15%的勞動生產力提升&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋/推導&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;台灣矽盾在2030年前保持高度有效性，之後逐步稀釋但不會消失&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋/推導&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;台海軍事衝突在2026-2035年間的概率非零但低於媒體渲染——灰色地帶施壓是更可能的情境&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;推導&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;聯準會獨立性面臨歷史性壓力但可能在制度層面存活——取決於Warsh的實際表現&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;低&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不確定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;俄烏戰爭將以「凍結衝突」形式暫停，但不會產生持久和平&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;搜尋/推導&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;終極判斷：&lt;/strong&gt; 美國2026-2035年的軌跡不是線性衰落，而是**「帶有高波動率的緩慢相對衰退」**。美國仍是全球最強大的單一國家，但其領導力的制度基礎正在被三股力量同時侵蝕：國內政治極化對制度的破壞、財政數學的無情惡化、以及盟友信任的結構性流失。反轉的窗口存在但正在收窄——2028年的總統選舉將是這一代人最重要的方向選擇。對台灣而言，核心策略訊號很清楚：&lt;strong&gt;不能假設美國會永遠在那裡，但也不能假設它不會。在這個模糊區間中最大化自身韌性，是唯一理性的選擇。&lt;/strong&gt; [推導]&lt;/p&gt;</description></item><item><title>Hugo 靜態網站 SEO + AEO 完整實作筆記：從 schema 到 llms.txt</title><link>https://blog.stanwu.org/posts/hugo-seo-aeo-complete-guide/</link><pubDate>Sun, 05 Apr 2026 12:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/hugo-seo-aeo-complete-guide/</guid><description>&lt;p&gt;把部落格從「只給人看」升級到「也給 AI 看」，這篇文章記錄了整個過程——包括踩到的坑。&lt;/p&gt;
&lt;h2 id="為什麼現在要做-aeo"&gt;為什麼現在要做 AEO&lt;/h2&gt;
&lt;p&gt;2025 年之後，流量的入口已經分裂成兩條路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;傳統搜尋引擎&lt;/strong&gt;（Google、Bing）→ 依然重要，排名決定曝光&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 答案引擎&lt;/strong&gt;（Perplexity、ChatGPT Search、Google AI Overviews）→ 快速成長，直接引用內容回答問題&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你的網站只做了 SEO，AI 引擎在回答相關問題時可能完全不引用你，即使你的內容是最完整的。AEO 的核心是讓 AI 系統能夠「讀懂」你的內容並信任你是可靠來源。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="現況盤點hugo-靜態網站-seo-的基礎"&gt;現況盤點：Hugo 靜態網站 SEO 的基礎&lt;/h2&gt;
&lt;p&gt;開始動工前先盤點現有基礎。一個典型的 Hugo 部落格通常已經有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; 與 Open Graph 基礎標籤&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;canonical&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;RSS Feed&lt;/li&gt;
&lt;li&gt;Hugo 自動產生的 &lt;code&gt;sitemap.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;基本的 JSON-LD Article schema&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但缺少的項目往往更關鍵：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缺少的項目&lt;/th&gt;
&lt;th&gt;影響&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Googlebot 行為不可控，AI 爬蟲沒有明確許可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;og:image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;社群分享沒有預覽圖，點擊率偏低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;meta name=&amp;quot;robots&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;無法告訴 Google 允許大圖摘要與長片段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BreadcrumbList schema&lt;/td&gt;
&lt;td&gt;缺少 Google 麵包屑富摘要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wordCount&lt;/code&gt;、&lt;code&gt;articleSection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Article schema 不完整&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speakable&lt;/code&gt; schema&lt;/td&gt;
&lt;td&gt;無法被語音搜尋與 AI 朗讀摘要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;llms.txt&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI 引擎沒有結構化的站點入口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAQPage schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google AI Overviews 無法直接抽取 Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E-E-A-T 作者信號&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI 引擎無法判斷內容可信度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="實作一robotstxt"&gt;實作一：&lt;code&gt;robots.txt&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;沒有 &lt;code&gt;robots.txt&lt;/code&gt; 並不代表所有爬蟲都被允許，只是讓爬蟲行為變得不可預測。更重要的是，現在需要明確告訴 AI 爬蟲「你們可以來」。&lt;/p&gt;
&lt;p&gt;把以下內容放到 &lt;code&gt;static/robots.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# AI crawlers — allow for AEO
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: GPTBot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: ClaudeBot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: PerplexityBot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: anthropic-ai
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sitemap: https://your-domain.com/sitemap.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="坑一cloudflare-managed-robotstxt"&gt;坑一：Cloudflare Managed robots.txt&lt;/h2&gt;
&lt;p&gt;部署之後用 &lt;code&gt;curl&lt;/code&gt; 測試，發現回傳的不是我們的檔案，而是 Cloudflare 的「Content Signals Framework」：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://your-domain.com/robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# As a condition of accessing this website, you agree to abide by the following&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# content signals:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# search: building a search index...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-input: inputting content into one or more AI models...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-train: training or fine-tuning AI models.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;這是 Cloudflare 的「Managed robots.txt」功能，會直接覆蓋掉你的靜態檔案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解決方法：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Scrape Shield → Managed robots.txt → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;關閉後 &lt;code&gt;curl&lt;/code&gt; 就能拿到自己的 &lt;code&gt;robots.txt&lt;/code&gt; 了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="坑二cloudflare-預設封鎖-ai-爬蟲"&gt;坑二：Cloudflare 預設封鎖 AI 爬蟲&lt;/h2&gt;
&lt;p&gt;即使 &lt;code&gt;robots.txt&lt;/code&gt; 正確，Cloudflare 從 2025 年 7 月起對新加入網域預設封鎖所有 AI bot。這個封鎖發生在網路層，&lt;strong&gt;在請求到達你的 server 之前就被 drop 掉&lt;/strong&gt;，所以 &lt;code&gt;robots.txt&lt;/code&gt; 完全沒有機會被讀到。&lt;/p&gt;
&lt;p&gt;被封鎖的包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PerplexityBot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPTBot&lt;/code&gt;（ChatGPT Search）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClaudeBot&lt;/code&gt;（Anthropic）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;anthropic-ai&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解決方法：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Security → Bots → AI Scrapers and Crawlers → Off
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重要區別&lt;/strong&gt;：這裡設成 Off 是讓所有 AI bot 通過，然後靠 &lt;code&gt;robots.txt&lt;/code&gt; 自己精細控制。如果你想繼續封鎖用來「訓練模型」的爬蟲（如 CCBot、Common Crawl），可以用 Cloudflare WAF 規則針對特定 User-Agent 封鎖，而不是全部擋掉。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;關閉後，可以在 Cloudflare Dashboard 的 &lt;strong&gt;AI Crawl Control&lt;/strong&gt; 頁面看到 AI 爬蟲的請求統計，確認爬蟲是否已順利抵達你的網站：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/images/cloudflare-ai-crawl-control.png" alt="Cloudflare AI Crawl Control 統計頁面，顯示 74 次 AI 爬蟲請求，76.2% 較前期增加"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="實作二ogimage-與-twitter-card"&gt;實作二：&lt;code&gt;og:image&lt;/code&gt; 與 Twitter Card&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;og:image&lt;/code&gt; 是社群分享時顯示預覽圖的關鍵。沒有這個標籤，文章分享到 Facebook、LINE、Twitter 時只會顯示一個空白方塊。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;layouts/partials/head.html&lt;/code&gt; 加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{/* OG Image：優先用文章自訂圖，否則用站點預設 */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $ogImage := &amp;#34;&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if .Params.image }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $ogImage = .Params.image | absURL }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ else }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $ogImage = site.Params.og_image | absURL }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:image&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $ogImage }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:image:width&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1200&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:image:height&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;630&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter:card&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;summary_large_image&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter:image&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $ogImage }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同時在 &lt;code&gt;config/_default/params.toml&lt;/code&gt; 加入預設圖路徑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;og_image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/images/og-default.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文章 front matter 可以個別指定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/images/posts/my-article-cover.png&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="實作三meta-namerobots-完整指令"&gt;實作三：&lt;code&gt;meta name=&amp;quot;robots&amp;quot;&lt;/code&gt; 完整指令&lt;/h2&gt;
&lt;p&gt;這個標籤告訴 Google 允許哪些摘要方式。&lt;code&gt;max-image-preview:large&lt;/code&gt; 讓 Google 在搜尋結果顯示大圖；&lt;code&gt;max-snippet:-1&lt;/code&gt; 允許顯示任意長度的文字摘要。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;robots&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;沒有這行，Google 可能只顯示小圖或截短摘要，直接影響點擊率。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="實作四完整的-article-schema"&gt;實作四：完整的 Article schema&lt;/h2&gt;
&lt;p&gt;基本的 Article schema 只有標題、日期、作者，但完整版還要加上 &lt;code&gt;wordCount&lt;/code&gt;、&lt;code&gt;articleSection&lt;/code&gt;、&lt;code&gt;speakable&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;layouts/partials/schema.html&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if .IsPage }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ .Params.schema_type | default &amp;#34;&lt;/span&gt;&lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Summary&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;plainify&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;truncate&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ .Date.Format &amp;#34;&lt;/span&gt;&lt;span class="mi"&gt;2006&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="nx"&gt;T15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="nx"&gt;Z07&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ .Lastmod.Format &amp;#34;&lt;/span&gt;&lt;span class="mi"&gt;2006&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="nx"&gt;T15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="nx"&gt;Z07&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;wordCount&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WordCount&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;articleSection&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}},{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ site.Params.schema.person_name }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ site.Params.schema.person_url }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;absURL&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="nx"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;og_image&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;absURL&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{{&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="nx"&gt;$v&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;speakable&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SpeakableSpecification&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;cssSelector&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.post-header h1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.post-summary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.content &amp;gt; p:first-child&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;speakable&lt;/code&gt; 標記的 CSS selector 告訴 Google 哪些段落「適合被朗讀」，這是語音搜尋和 AI 口語摘要的依據。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="實作五breadcrumblist-schema"&gt;實作五：BreadcrumbList schema&lt;/h2&gt;
&lt;p&gt;BreadcrumbList 讓 Google 在搜尋結果中顯示路徑導覽（「首頁 › 文章 › 文章標題」），提升點擊意願。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;首頁&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ site.BaseURL }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;文章&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ &amp;#34;&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; | absURL }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="實作六llmstxtaeo-的核心"&gt;實作六：&lt;code&gt;llms.txt&lt;/code&gt;（AEO 的核心）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; 是 &lt;a href="https://llmstxt.org"&gt;llmstxt.org&lt;/a&gt; 推動的新興標準。概念類似 &lt;code&gt;robots.txt&lt;/code&gt;，但目標是幫助 LLM 理解網站，而不是控制爬蟲行為。&lt;/p&gt;
&lt;p&gt;格式是 Markdown，放在網站根目錄 &lt;code&gt;/llms.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Stan Wu 吳信典
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;拆解被包裝過的東西、數位自主權實踐、非典型理財觀
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 重要頁面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; [&lt;span class="nt"&gt;首頁&lt;/span&gt;](&lt;span class="na"&gt;https://your-domain.com/&lt;/span&gt;): 最新文章列表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; [&lt;span class="nt"&gt;關於&lt;/span&gt;](&lt;span class="na"&gt;https://your-domain.com/about/&lt;/span&gt;): 關於作者
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 文章
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; [&lt;span class="nt"&gt;文章標題&lt;/span&gt;](&lt;span class="na"&gt;https://your-domain.com/posts/slug/&lt;/span&gt;): 摘要描述
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 關於作者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;專長領域：DevOps、Python、Linux、資訊安全...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Hugo 中用 custom output format 動態產生，確保文章清單永遠是最新的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;config/_default/hugo.toml&lt;/code&gt;&lt;/strong&gt; 加入輸出格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;home&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;JSON&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;LLMS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;outputFormats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LLMS&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mediatype&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/plain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;baseName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;llms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;isPlainText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;notAlternative&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;layouts/index.llms.txt&lt;/code&gt;&lt;/strong&gt; 模板：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# {{ site.Title }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; {{ site.Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## 文章
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ range where .Site.RegularPages &amp;#34;Section&amp;#34; &amp;#34;posts&amp;#34; }}{{ if not .Params.draft }}- [{{ .Title }}]({{ .Permalink }}){{ with .Summary }}: {{ . | plainify | truncate 120 }}{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="實作七faqpage-schema"&gt;實作七：FAQPage schema&lt;/h2&gt;
&lt;p&gt;FAQPage 是 AI Overviews 和 Google 精選摘要最喜歡的格式，AI 引擎會直接從 FAQ 提取問題和答案作為回覆。&lt;/p&gt;
&lt;p&gt;在 Hugo 中透過 front matter 的 &lt;code&gt;faq&lt;/code&gt; 陣列驅動，schema partial 自動輸出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 文章 front matter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;問題一？&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;詳細的答案...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;問題二？&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;詳細的答案...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;schema.html&lt;/code&gt; 對應的輸出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ with .Params.faq }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAQPage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mainEntity&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$item&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;}},{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Question&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;acceptedAnswer&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Answer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="實作八e-e-a-t-作者信號knowsabout"&gt;實作八：E-E-A-T 作者信號（&lt;code&gt;knowsAbout&lt;/code&gt;）&lt;/h2&gt;
&lt;p&gt;Google 和 AI 引擎判斷內容可信度的方式之一是 E-E-A-T（Experience、Expertise、Authoritativeness、Trustworthiness）。在 Person schema 中加入 &lt;code&gt;knowsAbout&lt;/code&gt; 欄位，明確宣告作者的專長領域。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;config/_default/params.toml&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;person_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;person_url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-personal-site.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;person_same_as&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/your-handle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;knows_about&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Linux 系統管理&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;DevOps&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;資訊安全&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;head.html&lt;/code&gt; 的 Person schema：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ site.Params.schema.person_name }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{ site.Params.schema.person_url }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;person_same_as&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sameAs&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{{&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ $v }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;knows_about&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;knowsAbout&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{{&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="p"&gt;}}{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ $v }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;sameAs&lt;/code&gt; 把你的 GitHub、社群媒體帳號連結起來，幫助 AI 引擎將「散落在各處的你」識別為同一個人，強化權威性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="實作九閱讀時間顯示"&gt;實作九：閱讀時間顯示&lt;/h2&gt;
&lt;p&gt;閱讀時間對 UX 有直接幫助——讓讀者在點進文章前知道需要花多少時間，降低跳出率。Hugo 內建 &lt;code&gt;.ReadingTime&lt;/code&gt; 變數，直接在文章 meta 中使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;reading-time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .ReadingTime }} 分鐘閱讀&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="驗證方式"&gt;驗證方式&lt;/h2&gt;
&lt;h3 id="快速驗證curl"&gt;快速驗證：curl&lt;/h3&gt;
&lt;p&gt;最直接的方式，用不同 User-Agent 模擬不同爬蟲：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認 robots.txt 是自己的內容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://your-domain.com/robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認 llms.txt 存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://your-domain.com/llms.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 用 Googlebot 身份抓頁面，確認 schema 存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -A &lt;span class="s2"&gt;&amp;#34;Googlebot&amp;#34;&lt;/span&gt; https://your-domain.com/posts/your-post/ &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;application/ld+json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="完整驗證python-模擬爬蟲"&gt;完整驗證：Python 模擬爬蟲&lt;/h3&gt;
&lt;p&gt;寫一支 Python 腳本，模擬 PerplexityBot 爬蟲，逐項檢查所有 SEO/AEO 信號：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-domain.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/bot)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;✅&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;❌&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 抓文章頁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/posts/your-post/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Hugo --minify 會把 &amp;lt;script type=&amp;#34;application/ld+json&amp;#34;&amp;gt; 的引號移除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 必須用無引號的 regex 才能正確比對&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;script type=application/ld\+json&amp;gt;(.*?)&amp;lt;/script&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DOTALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;types&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;has_breadcrumb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;has_speakable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;has_wordcount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;has_faqpage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;has_knowsabout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;has_breadcrumb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Article&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlogPosting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;has_speakable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;speakable&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;has_wordcount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;wordCount&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAQPage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;has_faqpage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;knowsAbout&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;has_knowsabout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;JSON-LD 區塊數量（&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;）&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Article schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Article&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlogPosting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_breadcrumb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;speakable&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_speakable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wordCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_wordcount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FAQPage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_faqpage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Person knowsAbout&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_knowsabout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;og:image&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;og:image&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;twitter:card large_image&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;summary_large_image&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;meta robots&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;name=robots&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;閱讀時間&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;分鐘閱讀&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Hugo 的 &lt;code&gt;--minify&lt;/code&gt; 會把 &lt;code&gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;/code&gt; 的引號去掉，變成 &lt;code&gt;&amp;lt;script type=application/ld+json&amp;gt;&lt;/code&gt;。如果 regex 還在找有引號的版本，就會全部找不到——這是一個很隱蔽的驗證陷阱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="google-官方工具"&gt;Google 官方工具&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://search.google.com/test/rich-results
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;貼入文章 URL，可以視覺化確認 Article、BreadcrumbList、FAQPage 三個 schema 是否都通過驗證。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="成果"&gt;成果&lt;/h2&gt;
&lt;p&gt;跑完完整驗證後的結果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[1] robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ 非 Cloudflare managed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ Allow PerplexityBot / ClaudeBot / GPTBot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ Sitemap 指向
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2] llms.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ 存在並包含文章清單與作者專長
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[3] Article schema
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ JSON-LD 3 個區塊（Person / Article / BreadcrumbList）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ BreadcrumbList
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ speakable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ wordCount
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ Person knowsAbout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ FAQPage（5 個 Q&amp;amp;A）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[4] Meta tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ og:image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ twitter:card summary_large_image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ meta robots
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ canonical
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[5] UX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ 閱讀時間顯示
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="小結"&gt;小結&lt;/h2&gt;
&lt;p&gt;SEO 是讓人找到你，AEO 是讓 AI 引用你。兩件事現在都要做。&lt;/p&gt;
&lt;p&gt;對 Hugo 靜態網站來說，實作成本不高，大多數改動都在 layouts 和 config，不需要動到文章內容本身。最麻煩的反而是 Cloudflare 那兩個預設行為——Managed robots.txt 和 AI bot 封鎖——如果不知道，可能花很多時間找不到原因。&lt;/p&gt;
&lt;p&gt;這篇文章記錄的所有改動，歡迎直接參考或借用。&lt;/p&gt;</description></item><item><title>Hugo 靜態網站社群預覽完整踩坑紀錄：og:image、Cloudflare、Facebook 爬蟲 403</title><link>https://blog.stanwu.org/posts/social-media-preview-og-cloudflare-pitfalls/</link><pubDate>Sun, 05 Apr 2026 00:01:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/social-media-preview-og-cloudflare-pitfalls/</guid><description>&lt;p&gt;把文章分享到社群平台，結果跳出「No title」、「No description」，或是預覽圖莫名出現頭像——這篇文章完整記錄這些問題的根本原因，以及一個一個解掉的過程。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;在完成 &lt;a href="https://blog.stanwu.org/posts/hugo-seo-aeo-complete-guide/"&gt;Hugo 靜態網站 SEO + AEO 最佳化&lt;/a&gt;之後，實際把文章貼到 Buffer 準備同步發佈到 Facebook、LinkedIn 和 X，結果馬上踩到一系列坑。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題一buffer-顯示no-titleno-description"&gt;問題一：Buffer 顯示「No title、No description」&lt;/h2&gt;
&lt;h3 id="症狀"&gt;症狀&lt;/h3&gt;
&lt;p&gt;在 Buffer 貼入文章 URL，預覽顯示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No title
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No description
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Buffer 錯誤訊息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We were unable to generate a preview of this link. This may happen if the website blocks Buffer&amp;rsquo;s access to images and other content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="排查過程"&gt;排查過程&lt;/h3&gt;
&lt;p&gt;第一反應是 &lt;code&gt;og:title&lt;/code&gt; 和 &lt;code&gt;og:description&lt;/code&gt; 沒有輸出。用 curl 模擬 Facebook 爬蟲：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -A &lt;span class="s2"&gt;&amp;#34;facebookexternalhit/1.1&amp;#34;&lt;/span&gt; https://blog.example.com/posts/your-post/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTML 內容完全正確，og 標籤都在。問題不在程式碼。&lt;/p&gt;
&lt;p&gt;接著測試 &lt;code&gt;robots.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;回傳的不是自己寫的內容，而是這個：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# As a condition of accessing this website, you agree to abide by the following&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# content signals:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# search: building a search index...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-input: inputting content into one or more AI models...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-train: training or fine-tuning AI models.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="根本原因"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 的 Managed robots.txt 功能開著&lt;/strong&gt;，它會攔截對 &lt;code&gt;/robots.txt&lt;/code&gt; 的請求，用 Cloudflare 自己的「Content Signals Framework」格式回應，完全取代你放在 &lt;code&gt;static/robots.txt&lt;/code&gt; 的檔案。&lt;/p&gt;
&lt;p&gt;Buffer 的爬蟲讀到這個格式不認識的 robots.txt，可能誤判為被封鎖，導致放棄抓取 metadata。&lt;/p&gt;
&lt;h3 id="解法"&gt;解法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Scrape Shield → Managed robots.txt → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;關閉後 &lt;code&gt;robots.txt&lt;/code&gt; 恢復正常。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題二facebook-sharing-debugger-回傳-403"&gt;問題二：Facebook Sharing Debugger 回傳 403&lt;/h2&gt;
&lt;h3 id="症狀-1"&gt;症狀&lt;/h3&gt;
&lt;p&gt;到 Facebook Sharing Debugger (&lt;code&gt;developers.facebook.com/tools/debug/&lt;/code&gt;) 貼入 URL 重新抓取，結果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回應碼：403
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回應碼原因：This response code could be due to a robots.txt block.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please allowlist facebookexternalhit on your sites robots.txt config.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="排查過程-1"&gt;排查過程&lt;/h3&gt;
&lt;p&gt;明明 &lt;code&gt;robots.txt&lt;/code&gt; 已經是 &lt;code&gt;User-agent: * Allow: /&lt;/code&gt;，照理說 Facebook 爬蟲不應該被擋。&lt;/p&gt;
&lt;p&gt;用 curl 模擬確認：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -o /dev/null -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -A &lt;span class="s2"&gt;&amp;#34;facebookexternalhit/1.1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://blog.example.com/posts/your-post/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 回傳：200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本機模擬是 200，但 Facebook 真實爬蟲拿到 403。&lt;/p&gt;
&lt;h3 id="根本原因-1"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 的 Bot Fight Mode&lt;/strong&gt; 把 Facebook 真實爬蟲的 IP 當成惡意 bot，在網路層直接封鎖，請求根本到不了 origin server，更不會去看 robots.txt。&lt;/p&gt;
&lt;p&gt;這就是為什麼：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本機用相同 User-Agent curl 是 200（本機 IP 沒被 Cloudflare 標記）&lt;/li&gt;
&lt;li&gt;Facebook 真實爬蟲是 403（Facebook 的 IP 被 Bot Fight Mode 封鎖）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="解法選一"&gt;解法（選一）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方案 A：直接關閉 Bot Fight Mode&lt;/strong&gt;（適合靜態網站，攻擊面小）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Security → Bots → Bot Fight Mode → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;靜態 HTML 網站基本上沒什麼可攻擊的（無資料庫、無後端程式、無登入），Bot Fight Mode 帶來的保護效益有限，關掉換取社群爬蟲正常運作是合理的取捨。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案 B：建立 WAF Custom Rule 精準放行&lt;/strong&gt;（保留 Bot Fight Mode）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Security → WAF → Custom Rules → Create rule
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在「Edit expression」模式貼入以下表達式，Action 選 &lt;strong&gt;Skip → Skip all remaining custom rules&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;facebookexternalhit&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;Twitterbot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;LinkedInBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;Bufferbot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;PerplexityBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;GPTBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;ClaudeBot&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="問題三沒有設定-ogimage頭像卻自動出現在預覽圖"&gt;問題三：沒有設定 og:image，頭像卻自動出現在預覽圖&lt;/h2&gt;
&lt;h3 id="症狀-2"&gt;症狀&lt;/h3&gt;
&lt;p&gt;文章 front matter 沒有設定 &lt;code&gt;image&lt;/code&gt;，程式碼也沒有輸出 &lt;code&gt;og:image&lt;/code&gt; meta tag，但 Facebook、Buffer 的預覽圖卻顯示網站頭像。&lt;/p&gt;
&lt;p&gt;確認 meta tag 確實不存在：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;property=&amp;#34;og:image&amp;#34;\|property=og:image&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 沒有輸出 → meta tag 確實不存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="根本原因-2"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Facebook 有 fallback 機制&lt;/strong&gt;：當頁面沒有 &lt;code&gt;og:image&lt;/code&gt; meta tag 時，Facebook 爬蟲會自動掃描頁面裡所有的 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤，抓第一張圖作為預覽圖。&lt;/p&gt;
&lt;p&gt;確認頁面裡的 img 標籤：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;img[^&amp;gt;]*src=[^[:space:]&amp;gt;]*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 輸出：img src=https://blog.stanwu.org/images/avatar.jpg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sidebar 的作者頭像用 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤載入，Facebook 掃到了就拿去用。&lt;/p&gt;
&lt;h3 id="解法-1"&gt;解法&lt;/h3&gt;
&lt;p&gt;把 sidebar 頭像從 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 改成 CSS &lt;code&gt;background-image&lt;/code&gt;。Facebook 爬蟲只掃 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤，不解析 CSS，所以改用 CSS 載入之後，Facebook 就掃不到這張圖。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layout 改動（&lt;code&gt;layouts/partials/header.html&lt;/code&gt;）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 改前 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/images/avatar.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;作者名稱&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sidebar-avatar&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 改後 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sidebar-avatar&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;img&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;aria-label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;作者名稱&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSS 改動（&lt;code&gt;assets/css/main.css&lt;/code&gt;）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 改前 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sidebar-avatar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 改後 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sidebar-avatar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/images/avatar.jpg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;視覺上完全一樣，但 Facebook 爬蟲看不到頭像了。&lt;/p&gt;
&lt;p&gt;改完後驗證：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;img[^&amp;gt;]*src=[^[:space:]&amp;gt;]*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 沒有輸出 → 頁面裡已無任何 &amp;lt;img&amp;gt; 標籤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="問題四ogdescription-有設但預覽沒有文字"&gt;問題四：og:description 有設但預覽沒有文字&lt;/h2&gt;
&lt;h3 id="症狀-3"&gt;症狀&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;og:description&lt;/code&gt; 在 HTML 裡確認存在，但 Buffer 或 Facebook 預覽只有大標題，沒有描述文字。&lt;/p&gt;
&lt;h3 id="根本原因-3"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;兩個可能：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 描述 fallback 到站點描述而非文章摘要&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hugo 模板常見寫法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 錯誤：沒有 description front matter 時 fallback 到站點描述 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:description&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ with .Params.description }}{{ . }}{{ else }}{{ site.Params.description }}{{ end }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每篇文章分享出去都顯示一樣的站點 tagline，社群平台判定為重複內容可能降低展示優先度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 快取問題&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Facebook 快取了舊版 metadata，即使 HTML 已經更新，Facebook 仍顯示舊內容。&lt;/p&gt;
&lt;h3 id="解法-2"&gt;解法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;修正 description fallback 邏輯&lt;/strong&gt;，改成用文章摘要（&lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; 之前的內容）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $desc := site.Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if .IsPage }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ if .Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $desc = .Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ else }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $desc = .Summary | plainify | truncate 160 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter:description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;優先順序：&lt;code&gt;front matter description&lt;/code&gt; → &lt;code&gt;文章摘要前 160 字&lt;/code&gt; → &lt;code&gt;站點描述（首頁用）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清除快取&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Caching → Cache Purge → Custom Purge → 貼入 URL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;清完後到 Facebook Sharing Debugger 再點一次「再次抓取」。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="整體流程回顧"&gt;整體流程回顧&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;分享連結到 Buffer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No title / No description
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Managed robots.txt 攔截 → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Facebook Sharing Debugger 重抓 → 403
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Bot Fight Mode 封鎖 Facebook 爬蟲 IP → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;頭像出現在預覽圖（無 og:image 時 Facebook 掃 &amp;lt;img&amp;gt;）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sidebar &amp;lt;img&amp;gt; 被掃到 → 改成 CSS background-image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 預覽正常：標題 + 文章摘要，無多餘圖片
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="小結"&gt;小結&lt;/h2&gt;
&lt;p&gt;這次碰到的四個問題，表面上看起來像是「og 設定沒設好」，實際上大部分根因都在 &lt;strong&gt;Cloudflare 的預設行為&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;th&gt;根因&lt;/th&gt;
&lt;th&gt;一行解法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No title / No description&lt;/td&gt;
&lt;td&gt;Cloudflare Managed robots.txt&lt;/td&gt;
&lt;td&gt;關閉 Managed robots.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facebook 爬蟲 403&lt;/td&gt;
&lt;td&gt;Cloudflare Bot Fight Mode&lt;/td&gt;
&lt;td&gt;關閉或 WAF 放行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;頭像出現在預覽&lt;/td&gt;
&lt;td&gt;Facebook 掃 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; fallback&lt;/td&gt;
&lt;td&gt;改 CSS background-image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description 顯示站點描述&lt;/td&gt;
&lt;td&gt;Hugo fallback 邏輯錯誤&lt;/td&gt;
&lt;td&gt;Summary 優先於 site.Params.description&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;對靜態網站來說，Cloudflare 帶來的保護主要是 CDN 加速和 L3/L4 DDoS 防護，應用層的 Bot Fight Mode 和 Managed robots.txt 反而會干擾正常的社群爬蟲和 AI 引擎，根據需求調整比全部開啟要好。&lt;/p&gt;</description></item><item><title>用 Python 自動化 nginx 虛擬主機與 Let's Encrypt SSL 部署</title><link>https://blog.stanwu.org/posts/nginx-ssl-auto-deploy-python/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/nginx-ssl-auto-deploy-python/</guid><description>&lt;p&gt;管理多個靜態網站時，每次新增網域都要手動建立 nginx 設定、建 symlink、申請憑證，流程繁瑣又容易出錯。這篇文章記錄我如何用一支 Python 腳本解決這個問題，以及開發過程中踩過的坑。&lt;/p&gt;
&lt;h2 id="為什麼要開發這支腳本"&gt;為什麼要開發這支腳本&lt;/h2&gt;
&lt;p&gt;當網站數量從個位數增長到數十個時，手動管理 nginx 虛擬主機設定就會變成一種折磨。每次新增網域的標準流程大概是這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt; 建立設定檔&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;/etc/nginx/sites-enabled/&lt;/code&gt; 建立 symlink&lt;/li&gt;
&lt;li&gt;執行 &lt;code&gt;nginx -t&lt;/code&gt; 測試設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl reload nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;執行 &lt;code&gt;certbot --nginx -d example.com&lt;/code&gt; 申請 SSL&lt;/li&gt;
&lt;li&gt;如果是 naked domain，還要額外加上 &lt;code&gt;www.example.com&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這六個步驟，每個網域都要重複一次。更麻煩的是，如果之前已申請過 SSL 但忘記了，再次執行 certbot 不會造成問題，但會觸發不必要的 API 呼叫，而 Let&amp;rsquo;s Encrypt 有 rate limit 限制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心需求：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;掃描目錄，自動偵測所有待設定的網域&lt;/li&gt;
&lt;li&gt;自動產生 nginx 設定並啟用&lt;/li&gt;
&lt;li&gt;naked domain 自動加上 &lt;code&gt;www&lt;/code&gt; alias&lt;/li&gt;
&lt;li&gt;申請 SSL 前先確認是否已有有效憑證&lt;/li&gt;
&lt;li&gt;支援 &lt;code&gt;--dry-run&lt;/code&gt; 預覽模式&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="整體架構"&gt;整體架構&lt;/h2&gt;
&lt;p&gt;腳本分為五個區塊：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;scan_domains&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;掃描&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;websites&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;下的目錄名稱&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;write_nginx_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;依模板產生&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="err"&gt;設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable_nginx_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;建立&lt;/span&gt; &lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt; &lt;span class="n"&gt;symlink&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ssl_is_valid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;檢查現有憑證是否有效&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;obtain_ssl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;呼叫&lt;/span&gt; &lt;span class="n"&gt;certbot&lt;/span&gt; &lt;span class="err"&gt;申請憑證&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="程式碼分段解說"&gt;程式碼分段解說&lt;/h2&gt;
&lt;h3 id="1-nginx-設定模板"&gt;1. nginx 設定模板&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;NGINX_TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;server {{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; listen [::]:80;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; server_name &lt;/span&gt;&lt;span class="si"&gt;{server_name}&lt;/span&gt;&lt;span class="s2"&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; root /var/www/websites/&lt;/span&gt;&lt;span class="si"&gt;{domain}&lt;/span&gt;&lt;span class="s2"&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; index index.html index.htm index.php;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; access_log /var/log/nginx/&lt;/span&gt;&lt;span class="si"&gt;{domain}&lt;/span&gt;&lt;span class="s2"&gt;_access.log;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; error_log /var/log/nginx/&lt;/span&gt;&lt;span class="si"&gt;{domain}&lt;/span&gt;&lt;span class="s2"&gt;_error.log;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; location / {{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; try_files $uri $uri/ =404;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; location ~ /&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.well-known/acme-challenge {{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; allow all;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; root /var/www/websites/&lt;/span&gt;&lt;span class="si"&gt;{domain}&lt;/span&gt;&lt;span class="s2"&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;這裡有個細節：&lt;code&gt;server_name&lt;/code&gt; 和 &lt;code&gt;domain&lt;/code&gt; 是兩個不同的佔位符。&lt;code&gt;domain&lt;/code&gt; 是目錄名稱（永遠只有一個），而 &lt;code&gt;server_name&lt;/code&gt; 可能是 &lt;code&gt;&amp;quot;example.com www.example.com&amp;quot;&lt;/code&gt;。模板中雙重花括號 &lt;code&gt;{{&lt;/code&gt; 是 Python &lt;code&gt;.format()&lt;/code&gt; 的跳脫寫法，避免被誤判為變數。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.well-known/acme-challenge&lt;/code&gt; 區塊是給 Let&amp;rsquo;s Encrypt HTTP-01 驗證用的，必須確保這個路徑可公開存取。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-naked-domain-偵測"&gt;2. Naked Domain 偵測&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_naked_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;判斷是否為 naked domain（無子網域，如 abc.com）&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;判斷邏輯：只有一個點代表是 &lt;code&gt;domain.tld&lt;/code&gt; 結構（naked domain），兩個以上的點代表是子網域（如 &lt;code&gt;sub.example.com&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;這個函式在兩個地方被呼叫：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;write_nginx_config()&lt;/code&gt;：決定 &lt;code&gt;server_name&lt;/code&gt; 要不要加 &lt;code&gt;www&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;obtain_ssl()&lt;/code&gt;：決定 certbot 要不要加第二個 &lt;code&gt;-d www.xxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-寫入-nginx-設定"&gt;3. 寫入 nginx 設定&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_nginx_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NGINX_AVAILABLE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] nginx 設定已存在，跳過（使用 --force 覆蓋）&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_naked_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; www.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NGINX_TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;server_name_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;回傳值 &lt;code&gt;True/False&lt;/code&gt; 代表「是否有新寫入設定」，用來決定後續是否需要 reload nginx。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="4-檢查-ssl-有效性避免重複申請"&gt;4. 檢查 SSL 有效性（避免重複申請）&lt;/h3&gt;
&lt;p&gt;這是這次開發中最值得紀錄的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;問題：&lt;/strong&gt; Let&amp;rsquo;s Encrypt 對同一 domain 每週有 5 次憑證申請的 rate limit。如果腳本每次跑都重新申請，很快就會撞牆。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解法：&lt;/strong&gt; 直接讀取本機已有的 PEM 憑證，用 &lt;code&gt;openssl&lt;/code&gt; 解析到期日後與當前時間比較。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ssl_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cert_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/etc/letsencrypt/live/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/cert.pem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cert_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openssl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x509&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-noout&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-enddate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_path&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 輸出格式：notAfter=Apr 5 00:00:00 2026 GMT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;date_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expiry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%b &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; %H:%M:%S %Y %Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;expiry&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] SSL 憑證有效，到期日：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;expiry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;，跳過申請&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] 檢查 SSL 有效期時發生錯誤：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;踩坑筆記：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openssl x509 -enddate&lt;/code&gt; 輸出的月份縮寫是英文（&lt;code&gt;Apr&lt;/code&gt;），且日期單位數時會有空格補位（&lt;code&gt;&amp;quot; 5&amp;quot;&lt;/code&gt; 而非 &lt;code&gt;&amp;quot;05&amp;quot;&lt;/code&gt;），解析格式要用 &lt;code&gt;&amp;quot;%b %d %H:%M:%S %Y %Z&amp;quot;&lt;/code&gt; 才能正確處理&lt;/li&gt;
&lt;li&gt;比較時間用 &lt;code&gt;datetime.utcnow()&lt;/code&gt; 而非 &lt;code&gt;datetime.now()&lt;/code&gt;，因為憑證時間是 UTC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;except Exception&lt;/code&gt; 吞掉所有例外並回傳 &lt;code&gt;False&lt;/code&gt;，讓腳本退化成「嘗試申請」而不是直接失敗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;naked domain 的憑證檔案路徑仍然是 &lt;code&gt;/etc/letsencrypt/live/{domain}/cert.pem&lt;/code&gt;（不含 &lt;code&gt;www&lt;/code&gt;），certbot 會將 SAN（Subject Alternative Name）一起打進同一張憑證。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="5-申請-ssl"&gt;5. 申請 SSL&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;obtain_ssl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;domains_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_naked_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;domains_args&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;www.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;certbot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--nginx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;domains_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--non-interactive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--agree-tos&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-m&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--redirect&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--redirect&lt;/code&gt; 讓 certbot 自動在 nginx 設定中加上 HTTP → HTTPS 301 redirect，不需要手動編輯。&lt;code&gt;--non-interactive&lt;/code&gt; 搭配 &lt;code&gt;--agree-tos&lt;/code&gt; 適合無人值守的排程執行。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="6-主流程"&gt;6. 主流程&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 處理每個網域&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;domains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config_written&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;write_nginx_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enable_nginx_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;config_written&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;nginx_changed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Reload nginx（如有變更）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nginx_changed&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reload_nginx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 申請 SSL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ssl_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssl_skipped&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obtain_ssl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssl_ok&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssl_fail&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;nginx_changed&lt;/code&gt; 是一個 flag，只有在「至少一個設定檔被實際寫入」時才 reload nginx，避免沒有變更時也觸發 reload。&lt;/p&gt;
&lt;p&gt;SSL 申請在 nginx reload 之後，確保 HTTP 驗證路徑已經生效。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="遇到的問題與解決方式"&gt;遇到的問題與解決方式&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;naked domain 只設定了 &lt;code&gt;abc.com&lt;/code&gt;，&lt;code&gt;www.abc.com&lt;/code&gt; 無法存取&lt;/td&gt;
&lt;td&gt;nginx &lt;code&gt;server_name&lt;/code&gt; 沒有加 www&lt;/td&gt;
&lt;td&gt;&lt;code&gt;is_naked_domain()&lt;/code&gt; 偵測後自動加上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;certbot 每次都重新申請，偶爾遇到 rate limit&lt;/td&gt;
&lt;td&gt;沒有檢查現有憑證&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssl_is_valid()&lt;/code&gt; 讀取本機 PEM 比對到期日&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openssl&lt;/code&gt; 日期解析失敗&lt;/td&gt;
&lt;td&gt;單位數日期有空格補位&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;&amp;quot;%b %d %H:%M:%S %Y %Z&amp;quot;&lt;/code&gt; 格式（注意 &lt;code&gt;%d&lt;/code&gt; 會處理空格）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nginx reload 失敗導致後續 SSL 申請卡住&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nginx -t&lt;/code&gt; 測試失敗時沒有終止&lt;/td&gt;
&lt;td&gt;reload 失敗時直接 &lt;code&gt;sys.exit(1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="使用方式"&gt;使用方式&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 預覽（不實際執行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo python3 scan_websites-domain.py --email you@example.com --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 正式執行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo python3 scan_websites-domain.py --email you@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 強制重新產生 nginx 設定（已存在的也覆蓋）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo python3 scan_websites-domain.py --email you@example.com --force
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只設定 nginx，不申請 SSL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo python3 scan_websites-domain.py --email you@example.com --skip-ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;執行完成後腳本會自動 reload nginx，不需要手動重啟服務。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="小結"&gt;小結&lt;/h2&gt;
&lt;p&gt;這支腳本把「掃描 → 設定 nginx → 啟用 → 申請 SSL」整個流程自動化，並且加入了冪等性設計（跑多次結果相同，不會重複申請憑證、不會覆蓋已有設定）。之後新增網域只需要在 &lt;code&gt;/var/www/websites/&lt;/code&gt; 建好目錄，再跑一次腳本就完成了。&lt;/p&gt;</description></item><item><title>深度分析：為什麼你不需要那麼多訂閱服務</title><link>https://blog.stanwu.org/posts/member-example/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.stanwu.org/posts/member-example/</guid><description>從訂閱疲勞到數位極簡——拆解為什麼我們不知不覺中被綁定了太多服務，以及如何用減法重新掌握主導權。</description></item><item><title>MCP 寫入 Cloudflare WAF 觸發詞避開</title><link>https://blog.stanwu.org/posts/mcp-cloudflare-waf/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.stanwu.org/posts/mcp-cloudflare-waf/</guid><description>&lt;h2 id="問題"&gt;問題&lt;/h2&gt;
&lt;p&gt;透過 Claude Code CLI 使用雲端 MCP（Box、ClickUp、Notion、Confluence）寫入內容時，Cloudflare WAF 會將特定字串當作攻擊特徵，直接封鎖整個 POST 請求（回傳 Cloudflare 403 頁面）。&lt;/p&gt;
&lt;p&gt;讀取操作（GET）不受影響，只有寫入操作（POST with body）會被攔截。&lt;/p&gt;
&lt;h2 id="觸發字串與-waf-分類"&gt;觸發字串與 WAF 分類&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;原始字串&lt;/th&gt;
&lt;th&gt;WAF 判定類別&lt;/th&gt;
&lt;th&gt;替代寫法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/hosts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;路徑穿越 (Path Traversal)&lt;/td&gt;
&lt;td&gt;「系統 hosts 檔案」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP 位址注入&lt;/td&gt;
&lt;td&gt;省略或用「loopback 位址」描述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sudo bash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指令注入 (Command Injection)&lt;/td&gt;
&lt;td&gt;「以管理員權限執行腳本」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaults write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;系統指令注入&lt;/td&gt;
&lt;td&gt;「SoftwareUpdate 偏好設定」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/db/diagnostics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;路徑穿越&lt;/td&gt;
&lt;td&gt;「系統診斷目錄」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/Library/LaunchDaemons/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;路徑穿越&lt;/td&gt;
&lt;td&gt;「系統級 Launch Daemon」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="影響範圍"&gt;影響範圍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;受影響&lt;/strong&gt;：Claude Code CLI → anthropic.com MCP proxy → 各平台 API（所有 &lt;code&gt;mcp__claude_ai_*&lt;/code&gt; 工具的寫入操作）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不受影響&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;本地 MCP（如 Obsidian stdio 直連）— 不經過 Cloudflare&lt;/li&gt;
&lt;li&gt;Claude.ai web 版 — 走不同的請求路徑&lt;/li&gt;
&lt;li&gt;雲端 MCP 的讀取操作（GET 請求）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="實際案例"&gt;實際案例&lt;/h2&gt;
&lt;p&gt;2026-03-25 存 KB 筆記「macOS 15.7.5 封鎖 Tahoe 升級方案」時：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;五平台並行寫入，Obsidian 成功，其餘四個全部被 Cloudflare 封鎖&lt;/li&gt;
&lt;li&gt;重試多次、重新認證 MCP server 均無效&lt;/li&gt;
&lt;li&gt;排查後發現內容中包含 &lt;code&gt;/etc/hosts&lt;/code&gt;、&lt;code&gt;0.0.0.0&lt;/code&gt;、&lt;code&gt;sudo bash&lt;/code&gt;、&lt;code&gt;defaults write&lt;/code&gt; 等字串&lt;/li&gt;
&lt;li&gt;將敏感字串替換為描述性文字後，四個平台全部寫入成功&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="處理原則"&gt;處理原則&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Obsidian&lt;/strong&gt;（本地 stdio）：保留完整原始內容，不需替換&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雲端平台&lt;/strong&gt;（Box、ClickUp、Notion、Confluence）：將觸發字串替換為描述性文字&lt;/li&gt;
&lt;li&gt;技術細節盡量用自然語言描述，避免直接貼命令列語法&lt;/li&gt;
&lt;li&gt;如果不確定是否會觸發，先寫 Obsidian，再用替代版寫雲端平台&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>如何提升生活品質</title><link>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E6%8F%90%E5%8D%87%E7%94%9F%E6%B4%BB%E5%93%81%E8%B3%AA/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E6%8F%90%E5%8D%87%E7%94%9F%E6%B4%BB%E5%93%81%E8%B3%AA/</guid><description>&lt;blockquote&gt;
&lt;p&gt;提升生活品質需要從多方面入手。首先，保持身心健康是基礎，通過適度運動和合理飲食來增強體質和釋放壓力。其次，培養興趣愛好如閱讀、繪畫、音樂等能豐富生活，使之多彩有趣。此外，經營人際關係，與家人朋友分享生活，建立深厚的情感連結也很重要。持續學習和成長，增加應對挑戰的能力，讓自己更自信充實。最後，管理好時間，找到工作與生活的平衡點，提高效率，保留足夠的休息和娛樂時間。通過這些方法，生活品質將得到顯著提升。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/uploads/unsplash/minimalist-living.jpg" alt="minimalist living"&gt;&lt;/p&gt;
&lt;p&gt;提升生活品質的方法有很多，不需要用條列式的方式來呈現，這樣可以讓文章更流暢，也更容易讓讀者產生共鳴。讓我們從一些生活中的細節來探討如何提升生活品質。&lt;/p&gt;
&lt;p&gt;首先，保持身心健康是提升生活品質的基石。每天的生活中，花點時間進行適度的運動，這不僅能增強體質，還能釋放壓力。無論是晨跑、瑜伽還是簡單的散步，都能讓你感受到身體的變化，帶來愉悅的心情。同時，合理的飲食習慣也是必不可少的，選擇新鮮的食材，自己動手烹飪，不僅能享受到美食，還能體驗到做飯的樂趣。&lt;/p&gt;
&lt;p&gt;其次，培養興趣愛好能讓生活變得更加豐富多彩。每個人都有自己喜歡的事物，無論是閱讀、繪畫、音樂還是旅行，找到自己熱愛的事情並投入其中，能讓你在繁忙的工作之餘找到心靈的慰藉。當你全心全意地投入到一件事情中時，那種專注和滿足感會讓你感受到生活的美好。&lt;/p&gt;
&lt;p&gt;此外，人際關係的經營也是提升生活品質的重要方面。花時間和家人、朋友相處，分享彼此的生活點滴，這些都是生活中最珍貴的時刻。與人溝通時，學會傾聽，理解對方的感受，這樣才能建立更深厚的情感連結。偶爾邀請朋友來家裡聚餐，或者一起參加社交活動，都能讓你感受到溫暖和支持。&lt;/p&gt;
&lt;p&gt;再者，保持學習和成長的心態也能提升生活品質。無論是學習新技能、參加培訓課程，還是閱讀書籍，這些都能豐富你的知識和視野。當你持續學習時，會發現自己有更多的能力去應對生活中的挑戰，這會讓你感到更加自信和充實。&lt;/p&gt;
&lt;p&gt;最後，管理好自己的時間，找到工作與生活的平衡點。現代社會節奏快，壓力大，學會有效的時間管理，合理安排工作和休息時間，是提升生活品質的關鍵。利用一些工具和方法，例如制定每日計劃、設置優先級，能幫助你更高效地完成任務，同時保留足夠的時間來享受生活。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定期運動以促進身體健康&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;營造舒適的居住環境&lt;/strong&gt; ，例如裝修房間，購買舒適的家具&lt;/li&gt;
&lt;li&gt;學習烹飪，享受&lt;strong&gt;自製美食&lt;/strong&gt; 的樂趣&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;閱讀&lt;/strong&gt; 優質的書籍，提升自我修養&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;學習新的技能&lt;/strong&gt; 或興趣，如畫畫，學習新的語言等&lt;/li&gt;
&lt;li&gt;保持積極正面的心態，&lt;strong&gt;適時的放鬆&lt;/strong&gt; 和休息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期旅行&lt;/strong&gt; ，體驗不同的文化和生活方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;享受藝術&lt;/strong&gt; ，如購買音樂會門票，參觀藝術展覽等&lt;/li&gt;
&lt;li&gt;建立良好的人際關係，擴大社交圈子&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尋找工作與生活的平衡&lt;/strong&gt; ，避免過度疲勞&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Simplify, Simplify | A Philosophy of Needing Less</title><link>https://blog.stanwu.org/posts/simplify-simplify-a-philosophy-of-needing-less/</link><pubDate>Sun, 25 Jun 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/simplify-simplify-a-philosophy-of-needing-less/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vPBlDD_8WNE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;請開啟英文字幕並點選自動翻譯中文字幕&lt;/strong&gt; 這部影片的主題是關於簡單生活的哲學，主張簡單的生活比奢華的生活更有意義，消費更少可以節省金錢、能源和時間。影片批評了社會對人們的洗腦，鼓勵他們購買不需要的東西，並為了讓富裕的少數人更富有而陷入債務。 影片引用了哲學家&lt;strong&gt;亨利·大衛·梭羅&lt;/strong&gt; 的觀點，他通過在森林中自建小屋生活了兩年，追求簡單而自給自足的生活。梭羅選擇在自然中過簡單的生活，是對他認為帶來更多害處的政府的公民抗議。他在獨處中寫下了他的傑作《&lt;strong&gt;瓦爾登湖&lt;/strong&gt; 》，描述了簡單生活的快樂，並批評了過度消費。梭羅認為，一個人的富有程度與他能夠放下的東西的數量成正比。 人們很容易受到潮流和時尚的影響，導致他們在不喜歡的工作中加班，購買超過他們需要的東西。公司一次又一次地成功地說服人們購買不必要的東西。影片主張，人們在追求物質擁有和社會認可的過程中，浪費了他們最寶貴的資產——時間。 作者引用了&lt;strong&gt;斯多葛派哲學家塞內卡和《鬥陣俱樂部》的泰勒·德登的話&lt;/strong&gt; ，強調物質擁有最終會擁有我們，並帶來更多的害處。問題在於，我們因為恐懼而讓自己被外界力量操控。影片認為，我們可以在不需要地位、尊重或讚美的情況下達到滿足。 影片討論了現代社會中的&amp;quot;地位焦慮&amp;quot;現象，這是一種對被認為在物質上不成功的恐懼。解決的方法是少關心別人的看法，專注於簡單的生活。&lt;strong&gt;這並不意味著要放棄所有的物質擁有，而是要在必需品、實用品和奢侈品之間做出區分&lt;/strong&gt; 。滿足於少，是一種讓我們從社會的束縛中解脫出來，過上更不複雜、壓力更小的生活的公民抗議形式。 影片鼓勵人們享受他們的時間，專注於重要的事情，而不是陷入不必要的細節中。影片引用了梭羅的建議，簡化生活。&lt;/p&gt;</description></item><item><title>如何讓自己內心隨時保持平靜</title><link>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E8%AE%93%E8%87%AA%E5%B7%B1%E5%85%A7%E5%BF%83%E9%9A%A8%E6%99%82%E4%BF%9D%E6%8C%81%E5%B9%B3%E9%9D%9C/</link><pubDate>Sat, 24 Jun 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E8%AE%93%E8%87%AA%E5%B7%B1%E5%85%A7%E5%BF%83%E9%9A%A8%E6%99%82%E4%BF%9D%E6%8C%81%E5%B9%B3%E9%9D%9C/</guid><description>&lt;p&gt;保持內心平靜是一種能力，需要時間和實踐才能熟練。這裡有一些建議，可以幫助你在日常生活中找到平靜：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;呼吸練習：深度呼吸是一種簡單且有效的緩解壓力的技巧。當你感到緊張或焦慮時，可以嘗試深呼吸，讓身心回歸平靜。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正念練習：正念意味著全心全意地活在當下，專注於目前正在做的事情，而不是去擔心未來或回顧過去。這可能需要一些練習，但是一旦習慣了，就會發現它對於維護內心平靜非常有幫助。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;運動：運動可以幫助我們釋放體內的壓力，並且讓我們的身體和心靈得到放鬆。這不一定要是劇烈的運動，如慢跑、瑜伽或者只是簡單的散步，都能產生效果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自我照顧：確保你的基本需求得到滿足，包括有足夠的睡眠，營養均衡的飲食，以及足夠的休息和放鬆時間。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立支持網絡：與他人建立關係，並保持與他們的聯繫，可以提供情感支持，並幫助你在面對壓力時保持平靜。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;創作：藝術和創作可以是一種療癒的方式，無論是繪畫、寫作、編織、做手工，還是其他的創作形式，都可以讓你專注於當下，並將情感轉化為有形的作品。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;花時間在大自然中：研究發現，在大自然中花時間可以降低壓力水平，提高心情，並提高專注力。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上的方法都需要持續的練習和實踐才能得到效果，並且可能需要一些時間才能看到改變。希望這些建議對你有所幫助，讓你能在日常生活中找到平靜。&lt;/p&gt;
&lt;h3 id="有關正念的詳細介紹"&gt;&lt;strong&gt;有關正念的詳細介紹&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;正念（Mindfulness）是一種來自於佛教傳統的精神修習方法，現代心理學中也大量引用並進行了科學化的研究和應用。正念的核心觀念是專注於當下，而不是沉溺於過去的回憶或對未來的憂慮。&lt;/p&gt;
&lt;p&gt;在正念練習中，我們嘗試保持對當下經驗的全然覺察，這包括對我們的思想、情緒、身體感覺以及環境的覺察。而這種覺察是不加評價的，也就是說，我們只是接受和注意到這些經驗的存在，而不是去評價它們是否好或壞。&lt;/p&gt;
&lt;h3 id="以下是一些實踐正念的基本步驟"&gt;以下是一些實踐正念的基本步驟&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;找一個安靜的地方：選擇一個不會被打擾的地方，讓你可以專注於你的正念練習。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;採取舒適的姿勢：你可以選擇坐著、躺著或站著，只要這個姿勢讓你感到舒適並能保持清醒。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;專注於你的呼吸：感覺你的呼吸如何進出你的身體。注意到每一次的吸氣和呼氣，不需要改變你的呼吸，只需要注意到它。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注意你的思想和感覺：當你的注意力被思想或感覺帶走時，只需要認識到這一點，然後將你的注意力輕輕地帶回到你的呼吸上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接受每一刻：無論你的思想、感覺或經驗是什麼，都接受它，不評價、不抵抗、不期待。只是單純地注意到它們的存在。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這就是正念的基本概念和實踐方式。值得注意的是，正念需要通過長期的練習才能熟練，並且可能需要在導師的指導下進行。然而，即使是短期的正念練習，也被發現可以降低壓力、改善專注力和提高生活滿意度。&lt;/p&gt;
&lt;h3 id="正念是一種輕輕地將你的意識集中在當下的過程"&gt;正念是一種輕輕地將你的意識集中在當下的過程&lt;/h3&gt;
&lt;p&gt;通常涉及專注於感覺，讓你在這裡和現在的身體中扎根。&lt;/p&gt;
&lt;p&gt;它可以在正式的冥想中實踐，也可以在日常活動中，例如烹飪、清潔或散步中實踐。&lt;/p&gt;
&lt;p&gt;實踐正念是一種溫和地重新訓練心靈進入當下的方法。&lt;/p&gt;
&lt;p&gt;最終，心靈可能會完全消解，意味著你和你正在體驗的事物之間沒有知識或概念的覆蓋。&lt;/p&gt;
&lt;p&gt;反之，你將完全沉浸在當下，並與當下合為一體。&lt;/p&gt;
&lt;p&gt;這種經驗被稱為真實的存在。&lt;/p&gt;
&lt;h3 id="正念的好處已在研究中得到了充分的證明"&gt;正念的好處已在研究中得到了充分的證明&lt;/h3&gt;
&lt;p&gt;正念可以提高認知能力，減慢大腦衰老，減輕壓力、焦慮和抑鬱症狀，增加幸福感，幫助疼痛管理，並改善患有慢性病的人的生活質量。&lt;/p&gt;
&lt;h3 id="以下是一些實踐正念的具體方法"&gt;以下是一些實踐正念的具體方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4 id="專注於呼吸"&gt;專注於呼吸&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;無論你在做什麼，你都可以嘗試將你的注意力集中在你的呼吸上。&lt;/p&gt;
&lt;p&gt;例如，感覺腹部和胸部的升降，感覺呼吸如何進出你的鼻孔。&lt;/p&gt;
&lt;p&gt;注意到它在吸氣時是冷的，在呼氣時是熱的。&lt;/p&gt;
&lt;p&gt;當你注意到你的心神已經飄忽或你被周圍的事物分散注意力時，只需將注意力帶回呼吸，而不評價自己或“評價”你的表現。&lt;/p&gt;
&lt;p&gt;沒有其他目標，只有與呼吸相處。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;h4 id="其他實踐正念的方式"&gt;其他實踐正念的方式&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正念是一個非常廣泛的類別，實踐的方式幾乎無窮無盡。&lt;/p&gt;
&lt;p&gt;你可以嘗試特定的技巧，看看什麼對你有效，例如：正念吃飯、正念行走、正念通勤、正念塗色或塗鴉。&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;h4 id="正念冥想"&gt;正念冥想：&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正念不必包括正式的冥想，但如果你被它吸引，或者想要學習如何坐著感受你正在體驗的一切而不分心，那麼冥想就是一個很好的工具。&lt;/p&gt;
&lt;p&gt;有多種方法可以將正念與坐姿冥想以及無數其他類型的冥想結合起來。&lt;/p&gt;
&lt;p&gt;最重要的是找到一種適合你和你的生活方式的技術，這樣你可以保持一致性。&lt;/p&gt;
&lt;p&gt;畢竟，當冥想變成一種習慣時，它最有效。&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;
&lt;h4 id="正念療法"&gt;正念療法&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你正在尋找包含正念的療法，你就有運氣了。&lt;/p&gt;
&lt;p&gt;現在有很多選擇。&lt;/p&gt;
&lt;p&gt;只是幾種包含正念的療法風格包括：整體療法、認知行為療法、辯證行為療法、體驗療法和生態療法等。&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;
&lt;h4 id="正念對焦慮的幫助"&gt;正念對焦慮的幫助&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;除了實踐正式的正念和冥想技巧，你還可以嘗試一些正念活動，這些活動可以幫助你體驗這裡和現在，並緩解焦慮症狀。&lt;/p&gt;
&lt;p&gt;這些包括：寫日記、塗鴉、將注意力集中在呼吸或身體感覺上、全天候的休息、從社交媒體上休息、在大自然中散步等。&lt;/p&gt;</description></item><item><title>斷捨離與生產力的關係</title><link>https://blog.stanwu.org/posts/%E6%96%B7%E6%8D%A8%E9%9B%A2%E8%88%87%E7%94%9F%E7%94%A2%E5%8A%9B%E7%9A%84%E9%97%9C%E4%BF%82/</link><pubDate>Tue, 20 Jun 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E6%96%B7%E6%8D%A8%E9%9B%A2%E8%88%87%E7%94%9F%E7%94%A2%E5%8A%9B%E7%9A%84%E9%97%9C%E4%BF%82/</guid><description>&lt;p&gt;斷捨離是指過去由於生活中積聚了太多無用或不必要的物品，導致環境雜亂、思緒混亂、時間被分散等問題，因此需要將這些不必要的物品進行整理和處理，讓自己擁有一個更簡潔、清爽的生活空間。斷捨離通常包括對衣物、書籍、家具和文件等物品進行篩選、捨棄或捐贈。&lt;/p&gt;
&lt;h3 id="斷捨離對提升生產力的好處"&gt;斷捨離對提升生產力的好處&lt;/h3&gt;
&lt;p&gt;生產力指的是一個人在單位時間內所能完成的工作量或成果。斷捨離與生產力之間存在著密切的關係，以下是一些與斷捨離與生產力相關的關聯點：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;專注力提升：&lt;/strong&gt; 斷捨離可以消除環境中的雜亂和干擾，讓人能夠更專注於目標和任務。當工作空間整潔有序時，可以減少分散注意力的因素，進而提升生產力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;減少決策負擔：&lt;/strong&gt; 斷捨離過程中需要對物品進行篩選和決策，這有助於培養決策能力。同時，斷捨離也能減少日常生活中的選擇，減少決策負擔，提高效率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效率提升：&lt;/strong&gt; 斷捨離可以幫助更好地組織和管理物品，使其更容易找到和使用。當環境整潔有序時，不需要花費大量時間尋找物品，這能夠節省時間並提高效率，讓任務更快完成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;減少精神負擔：&lt;/strong&gt; 斷捨離過程中可以釋放舊物品和不必要的情緒負擔。減少物品的負擔和情緒上的包袱，可以讓心情更加輕鬆、平靜，進而提高對工作和生活的積極性和投入度。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;總的來說，斷捨離能夠營造一個整潔、有序、舒適的環境，並幫助更好地管理物品和提高生產力。&lt;/p&gt;
&lt;h3 id="實際應用案例"&gt;實際應用案例&lt;/h3&gt;
&lt;p&gt;當斷捨離與生產力相結合時，可以有以下的實際案例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;辦公環境的整理：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;清理桌面上的雜物；將文件歸檔整理；只保留必要的工作工具和文件。&lt;/p&gt;
&lt;p&gt;這樣可以減少混亂和分散注意力的因素，讓更專注於工作任務，提高生產力。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;數位資源的整理：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;清理電腦桌面上的不必要檔案和捷徑；整理郵件和文件資料夾；刪除不再需要的應用程式或網路書籤。&lt;/p&gt;
&lt;p&gt;這樣可以加快尋找和使用數位資源的速度，減少時間浪費，提升生產力。&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;衣物和配飾的整理：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;挑選出不再穿著的衣物、過時的配飾或者不喜歡的款式；捐贈或者賣掉它們。&lt;/p&gt;
&lt;p&gt;透過這樣的整理，可以讓衣櫃變得整潔，同時也減少了每天選擇穿著的困擾，節省了時間和精力，提升生產力。&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;減少社交媒體和數位訊息的干擾：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;減少追蹤的社交媒體帳號數量；關閉不必要的通知；將手機或電腦設定為勿擾模式。&lt;/p&gt;
&lt;p&gt;這樣可以減少這些數位干擾對工作和專注力的影響，提高生產力。&lt;/p&gt;
&lt;p&gt;這些案例只是斷捨離與生產力關係的一部分，實際應用時可以根據個人需求和環境進行調整。重點在於通過斷捨離，創造一個更簡潔、有序、無干擾的環境。&lt;/p&gt;
&lt;h3 id="生活品質與工作提升的影響"&gt;生活品質與工作提升的影響&lt;/h3&gt;
&lt;p&gt;斷捨離對生活品質和工作提升的影響是多方面的，以下是一些詳細說明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;減輕心理負擔：過多的物品和雜亂的環境會給人帶來心理負擔和壓力。透過斷捨離，你可以擺脫物品的束縛，減少環境的混亂和杂乱无章，讓你感到心情更加輕鬆和平靜。這種心理負擔的減輕有助於提升生活品質和工作效能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提高專注力和注意力：斷捨離能夠營造整潔、清爽的環境，減少外在的干擾和雜亂，讓你更容易集中注意力。當你的工作空間整理有序時，你可以更專注於工作任務，提高專注力和工作效率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;節省時間和能量：斷捨離可以讓你更有效地使用時間和能量。整理和精簡物品，減少冗雜和不必要的東西，使你不需要花費大量時間尋找物品或處理雜亂。同時，減少物品和資源的浪費，使你能夠更有效地規劃和利用時間，增加生產力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;增加自律和自信：斷捨離是一個需要做出決策和行動的過程。透過這個過程，你可以培養自律能力，學會選擇和保留真正重要的事物。隨著斷捨離的進行，你將感到更有掌控力和自信，這對於提升生活品質和工作效能至關重要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;創造舒適和美感：整潔有序的環境和精心挑選的物品能夠營造出舒適和美感。這種環境可以提升你的情緒和幸福感，使你在家庭和工作空間中感到更加愉悅和舒適。舒適的環境有助於提高生活品質和創造力，同時也提供了一個更具有活力和有吸引力的工作環境。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="結論"&gt;結論&lt;/h3&gt;
&lt;p&gt;總的來說，斷捨離可以在物質和心理層面上對生活品質和工作提升產生積極影響。透過整理和精簡物品，你能夠減輕負擔、提高專注力、節省時間和能量，培養自律和自信，並創造出舒適和美感的環境，從而提升整體的生活品質和工作效能。&lt;/p&gt;</description></item><item><title>斷捨離流程</title><link>https://blog.stanwu.org/posts/%E6%96%B7%E6%8D%A8%E9%9B%A2%E6%B5%81%E7%A8%8B/</link><pubDate>Mon, 19 Jun 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E6%96%B7%E6%8D%A8%E9%9B%A2%E6%B5%81%E7%A8%8B/</guid><description>&lt;p&gt;&lt;strong&gt;這是一篇 SOP 清單文章，請將下面列印出來，或者是複製到您的待辦清單 App 直接使用&lt;/strong&gt; 斷捨離過程可以被分為三個主要階段：準備、選擇和處理。以下是一個可以幫助降低丟東西決策壓力的流程，並分解成詳細的單一行動：&lt;/p&gt;
&lt;h3 id="準備階段"&gt;準備階段&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;分配一個明確的時間段，以便你可以集中精力進行斷捨離。&lt;/li&gt;
&lt;li&gt;準備好垃圾袋和收納盒等物品，以便將物品分類和存放。&lt;/li&gt;
&lt;li&gt;準備一個清單或確切的目標，讓你知道你想要達成什麼。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="選擇階段"&gt;選擇階段&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;將所有物品拿出來，一個接一個地檢查。&lt;/li&gt;
&lt;li&gt;將每個物品歸為三類：保留、捐贈或丟棄。&lt;/li&gt;
&lt;li&gt;對於那些你不確定要保留還是丟棄的物品，考慮以下問題：&lt;/li&gt;
&lt;li&gt;你最近是否使用過這個物品？&lt;/li&gt;
&lt;li&gt;這個物品是否有情感價值？&lt;/li&gt;
&lt;li&gt;你是否可以輕鬆地取得這個物品？&lt;/li&gt;
&lt;li&gt;這個物品是否仍然有用？&lt;/li&gt;
&lt;li&gt;將物品放入相應的垃圾袋、收納盒或捐贈箱中。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="處理階段"&gt;處理階段&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;將丟棄的物品放進垃圾桶。&lt;/li&gt;
&lt;li&gt;將捐贈的物品放入捐贈箱中。&lt;/li&gt;
&lt;li&gt;將保留的物品整理好，並放回原來的位置。&lt;/li&gt;
&lt;li&gt;想一想你下一步要怎麼處理捐贈箱中的物品，你可以將它們直接送到捐贈機構或者進一步整理後再捐贈出去。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;收納的最高原則是：先丟再納&lt;/strong&gt; 這個斷捨離流程可以幫助你更輕鬆地做出決策，因為它分為不同的階段和單一行動，可以讓你逐一處理每個物品，減少混亂和焦慮的情況。另外，對於那些你不確定要保留還是丟棄的物品，考慮特定的問題可以幫助你更清晰地思考，最終做出明智的決策。&lt;/p&gt;</description></item><item><title>生產力：解決問題的方法與過程</title><link>https://blog.stanwu.org/posts/%E7%94%9F%E7%94%A2%E5%8A%9B%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C%E7%9A%84%E6%96%B9%E6%B3%95%E8%88%87%E9%81%8E%E7%A8%8B/</link><pubDate>Sun, 18 Jun 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%94%9F%E7%94%A2%E5%8A%9B%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C%E7%9A%84%E6%96%B9%E6%B3%95%E8%88%87%E9%81%8E%E7%A8%8B/</guid><description>&lt;blockquote&gt;
&lt;p&gt;生產力是指在有效利用資源的情況下，完成任務或達成目標的能力。解決問題是提高生產力的關鍵因素之一，以下是解決問題的一般方法和過程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;生產力是指在有效利用資源的情況下，完成任務或達成目標的能力。解決問題是提高生產力的關鍵因素之一，以下是解決問題的一般方法和過程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;確定問題&lt;/strong&gt; ：首先，要明確確定問題的本質和範圍。這需要仔細分析問題，確定具體的挑戰和目標。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收集資訊&lt;/strong&gt; ：了解問題的相關背景和相關資訊。這可能包括收集數據、研究相關文獻或諮詢相關專家。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;制定解決方案&lt;/strong&gt; ：基於收集到的資訊，開始制定解決問題的方案。這可能需要創造性思維和創新的想法。可以嘗試不同的方法和策略，並評估其可行性和效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;實施解決方案&lt;/strong&gt; ：選擇最有潛力的解決方案並開始實施。這可能需要協調不同的資源和團隊成員。確保有效的溝通和順利執行計劃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;監測和評估&lt;/strong&gt; ：在實施解決方案的過程中，持續監測和評估進展。這有助於確定是否正在朝著期望的目標邁進，並在需要時進行調整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;學習和改進&lt;/strong&gt; ：根據實施的結果和反饋，進行學習並不斷改進。這包括瞭解成功的因素和改進的機會，以進一步提高生產力。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此外，以下是一些增加生產力的其他常見方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;優化時間管理：合理安排時間，設定優先順序，避免浪費時間和精力。&lt;/li&gt;
&lt;li&gt;自我組織和規劃：確定目標，制定計劃，分配任務，並保持組織和效率。&lt;/li&gt;
&lt;li&gt;自我激勵和專注：找到激勵和專注的方法，以保持高度專注和工作動力。&lt;/li&gt;
&lt;li&gt;學習和技能發展：不斷學習和提升技能，以增加工作效率和能力。&lt;/li&gt;
&lt;li&gt;使用適當的工具和技術：採用適當的工具、技術和軟體，以提高工作效率和準確性。&lt;/li&gt;
&lt;li&gt;團隊合作和溝通：與團隊成員合作，有效溝通，分享資訊和協調工作。&lt;/li&gt;
&lt;li&gt;預防和解決問題：著重預防問題的發生，並迅速解決已經出現的問題，以減少生產力的影響。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些方法和過程可以幫助提高生產力，讓工作更高效、有效地完成。然而，每個人和每個情境都可能有不同的因素和策略，因此重要的是根據實際情況找到最適合的方法。&lt;/p&gt;
&lt;p&gt;以下是一些進一步提高生產力的方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自我管理&lt;/strong&gt; ：建立良好的自我管理習慣，包括定期檢視和調整目標，制定計劃，保持自律和堅持力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批判性思維&lt;/strong&gt; ：培養批判性思維能力，學會分析和評估問題，從多個角度思考，找到最佳解決方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動化和自動化工具&lt;/strong&gt; ：利用技術和工具來自動化重複性任務和流程，節省時間和精力。例如，使用自動化軟體、應用程式或機器人流程自動化（RPA）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康和平衡&lt;/strong&gt; ：注意身心健康，確保適當的休息和放鬆，達到工作和生活的平衡。保持健康的生活方式，包括良好的睡眠、飲食和運動習慣。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;委派和委託&lt;/strong&gt; ：學會委派任務給適當的人，並相信他們的能力。合理地分配工作負荷，並利用外部資源和專業知識，以提高效率和成果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持續學習&lt;/strong&gt; ：不斷學習新知識和技能，跟上行業趨勢和技術發展。參加培訓課程、研討會或線上學習，以不斷提升自己的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;減少干擾和集中注意力&lt;/strong&gt; ：創造一個無干擾的工作環境，將注意力集中在重要任務上。關閉社交媒體通知、限制電子郵件檢查的頻率，避免不必要的打擾。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;設定有效的目標&lt;/strong&gt; ：確定明確、具體且可衡量的目標，並制定相應的行動計劃。優先處理重要且緊急的任務，並利用時間管理技巧來實現目標。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持續改進&lt;/strong&gt; ：定期回顧工作流程和方法，尋找改進的機會。鼓勵反思和反饋，並嘗試新的方法和工具，以提高效率和效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;培養積極心態&lt;/strong&gt; ：培養積極的心態和心理韌性，面對挑戰和困難時能保持冷靜和解決問題的能力。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這些方法和策略可以協助提高個人和組織的生產力，但要注意，適用的方法可能因個人和工作環境而異。因此，重要的是根據自己的需求和情況，選擇最適合的方法並進行調整。&lt;/p&gt;</description></item><item><title>如何申請免費電子書帳號並安裝App</title><link>https://blog.stanwu.org/posts/%E7%94%B3%E8%AB%8B%E9%9B%BB%E5%AD%90%E6%9B%B8%E5%B8%B3%E8%99%9F%E4%B8%A6%E5%AE%89%E8%A3%9Dapp/</link><pubDate>Sat, 07 Jan 2023 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%94%B3%E8%AB%8B%E9%9B%BB%E5%AD%90%E6%9B%B8%E5%B8%B3%E8%99%9F%E4%B8%A6%E5%AE%89%E8%A3%9Dapp/</guid><description>&lt;p&gt;&lt;strong&gt;其實蒙格 (Charlie Munger) 與巴菲特 (Warren Buffett) 他們都喜歡閱讀&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;知識的擴充：&lt;/strong&gt; 閱讀是獲取知識和學習的主要途徑之一。蒙格和巴菲特明白，在不斷變化的商業和投資環境中，&lt;strong&gt;持續學習和更新知識是取得成功的關鍵。&lt;/strong&gt; 閱讀讓他們能夠瞭解不同領域的觀點和專業知識，這些知識可以幫助他們做出更好的商業和投資決策。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;深入理解：&lt;/strong&gt; 蒙格和巴菲特都非常重視對問題的深入理解。閱讀能夠讓他們深入研究各種主題，&lt;strong&gt;理解問題的本質和複雜性。&lt;/strong&gt; 他們相信，只有通過深入理解，才能夠作出明智的決策並抓住機會。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;經驗的分享：&lt;/strong&gt; 許多書籍是成功人士分享經驗和智慧的寶貴資源。蒙格和巴菲特喜歡閱讀這些書籍，以從其他成功者的經驗中學習。**這些書籍可能是傳記、商業策略、投資理論等，都能夠提供寶貴的觀點和啟發。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;培養思考能力：&lt;/strong&gt; 閱讀不僅僅是為了獲取知識，也是為了培養思考能力。通過閱讀不同類型的書籍，蒙格和巴菲特能夠&lt;strong&gt;拓寬他們的思維框架，培養批判性思維和問題解決能力。&lt;/strong&gt; 這有助於他們在商業和投資決策中更好地分析和評估情況。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;閱讀習慣是一種持續學習、獲取知識、深入理解和培養思考能力的重要方式。這些因素有助於現在與未來在商業和投資決策中更好地把握機會，而公共支援提供了巨量的書籍供我們閱讀，這個是最佳人生的投資方式之一，讓我們開始吧 ⬇️。&lt;/p&gt;
&lt;h3 id="步驟-1-電子書免費申請帳號"&gt;步驟 1. 電子書免費申請帳號&lt;/h3&gt;
&lt;p&gt;可以同時申請以下多家圖書館帳號，增加更多的借書額度&lt;/p&gt;
&lt;p&gt;臺北市立圖書館&lt;/p&gt;
&lt;p&gt;&lt;a href="https://book.tpml.edu.tw/register"&gt;https://book.tpml.edu.tw/register&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新北市立圖書館&lt;/p&gt;
&lt;p&gt;&lt;a href="https://webpac.tphcc.gov.tw/webpac/web_register.cfm"&gt;https://webpac.tphcc.gov.tw/webpac/web_register.cfm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;國立台灣圖書館&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cis.ntl.edu.tw/F?func=file&amp;amp;file_name=net-bor-new"&gt;http://cis.ntl.edu.tw/F?func=file&amp;amp;file_name=net-bor-new&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;國立公共資訊圖書館&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ebook.nlpi.edu.tw/register"&gt;https://ebook.nlpi.edu.tw/register&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;台灣雲端書庫&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.ebookservice.tw/#membership/intro"&gt;https://www.ebookservice.tw/#membership/intro&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="步驟-2-免費下載-hyread-電子書-app"&gt;步驟 2. 免費下載 HyRead 電子書 App&lt;/h3&gt;
&lt;p&gt;iPhone / iPad / iOS&lt;/p&gt;
&lt;p&gt;&lt;a href="https://apps.apple.com/tw/app/hyread-%E9%9B%BB%E5%AD%90%E6%9B%B8/id1098612822"&gt;https://apps.apple.com/tw/app/hyread-電子書/id1098612822&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Android&lt;/p&gt;
&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.hyread.reader.v3&amp;amp;hl=zh_TW&amp;amp;gl=US"&gt;https://play.google.com/store/apps/details?id=com.hyread.reader.v3&amp;amp;hl=zh_TW&amp;amp;gl=US&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="步驟-3-免費開始借書"&gt;步驟 3. 免費開始借書&lt;/h3&gt;</description></item><item><title>My Zsh Configure Notes</title><link>https://blog.stanwu.org/posts/zsh-config-notes/</link><pubDate>Mon, 10 Aug 2020 23:08:57 +0800</pubDate><guid>https://blog.stanwu.org/posts/zsh-config-notes/</guid><description>&lt;p&gt;配置 Zsh&lt;/p&gt;</description></item><item><title>神奇的 macOS 自動批次修改檔名</title><link>https://blog.stanwu.org/posts/%E7%A5%9E%E5%A5%87%E7%9A%84-macos-%E8%87%AA%E5%8B%95%E6%89%B9%E6%AC%A1%E4%BF%AE%E6%94%B9%E6%AA%94%E5%90%8D/</link><pubDate>Thu, 02 Jul 2020 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%A5%9E%E5%A5%87%E7%9A%84-macos-%E8%87%AA%E5%8B%95%E6%89%B9%E6%AC%A1%E4%BF%AE%E6%94%B9%E6%AA%94%E5%90%8D/</guid><description>&lt;blockquote&gt;
&lt;p&gt;[estimated_reading_time]因為完成一個開發說明文件之後，會產生一堆的畫面截圖素材需要歸檔到「素材庫」，為了方便整理，需要把目錄名稱加入到檔案名稱的前面，方便日後搜尋，基於懶人原則，先 Google 看看，結果發現還真的有這個功能耶!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因為完成一個開發說明文件之後，會產生一堆的畫面截圖素材需要歸檔到「素材庫」，為了方便整理，需要把目錄名稱加入到檔案名稱的前面，方便日後搜尋，基於懶人原則，先 Google 看看，結果發現還真的有這個功能耶!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真的很簡單又方便，而且不容易出錯喔!!!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;選擇全部檔案，然後選重新命名項目&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2020/07/unnamed-file-2.png" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增加目錄名稱到檔名之前&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2020/07/unnamed-file.png" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這樣就完成了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2020/07/unnamed-file-1.png" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接上傳到印象筆記的素材庫中，提供下次重覆使用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2020/07/unnamed-file-3.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>修復 Windows 10 的地圖無法顯示問題</title><link>https://blog.stanwu.org/posts/%E4%BF%AE%E5%BE%A9-windows-10-%E7%9A%84%E5%9C%B0%E5%9C%96%E7%84%A1%E6%B3%95%E9%A1%AF%E7%A4%BA%E5%95%8F%E9%A1%8C/</link><pubDate>Mon, 11 May 2020 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E4%BF%AE%E5%BE%A9-windows-10-%E7%9A%84%E5%9C%B0%E5%9C%96%E7%84%A1%E6%B3%95%E9%A1%AF%E7%A4%BA%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;Windows 10 有內建一個地圖的應用程式, 雖然功能不多但是身為有系統潔癖的我來說，內建的應用不能正常運作顯示地圖看了就覺得很不爽，檢查結果發現是離線地圖無法正常工作，所以一度懷疑是不是電腦中毒了？還是因為系統更新的關係？&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2020/05/windows-10-%E9%9B%A2%E7%B7%9A%E5%9C%B0%E5%9C%96%E9%8C%AF%E8%AA%A4.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Windows 10 有內建一個地圖的應用程式，雖然功能不多但是身為有系統潔癖的我來說，內建的應用不能正常運作顯示地圖看了就覺得很不爽，檢查結果發現是離線地圖無法正常工作，所以一度懷疑是不是電腦中毒了?還是因為系統更新的關係?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以沒辦法只好硬著頭皮下載防毒軟體來掃毒看看，結果還是一樣，經過 2 小時的 google 之後發現原來離線地圖是由一個系統服務在控制的，很高興的把那個服務跑起來，結果大概 6 秒之後就又自動停了，查看 log 事件紀錄也沒有特別標註出來，就正當要放棄的時候，想說反正都到這個地步了，何不把視窗分成兩邊：一邊是服務控制，另外一邊是離線下載，按下啟動服務的時候，馬上去按下+ 號增加離線地圖，結果居然可以下載了！哈哈哈真爽！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;維修方法是非常的怪異，啟動服務之後就馬上下載離線地圖&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2020/05/%E7%A1%AC%E6%8A%93%E9%9B%A2%E7%B7%9A%E5%9C%B0%E5%9C%96-1024x576.jpg" alt=""&gt;&lt;/p&gt;</description></item><item><title>創業是一場持久的戰爭</title><link>https://blog.stanwu.org/posts/%E5%89%B5%E6%A5%AD%E6%98%AF%E4%B8%80%E5%A0%B4%E6%8C%81%E4%B9%85%E7%9A%84%E6%88%B0%E7%88%AD/</link><pubDate>Sun, 10 May 2020 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%89%B5%E6%A5%AD%E6%98%AF%E4%B8%80%E5%A0%B4%E6%8C%81%E4%B9%85%E7%9A%84%E6%88%B0%E7%88%AD/</guid><description>&lt;p&gt;創業是終生的樂趣，如何讓公司可以永續的經營是一門學問，其中如果是網路公司的話基礎建設其實可以一開始就考慮十年以上的部署，當然不一定是單指電腦硬體，還有其他的硬體設備。 &lt;a href="http://blog.stanwu.org/wp-content/uploads/2020/05/two-men-sitting-facing-on-flat-screen-monitors-2451646-scaled.jpg"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2020/05/two-men-sitting-facing-on-flat-screen-monitors-2451646-1024x422.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;創業是終生的樂趣，如何讓公司可以永續的經營是一門學問，其中如果是網路公司的話基礎建設其實可以一開始就考慮十年以上的部署，當然不一定是單指電腦硬體，還有其他的硬體設備。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基本上辦公室很少可以一開始就自購，除非是創始人自家原本就有辦公室。至於辦公室裝修，原則上只要窗明几淨，通風良好，簡單的粉刷，盡量減少不必要的浪費，如果可以的話有一個小型的中島吧台就太好了，誰說會議桌一定要正襟危坐？辦公室位置建議高樓層絕對是最佳的選項。在辦公設備採購的時候就需要考慮至少三年以上為主，如果辦公桌椅更是可以考慮十年保固的品牌，買二手的也沒關係，日後擴展辦公室的時候，基本上是可以跟著搬家的，冷氣空調也是建議一開始就買好一點的，以上可以在初期建置的成本就全部算進去，畢竟 startup 時候頂多 2-3 人, 所以桌椅購置成本應該還好，接著個人用的電腦設備至少考慮週期要至少三年以上，還有一些週邊設備也都是要至少三年以上，最後對於雲端主機商的選擇也是要找起碼感覺十年內不容易倒 (方法很簡單，直接找已經存活十年的廠商)，主機租用至少也是要三年為一個單位的投資，盡量在初期時候就盡量部署可以撐十年的環境。&lt;/p&gt;</description></item><item><title>Linode + Alpine 3.9 + Docker</title><link>https://blog.stanwu.org/posts/linode-alpine-3-9-docker/</link><pubDate>Mon, 07 Oct 2019 23:08:57 +0800</pubDate><guid>https://blog.stanwu.org/posts/linode-alpine-3-9-docker/</guid><description>&lt;p&gt;&lt;a href="https://www.linode.com/?r=f8919fc90639487d353f141e4bd63739ace68f41"&gt;Linode&lt;/a&gt; 基本上可以很輕易的搭配 Docker，這次採用的是 Alpine 3.9，經過測試基本上使用 Nanode US$5 就可以跑輕量級的 microservice 了。&lt;/p&gt;
&lt;p&gt;在眾多的服務中，&lt;a href="https://www.linode.com/?r=f8919fc90639487d353f141e4bd63739ace68f41"&gt;Linode&lt;/a&gt; 是少數有支援自己的 StackScript 功能，方便您可以快速的部屬所需要的主機，所以您只要將下面的 StackScript 新增然後複製貼上到您自己的 StackScript 中就可以了。&lt;/p&gt;
&lt;h3 id="stackscript"&gt;StackScript&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apk add docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rc-update add docker boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;硬碟用量&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.stanwu.org/screenshots/Linode-Alpine-3.9-Docker/18.25.38.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;查看實際記憶體用量&lt;/p&gt;
&lt;p&gt;清除快取&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://blog.stanwu.org/screenshots/Linode-Alpine-3.9-Docker/18.23.48.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>Acrobat Reader DC macOS版本正確的移除方法</title><link>https://blog.stanwu.org/posts/uninstall-acrobat-reader-dc-from-a-mac/</link><pubDate>Sat, 05 Oct 2019 23:08:57 +0800</pubDate><guid>https://blog.stanwu.org/posts/uninstall-acrobat-reader-dc-from-a-mac/</guid><description>&lt;p&gt;真的無法相信，Adobe Acrobat Reader DC for macOS 的產品只能裝，居然沒有清楚的的移除說明指示!&lt;/p&gt;
&lt;p&gt;花了很多時間 Google 搜尋幾乎都是 Uninstaller 的廣告文章居多，原本要移除 Acrobat Reader DC，結果更慘，可能因此安裝了不該裝的軟體！&lt;/p&gt;
&lt;p&gt;在網路查到的幾乎都是需要再手動刪除檔案之後還要再移除 Safari 的 Plugin&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/Library/Internet Plug-Ins/AdobePDFViewer.plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/Library/Internet Plug-Ins/AdobePDFViewerNPAPI.plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;不過說實在的真的很麻煩！我覺得下面的方法才是正解&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;移除 Adobe Reader and Acrobat 的 Adobe 官方移除工具：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://labs.adobe.com/downloads/acrobatcleaner.html"&gt;Download Adobe Reader and Acrobat Cleaner Tool - Adobe Labs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Phone Lock / OFF+ 1.8.31 beta release now</title><link>https://blog.stanwu.org/posts/phone-lock-off-1-8-31-beta-release-now/</link><pubDate>Sat, 09 Mar 2019 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/phone-lock-off-1-8-31-beta-release-now/</guid><description>&lt;ul&gt;
&lt;li&gt;Yes, support status bar QS tile icon, you can lock screen anywhere now !&lt;/li&gt;
&lt;li&gt;Support fingerprint unlock immediately !&lt;/li&gt;
&lt;li&gt;Fixed some fingerprint device unexceptional crash issue&lt;/li&gt;
&lt;li&gt;Fixed screen brightness goes to lowest setting when adaptive display is on issue&lt;/li&gt;
&lt;li&gt;You can also change go to Settings - Security &amp;amp; location - Screen lock (Gear icon) - Automatically lock - Immediately to enhance your phone security&lt;/li&gt;
&lt;li&gt;Add required write settings permission dialog when first time to launch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blog.stanwu.org/wp-content/uploads/2019/03/Screenshot_1552111595.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2019/03/Screenshot_1552111595-576x1024.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好消息，支援狀態列快速設定圖塊功能了，現在可以隨時鎖定更方便 !&lt;/li&gt;
&lt;li&gt;現在用指紋可以立即解鎖&lt;/li&gt;
&lt;li&gt;修復部分手機指紋裝置偵測異常的問題&lt;/li&gt;
&lt;li&gt;修正螢幕變暗的問題&lt;/li&gt;
&lt;li&gt;如果需要更安全 設定 - 安全性與位置資訊 - 螢幕鎖定旁的齒輪 - 自動鎖定 - 設定 0秒 可以讓您的手機更快鎖定 (感謝 晨福 提供資訊)&lt;/li&gt;
&lt;li&gt;更換SDK開發版本，支援 Pie 的開發框架&lt;/li&gt;
&lt;li&gt;第一次執行會跳出修改權限設定的對話框 (Google規範)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Phone Lock / OFF+ 1.8.32 beta release now</title><link>https://blog.stanwu.org/posts/phone-lock-off-1-8-32-beta-release-now/</link><pubDate>Sat, 09 Mar 2019 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/phone-lock-off-1-8-32-beta-release-now/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support volume control widget on QS tile area that not only lock screen but also control your sound volume anywhere now !&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Support fingerprint unlock immediately !&lt;/li&gt;
&lt;li&gt;Fixed some fingerprint device unexceptional crash issue&lt;/li&gt;
&lt;li&gt;You can also change go to Settings – Security &amp;amp; location – Screen lock (Gear icon) – Automatically lock – Immediately to enhance your phone security&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;YouTube demo : &lt;a href="https://youtu.be/7P-0nOi_ILc"&gt;https://youtu.be/7P-0nOi_ILc&lt;/a&gt; &lt;a href="http://blog.stanwu.org/wp-content/uploads/2019/03/Screenshot_1552130232.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2019/03/Screenshot_1552130232-576x1024.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新增「音量控制」到狀態列「快速設定圖塊」功能，現在不只可以秒速鎖屏還可以隨時調整您的手機音量，不需要再按實體音量鍵了 !&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;現在用指紋可以立即解鎖&lt;/li&gt;
&lt;li&gt;修復部分手機指紋裝置偵測異常的問題&lt;/li&gt;
&lt;li&gt;修正螢幕變暗的問題 如果需要更安全 設定 – 安全性與位置資訊 – 螢幕鎖定旁的齒輪 – 自動鎖定 – 設定 0秒 可以讓您的手機更快鎖定 (感謝 晨福 提供資訊)&lt;/li&gt;
&lt;li&gt;更換SDK開發版本，支援 Pie 的開發框架&lt;/li&gt;
&lt;li&gt;第一次執行會跳出修改權限設定的對話框 (Google規範)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OFF</title><link>https://blog.stanwu.org/posts/i-htm/</link><pubDate>Sun, 09 Oct 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/i-htm/</guid><description>&lt;p&gt;Google Play (Android 5.x, 4.x) : &lt;a href="https://play.google.com/store/apps/details?id=us.stanwu.screenoff"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png" alt="Get it on Google Play"&gt;&lt;/a&gt; Part of users found most of the Android 6.0 users can not work properly, we try to investigate the API call issue now Protect your power button, reduce power button usage and extend your life of button If your phone hasn&amp;rsquo;t built-in the double click to lock or without software screen lock button or support the leather cover lock that your should consider this app This app will not occupation the RAM resource and background CPU power of your phone that will auto self-exit and release all of your precious resources and the most important thing &amp;ndash; &lt;strong&gt;it is AD-free!&lt;/strong&gt; The best thing is that is open source which means the app is not only safety but also protect your privacy and open &lt;strong&gt;Important&lt;/strong&gt; App was not marked as Device Administrator. Please check Security settings You have to [Settings]-&amp;gt;[Security]-&amp;gt;[Device administrators] to enable OFF If you wish to remove this App that requires disabling OFF from Device administrators first GitHub: &lt;a href="https://github.com/stanwu/us.stanwu.screenoff"&gt;https://github.com/stanwu/us.stanwu.screenoff&lt;/a&gt; &lt;a href="https://play.google.com/store/apps/details?id=us.stanwu.screenoff"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png" alt="Get it on Google Play"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>OFF+ (Nexus Imprint support)</title><link>https://blog.stanwu.org/posts/cialis-online-html/</link><pubDate>Sun, 09 Oct 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/cialis-online-html/</guid><description>&lt;p&gt;Google Play Beta: &lt;a href="https://play.google.com/apps/testing/org.stanwu.smartscreenlockpro"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png" alt="Get it on Google Play"&gt;&lt;/a&gt; Protecting the Power Button of mobile phones from intensive use by reducing the frequency of pressing physical button. If your phone doesn’t have the double click lock built-in soft screen lock button or the leather cover lock, then you may consider using this App &lt;strong&gt;Please try our OFF App, if you don&amp;rsquo;t need Nexus Imprint (Fingerprint) unlock&lt;/strong&gt; &lt;strong&gt;2016/10/03&lt;/strong&gt; FIXED: Auto remove OFF+ app from overview screen after hardware screen lock is activated. Special thanks to 謝立達 who reports the issue This App is focused on the solution of Nexus Imprint (HTC 10 or most of the fingerprint unlock) issues, it is unlikely our previous version used a screen lock mechanism which will cause fingerprint unlock fail. OFF+ is a 10 secs soft screen lock, it tries to disable all touch and button keys events and turns off the backlight then wait for 10 secs until hardware lock is activated, it will exit automatically and release all pre-occupied RAM and CPU resources. Please don&amp;rsquo;t forget to rate and give your valuable comments. Your satisfaction is important to us, this encourage us to work harder and better. Improvement suggestions are most welcome, let us know what you need and we will provide updates as and when ready. :-D &lt;a href="https://blog.stanwu.org/wp-content/uploads/2016/09/Screen-Shot-2016-09-06-at-16.24.43.png"&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2016/09/Screen-Shot-2016-09-06-at-16.24.43-573x1024.png" alt="Screen Shot 2016-09-06 at 16.24.43"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>秒速鎖屏+ (Nexus Imprint 支援)</title><link>https://blog.stanwu.org/posts/eg-html/</link><pubDate>Tue, 06 Sep 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/eg-html/</guid><description>&lt;p&gt;Google Play 下載安裝 : &lt;a href="https://play.google.com/store/apps/details?id=org.stanwu.smartscreenlockpro"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png" alt="Get it on Google Play"&gt;&lt;/a&gt; 這個 App 是針對 HTC 10 或是類似的指紋解鎖的手機所特別設計的, 跟原先的 &lt;a href="https://blog.stanwu.org/2016/08/13/%E7%A7%92%E9%80%9F%E9%8E%96%E5%B1%8F/"&gt;秒速鎖屏&lt;/a&gt; 是完全不一樣的設計架構, 秒速鎖屏+ (Nexus Imprint 支援)本身設計是一個 15 秒的螢幕鎖定程式, 執行之後會盡量嘗試關閉您的螢幕電源跟調整背光亮度到全暗, 同時阻斷螢幕觸控跟按鍵功能, 讓手機運作電力降到最低, 等 15 秒後手機系統的螢幕鎖定啟動之後, 就會自動結束退出, 完全不費浪費您手機寶貴的記憶體跟電池電力 &lt;a href="https://blog.stanwu.org/wp-content/uploads/2016/09/Screen-Shot-2016-09-06-at-16.24.43.png"&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2016/09/Screen-Shot-2016-09-06-at-16.24.43-573x1024.png" alt="Screen Shot 2016-09-06 at 16.24.43"&gt;&lt;/a&gt; &lt;strong&gt;2016/11/20&lt;/strong&gt; 由於 Android 6.0 之後對手機系統安全要求全面提升, 舊版的鎖屏 App 大多會取得裝置管理員的最高存取權限, 這代表著對指紋辨識裝置會有極高的安全風險問題, 因此 6.0 以上的系統在解鎖的時候如果偵測到有第三方App具有裝置管理員權限, 就會禁止使用指紋裝置(安全考量), 改用傳統的方式解鎖, 所以當您覺得很麻煩的時候, 表示您的手機很安全 T_T 這個 App 採用折衷的設計方式, 用混合的方式設計(更多標準API呼叫), 以確保符合 6.0 以上的系統安全原則, 但是相對的缺點是對大部分手機無法立即秒鎖(註1), 因為這個 App 是透過訊息傳遞給系統去控制硬體, 而不是由 App 自己直接去控制硬體(註2), 因為每支手機的系統廠商調校都不太一樣, 所以秒鎖的時間也會都不一樣, 10秒是 Nexus Android 6.0 的標準值 :P 也是因為以上安全性的考量, 本商店另外一款傳統鎖屏方式的App「秒速鎖屏」最後決定採用開放原始碼的原因也是在這邊, 這樣才有辦法保證所有裝置存取權限的運作過程是透明公開且安全的 註1 : 有的大大透過系統的設定配置, 可以做到秒鎖實在太厲害了 註2 : 您可以想像: 手機就是汽車, 您就是系統, 第三方App就是陌生人, 之前的設計是您直接把汽車直接交給陌生人開, 以前車可以可直接熄火, 現在安卓 6.0 的設計是變成您來開汽車, 陌生人所有要求的動作都需要經過您來決定開車的方式, 您可能考慮到其他因素所以延遲一下熄火的時間 下載安裝前您必須先了解的常見問題 : &lt;strong&gt;Q: 為什麼沒辦法用 一按進去就跳出黑色的畫面，沒辦法開&lt;/strong&gt; A: 因為直接就鎖屏了, 這個App很節省資源, 不需要任何使用者介面 T_T &lt;strong&gt;Q: 能不能縮短10秒時間?&lt;/strong&gt; A: 因為App是呼叫標準的系統API 傳遞給手機系統其實為立刻鎖屏命令, 但是因為手機系統差異的關係, 每個系統動作的時間都不太一樣, 標準 Nexus 的 Android 6.0 回應為 10 秒鐘, 但是也有神等級的「天雲風」大大就是有辦法弄到 秒鎖 (請參考下方評論), 需要經過自己對手機系統本身設定調校 &lt;strong&gt;Q: 三星(Samsung)系列手機或平板安裝完後, 兩秒就關屏, 這樣怎麼使用手機&lt;/strong&gt; A: 這個問題之前S7使用者有反映過, 在某一些條件下新安裝或者是重新安裝App 會有這個奇怪的情況, 請協助到設定中的螢幕自動關閉時間調整回自己的時間(例如30秒), 這樣就可以正常使用了 &lt;strong&gt;Q: 若使用了秒速鎖屏關上螢幕，手機的螢幕休眠手勢功能就會沒反應，無法使用&lt;/strong&gt; A: 對於某些手勢解鎖的手機(如OPPO R9s), 軟體鎖定期間前十秒, App會取消所有的面板觸控功能, 請使用 音量[+] 解鎖) &lt;strong&gt;2016/09/26&lt;/strong&gt; 有網友反應解鎖後還會留在背景, 剛剛測試看起來是不會, 還希望有人可以幫忙看看能不能重現問題之所在 ^^ (影片有字幕, 請打開 YouTube 字幕選項) &lt;strong&gt;2016/09/16&lt;/strong&gt; 修正螢幕旋轉解鎖問題, 感謝 阿古多 大大的提醒, 我居然忽略了這麼旋轉螢幕這麼重要的問題 T_T 經過測試, 將鎖定時間縮短為 10 秒, 感謝 楊宗憲 的建議, 新增前五次使用提示說明(前十秒按 音量[+] 解鎖), 將程式碼最佳化, 將提示訊息改為中文 &lt;strong&gt;2016/09/10&lt;/strong&gt; mobile01的 Jacob-mms 大大的建議, ,移除原本鎖定前15秒內的快點兩下解鎖功能 暫時改為按下音量[+]解鎖 如果鎖定時候還看得到背光, 目前這個版本是正常的, 螢幕亮度理論上已經被調整為零了 App 爭取在15秒內盡量節省用電, 缺點還是會有微弱的背光 這個 App 本身是一個 10 秒的螢幕鎖定程式, 會盡量嘗試關閉您的螢幕電源(有些手機的背光電源無法關閉)跟亮度調整到全暗, 並阻斷螢幕觸控跟按鍵功能, 讓手機運作電力降到最低, 等 10 秒後手機系統的螢幕鎖定啟動之後, 就會自動結束退出, 完全不費浪費您手機寶貴的記憶體跟電池電力 為什麼想設計這款 App 呢? 因為之前上架『&lt;a href="https://blog.stanwu.org/2016/08/13/%E7%A7%92%E9%80%9F%E9%8E%96%E5%B1%8F/"&gt;秒速鎖屏&lt;/a&gt;』想說只是為了方便親朋好友使用下載安裝, 沒有特別注意 App 的安裝者有誰, 上架大概三個月過去之後, 上個月忽然接到一封電子郵件, 問有關『秒速鎖屏』不能用在有指紋解鎖的手機上面, 因為手上沒有類似的機器, 也沒辦法馬上解決 可是就在最近這一個月安裝者忽然暴增, 問指紋機的人也越來越多了, 所以就花了一些時間 Google 一下, 發現這個問題已經出現很久了, 原因是出現在 lockNow(); 這個呼叫需要 USES_POLICY_FORCE_LOCK 這個 Admin 的權限, 而新版本的 Android 針對此權限做出新的安全限制, 導致後面的問題發生, 其實個人是非常贊同 Google 新的安全作法, 增強 Android 手機的安全性比增強新功能還要重要, 所以就產生了『秒速鎖屏+』這個設計, 設計原則是&lt;strong&gt;絕對不能使用 root 的方法, 也不能用很奇怪的手段解決&lt;/strong&gt; , 最後是參考了網路上大家的討論, 就著手把程式碼開發出來了 Google Play 直接下載安裝 : &lt;a href="https://play.google.com/apps/testing/org.stanwu.smartscreenlockpro"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png" alt="Get it on Google Play"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>秒速鎖屏</title><link>https://blog.stanwu.org/posts/%E7%A7%92%E9%80%9F%E9%8E%96%E5%B1%8F/</link><pubDate>Sat, 13 Aug 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%A7%92%E9%80%9F%E9%8E%96%E5%B1%8F/</guid><description>&lt;p&gt;Google Play 直接安裝(Android 5.x, 4.x) : &lt;a href="https://play.google.com/store/apps/details?id=us.stanwu.screenoff"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png?w=660&amp;amp;ssl=1" alt="Get it on Google Play"&gt;&lt;/a&gt; 最近很多的使用者回報在他們的手機上面無法正確的運作, 經過Play Console上面顯示很多的 Android 6.0 的手機很容易有問題, 所以開始著手調查 6.0 的 API 呼叫是否有變動?&lt;br&gt;
關於 htc 10 的指紋解鎖問題, 大概也有一個大方向的拼圖. ..&lt;strong&gt;2016/09/03&lt;/strong&gt; 關於 htc 10 無法指紋解鎖問題, 目前為已知問題&lt;br&gt;
&lt;a href="https://www.reddit.com/r/Nexus6P/comments/3qpzjp/psa_screen_off_apps_break_nexus_imprint/"&gt;請參考 Reddit 這一篇文章有討論到&lt;/a&gt;&lt;br&gt;
有部分付費的App可以做到, 不過相信是使用系統漏洞的方法處理, 當然以長遠的角度來看, 直接指紋解鎖跳過電源按鈕且不需要密碼是很有效率的使用模式, 所以盡量以合理的方式來解決指紋直接解鎖這個方向前進 這是解決方法之一, 不過需要 root 權限, 所以暫時不考慮&lt;/p&gt;
&lt;p&gt;I use this method which emulates the power button (requires root!):
try {
Runtime.getRuntime().exec(new String[]{&amp;ldquo;su&amp;rdquo;, &amp;ldquo;-c&amp;rdquo;, &amp;ldquo;input keyevent 26&amp;rdquo;}).waitFor();
} catch (IOException | InterruptedException e) {
}&lt;/p&gt;
&lt;p&gt;其實方法很簡單 &amp;ndash; 就是直接送出觸發電源開關的訊號, 這樣就可以鎖定畫面了, 而不需要呼叫 lockNow(); 也不會觸發 Android 新版本的安全機制 網路上另外一個付費App的做法是&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;出現一個自己寫的鎖屏畫面&lt;/li&gt;
&lt;li&gt;等待10秒鐘之後讓螢幕自己鎖定&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;2016/09/06 秒速鎖屏+ (Nexus Imprint 支援) 就是這樣生出來的, 請參考 &lt;a href="https://blog.stanwu.org/2016/09/06/%E7%A7%92%E9%80%9F%E9%8E%96%E5%B1%8F-nexus-imprint-%E6%94%AF%E6%8F%B4/"&gt;秒速鎖屏+ (Nexus Imprint 支援)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="秒速鎖屏-徵求-htc-10-測試者"&gt;秒速鎖屏 徵求 htc 10 測試者&lt;/h2&gt;
&lt;p&gt;嘗試解決 htc 10 的 Nexus Imprint 解鎖的問題, 因為手邊沒有實體機器, 使用模擬器的 Nexus Imprint 測試看起來又都正常, 請有 htc 10 的人幫忙測試一下 ^^ &lt;a href="https://play.google.com/apps/testing/us.stanwu.screenoff"&gt;我要加入測試者計畫!&lt;/a&gt; 感謝 Fisico 的回報, 已經修正了在 Android 6.0 的 Bug, 不過因為怕影響到 Android 5.x 跟 4.x 的使用者, 所以我先只有放在 Beta 版本, 想要參加 Beta 版本的人可以發 email 跟我說, 我幫您加入 Beta 版本的測試群組當中 &lt;strong&gt;或者是您也可以直接下載測試&lt;/strong&gt; &lt;strong&gt;如果您的手機是 Android 6.0 請&lt;a href="https://play.google.com/apps/testing/us.stanwu.screenoff"&gt;協助測試 Beta 版本&lt;/a&gt;&lt;/strong&gt; 這次更新了新版的 source code 也順便一起更新了 project 格式支援 Android Studio 2.1.2 這個意味著 &amp;ndash; 如果您使用舊版的 Android Studio 開啟的話可能會有問題 &lt;strong&gt;2015/12/15&lt;/strong&gt; 最節省手機資源的鎖定螢幕工具 (screen off / screen lock) 適合有系統潔癖的人使用! 適合有系統潔癖的人使用! (screen off / screen lock) &lt;em&gt;如果您的手機跟我一樣&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沒有內建點兩下鎖屏&lt;/li&gt;
&lt;li&gt;也沒有內建懸浮按鈕&lt;/li&gt;
&lt;li&gt;也沒有內建翻蓋自動鎖屏&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;如果您對App有跟我一樣的要求&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不能有廣告&lt;/li&gt;
&lt;li&gt;不能吃太多的記憶體&lt;/li&gt;
&lt;li&gt;越簡單越好&lt;/li&gt;
&lt;li&gt;不能吃太多CPU與系統資源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那您可以考慮這個APP! 完全不會佔用您手機的記憶體資源, 執行鎖定螢幕之後就自動退出結束APP, 完全不費浪費您手機寶貴的記憶體跟電池電力, 而且不會有廣告! (因為我自己也不喜歡廣告) &lt;em&gt;保護您的手機電源按鈕, 減少電源按鈕按的次數, 延長按鈕使用壽命&lt;/em&gt; 如果使用上有任何使用上的不滿意, 在評分之前請先不吝嗇寄信給 &lt;a href="mailto:stan@stanwu.org"&gt;stan@stanwu.org&lt;/a&gt; 讓我知道改進的地方, 謝謝 Google Play 直接安裝(Android 5.x, 4.x) : &lt;a href="https://play.google.com/store/apps/details?id=us.stanwu.screenoff"&gt;&lt;img src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png?w=660&amp;amp;ssl=1" alt="Get it on Google Play"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="重要-重要-重要"&gt;重要!!! 重要!!! 重要!!!&lt;/h3&gt;
&lt;p&gt;第一次使用 : 因為鎖定螢幕需要使用者授權, 所以安裝之後請一定要先到 [設定] -&amp;gt; [安全性] -&amp;gt; [裝置管理員] 中設定秒速鎖屏裝置授權 -&amp;gt; 將本 APP 打勾授權 如果要移除本APP : 同樣要先取消授權才能夠正確移除 請到 [設定] -&amp;gt; [安全性] -&amp;gt; [裝置管理員] -&amp;gt; 將本 APP 取消打勾授權 ICON 圖像來源與授權聲明 (ICON source and license)&lt;br&gt;
&lt;a href="http://www.softicons.com/social-media-icons/brushed-metal-icons-by-mebaze/power-1-icon"&gt;http://www.softicons.com/social-media-icons/brushed-metal-icons-by-mebaze/power-1-icon&lt;/a&gt;&lt;/p&gt;</description></item><item><title>部落格從 DigitalOcean 遷出</title><link>https://blog.stanwu.org/posts/%E9%83%A8%E8%90%BD%E6%A0%BC%E5%BE%9E-digitalocean-%E9%81%B7%E5%87%BA/</link><pubDate>Tue, 03 May 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E9%83%A8%E8%90%BD%E6%A0%BC%E5%BE%9E-digitalocean-%E9%81%B7%E5%87%BA/</guid><description>&lt;p&gt;之前因為 GitHub 有送 100 美元的 DigitalOcean 基金, 本來想說可以 20 個月慢慢燒 (反正部落格沒什麼人在看, 租用一個月 5 元的就好), 結果最近忽然收到 DigitalOcean 寄來的信件, 說更改服務條款, 推廣的基金有效期只有12個月, 這個月(2016/05/01)起剩下的餘額全部過期, 所以帳號不但歸零還瞬間變成負的 0.36 美元, 所以就只好搬到自己家裡的主機&lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/05/docker.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/05/docker.png" alt="docker"&gt;&lt;/a&gt; 趁著這一次搬家, 乾脆就把這個部落格系統, 整個都轉換成 Docker 的 container 格式, 這樣的好處是, 以後要轉移到其他平台, 理論上就方便許多了, 整個 Wordpress 轉換過程還算順利, 主要是把 apache2 跟 php 的設定目錄複製過來, 至於 MySQL 因為筆者超級懶惰, 是直接把 /var/lib/mysql 整個使用 rsync 方式同步到新的 container 上面 整個過程運氣算不錯, 基本上啟動就可以正常運作了, 多虧是使用 Ubuntu 14.04 LTS, 基本上 MySQL 可以無痛轉移到新的平台, (之前測試 12.04 的 MySQL 在 container 的轉移, 需要手動執行 mysqld_safe 才能執行, 主要是 init 的關係)&lt;/p&gt;</description></item><item><title>救回 Mac OS X 的 System Policy</title><link>https://blog.stanwu.org/posts/%E6%95%91%E5%9B%9E-mac-os-x-%E7%9A%84-system-policy/</link><pubDate>Tue, 09 Feb 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E6%95%91%E5%9B%9E-mac-os-x-%E7%9A%84-system-policy/</guid><description>&lt;p&gt;大家恭喜發大財, 先說心得, 如果要貪小便宜用了不該用的軟體, 付出的代價其實是到最後是一樣的或者是更高, 那就是時間成本 &lt;a href="https://blog.stanwu.org/wp-content/uploads/2016/02/Screen-Shot-2016-02-09-at-11.58.21-AM.png"&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2016/02/Screen-Shot-2016-02-09-at-11.58.21-AM.png" alt="Screen Shot 2016-02-09 at 11.58.21 AM"&gt;&lt;/a&gt; 話說因為要測試一些軟體, 所以將安全與隱私(Security&amp;amp;Privacy)全部打開, 允許未驗證App的執行, 測試之後雖然有馬上恢復預設值, 但是事實上之前允許的App 因為已經允許過了 &amp;ndash; 所以一樣是可以執行的, 因此覺得有點系統潔癖的我馬上心有不安, 但是又無法取消之前允許的動作, 經過 Google 之後查到了 spctl 這個命令, 但是因為那個命令沒有 label (Google 查到的用法)所以無法單獨刪除那個 App 的單一規則, 所以心一橫就 spctl &amp;ndash;remove 接著就出現需要 root 權限, 很順的把密碼敲進去按下 Enter, 不到一秒鐘搞定, 接著用 spctl &amp;ndash;list 列出規則, Ya 全部清除了 (覺得非常的安全), 趕快來測試一下, 是否生效, 心裡正覺得得意的時候, 發現怎麼變成所有只要是從網路下載的 dmg 只要執行裡面的App都會顯示檔案損毀訊息, 只能從 App Store 下載安裝可以被執行, 這時候才發現是資料刪過頭了, 把原本資料庫內建有效開發者簽章的資料也一併刪了, 所以變成只要是網路下載的 App 都顯示檔案損毀 &lt;a href="https://blog.stanwu.org/wp-content/uploads/2016/02/Screen-Shot-2016-02-09-at-12.15.00-PM.png"&gt;&lt;img src="https://blog.stanwu.org/wp-content/uploads/2016/02/Screen-Shot-2016-02-09-at-12.15.00-PM.png" alt="Screen Shot 2016-02-09 at 12.15.00 PM"&gt;&lt;/a&gt; 本來想要重裝 OS 了事, 但是資料實在太多了, 不太可能允許重裝, 於是又開始 Google 從網路上找到的片段資訊, 終於成功了, 方法也很簡單答案在 /var/db 目錄中&lt;/p&gt;
&lt;p&gt;#原來是 SQLite SystemPolicy: SQLite 3.x database, user version 1 #先備份一下原來的 &lt;strong&gt;sudo****cp SystemPolicy SystemPolicy-orig&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#把系統預設的資料庫恢復, .SystemPolicy-default 前面有一個句點 &lt;strong&gt;sudo cp .SystemPolicy-default SystemPolicy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目前預設的簽章規則一共有 1782 條&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>無法移除 Dropbox 的 Mac 版本?</title><link>https://blog.stanwu.org/posts/%E7%84%A1%E6%B3%95%E7%A7%BB%E9%99%A4-dropbox-%E7%9A%84-mac-%E7%89%88%E6%9C%AC/</link><pubDate>Fri, 22 Jan 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%84%A1%E6%B3%95%E7%A7%BB%E9%99%A4-dropbox-%E7%9A%84-mac-%E7%89%88%E6%9C%AC/</guid><description>&lt;p&gt;如果要把 Dropbox 從 Mac 中移除掉, 只要把它拖曳到垃圾桶就好了, 可是很不幸的我遇到了以下的信息 &amp;ndash; 其中部分延伸功能正在使用中 &amp;ndash; 就算整個帳號都登出了, 也是沒用 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2016-01-22-%E4%B8%8B%E5%8D%886.09.34.png?resize=532%2C265" alt="螢幕快照 2016-01-22 下午6.09.34"&gt; &lt;strong&gt;解決的方法很簡單&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用終端機 打 ps aux | grep -i dropbox&lt;br&gt;
查看應該會發現一個執行緒, 用 kill -9 (PID) 直接刪除掉, 就可以順利將 Dropbox 丟到垃圾桶中&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2016-01-22-%E4%B8%8B%E5%8D%886.10.25-1024x439.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>Sublime Text 與 Simplenote 共舞</title><link>https://blog.stanwu.org/posts/sublime-text-%E8%88%87-simplenote-%E5%85%B1%E8%88%9E/</link><pubDate>Mon, 04 Jan 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/sublime-text-%E8%88%87-simplenote-%E5%85%B1%E8%88%9E/</guid><description>&lt;p&gt;Sublime Text 與 &lt;a href="http://simplenote.com/"&gt;Simplenote&lt;/a&gt; 都是軟體工程師的重要工具之一, 如果您是使用 Mac 的話 &lt;a href="http://simplenote.com/"&gt;Simplenote&lt;/a&gt; 已經有提供完整的 App 可以使用安裝, 而 Windows 的使用者基本上只能使用 2013 之後就沒有維護的 &lt;a href="http://www.resoph.com/"&gt;ResophNotes&lt;/a&gt; 之類的第三方軟體, 如果你剛好是 Sublime Text 的使用者, 又剛好是 &lt;a href="http://simplenote [cialis nachnahme](http://biturlz.com/zsj3sXB).com/" target="_blank"&gt;Simplenote 的使用者那可以考慮安裝這個外掛將兩個功能可以簡單的整合在一起使用 &lt;strong&gt;以下簡單的幾個步驟就可以將兩個重要的工具整合在一起使用&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝 Sublime Text 的 Package Control&lt;br&gt;
&lt;a href="https://packagecontrol.io/installation#st2"&gt;https://packagecontrol.io/installation#st2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安裝 IMESupport 支援中文輸入法 (解決Windows的中文輸入法問題)&lt;/li&gt;
&lt;li&gt;安裝 QuickSimplenote&lt;br&gt;
說明 : &lt;a href="https://packagecontrol.io/packages/QuickSimplenote"&gt;https://packagecontrol.io/packages/QuickSimplenote&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一次按下熱鍵的時候會出現設定畫面, 需要設定帳號跟密碼&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝完畢之後, 第二次按下熱鍵 &amp;ndash; 你會發現沒反應!? 看一下狀態列, 你會發現正在下載 Simplenote 索引檔案的信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所以要再次的第三次按下熱鍵 &amp;ndash; 就可以叫出所有的 Simplenote 筆記列表&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;*** 備註 : Ubuntu 的熱鍵會失效, 所以要改用 Ctrl + Shift + P 叫出命令視窗, 然後打 quick 開頭就會出現功能選單** &lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture.png?resize=660%2C491" alt="Capture"&gt;&lt;/a&gt; 4. 直接在 Sublime Text 2 編輯從 Simplenote 下載的筆記內容, 存檔之後會自動更新到 Simplenote 上面&lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture2.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture2-1024x455.png?resize=660%2C293" alt="Capture2"&gt;&lt;/a&gt; &lt;strong&gt;使用 Sublime Text 整合 Simplenote 的好處&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨平台使用&lt;/li&gt;
&lt;li&gt;簡化單一使用者介面, 無須重覆再次學習新東西&lt;/li&gt;
&lt;li&gt;無須執行多個軟體交互使用, 更節省系統資源&lt;/li&gt;
&lt;li&gt;簡單生活, 簡單才能專注&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>將 CentOS 6.5 Yum Server 指定國家實驗研究院</title><link>https://blog.stanwu.org/posts/centos-6-5-yum-server-%E6%8C%87%E5%AE%9A%E5%9C%8B%E5%AE%B6%E5%AF%A6%E9%A9%97%E7%A0%94%E7%A9%B6%E9%99%A2/</link><pubDate>Mon, 04 Jan 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/centos-6-5-yum-server-%E6%8C%87%E5%AE%9A%E5%9C%8B%E5%AE%B6%E5%AF%A6%E9%A9%97%E7%A0%94%E7%A9%B6%E9%99%A2/</guid><description>&lt;p&gt;既然繳了稅, 當然就要善用國家的資源, 將 CentOS 的 Yum 指定為國家高速網路與計算中心 (國家實驗研究院 NCHC) 的設定, 享受高速網路下載的樂趣 &lt;strong&gt;步驟如下 :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手動修改/etc/yum.repos.d/CentOS-Base.repo&lt;/li&gt;
&lt;li&gt;將全部 mirrorlist= 註解掉, 變成 #mirrorlist=&lt;/li&gt;
&lt;li&gt;將全部原有的 baseurl= 註解掉, 變成 #baseurl=&lt;/li&gt;
&lt;li&gt;新增&lt;strong&gt;baseurl=http://ftp.nchc.org.tw/Linux/CentOS/6/[對應的部分]/$basearch/&lt;/strong&gt;&lt;br&gt;
(對應的部分例如: os, updates…)&lt;br&gt;
&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture-1.png" alt=""&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;懶的修改? 可以直接&lt;a href="https://gist.github.com/stanwu/58cb9184147c6d6d5c25"&gt;下載&lt;/a&gt;&lt;/strong&gt; &lt;strong&gt;注意 : 根據 README 上面說明, 現在 6.X 一律都改用 6&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;詳情請參考 : &lt;a href="http://ftp.nchc.org.tw/Linux/CentOS/6.5/readme"&gt;http://ftp.nchc.org.tw/Linux/CentOS/6.5/readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;建議更新之後使用 &lt;strong&gt;yum update&lt;/strong&gt; (系統會變成 6.7 請斟酌使用)&lt;/li&gt;
&lt;li&gt;如果覺得有需要可以 &lt;strong&gt;yum clean all&lt;/strong&gt;(如果沒問題就不需要使用此命令)**&lt;br&gt;
**&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;後記 : 安裝 joe 文字編輯器&lt;/strong&gt; 忽然發現 CentOS 6 目前沒有收錄 joe 編輯器(可能是我的問題?), 所以 Google 一下, 使用 &lt;a href="http://pkgs.org"&gt;pkgs.org&lt;/a&gt; 查詢之後發現 joe 編輯器只有在 EPEL (Extra Packages for Enterprise Linux) 裡面有, 所以要額外增加 EPEL 到 Yum 裡面 至於會什麼會發這樣的問題, 筆者也不太清楚, 如果您知道或許可以不吝嗇地告訴我原因 : &lt;a href="https://twitter.com/stanwu"&gt;@stanwu&lt;/a&gt; ? &lt;strong&gt;# Install EPEL and additional repositories on CentOS and Red Hat&lt;/strong&gt;&lt;br&gt;
sudo yum install epel-release&lt;br&gt;
wget &lt;a href="https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm"&gt;https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm&lt;/a&gt;&lt;br&gt;
sudo rpm -Uvh epel-release-latest-6.noarch.rpm 如果一切都順利的話, 應該可以安裝 joe 編輯器了 ^^ &lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture-2.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/Capture-2.png?resize=660%2C583" alt="Capture"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增加 EPEL 請參考 : &lt;a href="http://www.rackspace.com/knowledge_center/article/install-epel-and-additional-repositories-on-centos-and-red-hat"&gt;http://www.rackspace.com/knowledge_center/article/install-epel-and-additional-repositories-on-centos-and-red-hat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>解決 Sublime Text 忽然無法安裝 Package 的問題</title><link>https://blog.stanwu.org/posts/%E8%A7%A3%E6%B1%BA-sublime-text-%E5%BF%BD%E7%84%B6%E7%84%A1%E6%B3%95%E5%AE%89%E8%A3%9D-package-%E7%9A%84%E5%95%8F%E9%A1%8C/</link><pubDate>Mon, 04 Jan 2016 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E8%A7%A3%E6%B1%BA-sublime-text-%E5%BF%BD%E7%84%B6%E7%84%A1%E6%B3%95%E5%AE%89%E8%A3%9D-package-%E7%9A%84%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;剛剛要安裝新的 Package 忽然出現 There are no packages available for installation, 所以 Google 一下, 基本上有兩個原因原因 1, https 協定的憑證錯誤, 基本上這個問題只要把 Package Control.system-ca-bundle 跟 Package Control.merged-ca-bundlen 兩個檔案移除就可以解決, 重新下載憑證就可以了 &lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2016-01-04-19.40.25.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2016-01-04-19.40.25-300x185.png" alt="螢幕截圖 2016-01-04 19.40.25"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是&amp;hellip;我遇到的是第二個原因&lt;/strong&gt; &lt;a href="https://packagecontrol.io/channel_v3.json"&gt;https://packagecontrol.io/channel_v3.json&lt;/a&gt; &lt;a href="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2016-01-04-19.25.14.png"&gt;&lt;img src="http://blog.stanwu.org/wp-content/uploads/2016/01/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2016-01-04-19.25.14.png" alt="螢幕截圖 2016-01-04 19.25.14"&gt;&lt;/a&gt;主機返回空值, 這時候就當然無法安裝套件了, 暫時解決的方法是用檔案庫存資料, 方法是 打開 Package Control.sublime-settings 這個設定,&lt;strong&gt;暫時將 Channel 多一個庫存位置&lt;/strong&gt; , 當然這只是權宜之計, 等主機恢復記得要改回來喔 ^^ &amp;ldquo;channels&amp;rdquo;: [ &amp;ldquo;https://packagecontrol.io/channel_v3.json&amp;rdquo;, &lt;strong&gt;&amp;ldquo;https://web.archive.org/web/20150905194312/https://packagecontrol.io/channel_v3.json&amp;rdquo;&lt;/strong&gt; ], 如果有一樣的問題可以到 github 的討論串裡面有回報&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wbond/package_control/issues/959"&gt;https://github.com/wbond/package_control/issues/959&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;更新 :&lt;/strong&gt; &lt;strong&gt;看起來這個 project 使用的 Linode 主機不太夠力, 開發者需要大家可以慷慨贊助一下, 看有沒有機會可以更換高檔一點的主機, 最後還有就是相關的軟體架構也需要重新改寫擴展, 所以在這個問題還沒有解決之前可能要先撐一陣子囉 X-D&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wbond/package_control/issues/1057"&gt;https://github.com/wbond/package_control/issues/1057&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;臨時的解決方案 : 自動映射位置 , 每天自動備份一次, 如果有需要請自行取用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.githubusercontent.com/stanwu/679f8af0c9a43f800974/raw/5e3561bfb8b3ddc92680052c89e73c7dabc92f94/channel_v3.json"&gt;https://gist.githubusercontent.com/stanwu/679f8af0c9a43f800974/raw/5e3561bfb8b3ddc92680052c89e73c7dabc92f94/channel_v3.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;將以上位置加入 channels 就可以了 &lt;strong&gt;自動產生以上資料的原始碼請參考&lt;a href="https://gist.github.com/stanwu/f080ab66063d782f2597"&gt;這邊&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>iTunes 預設的播放列表預設值與恢復方法</title><link>https://blog.stanwu.org/posts/itunes-%E9%A0%90%E8%A8%AD%E7%9A%84%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E9%A0%90%E8%A8%AD%E5%80%BC%E8%88%87%E6%81%A2%E5%BE%A9%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 07 Aug 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/itunes-%E9%A0%90%E8%A8%AD%E7%9A%84%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E9%A0%90%E8%A8%AD%E5%80%BC%E8%88%87%E6%81%A2%E5%BE%A9%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;iTunes 最強大的莫過於 Genius 組曲跟智慧播放清單, 基本上選歌曲的精確度非常的高, 尤其是如果你擁有2萬首以上的歌曲的話, 只能靠 Genius 與「智慧清單」來跟 iTunes 指示你的歌曲喜愛偏好的方向, 而這些偏好也會影響到 iTunes 的 Apple Music 與 Radio Station 每一次為您推薦的選播的歌曲曲風走向, 就在今天早上筆者把 My Top Rated 的播放清單給誤刪了, 這下有點麻煩了, 因為筆者的 iPhone 就靠它每天來自動更新離線歌曲, 研究老半天終於恍然大悟, 所以趕快筆記下來恢復方式 原來 iTunes 的播放列表中, 只要出現「&lt;strong&gt;齒輪形狀&lt;/strong&gt; 」的, 就是智慧播放清單 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2015-08-07-19.31.571.png" alt="螢幕截圖 2015 08 07 19 31 57"&gt; 您會發現少了 My Top Rated 的清單, 所以就查另外一台 Mac 上面的 iTunes 設定 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2015-08-07-19.30.52.png" alt="螢幕截圖 2015 08 07 19 30 52"&gt; 所以您只要新增一組 智慧播放清單, 條件設定如上圖, 日後就可以同步到 iPhone, iPod 之類的播放設備了 下方為「&lt;strong&gt;最近加入&lt;/strong&gt; 」的播放規則提供需要的人參考 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2015-08-07-19.31.03.png" alt="螢幕截圖 2015 08 07 19 31 03"&gt; 下方為「&lt;strong&gt;最近播放過的項目&lt;/strong&gt; 」的播放規則提供需要的人參考 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2015-08-07-19.31.14.png" alt="螢幕截圖 2015 08 07 19 31 14"&gt; 下方為「&lt;strong&gt;最近常播的項目(25項)&lt;/strong&gt; 」的播放規則提供需要的人參考 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96-2015-08-07-19.31.25.png" alt="螢幕截圖 2015 08 07 19 31 25"&gt; 所以如果您覺得以上預設的不能滿足您的要求, 您可以自己設定一些規則, 也歡迎可以跟筆者一起分享 ^^&lt;/p&gt;</description></item><item><title>為什麼要念大學</title><link>https://blog.stanwu.org/posts/%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E5%BF%B5%E5%A4%A7%E5%AD%B8/</link><pubDate>Thu, 06 Aug 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E5%BF%B5%E5%A4%A7%E5%AD%B8/</guid><description>&lt;p&gt;現在教育課綱吵得火熱, 其實我滿佩服現在高中生的勇氣, 那時同年齡的我可能還躲在萬年買漫畫書呢! 話說回來我很慶幸, 年輕的時候近代史就念不好, 幾乎每次考試分數都是個位數, 地理也是, 對於眼前沒有用的知識根本沒有興趣(那時候怎麼可能會去匪區, 更不可能反共大陸, 中國地理那麼好要幹麻!?) 至於國文除了漫畫裡面的對話之外其實是很討厭作文的! &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/08/15490190381_ad3789ad7b_k.jpg" alt="15490190381 ad3789ad7b k"&gt; (&lt;a href="https://creativecommons.org/licenses/by/2.0/"&gt;https://creativecommons.org/licenses/by/2.0/&lt;/a&gt;) 說到英文, 我家經濟不太可能移民去美國所以就不太了解為什麼要學英文? 這就是我的國中生活, 當然高中聯考自然而然就考上泰北高中美工科, 高一上的時候, 背著書包走在外面說真的還滿自卑的(畢竟我當時的第一志願是中正高中美術實驗班), 但是高一下開始就覺得原來這叫做唸書啊! 從高一開始就不需要每天考試, 因為是高職, 所以每天都可以學到很多很實用的知識, 真的是每天都期待去上課呢! 其實工匠或是師傅是一項了不起的工作, 我很喜歡也很尊敬這類工作的專家, 不過爽爽的三年很快地就面臨到大學聯考或是去當兵的問題了! 說真的我現在有辦法打打一點文章還要感謝當時上補習班重考大學的補習班國文老師, 真的是名師, 上課一直講笑話, 讓我不會馬上夢到周公, 同時也慢慢的理解文言文其實不會那麼無聊, 至於文筆方面因為那時每天都要寫作文, 第一次覺得原子筆除了畫畫之外原來寫作文也可以很快的用完筆的墨水, 所以運用文字的能力就變得稍微好一點點, 當然這一輩子覺得國文作文最有用的一次是跟台北市政府寫申訴狀, 大概往返兩次(問與答)就申訴成功, 省下了一筆不合理的罰款, 這是我這輩子第一次發現原來作文這件事情是這麼的重要! 也體驗到很多弱勢團體因為知識差異而吃虧的不平等 跟大家坦白, 小弟考大學最大的動機是怕當兵, 所以無論如何也要考上大學撐個四年再當兵, 那時候大家都覺得上大學的文憑很重要, 所以上大學對我兩種意義, 一是可以延遲當兵, 二是可以當當大學生好像不錯的樣子?! 以前學不好的東西, 到最後還是會面對, 小弟自從上大學一年級上學期英文馬上就被當, 所以大一下之後當其他同學大家還在爽爽的午睡的時候, 幾個跟我一樣被當的同學就要準備上課重修英文, 這也要感謝故意當我們的美國老師 Kevin 真是用心良苦犧牲自己的休息時間, 來拯救這群英文實在是破到不行的同學, 他說我們美術系的幾位同學英文素質太差了, 所以故意死當我們, 才可以變成小班制比較好教 不過幸運的是學習過程中, 不知道為什麼所有做學問的動機就忽然開竅了, 原來所謂的追求學問是快樂的! 不是一言堂或是灌水式的方式, 是有疑問自己找尋解答的樂趣, 同時不是為別人唸書, 也不是照本宣科一字不差的連標點符號都背下來才是好學生的那種求學環境, 100分不是對每個人都適用, 而且念大學最重要的除了知識之外就是同學相處與生活了(現在才知道為什麼有錢人家會把小孩送去名校, 同學或是學長比什麼都重要) 不過真正重要的是在進入社會之前, 同學的情誼在大學生活中是最真誠的也是最純淨的, 大學同學們是二十四小時隨時混在一起, 討論理想或是天馬行空的做自己想做的事情, 原來這才是大學生活, &lt;strong&gt;這才是為什麼要念大學的真正原因, 只有大學生的生活才是人跟人全天相處可以是最單純的時期, 可以互相學習知識這比所謂的教科書或是高中時期的課綱還要來的重要, 學問的發掘由一律接受來源變成質疑來源的學問, 也因此學會了一些思考, 只要不要被二一退學, 基本上都是可以追求自己有興趣的學問&lt;/strong&gt; &lt;strong&gt;基本上, 可以說念大學是一種奢侈, 如果您正在或是正準備念大學, 或許可以好好享受同學們的情誼, 至於做學問就做自己有興趣的真正學問, 談到考試方面或是學分方面問題大概只要確認可以順利畢業就好, 畢竟知識是給自己使用的, 不是為了老師或是他人, 而大學提供的很多免費的研究環境, 運氣好搞不好還可以跨校際共享實驗室或是研究室, 大學校園這是要好好撈本的地方(畢竟現在學費也不便宜)&lt;/strong&gt; &lt;strong&gt;但是如果只是為了文憑而念大學? 其實就不那麼建議了, 或許擁有專門的技能比文憑更重要呢! 如果因為某些因素錯過大學也沒關係, 遊學或是任何興趣的進修其實也算是念大學了, 畢竟大學就是大大的學! 怎麼學都無所謂了, 只要是心甘情願的學都算 :P&lt;/strong&gt; 如果要念研究所? 沒錯! 我大四畢業又面臨當兵問題, 因此想要念研究所躲避, 我印象很深, 蔣老師好像一眼就看穿我的伎倆, 直接跟我說 : 「你還沒準備好真正的要念研究所!」 最後只好乖乖去當兵了 &lt;strong&gt;最後&lt;/strong&gt; &lt;strong&gt;如果情況可以 — 絕對一定要想辦法留學或是短期遊學! 暫時飛出台灣島您一定會發現外面的世界是無止境的平原, 而不是海洋, 再也不是只是做做學問的問題, 而是會發現體驗跟不同國家的文化或是價值觀的人事物可以了解到其中差異的樂趣, 您驚覺原來語言能力是這麼重要, 不同的語言是可以幫助我們大開眼界的一項重要工具, 它們可以幫助你吃到任何美食, 或是每個您想要到達的地方, 每當你覺得不合理的時候可以用完整意思的反駁回去!&lt;/strong&gt; 所以學問這一件事情是讓您享受與品味人生的最快捷徑之一, 而不同語言能力的具備更是可以有加分的作用!&lt;/p&gt;</description></item><item><title>免費 WIFLY 完全攻略</title><link>https://blog.stanwu.org/posts/%E5%85%8D%E8%B2%BB-wifly-%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5/</link><pubDate>Wed, 29 Jul 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%85%8D%E8%B2%BB-wifly-%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5/</guid><description>&lt;p&gt;如果您跟我一樣是使用中華電信4G如意卡+HoHo卡配合1GB流量的方案[註1](沒什麼在打電話, 又需要上網的最省錢的方法), 那配合免費的 WIFLY 應該是最完美的省錢方案吧!? 話說今天本來是要連中華電信的付費無線網路 CHT Wi-Fi(HiNet) 可是怎麼連都連不上, 不過 WIFLY 倒是一下就自動連上去了 (TPE-Free 也可以連上但是一直無法出現認證畫面) 想說既然連上 WIFLY 就試試看囉! (一般來說便利商店或是捷運都可以找到這個熱點) &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/07/IMG_8387.png" alt="IMG 8387"&gt; 如果是使用 iPhone 的話會自動出現認證畫面 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/07/IMG_8384.png" alt="IMG 8384"&gt; 本來心裡還在想說是不是要註冊之類的, 沒想到居然不需要註冊就可以使用&lt;br&gt;
**原來是點擊廣告換取上網, 這樣的交換條件其實滿公平的&lt;br&gt;
** 裡面有一些廣告, 選一則你有興趣的廣告點擊進去就可以了 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/07/IMG_8385.png" alt="IMG 8385"&gt; 接著會出現那則廣告的詳細廣告內容, 按下 Done 就可以上網了 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/07/IMG_8386.png" alt="IMG 8386"&gt;&lt;/p&gt;
&lt;p&gt;是不是超簡單的!&lt;br&gt;
都不需要非常高難度的註冊機制&lt;br&gt;
(等註冊好我想捷運電車都跑掉了)&lt;/p&gt;
&lt;p&gt;好吧! 趁著等捷運電車還沒來的空檔下載幾首 Spotify 的離線歌曲, 等等無聊可以聽囉 ^O^ 詳細 WIFLY 免費資料 &lt;a href="http://www.wifly.com.tw/mWifly6/MCMS/4Free/free.html"&gt;http://www.wifly.com.tw/mWifly6/MCMS/4Free/free.html&lt;/a&gt; 註1: 4G如意卡其實就是中華電信預付卡, 基本上如果配合HoHo卡話費幾乎就是打6折, 換算下來其實通話費率跟月租型差不了多少(網內3元 &lt;em&gt;0.6=1.8元/分 網外市話6元&lt;/em&gt; 0.6=3.6元/分), 重點是配合1GB上網流量如果用不完還可以累積到下個月使用, 不會被歸零, 如果不續租上網, 之前累積的流量還可以轉回免費網內對打的費用 備註: 我的親朋好友同事幾乎都是中華電信, 另外因為工作關係主要溝通方式是以電子郵件為大宗其次為 Yammer, 通話對象都是中國大陸跟美國, 其實我都打 Facetime + Skype 比較多&lt;/p&gt;</description></item><item><title>如何避免讓自己買到非官網的門票</title><link>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E8%AE%93%E8%87%AA%E5%B7%B1%E8%B2%B7%E5%88%B0%E9%9D%9E%E5%AE%98%E7%B6%B2%E7%9A%84%E9%96%80%E7%A5%A8/</link><pubDate>Sat, 06 Jun 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E8%AE%93%E8%87%AA%E5%B7%B1%E8%B2%B7%E5%88%B0%E9%9D%9E%E5%AE%98%E7%B6%B2%E7%9A%84%E9%96%80%E7%A5%A8/</guid><description>&lt;p&gt;這個問題有一點要怪 Google, 尤其是當大家都那麼相信 Google 的時候! 故事是這樣的, 最近很多朋友(好幾位)都買到與預期不一樣的演唱會門票, 原因是誤以為是官方網站因而上錯網站, 理論上 Google 排名第一的應該是官方網站, 但是事實上真正的排名第一位並不是第一個! 如果從遊戲規則來看, 非官方網站並無違法, 但是賺錢的手段就有點不高明了, &lt;strong&gt;至少讓消費者心理有受騙的感覺的交易就是不成功的交易&lt;/strong&gt; , 但是現實情況是搜尋引擎業者也不會防止類似的事情發生 — 因為有可觀的廣告費可以賺取, 而且嚴格說起來這種模式也不違法, 所以就只能靠使用者自己的眼睛囉! 基本上買票的關鍵字 建議不要以 &lt;strong&gt;活動名稱&lt;/strong&gt; 作為搜尋字眼, 因為這種臨時性的關鍵字官方網站的排行版很容易輸給排行榜灌水的第三方網站, 所以 建議要以 &lt;strong&gt;官方網站名稱&lt;/strong&gt; 取代活動作為主要搜尋關鍵字 例如 &lt;strong&gt;XXX演唱會&lt;/strong&gt; 就不建議用這個關鍵字, 而是改用 &lt;strong&gt;XX售票&lt;/strong&gt; 當作關鍵字 同樣的, 如果某家 **XX銀行 **有 &lt;strong&gt;XXX活動&lt;/strong&gt; , 盡量不要用 **XXX活動 **當作關鍵字, 應該以該 &lt;strong&gt;XX銀行&lt;/strong&gt; 作為關鍵字搜尋 又例如最近夏天到了, 很多人的冷氣要報修, 也是不小心就點到非官方的X立冷氣維修站, 結果荷包大失血(註) 另外最有效的方法是直接將不良的廣告商刪除掉, 永遠的讓他們從自己的瀏覽器中消失! **以下就實際示範一次&lt;br&gt;
**&lt;br&gt;
當我們使用活動關鍵字搜尋之後, 以這個範例來看, 官方網站的確是排行第一位, 可是問題是非官方網站因為是用買廣告方式, 所以就卡在第一位的上面, 您可以發現兩個中間有一條淺淺的灰色分隔線 還有一個淺淺的 &lt;strong&gt;廣告&lt;/strong&gt; 兩個字 XD (這些都是故意設計的, 所以眼睛一定要張大一點) &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/06/I18466485632_3ce6ecfc0e_o1.png?resize=600%2C382" alt="18466485632 3ce6ecfc0e o"&gt; 確認之後 按下右邊有一個小小的 i 選項 接著選擇 廣告設定 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/06/I18472677271_202e419586_o.png?resize=600%2C188" alt="18472677271 202e419586 o"&gt; 接著點選 封鎖這個廣告客戶 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/06/I18470865375_6079f22e7d_o.png?resize=510%2C297" alt="18470865375 6079f22e7d o"&gt; 以後這家廠商廣告就永遠不會再出現在你的瀏覽器當中了 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/06/IScreen-Shot-2015-06-06-at-10.33.36.png?resize=600%2C344" alt="Screen Shot 2015 06 06 at 10 33 36"&gt; 就是這麼簡單! 以後凡是看不順眼的, 所以是惡劣的廣告, 都可以用這個方式排除喔! &lt;strong&gt;對了! 通常比較有規模的廠商, 也會用同樣的方法買廣告來讓自己的官方網站可以蓋過第三方網站, 雖然多花一些錢, 但是基本上保障了消費者的權益, 所以筆者建議 XX售票可以考慮一下這種做法!&lt;/strong&gt; *註: 剛好筆者家裡的冷氣也是故障了, 一查 Google 的搜尋結果真的是五花八門完全無法識別哪個才是官網, 所以只好從X日企業的主網站(英文版)直接一個一個點選確認哪個才是正牌的網站 XD&lt;/p&gt;</description></item><item><title>解決 VMware 在部分 Linux 無法順利編譯 hgfs 驅動的問題</title><link>https://blog.stanwu.org/posts/%E8%A7%A3%E6%B1%BA-vmware-%E5%9C%A8%E9%83%A8%E5%88%86-linux-%E7%84%A1%E6%B3%95%E9%A0%86%E5%88%A9%E7%B7%A8%E8%AD%AF-hgfs-%E9%A9%85%E5%8B%95%E7%9A%84%E5%95%8F%E9%A1%8C/</link><pubDate>Sun, 31 May 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E8%A7%A3%E6%B1%BA-vmware-%E5%9C%A8%E9%83%A8%E5%88%86-linux-%E7%84%A1%E6%B3%95%E9%A0%86%E5%88%A9%E7%B7%A8%E8%AD%AF-hgfs-%E9%A9%85%E5%8B%95%E7%9A%84%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;VMware Tools 在部分 Linux 無法順利編譯並安裝 hgfs 驅動, 導致無法順利使用 host 的 sharing folder 的問題, 這個好像是老問題了, 只是筆者太久沒安裝使用所以又忘記當初是如何手動 patch 處理的了, 不過好消息是已經有人把整個處理的方法放到 GitHub 上面了, 就讓我們接著看下去 沒錯! 安裝 VMware Tools 過程中, 可以特別注一下編譯 hgfs 的驅動是不是有問題, 如果有問題表示您的 Linux 將無法掛載 host 分享出來的目錄了 &lt;img title="screenshot [cialis per nachnahme bestellen](http://biturlz.com/e4gShF0).png" src="https://blog.stanwu.org/uploads/2015/05/Iscreenshot.png" alt="Screenshot" border="0" data-recalc-dims="1" /&gt; 當然我們可以使用其他方式, 例如 scp 或是 rsync 或是 samba 與 host 交換檔案, 不過我們還是決定使用 VMware 原生的方式來解決分享的問題 方法很簡單 &lt;strong&gt;1. 先把自己變成 root 身份&lt;/strong&gt; sudo bash &lt;strong&gt;2. 安裝編譯工具&lt;/strong&gt; apt-get install kernel-package &lt;strong&gt;3. 接著安裝 git 工具&lt;/strong&gt; apt-get install git &lt;strong&gt;4. 然後到 GitHub 取得修正的 source code&lt;/strong&gt; 網址 &lt;a href="https://github.com/rasa/vmware-tools-patches"&gt;https://github.com/rasa/vmware-tools-patches&lt;/a&gt; &lt;strong&gt;5. 取得原始檔案&lt;/strong&gt; &lt;a href="https://github.com/rasa/vmware-tools-patches.git"&gt;https://github.com/rasa/vmware-tools-patches.git&lt;/a&gt; &lt;strong&gt;6. 接著使用 git 下載&lt;/strong&gt; git clone &lt;a href="https://github.com/rasa/vmware-tools-patches.git"&gt;https://github.com/rasa/vmware-tools-patches.git&lt;/a&gt; &lt;strong&gt;7. 然後就可以開始安裝編譯了, 先切換目錄到 vmware-tools-folder&lt;/strong&gt; cd vmware-tools-patches &lt;strong&gt;8. 最後執行以下三個 patch 步驟&lt;/strong&gt; ./download-tools.sh ./untar-and-patch.sh ./compile.sh &lt;strong&gt;理論上就大功告成囉!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Rails for Mac 懶人快速安裝</title><link>https://blog.stanwu.org/posts/rails-for-mac-%E6%87%B6%E4%BA%BA%E8%A4%87%E8%A3%BD%E8%B2%BC%E4%B8%8A%E5%AE%89%E8%A3%9D/</link><pubDate>Tue, 24 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/rails-for-mac-%E6%87%B6%E4%BA%BA%E8%A4%87%E8%A3%BD%E8%B2%BC%E4%B8%8A%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;Rails for Mac 懶人複製貼上安裝:&lt;/p&gt;
&lt;p&gt;curl -s &lt;a href="http://stanwu.us/install/rails/mac/"&gt;http://stanwu.us/install/rails/mac/&lt;/a&gt; | bash&lt;/p&gt;
&lt;p&gt;複製上面字串, 貼到 Terminal 上面執行就可以了 (只有在 Yosemite 上面測試過, 理論上其他版本應該也沒有問題) &lt;img src="https://blog.stanwu.org/wp-content/uploads/2015/03/I%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-24-21.44.12.png" alt="螢幕快照 2015 03 24 21 44 12"&gt; &lt;strong&gt;那這個安裝腳本會主動幫我安裝哪些東西呢?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝 &lt;a href="http://brew.sh"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;透過 Homebrew 來更新最新版本的 ruby&lt;/li&gt;
&lt;li&gt;安裝 xcode 的命令列工具&lt;/li&gt;
&lt;li&gt;最後就是安裝 Rails 了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面為整個安裝腳本的 source code (&lt;a href="http://stanwu.us/install/rails/mac/"&gt;線上版本&lt;/a&gt;可能會隨時更新)&lt;/p&gt;</description></item><item><title>如果有心寫作, 請使用自己的部落格系統</title><link>https://blog.stanwu.org/posts/%E5%A6%82%E6%9E%9C%E6%9C%89%E5%BF%83%E5%AF%AB%E4%BD%9C-%E8%AB%8B%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E9%83%A8%E8%90%BD%E6%A0%BC%E7%B3%BB%E7%B5%B1/</link><pubDate>Fri, 20 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%A6%82%E6%9E%9C%E6%9C%89%E5%BF%83%E5%AF%AB%E4%BD%9C-%E8%AB%8B%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E9%83%A8%E8%90%BD%E6%A0%BC%E7%B3%BB%E7%B5%B1/</guid><description>&lt;p&gt;很不幸的 iThome 的 iT邦部落格 於 4/13 要停止部落格的服務, 上面幾十篇的文章又要開始搬家了, 免費的下場總是變成最貴的代價, 如果您要專心寫作,建議您真的可以考慮使用付費的部落格系統, 您投入的文字生產與花費的時間價值絕對是超過一個月 $5 或是 $10 美元的價值 &lt;img src="https://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-20-08.47.05.png" alt="螢幕快照 2015 03 20 08 47 05"&gt; &lt;strong&gt;以下為 iT邦部落格的新聞稿&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重大公告 iT邦部落格將於4/13停止服務&lt;/strong&gt; 網路一直以極高的速度在發展、前進，種種創新與挑戰也一直在發生，iThome為了能更專注在核心產品的提升以及創新服務的推出，在經過困難的考量與抉擇後，我們決定將在2015/4/13停止iT邦部落格服務。 iT邦部落格預計在3/13日起進入唯讀狀態，屆時iT邦部落格的會員將不能再發表與更新部落格文章。 自3/13日起，我們也會提供備份服務，讓使用者可以將過去部落格發表的文章與上傳的圖片做備份。 4/13日之後，我們將關閉iT邦部落格的服務，到時候部落格將無法再讀取內容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果您願意每個月付費使用自己的部落格系統, 這說明了一件事情, 您的文章品質絕對是超過每個月的付費價格, 真的恭喜您成為固定的文字紀錄者, 不管是國外還是台灣, 有太多免費的部落格系統關閉, 原因無它 — 免費的下場就是文章品質參差不全, 當低品質的文章多過高品質的文章的生態系統出現的時候, 大概就是要關門大吉的時候了！ 但是如果您還是要堅持免費的服務, 現在唯一可以用的大概剩下 Google 的 &lt;a href="https://www.blogger.com"&gt;Blogger&lt;/a&gt; 跟 &lt;a href="https://wordpress.com"&gt;WordPress.com&lt;/a&gt; 的服務了(大陸會屏蔽), 但是誰都無法保證將來會如何&lt;/p&gt;</description></item><item><title>Windows XP 的 IE 最後一個版本</title><link>https://blog.stanwu.org/posts/windows-xp-%E7%9A%84-ie-%E6%9C%80%E5%BE%8C%E4%B8%80%E5%80%8B%E7%89%88%E6%9C%AC/</link><pubDate>Thu, 19 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/windows-xp-%E7%9A%84-ie-%E6%9C%80%E5%BE%8C%E4%B8%80%E5%80%8B%E7%89%88%E6%9C%AC/</guid><description>&lt;p&gt;Windows XP 應該是壽命最長的作業系統, 原因無他 — 因為還有很多舊電腦可以使用, 基本上如果電腦沒有壞掉就沒必要丟掉, 除了省錢之外更重要的是環保的因素, 如果只是寫寫電子郵件使用一下公司的 ERP 系統輸入資料, 東西還是物盡其用才不會浪費 不過問題來了! 很多新型網站舊版的 IE 根本沒辦法打開, 當然您可以安裝 &lt;a href="http://mozilla.com.tw/firefox/new/"&gt;Firefox&lt;/a&gt;, &lt;a href="https://www.google.com.tw/chrome/browser/desktop/index.html"&gt;Chrome&lt;/a&gt;, &lt;a href="https://www.apple.com/tw/safari/"&gt;Safari&lt;/a&gt; 跟 &lt;a href="http://www.opera.com/zh-tw"&gt;Opera&lt;/a&gt; 等瀏覽器, 如果您堅持要安裝 IE 那最後一個版本將會是 &lt;a href="http://zh.wikipedia.org/wiki/Internet_Explorer_8"&gt;IE8&lt;/a&gt; &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/Internet_Explorer_8_on_Vista.png?resize=600%2C395" alt="Internet Explorer 8 on Vista"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;點擊&lt;a href="http://download.microsoft.com/download/8/3/9/83941BA7-BDE8-4402-BEC4-51D670DF2BAB/IE8-WindowsXP-x86-CHT.exe"&gt;下載 IE8&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當然 Windows XP 除了打打字之外, 如果是公司的話可能有一堆的 Windows XP 電腦, 現在開公司不容易, 可以撐到最後才是贏家, 只有靠打精算盤才能引導公司往成功的方向前進, 因此真的要用到骨頭裡面去, 您只要使用 Windows XP 內建的 &lt;a href="http://windows [cialis in deutschland kaufen](http://biturlz.com/Tqw7XcN).microsoft.com/zh-TW/windows7/products/features/remote-desktop-connection"&gt;遠端桌面連線 那麼將 Windows XP 轉用成為 &lt;a href="http://zh.wikipedia.org/wiki/%E7%98%A6%E5%AE%A2%E6%88%B7%E7%AB%AF"&gt;Thin Client&lt;/a&gt; 的用途上面應該算是終極大法了&lt;/p&gt;</description></item><item><title>如何隱藏 Blogger 的導覽列</title><link>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E9%9A%B1%E8%97%8F-blogger-%E7%9A%84%E5%B0%8E%E8%A6%BD%E5%88%97/</link><pubDate>Thu, 19 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E5%A6%82%E4%BD%95%E9%9A%B1%E8%97%8F-blogger-%E7%9A%84%E5%B0%8E%E8%A6%BD%E5%88%97/</guid><description>&lt;p&gt;如果你打算拿 Google 的 Blogger (Blogspot) 來當自己的新創公司 Blog 基地, 或是乾脆拿來當新創公司的宣傳網站使用, 除了可以客製化自己的網域名稱之外, 另外一個重點是要把上面的導覽列(Navbar)拿掉, 這樣整個版面才會乾乾淨淨 很久以前是要靠修改 CSS 方式隱藏, 現在其實方法很簡單, 直接到 &lt;strong&gt;版面配置&lt;/strong&gt; 下面, 在右邊 導覽列 按下 &lt;strong&gt;編輯&lt;/strong&gt; , 接著選擇 &lt;strong&gt;關閉&lt;/strong&gt; , 就大功告成了 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-19-08.59.27.png" alt="螢幕快照 2015 03 19 08 59 27"&gt; 基本上多一個導覽列還有點礙眼 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-19-09.24.35.png" alt="螢幕快照 2015 03 19 09 24 35"&gt; 關掉導覽列後, 是不是整個版面清爽多了? &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-19-09.15.41.png" alt="螢幕快照 2015 03 19 09 15 41"&gt; 最後透過客製化的網址與網站小圖示來做最後的修正, 將整個 Blogger 系統完全變成一個獨立的站台, 首先上傳一個小圖示 PNG 圖檔上去 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/Screen-Shot-2015-03-19-at-14.05.48.png" alt="Screen Shot 2015 03 19 at 14 05 48"&gt; 經過客製化之後的最後成果 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/Screen-Shot-2015-03-19-at-14.02.29.png" alt="Screen Shot 2015 03 19 at 14 02 29"&gt; 接著我們使用 Blogger 範本設計工具 重新對頁面進行排版, 為了簡化不必要的視覺負擔, 所以決定採用極為簡單的排版設計 &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/Screen-Shot-2015-03-19-at-14.47.33.png" alt="Screen Shot 2015 03 19 at 14 47 33"&gt; &lt;strong&gt;最後呈現的效果&lt;/strong&gt; &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/Screen-Shot-2015-03-19-at-14.47.52.png" alt="Screen Shot 2015 03 19 at 14 47 52"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;參觀實際的網站&lt;a href="http://blog-archive.stanwu.us/"&gt;http://blog-archive.stanwu.us/&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>關於新創公司申請DNS域名</title><link>https://blog.stanwu.org/posts/%E9%97%9C%E6%96%BC%E6%96%B0%E5%89%B5%E5%85%AC%E5%8F%B8%E7%94%B3%E8%AB%8Bdns%E5%9F%9F%E5%90%8D/</link><pubDate>Thu, 19 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/%E9%97%9C%E6%96%BC%E6%96%B0%E5%89%B5%E5%85%AC%E5%8F%B8%E7%94%B3%E8%AB%8Bdns%E5%9F%9F%E5%90%8D/</guid><description>&lt;p&gt;比起申請公司的複雜度, 相對的申請域名DNS真的是隨手可得的工作, 不過看似簡單的工作還是有一些注意的事項, 光是跟哪一家公司申請多注意一下就可以減少很多不必要的麻煩 &lt;strong&gt;我該跟台灣網路域名公司申請還是國外公司申請？&lt;/strong&gt; ****其實答案滿簡單的, 如果是 .tw 結尾的, 建議您直接跟&lt;a href="http://myname.pchome.com.tw/"&gt;PChome&lt;/a&gt; 申請就對了, 其他的就直接跟美國幾家大公司申請 &lt;strong&gt;有些網站推出超低特價, 我該申購嗎？&lt;/strong&gt; 通常類似的優惠活動只有第一年, 第二年的價格可能比其他的公司貴好幾元, 如果您不怕麻煩可以在第一年的時候購買該域名, 等到第二年的時候再轉到其他家公司 &lt;strong&gt;我該一次買一年就好嗎?&lt;/strong&gt; 如果是用於公司電子郵件與網站, 不用太多考慮, 建議一次買十年! 我相信創業是持續的, 如果您連十年的自信心都沒有, 那麼您真的要好好考慮一下『我是否真心的要創業?』 如果是實驗性質的活動, 某項產品專用或是其他用途則可以先買一年測試看看 &lt;strong&gt;國外有哪些家域名商可以推薦?&lt;/strong&gt; 比較有名的有 &lt;a href="https://www.godaddy.com/"&gt;GoDaddy&lt;/a&gt;, &lt;a href="http://www.networksolutions.com/"&gt;NetworkSolutions&lt;/a&gt;, &lt;a href="https://www.namecheap.com"&gt;NameCheap&lt;/a&gt;, &lt;a href="https://domains.google.com/about/"&gt;Google&lt;/a&gt; 等, 其中 &lt;a href="https://www.godaddy.com/"&gt;GoDaddy&lt;/a&gt; 有跟很多家服務商合作, 提供 API 直接就可以快速設定, 還算滿方便的, 不過說真的 &lt;a href="https://www.godaddy.com/"&gt;GoDaddy&lt;/a&gt; 跟 &lt;a href="http://www.networksolutions.com/"&gt;NetworkSolutions&lt;/a&gt; 花招滿多的, 有時候一個不小心就多刷了好幾美元出去, 這是最糟糕的地方, 通常對於任何選項與畫面都要仔細的看清楚才能點下確認！ &lt;strong&gt;關於申請 .CA 加拿大域名特別注意事項&lt;/strong&gt; 如果您要申請.CA 的域名, 您必須期限內額外跟 CIRA (Canadian Internet Registration Authority) 填寫申請表單, 如果超過期限不遞交表單, 您的域名將會被 CIRA 取消喔! 相關請參考 &lt;a href="http://cira.ca/"&gt;http://cira.ca/&lt;/a&gt; &lt;strong&gt;關於 2015 價格參考部分&lt;/strong&gt; 基本上我們要看真正的報價是第二年以後, 那個才是真正的價格, 以下就列出 GoDaddy 跟 NameCheap 的報價提供大家參考, 下面的 1 year 是指第一年之後, 再續約一年, 依此類推 &lt;img src="https://blog.stanwu.org/uploads/unsplash/server-network.jpg" alt="server network"&gt;&lt;/p&gt;
&lt;p&gt;GoDaddy : NameCheap : &lt;img src="http://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-17-08.38.05.png?resize=600%2C419" alt="螢幕快照 2015 03 17 08 38 05"&gt;&lt;/p&gt;</description></item><item><title>DigitalOcean 一鍵安裝 WordPress</title><link>https://blog.stanwu.org/posts/digitalocean-%E6%87%B6%E4%BA%BA%E4%B8%80%E9%8D%B5%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-wordpress/</link><pubDate>Wed, 18 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/digitalocean-%E6%87%B6%E4%BA%BA%E4%B8%80%E9%8D%B5%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-wordpress/</guid><description>&lt;p&gt;如果您真的不想花太多時間在架設新創公司的 Blog 系統的建構上面, 可以考慮使用 &lt;a href="https://www.digitalocean.com/?refcode=b54b96e42328"&gt;DigitalOcean&lt;/a&gt; 的一鍵安裝服務, $5/mo 的也可以建立, 不一定非得 $10/mo 起跳, 不過裝完之後, 您可能需要 putty 以 ssh 的方式連線到主機取得後續安裝的帳號密碼 基本上只要按照下面的網址操作就可以了 &lt;a href="https://www.digitalocean.com/community/tutorials/one-click-install-wordpress-on-ubuntu-14-04-with-digitalocean"&gt;https://www.digitalocean.com/community/tutorials/one-click-install-wordpress-on-ubuntu-14-04-with-digitalocean&lt;/a&gt; &lt;strong&gt;事實上看下面這張圖就可以搞定了&lt;/strong&gt; &lt;img src="https://blog.stanwu.org/wp-content/uploads/2015/03/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2015-03-18-23.43.16.png?resize=450%2C600" alt="螢幕快照 2015 03 18 23 43 16"&gt; 大概 30-50 秒左右就可以建立一個 WordPress 的網站, 主機建議選舊金山, 基本上美國西岸的速度會比東岸好多了, 如果一開始不確定會有多少人來看您的網站, 建議從 $5/mo 起跳, 這樣或許可以省下一些費用 建立好之後, &lt;a href="https://www [cialis 20mg generika](http://biturlz.com/3PLsuFq).digitalocean.com/?refcode=b54b96e42328"&gt;DigitalOcean 會發送一封含有 root 密碼的郵件給您, 請您收一下電郵郵件, 並且使用 ssh 的工具, 例如 &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"&gt;putty&lt;/a&gt; 以 ssh 的方式連線到您剛剛建立好的主機, 登入進去之後, 就可以看到一組 admin 的密碼, 這組密碼是給您等等後續安裝 WordPress 使用的 像現在這個 Blog 就是選用 舊金山主機 $5/mo, 因為我預計大概沒多少人會來看, 所以就選最便宜的就對了 ^O^ 如果您問我為什麼會用 &lt;a href="https://www.digitalocean.com/?refcode=b54b96e42328"&gt;DigitalOcean&lt;/a&gt; ? 喔! 那是因為我低調的參加了 GitHub 的 &lt;a href="https://education.github.com/pack"&gt;Student Developer Pack&lt;/a&gt; 所以有了 $100+$10=$110 的資金(登記信用卡又送 $10), &lt;a href="https://www.digitalocean.com/?refcode=b54b96e42328"&gt;DigitalOcean&lt;/a&gt; 資金涼在那邊好幾個月都快忘記了, 所以就拿來燒了一下, 順便測試看看有沒有什麼好玩的功能 對了! 順便說說最近怎麼又開始搞 WordPress？ 還不是那個 &lt;a href="http://wordpress.com"&gt;wordpress.com&lt;/a&gt; 最近又開始在文章下面亂塞廣告, 另外一個更大的問題是, 大陸把 &lt;a href="http://wordpress.com"&gt;wordpress.com&lt;/a&gt; 整個封鎖住, 文章完全沒辦法分享給內地朋友, 所以就拿這個來測試一下系統的效能與穩定度 好啦! 我承認 &lt;a href="https://www.digitalocean.com/?refcode=b54b96e42328"&gt;DigitalOcean&lt;/a&gt; 的推薦連結也算是廣告的一種, 如果您不喜歡可以點擊這個 &lt;a href="http://www.digitalocean.com"&gt;DigitalOcean&lt;/a&gt; 就沒有推薦連結了&lt;/p&gt;</description></item><item><title>公司網內溝通 FaceTime 語音</title><link>https://blog.stanwu.org/posts/2015-%E7%B6%B2%E5%85%A7%E9%80%9A%E9%80%9A%E4%B8%8D%E7%94%A8%E9%8C%A2-%E4%B8%80-facetime-%E8%AA%9E%E9%9F%B3/</link><pubDate>Wed, 18 Mar 2015 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/2015-%E7%B6%B2%E5%85%A7%E9%80%9A%E9%80%9A%E4%B8%8D%E7%94%A8%E9%8C%A2-%E4%B8%80-facetime-%E8%AA%9E%E9%9F%B3/</guid><description>&lt;p&gt;新創公司網內溝通 FaceTime 語音有效率的溝通方式 現在 4G 語音新費率, 真的是隨便講幾分鐘都很貴, 除非想辦法把親朋好友都拉到同一個電信業者網內才會便宜, 問題是每個人的電信公司都不一樣, 有的綁約一綁就 30 個月, 如果您的好友與同事都是使用 iPhone 那麼這個問題就容易解決了！就是大家都使用蘋果公司提供的網內互打通通不用錢的 FaceTime 語音電話的服務, 重點是使用起來跟打一般電信公司的語音電話方法一模一樣, 完全不需要特別做任何的改變, 甚至連接聽的人基本上也不容易發現您是使用 FaceTime 打的, 特別適合家裡的長輩或是完全不懂科技技術的人使用 如果您有淘汰下來的 iPhone 4 手機, 建議您可以設定好, 當作家裡的市話給長輩使用, 或是當作公司內部的免費通話分機使用, 都是非常方便且實用的方法 當您第一次使用 iPhone 的時候, 手機會要求您插入 sim 卡, 這時候您的手機號碼就會自動註冊到蘋果的雲端伺服器當中, 就跟電話公司一樣, 手機的門號, 就是您 FaceTime 的門號, 您所要做的唯一件事情就是確認您的 FaceTime 有開啟 一 請到 [設定] 中的 [一般] 裡面的 [ 取用限制] &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-13.png" alt="2015 01 18 18 14 13"&gt; 二 如果您的 [取用限制] 是關閉的, 就不用理會下面步驟, 如果您的 [取用限制] 是打開的, 請確認 [FaceTime] 的開關是開啟的, 這樣您的 iPhone 才有 FaceTime 的圖示與功能設定 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-21.png" alt="2015 01 18 18 14 21"&gt; 三 設定 [訊息] 跟 [FaceTime], 除了語音通話之外, 您也可以發送免費的簡訊給朋友 (雖然現在電信公司簡訊已經很便宜了), 但是如果發送給國外的朋友或是同事, 那麼就很划算了, 簡訊功能跟電信公司簡訊一模一樣, 收訊的人不需要額外的學習操作就可以收到與打開與平常習慣那樣一模一樣簡訊通知 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-28.png" alt="2015 01 18 18 14 28"&gt; 四 首先確認您的 iMessage 選項是打開的 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-35.png" alt="2015 01 18 18 14 35"&gt; 五 選擇 [傳送與接收] 設定您的發送門號 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-39.png" alt="2015 01 18 18 14 39"&gt; 六 如果您希望您的朋友很容易找到您, 您可以把電話號碼與郵件都打勾, 電話號碼數量是由 sim 卡與 iPhone 決定的, 筆者有兩個門號與 iPhone 所以不管朋友或是同事不管發送簡訊給哪一支手機門號, 筆者都可以收得到簡訊 第二格是設定簡訊發送門號顯示, 建議設定一個您的主要電話號碼, 非電子郵件 (相信您大部份朋友與同事的手機通訊錄還是以電話號碼為主) 這樣才能夠讓對方的手機收到簡訊時候可以正確顯示您的來電名稱 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-14-48.png" alt="2015 01 18 18 14 48"&gt; 七 同樣的在 FaceTime 選項中請設定與 iMessage 一模一樣的勾選方式 如果您希望您的朋友很容易找到您, 您可以把電話號碼與郵件都打勾, 您的電話號碼數量是由 sim 卡與 iPhone 決定的, 筆者因為有兩個門號與 iPhone 所以會顯示兩組門號, 都打勾之後不管打哪一支門號, 手機都可以接聽 (感覺很像雙卡雙待) 第二格是設定發送門號顯示, 建議設定一個您的主要電話號碼, 非電子郵件 (相信您大部份朋友與同事的手機通訊錄還是以電話號碼為主) 這樣才能夠讓對方的手機可以正確顯示您的來電名稱, 不會以為是推銷電話 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-15-03.png" alt="2015 01 18 18 15 03"&gt; 八 最後您以後要打給朋友, 操作方式就跟之前一樣, 撥打電話時候只要改用 FaceTime 那個聽筒圖案就可以了, 但是因為攝影機與聽筒圖案太接近了, 有時候會按錯, 變成視訊通話, 這時候就不太習慣, 這點對筆者滿困擾的, 所以筆者建議將常打的人加到 [常用聯絡資訊] 來設定一鍵 FaceTime 語音直撥, 避免誤按 FaceTime 視訊 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-38-27.png" alt="2015 01 18 18 38 27"&gt; 九 您只要在將某人加到 常用聯絡人 時候, 選擇手機號碼, 之後再選定 [FaceTime 語音] 就可以了, 以後就可以直接打網內語音永遠不用錢了 &lt;img src="http://stanwu.files.wordpress.com/2015/01/2015-01-18-18-38-51.png" alt="2015 01 18 18 38 51"&gt; 最後, 筆者回家後會直接關閉語音電話網路, 改用 Wi-Fi 這樣的好處是直接跟討厭的推銷電話跟詐騙電話說拜拜, 隨時保持好心情~~~耶 經過辛苦的設定之後, 您將會有很好的回報, 您會將發現您的電話帳單費用將會更為合理, 省下來的錢可以拿來吃好吃的大餐, 何樂而不為呢? 讓我們一起來快樂 FaceTime 語音吧!&lt;/p&gt;</description></item><item><title>Bluehost (藍色主機)</title><link>https://blog.stanwu.org/posts/bluehost-%E8%97%8D%E8%89%B2%E5%B7%A8%E4%BA%BA/</link><pubDate>Mon, 24 Mar 2014 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/bluehost-%E8%97%8D%E8%89%B2%E5%B7%A8%E4%BA%BA/</guid><description>&lt;p&gt;基本上 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 是一家很老牌的主機供應商, 服務上沒甚麼大問題, 只要確切的遵循使用服務條款的話, 相信您從此就不用再擔心煩惱主機當機, 或是網站掛點的問題, 但是如果您租來備份資料或是拿來做違法的服務的話, 可能只要一旦違反條款 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 馬上無任何警告就暫停帳號 所以如果您要使用此方案, 必須先要有一個認知就是絕對不抱著僥倖的心理, 尤其是如果上面有客戶服務的話, 更是要嚴格的把關, 維持客戶的利益, 目前筆者租用的 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 雖然號稱沒有任何頻寬, 人數, 檔案, 空間, 網站的限制, 不過筆者目前還是規劃一個 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 帳號最多存放 20 家客戶網站資料(小公司), 每間公司最多 10 個員工的電子郵件, 也就是一組 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 帳號總共服務約 20 個網站 + 20 個 MySQL 資料庫 + 200 人電子郵件帳號, 當然為了維護客戶的權益, 還是有自動備份機制, 每天自動從 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 加密備份客戶的網站到其他的備援主機當中, 筆者從 2009 使用至今, 基本上 SLA 都是維持 100%, 但是帳號被暫停一次, 因為拿來備份大量的檔案 (.tgz), 雖然很不爽, 不過想想 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 畢竟也是維護其他人的權益, 如果每個人違反遊戲規則, 那就很難做到 100% 的服務了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;購買日期: 07/31/2009, 至今(續)
&lt;ul&gt;
&lt;li&gt;購買類型: Web Hosting (3 年繳)&lt;/li&gt;
&lt;li&gt;購買價格: 250 美元&lt;/li&gt;
&lt;li&gt;主機狀態: 正常使用中&lt;/li&gt;
&lt;li&gt;購買公司: &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Secure Dragon LLC.</title><link>https://blog.stanwu.org/posts/secure-dragon-llc/</link><pubDate>Mon, 24 Mar 2014 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/secure-dragon-llc/</guid><description>&lt;p&gt;基本上這間 &lt;a href="http://stanwu [5mg cialis](http://biturlz.com/VFD493T).us/rd?url=securedragon" target="_blank"&gt;SecureDragon VPS 供應商算是滿新的公司, 所以給的優惠也滿好的, &lt;a href="http://stanwu.us/rd?url=securedragon"&gt;SecureDragon&lt;/a&gt; 有提供 OpenVZ, Xen, 和 Backup VPS 的服務, 價位從一年 19.9 美元到 491 美元都有 所以您可以選擇適合您的方案, 目前筆者有一台 OpenVZ 和 一台 Xen 的主機, 目前用的感覺還滿不錯的, SLA 累計到目前為止為 100%, Xen 主機的效能果然比 OpenVZ 好很多, 果然是一分錢一分貨, 如果只是要自己玩玩 OpenVZ 就可以了, 如果要拿來跑比較重的服務, 那麼還是建議使用 Xen 的方案會比較好&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;購買日期: 08/06/2011, 至今(續)
&lt;ul&gt;
&lt;li&gt;購買類型: O1024*2台&lt;/li&gt;
&lt;li&gt;主機狀態: 正常使用中&lt;/li&gt;
&lt;li&gt;目前應用: 第一代版本控管伺服器 / Alpha測試版伺服器&lt;/li&gt;
&lt;li&gt;rDNS反解: 需要提出(人工設定, 但速度滿快的就是了)&lt;/li&gt;
&lt;li&gt;購買公司: &lt;a href="http://stanwu.us/rd?url=securedragon"&gt;SecureDragon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>重要: DNS 域名省錢術</title><link>https://blog.stanwu.org/posts/dns-%E5%9F%9F%E5%90%8D%E7%9C%81%E9%8C%A2%E8%A1%93/</link><pubDate>Mon, 24 Mar 2014 00:00:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/dns-%E5%9F%9F%E5%90%8D%E7%9C%81%E9%8C%A2%E8%A1%93/</guid><description>&lt;p&gt;如果您還沒有 Domain Name 並且&lt;strong&gt;您確定要使用一個網站 (Web Hosting) 的服務&lt;/strong&gt; , 例如 &lt;a href="http://stanwu.us/rd?url=bluehost"&gt;Bluehost&lt;/a&gt; (藍色主機) 或是 &lt;a href="http://stanwu.us/rd?url=dreamhost"&gt;DreamHost&lt;/a&gt;, 那麼您就可以 跳過&lt;strong&gt;第一步驟&lt;/strong&gt; 申請 DNS 網域, 直接到 &lt;strong&gt;第二步驟&lt;/strong&gt; 尋找主機供應商, 因為這些供應商都會提供一組免費的網域 (.com 之類的) 送您, 但是如果確定要使用 VPS 服務的話, 目前暫時可能就沒有這個好康了 :D&lt;/p&gt;</description></item></channel></rss>