[{"data":1,"prerenderedAt":21238},["ShallowReactive",2],{"search":3,"tag-AI Agent":21235},[4,1339,2210,3914,3996,4588,4833,5266,6468,6883,7067,9807,10604,10790,11480,11804,11856,12253,13819,13909,14794,17639,18399,18952,19165,19482,19863,20286,20406,20774],{"id":5,"title":6,"body":7,"category":1322,"description":1323,"extension":1324,"image":1325,"meta":1326,"navigation":895,"path":1327,"pubDate":1328,"seo":1329,"status":895,"stem":1330,"summary":1331,"tags":1332,"__hash__":1338},"content\u002Farticles\u002F2026-09-04-herdr-skills.md","讓 AI Agent 自己管理 AI Agent：Herdr Skills 進階實戰",{"type":8,"value":9,"toc":1305},"minimark",[10,14,24,27,43,51,59,62,67,74,77,111,114,120,122,126,129,178,181,188,194,196,200,207,245,252,258,278,284,295,297,301,304,334,344,347,350,358,361,363,367,370,449,452,458,461,467,469,473,476,479,516,519,539,542,571,574,608,611,645,648,650,654,657,667,721,724,797,804,830,842,918,927,934,936,940,943,954,1023,1026,1029,1035,1038,1065,1068,1074,1077,1102,1107,1116,1126,1129,1135,1141,1145,1160,1163,1167,1184,1187,1191,1209,1218,1227,1233,1235,1238,1241,1247,1264,1267,1269,1272,1301],[11,12,6],"h1",{"id":13},"讓-ai-agent-自己管理-ai-agentherdr-skills-進階實戰",[15,16,17,18,23],"p",{},"在上一篇〈",[19,20,22],"a",{"href":21},"\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr","AI Agent 時代終端機新選擇：ghostty+herdr","〉中，我們介紹了 Herdr 如何在終端機裡管理多個 AI Agent：工作空間、分頁、窗格，以及一眼就能辨識的 Agent 狀態。",[15,25,26],{},"但當 Agent 的數量開始增加，真正的瓶頸往往不在「能不能同時開很多窗格」，而在於：",[28,29,30,34,37,40],"ul",{},[31,32,33],"li",{},"哪一個 Agent 正在執行？",[31,35,36],{},"哪一個 Agent 卡在授權或提問畫面？",[31,38,39],{},"測試跑完了嗎？",[31,41,42],{},"我能不能讓一個 Agent 幫我啟動另一個 Agent，或收集它的執行結果？",[15,44,45,46,50],{},"Herdr 的答案不是再加一層複雜的控制面板，而是把操作能力交給 Agent 本身。這就是 ",[47,48,49],"strong",{},"Herdr Skills"," 的用途。",[15,52,53,54,58],{},"一句話來說：Herdr Skills 是一份提供給 AI Agent 閱讀的操作手冊，讓它知道何時、如何安全地透過 ",[55,56,57],"code",{},"herdr"," CLI 控制 Herdr。",[60,61],"hr",{},[63,64,66],"h2",{"id":65},"herdr-skills-是什麼","Herdr Skills 是什麼？",[15,68,69,70,73],{},"Herdr 提供一份可重複使用的 ",[55,71,72],{},"SKILL.md"," 檔案，內容不是應用程式，也不是背景服務，而是專門給 AI Agent 理解的 Markdown 指令。",[15,75,76],{},"安裝後，Agent 便能理解 Herdr 的結構與操作規範，例如：",[28,78,79,82,85,88,91,94],{},[31,80,81],{},"查看目前的 workspace、tab、pane 與相鄰 Agent",[31,83,84],{},"分割窗格，並在背景執行指令",[31,86,87],{},"讀取其他窗格的近期輸出或日誌",[31,89,90],{},"等待測試、開發伺服器或其他 Agent 完成",[31,92,93],{},"在相鄰窗格中啟動協作 Agent",[31,95,96,97,100,101,100,104,100,107,110],{},"根據 ",[55,98,99],{},"idle","、",[55,102,103],{},"working",[55,105,106],{},"blocked",[55,108,109],{},"done"," 等狀態決定下一步",[15,112,113],{},"這讓 Herdr 從「人類管理多個終端」進一步變成「人類與 Agent 一起協調多個 Agent」的工作環境。",[115,116,117],"blockquote",{},[15,118,119],{},"Herdr Skills 的核心不是讓 Agent 任意操控終端，而是讓它在明確的上下文與安全邊界中協作。",[60,121],{},[63,123,125],{"id":124},"skills-與-agent-guide用途並不相同","Skills 與 Agent Guide：用途並不相同",[15,127,128],{},"Herdr 官方同時提供兩種文件，名稱相近，但適用對象不同。",[130,131,132,148],"table",{},[133,134,135],"thead",{},[136,137,138,142,145],"tr",{},[139,140,141],"th",{},"文件",[139,143,144],{},"給誰使用",[139,146,147],{},"用途",[149,150,151,165],"tbody",{},[136,152,153,159,162],{},[154,155,156],"td",{},[55,157,158],{},"skills\u002Fherdr\u002FSKILL.md",[154,160,161],{},"在 Herdr 窗格內執行的 AI Agent",[154,163,164],{},"讓 Agent 操作 Herdr",[136,166,167,172,175],{},[154,168,169],{},[55,170,171],{},"agent-guide.md",[154,173,174],{},"協助人類的 AI Agent",[154,176,177],{},"用來解說、安裝與排除 Herdr 問題",[15,179,180],{},"這個差異很重要。",[15,182,183,184,187],{},"如果你的目標是讓 Codex、Claude Code 或其他編程 Agent 幫忙分割窗格、等待測試結果、啟動協作 Agent，應安裝的是 ",[47,185,186],{},"Herdr Skill","。",[15,189,190,191,187],{},"如果你的目標是請 AI 教你如何安裝 Herdr、解釋設定或排除問題，則應參考 ",[47,192,193],{},"Agent Guide",[60,195],{},[63,197,199],{"id":198},"安裝-herdr-skill","安裝 Herdr Skill",[15,201,202,203,206],{},"官方建議透過 ",[55,204,205],{},"npx skills"," 安裝：",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-bash shiki shiki-themes github-light github-dark github-dark","npx skills add herdrdev\u002Fherdr --skill herdr -g\n","bash","",[55,215,216],{"__ignoreMap":213},[217,218,221,225,229,232,235,239,242],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"shcOC","npx",[217,226,228],{"class":227},"sfrk1"," skills",[217,230,231],{"class":227}," add",[217,233,234],{"class":227}," herdrdev\u002Fherdr",[217,236,238],{"class":237},"suiK_"," --skill",[217,240,241],{"class":227}," herdr",[217,243,244],{"class":237}," -g\n",[15,246,247,248,251],{},"其中 ",[55,249,250],{},"-g"," 代表全域安裝，讓支援 Skills 的 Agent 在不同專案中都能使用。",[15,253,254,255,257],{},"如果只希望在目前專案使用，可以省略 ",[55,256,250],{},"：",[208,259,261],{"className":210,"code":260,"language":212,"meta":213,"style":213},"npx skills add herdrdev\u002Fherdr --skill herdr\n",[55,262,263],{"__ignoreMap":213},[217,264,265,267,269,271,273,275],{"class":219,"line":220},[217,266,224],{"class":223},[217,268,228],{"class":227},[217,270,231],{"class":227},[217,272,234],{"class":227},[217,274,238],{"class":237},[217,276,277],{"class":227}," herdr\n",[15,279,280,281,283],{},"安裝完成後，Skill 會以 ",[55,282,57],{}," 的名稱提供給 Agent 使用。",[15,285,286,287,294],{},"若你的 Agent 沒有原生 Skills 系統，也可以將官方 ",[19,288,292],{"href":289,"rel":290},"https:\u002F\u002Fgithub.com\u002Fherdrdev\u002Fherdr\u002Fblob\u002Fv0.8.2\u002Fskills\u002Fherdr\u002FSKILL.md",[291],"nofollow",[55,293,72],{}," 的內容放進專案指令或 Agent 的自訂指令中。",[60,296],{},[63,298,300],{"id":299},"安全關鍵先確認自己真的在-herdr-裡","安全關鍵：先確認自己真的在 Herdr 裡",[15,302,303],{},"Herdr Skill 的第一條規則非常值得理解：",[208,305,307],{"className":210,"code":306,"language":212,"meta":213,"style":213},"test \"${HERDR_ENV:-}\" = 1\n",[55,308,309],{"__ignoreMap":213},[217,310,311,314,317,321,325,328,331],{"class":219,"line":220},[217,312,313],{"class":237},"test",[217,315,316],{"class":227}," \"${",[217,318,320],{"class":319},"slsVL","HERDR_ENV",[217,322,324],{"class":323},"so5gQ",":-",[217,326,327],{"class":227},"}\"",[217,329,330],{"class":227}," =",[217,332,333],{"class":237}," 1\n",[15,335,336,337,340,341,343],{},"只有當 ",[55,338,339],{},"HERDR_ENV=1"," 存在時，Agent 才能使用 ",[55,342,57],{}," CLI 操作目前的 Herdr session。",[15,345,346],{},"這個環境變數代表：目前的 Agent 正在 Herdr 管理的 pane 裡執行，並且可以安全地與本機 Herdr socket 通訊。",[15,348,349],{},"若變數不存在，Skill 要求 Agent 立即停止，並告知使用者自己不在 Herdr 管理的窗格中。",[208,351,356],{"className":352,"code":354,"language":355,"meta":213},[353],"language-text","HERDR_ENV=1\n       │\n       ├── 存在：可安全使用 herdr CLI\n       │\n       └── 不存在：停止操作，避免誤控其他終端會話\n","text",[55,357,354],{"__ignoreMap":213},[15,359,360],{},"這道護欄看起來簡單，實際上非常重要。它避免外部 Agent 因為缺乏正確上下文，而意外控制不屬於自己的終端工作階段。",[60,362],{},[63,364,366],{"id":365},"agent-如何理解-herdr-的世界","Agent 如何理解 Herdr 的世界？",[15,368,369],{},"要讓 Agent 能夠協作，第一步不是直接分割畫面，而是先讀取目前環境。",[208,371,373],{"className":210,"code":372,"language":212,"meta":213,"style":213},"herdr workspace list\nherdr tab list --workspace \"$HERDR_WORKSPACE_ID\"\nherdr pane current --current\nherdr pane list --workspace \"$HERDR_WORKSPACE_ID\"\nherdr agent list\n",[55,374,375,385,408,422,439],{"__ignoreMap":213},[217,376,377,379,382],{"class":219,"line":220},[217,378,57],{"class":223},[217,380,381],{"class":227}," workspace",[217,383,384],{"class":227}," list\n",[217,386,388,390,393,396,399,402,405],{"class":219,"line":387},2,[217,389,57],{"class":223},[217,391,392],{"class":227}," tab",[217,394,395],{"class":227}," list",[217,397,398],{"class":237}," --workspace",[217,400,401],{"class":227}," \"",[217,403,404],{"class":319},"$HERDR_WORKSPACE_ID",[217,406,407],{"class":227},"\"\n",[217,409,411,413,416,419],{"class":219,"line":410},3,[217,412,57],{"class":223},[217,414,415],{"class":227}," pane",[217,417,418],{"class":227}," current",[217,420,421],{"class":237}," --current\n",[217,423,425,427,429,431,433,435,437],{"class":219,"line":424},4,[217,426,57],{"class":223},[217,428,415],{"class":227},[217,430,395],{"class":227},[217,432,398],{"class":237},[217,434,401],{"class":227},[217,436,404],{"class":319},[217,438,407],{"class":227},[217,440,442,444,447],{"class":219,"line":441},5,[217,443,57],{"class":223},[217,445,446],{"class":227}," agent",[217,448,384],{"class":227},[15,450,451],{},"Herdr 的階層可以簡化成：",[208,453,456],{"className":454,"code":455,"language":355,"meta":213},[353],"Workspace\n└── Tab\n    ├── Pane：執行 shell、測試或服務\n    ├── Pane：執行主要 Agent\n    └── Pane：執行協作 Agent\n",[55,457,455],{"__ignoreMap":213},[15,459,460],{},"每一個 workspace、tab、pane 都有穩定的識別 ID。Agent 不應該猜測 ID，也不應該依照畫面順序操作，而是必須從 Herdr 的 JSON 回應中取得正確 ID。",[15,462,463,464],{},"這是自動化最容易被忽略、但最關鍵的原則：",[47,465,466],{},"畫面位置會改變，識別 ID 才是可靠的協作介面。",[60,468],{},[63,470,472],{"id":471},"實戰一用-ai-agent-控制-herdr","實戰一：用 AI agent 控制 herdr",[15,474,475],{},"假設主 Agent 正在修改功能，但希望測試在旁邊獨立執行，不干擾目前工作。",[15,477,478],{},"它可以先建立一個相鄰分屏：",[208,480,482],{"className":210,"code":481,"language":212,"meta":213,"style":213},"herdr pane split --current --direction right --cwd \"$PWD\" --no-focus\n",[55,483,484],{"__ignoreMap":213},[217,485,486,488,490,493,496,499,502,505,507,510,513],{"class":219,"line":220},[217,487,57],{"class":223},[217,489,415],{"class":227},[217,491,492],{"class":227}," split",[217,494,495],{"class":237}," --current",[217,497,498],{"class":237}," --direction",[217,500,501],{"class":227}," right",[217,503,504],{"class":237}," --cwd",[217,506,401],{"class":227},[217,508,509],{"class":319},"$PWD",[217,511,512],{"class":227},"\"",[217,514,515],{"class":237}," --no-focus\n",[15,517,518],{},"這個指令有三個重點：",[28,520,521,527,533],{},[31,522,523,526],{},[55,524,525],{},"--current","：明確指定以目前 pane 為目標",[31,528,529,532],{},[55,530,531],{},"--cwd \"$PWD\"","：讓新 pane 保持目前專案目錄",[31,534,535,538],{},[55,536,537],{},"--no-focus","：不搶走使用者正在看的畫面",[15,540,541],{},"接著，從指令回傳結果取得新 pane 的 ID，再執行測試：",[208,543,545],{"className":210,"code":544,"language":212,"meta":213,"style":213},"herdr pane run \u003Cpane-id> \"yarn build\"\n",[55,546,547],{"__ignoreMap":213},[217,548,549,551,553,556,559,562,565,568],{"class":219,"line":220},[217,550,57],{"class":223},[217,552,415],{"class":227},[217,554,555],{"class":227}," run",[217,557,558],{"class":323}," \u003C",[217,560,561],{"class":227},"pane-i",[217,563,564],{"class":319},"d",[217,566,567],{"class":323},">",[217,569,570],{"class":227}," \"yarn build\"\n",[15,572,573],{},"最後等待關鍵輸出：",[208,575,577],{"className":210,"code":576,"language":212,"meta":213,"style":213},"herdr pane wait-output \u003Cpane-id> --match \"Tests:\" --timeout 120000\n",[55,578,579],{"__ignoreMap":213},[217,580,581,583,585,588,590,592,594,596,599,602,605],{"class":219,"line":220},[217,582,57],{"class":223},[217,584,415],{"class":227},[217,586,587],{"class":227}," wait-output",[217,589,558],{"class":323},[217,591,561],{"class":227},[217,593,564],{"class":319},[217,595,567],{"class":323},[217,597,598],{"class":237}," --match",[217,600,601],{"class":227}," \"Tests:\"",[217,603,604],{"class":237}," --timeout",[217,606,607],{"class":237}," 120000\n",[15,609,610],{},"需要進一步查看結果時：",[208,612,614],{"className":210,"code":613,"language":212,"meta":213,"style":213},"herdr pane read \u003Cpane-id> --source recent-unwrapped --lines 120\n",[55,615,616],{"__ignoreMap":213},[217,617,618,620,622,625,627,629,631,633,636,639,642],{"class":219,"line":220},[217,619,57],{"class":223},[217,621,415],{"class":227},[217,623,624],{"class":227}," read",[217,626,558],{"class":323},[217,628,561],{"class":227},[217,630,564],{"class":319},[217,632,567],{"class":323},[217,634,635],{"class":237}," --source",[217,637,638],{"class":227}," recent-unwrapped",[217,640,641],{"class":237}," --lines",[217,643,644],{"class":237}," 120\n",[15,646,647],{},"這樣主 Agent 不必把測試塞進自己的互動介面，也不需要讓人類頻繁切換分頁。測試成為一個可觀測、可等待、可讀取的獨立工作單元。",[60,649],{},[63,651,653],{"id":652},"實戰二讓多模態-agent-傳遞圖片分析結果","實戰二：讓多模態 Agent 傳遞圖片分析結果",[15,655,656],{},"有些任務的第一步是理解圖片，但後續工作不一定需要多模態能力。例如，先讓一個支援圖片輸入的 Pi Agent 分析介面截圖，再把結構化的文字結果交給另一個成本較低的 Pi Agent 實作功能。Herdr Skills 可以將這兩個階段拆到不同 pane，讓模型能力各自對應到最適合的工作。",[15,658,659,660,663,664,257],{},"先建立兩個相鄰 pane，分別啟動支援多模態的 ",[55,661,662],{},"Qwen 3.8 MAX","，以及不支援多模態、負責後續工作的 ",[55,665,666],{},"deepseek-v4-flash",[208,668,670],{"className":210,"code":669,"language":212,"meta":213,"style":213},"herdr pane split --current --direction right --cwd \"$PWD\" --no-focus\nherdr pane split --current --direction down --cwd \"$PWD\" --no-focus\n",[55,671,672,696],{"__ignoreMap":213},[217,673,674,676,678,680,682,684,686,688,690,692,694],{"class":219,"line":220},[217,675,57],{"class":223},[217,677,415],{"class":227},[217,679,492],{"class":227},[217,681,495],{"class":237},[217,683,498],{"class":237},[217,685,501],{"class":227},[217,687,504],{"class":237},[217,689,401],{"class":227},[217,691,509],{"class":319},[217,693,512],{"class":227},[217,695,515],{"class":237},[217,697,698,700,702,704,706,708,711,713,715,717,719],{"class":219,"line":387},[217,699,57],{"class":223},[217,701,415],{"class":227},[217,703,492],{"class":227},[217,705,495],{"class":237},[217,707,498],{"class":237},[217,709,710],{"class":227}," down",[217,712,504],{"class":237},[217,714,401],{"class":227},[217,716,509],{"class":319},[217,718,512],{"class":227},[217,720,515],{"class":237},[15,722,723],{},"從兩次指令的回傳結果取得 pane ID 後，啟動兩個 Pi Agent：",[208,725,727],{"className":210,"code":726,"language":212,"meta":213,"style":213},"herdr agent start vision --kind pi --model \"Qwen 3.8 MAX\" --pane \u003Cvision-pane-id>\nherdr agent start worker --kind pi --model \"deepseek-v4-flash\" --pane \u003Cworker-pane-id>\n",[55,728,729,766],{"__ignoreMap":213},[217,730,731,733,735,738,741,744,747,750,753,756,758,761,763],{"class":219,"line":220},[217,732,57],{"class":223},[217,734,446],{"class":227},[217,736,737],{"class":227}," start",[217,739,740],{"class":227}," vision",[217,742,743],{"class":237}," --kind",[217,745,746],{"class":227}," pi",[217,748,749],{"class":237}," --model",[217,751,752],{"class":227}," \"Qwen 3.8 MAX\"",[217,754,755],{"class":237}," --pane",[217,757,558],{"class":323},[217,759,760],{"class":227},"vision-pane-i",[217,762,564],{"class":319},[217,764,765],{"class":323},">\n",[217,767,768,770,772,774,777,779,781,783,786,788,790,793,795],{"class":219,"line":387},[217,769,57],{"class":223},[217,771,446],{"class":227},[217,773,737],{"class":227},[217,775,776],{"class":227}," worker",[217,778,743],{"class":237},[217,780,746],{"class":227},[217,782,749],{"class":237},[217,784,785],{"class":227}," \"deepseek-v4-flash\"",[217,787,755],{"class":237},[217,789,558],{"class":323},[217,791,792],{"class":227},"worker-pane-i",[217,794,564],{"class":319},[217,796,765],{"class":323},[15,798,799,800,803],{},"先將圖片與分析要求交給 ",[55,801,802],{},"vision","。這個 Agent 的責任是辨識圖片內容，並輸出不依賴圖片本身也能理解的文字描述，例如畫面中的元件、文字、狀態與需要處理的問題：",[208,805,807],{"className":210,"code":806,"language":212,"meta":213,"style":213},"herdr agent prompt vision \"分析 .\u002Fscreenshots\u002Ferror.png，整理畫面內容、錯誤訊息、可疑元件與建議處理方向，請只輸出清楚的文字分析。\" --wait --timeout 120000\n",[55,808,809],{"__ignoreMap":213},[217,810,811,813,815,818,820,823,826,828],{"class":219,"line":220},[217,812,57],{"class":223},[217,814,446],{"class":227},[217,816,817],{"class":227}," prompt",[217,819,740],{"class":227},[217,821,822],{"class":227}," \"分析 .\u002Fscreenshots\u002Ferror.png，整理畫面內容、錯誤訊息、可疑元件與建議處理方向，請只輸出清楚的文字分析。\"",[217,824,825],{"class":237}," --wait",[217,827,604],{"class":237},[217,829,607],{"class":237},[15,831,832,833,835,836,187,839,841],{},"接著讀取 ",[55,834,802],{}," 的輸出，再將分析文字連同原始任務傳給 ",[55,837,838],{},"worker",[55,840,838],{}," 不需要直接讀取圖片，只要根據文字上下文完成後續程式修改或其他任務：",[208,843,845],{"className":210,"code":844,"language":212,"meta":213,"style":213},"analysis=$(herdr agent read vision --source recent-unwrapped --lines 120)\nherdr agent prompt worker \"以下是另一個 Agent 對圖片的分析結果：\n\n$analysis\n\n請根據這份分析完成後續任務，檢查現有程式碼，實作必要修改，並回報處理結果。\" --wait --timeout 120000\n",[55,846,847,878,891,897,902,906],{"__ignoreMap":213},[217,848,849,852,855,858,860,862,864,866,868,870,872,875],{"class":219,"line":220},[217,850,851],{"class":319},"analysis",[217,853,854],{"class":323},"=",[217,856,857],{"class":319},"$(",[217,859,57],{"class":223},[217,861,446],{"class":227},[217,863,624],{"class":227},[217,865,740],{"class":227},[217,867,635],{"class":237},[217,869,638],{"class":227},[217,871,641],{"class":237},[217,873,874],{"class":237}," 120",[217,876,877],{"class":319},")\n",[217,879,880,882,884,886,888],{"class":219,"line":387},[217,881,57],{"class":223},[217,883,446],{"class":227},[217,885,817],{"class":227},[217,887,776],{"class":227},[217,889,890],{"class":227}," \"以下是另一個 Agent 對圖片的分析結果：\n",[217,892,893],{"class":219,"line":410},[217,894,896],{"emptyLinePlaceholder":895},true,"\n",[217,898,899],{"class":219,"line":424},[217,900,901],{"class":319},"$analysis\n",[217,903,904],{"class":219,"line":441},[217,905,896],{"emptyLinePlaceholder":895},[217,907,909,912,914,916],{"class":219,"line":908},6,[217,910,911],{"class":227},"請根據這份分析完成後續任務，檢查現有程式碼，實作必要修改，並回報處理結果。\"",[217,913,825],{"class":237},[217,915,604],{"class":237},[217,917,607],{"class":237},[15,919,920,921,923,924,926],{},"這種做法的重點不是讓兩個 Agent 同時工作，而是建立清楚的能力接力：",[55,922,662],{}," 負責將圖片轉換成可靠的文字上下文，",[55,925,666],{}," 則專注在理解需求、操作程式碼與完成後續工作。每個 Agent 都有可追蹤的名稱，輸出也能被下一個階段明確接收。",[15,928,929],{},[930,931],"img",{"alt":932,"src":933},"讓多模態 Agent 傳遞圖片分析結果","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fflow-chart-01.png",[60,935],{},[63,937,939],{"id":938},"實戰三規劃實作審查的多-agent-協作迴圈","實戰三：規劃、實作、審查的多 Agent 協作迴圈",[15,941,942],{},"單一 Agent 可以完成許多工作，但複雜需求通常同時需要架構判斷、程式實作與程式碼審查。把所有階段交給同一個 Agent，雖然方便，卻容易讓規劃與驗證失去獨立性。",[15,944,945,946,949,950,953],{},"這個範例使用 ",[47,947,948],{},"三個 Herdr pane","。三個 pane 都執行 ",[47,951,952],{},"Pi Agent","，但各自配置不同的 AI 模型，並承擔不同角色。第一個 pane 是整個流程的主控者，負責分派工作、收集結果與決定是否進入下一輪修正。",[130,955,956,972],{},[133,957,958],{},[136,959,960,963,966,969],{},[139,961,962],{},"Pane",[139,964,965],{},"角色",[139,967,968],{},"Agent 與模型",[139,970,971],{},"負責工作",[149,973,974,991,1007],{},[136,975,976,979,982,988],{},[154,977,978],{},"Pane 1",[154,980,981],{},"主控／規劃者",[154,983,984,985],{},"Pi Agent + ",[55,986,987],{},"GPT-5.6 Sol",[154,989,990],{},"釐清複雜需求、分析程式碼、產出實作方案，並協調整個流程",[136,992,993,996,999,1004],{},[154,994,995],{},"Pane 2",[154,997,998],{},"實作者",[154,1000,984,1001],{},[55,1002,1003],{},"Qwen3.8 Flash",[154,1005,1006],{},"根據方案實作功能、修正問題與回報結果",[136,1008,1009,1012,1015,1020],{},[154,1010,1011],{},"Pane 3",[154,1013,1014],{},"審查者",[154,1016,984,1017],{},[55,1018,1019],{},"Claude Fable 5.1",[154,1021,1022],{},"對照需求與實作結果，進行獨立 code review",[15,1024,1025],{},"這樣規畫目的，將需要高度思考的工作和驗證工作交由旗艦模型，將實作工作交由較便宜模型實作，這樣可以確保程式碼品質，也可省下不少 Token 費用",[15,1027,1028],{},"我們可以透過以下提示詞先建立起我們的開發環境",[208,1030,1033],{"className":1031,"code":1032,"language":355,"meta":213},[353],"herdr\n1. 在右方建立一個新的分屏\n2. 執行 pi agent，並使用 opencode-go 提供的 qwen3.8-flash 模型\n3. 在下方建立一個新的分屏\n4. 執行 pi agent，並使用 opencode 提供的 claude-fable-5-1 模型\n",[55,1034,1032],{"__ignoreMap":213},[15,1036,1037],{},"執行後會輸以下結果，並成開啟三個分屏，我可以記下代號，作為傳送互傳資訊的代碼",[208,1039,1043],{"className":1040,"code":1041,"language":1042,"meta":213,"style":213},"language-markdown shiki shiki-themes github-light github-dark github-dark","佈局（wK:t1）：\n      - wK:p1 左上（原始 pane，保持 focus）\n      - wK:p5 右方 - 佔滿右半部 41x28\n      - wK:p6 下方 - 左下 42x14\n","markdown",[55,1044,1045,1050,1055,1060],{"__ignoreMap":213},[217,1046,1047],{"class":219,"line":220},[217,1048,1049],{},"佈局（wK:t1）：\n",[217,1051,1052],{"class":219,"line":387},[217,1053,1054],{},"      - wK:p1 左上（原始 pane，保持 focus）\n",[217,1056,1057],{"class":219,"line":410},[217,1058,1059],{},"      - wK:p5 右方 - 佔滿右半部 41x28\n",[217,1061,1062],{"class":219,"line":424},[217,1063,1064],{},"      - wK:p6 下方 - 左下 42x14\n",[15,1066,1067],{},"除了用分屏方式，也可以用分頁的方式進行，這可以由開發者需求自行決定。",[208,1069,1072],{"className":1070,"code":1071,"language":355,"meta":213},[353],"herdr\n1. 建立新 tab, rename 為「實作」，啟用 pi agent，並使用 opencode-go 提供的 Qwen3.8 Flash 模型\n2. 建立新 tab, rename 為「審查」，啟用 pi agent，並使用 opencode 提供的 Claude Fable 5.1 模型 \n",[55,1073,1071],{"__ignoreMap":213},[15,1075,1076],{},"輸出如下：",[208,1078,1080],{"className":1040,"code":1079,"language":1042,"meta":213,"style":213}," 當前 Tab 列表（wM）：\n - wM:t1 主控 (working)\n - wM:t4 實作 (idle, opencode-go\u002Fqwen3.8-flash)\n - wM:t5 審查 (idle, opencode\u002Fclaude-fable-5-1)\n",[55,1081,1082,1087,1092,1097],{"__ignoreMap":213},[217,1083,1084],{"class":219,"line":220},[217,1085,1086],{}," 當前 Tab 列表（wM）：\n",[217,1088,1089],{"class":219,"line":387},[217,1090,1091],{}," - wM:t1 主控 (working)\n",[217,1093,1094],{"class":219,"line":410},[217,1095,1096],{}," - wM:t4 實作 (idle, opencode-go\u002Fqwen3.8-flash)\n",[217,1098,1099],{"class":219,"line":424},[217,1100,1101],{}," - wM:t5 審查 (idle, opencode\u002Fclaude-fable-5-1)\n",[1103,1104,1106],"h3",{"id":1105},"第一步由旗艦模型建立實作方案","第一步：由旗艦模型建立實作方案",[15,1108,1109,1110,1112,1113,1115],{},"先在 ",[47,1111,978],{}," 啟動 Pi Agent，並使用 ",[55,1114,987],{}," 模型處理需求分析、規劃與流程協調。這個 pane 是主控 pane；後續將規劃傳給 wK:p5、把審查結果送回 wK:p6 修正，以及在完成後確認任務結案，皆由它負責。",[1117,1118,1119],"info-block",{},[15,1120,1121,1122,1125],{},"建議：若規畫方案比較複雜，可以請 AI agent 將方案輸出成一分 ",[55,1123,1124],{},"plan.md","，方便在不同 agent 資訊傳遞",[15,1127,1128],{},"範例提示詞：",[208,1130,1133],{"className":1131,"code":1132,"language":355,"meta":213},[353],"herdr\n請規畫可執行方案，符合以下需求\n1.你是一位專業的網頁前端工程師與 Three.js 3D 專家。請幫我寫一個完整的、可獨立運行的 HTML 檔案，內含最新版 Tailwind CSS（用於基本排版）與最新版 Three.js（透過 CDN 導入 three.min.js）。\n2. 創建繁忙的城市街景\n3. 固定場景：高樓大廈、摩天大樓，行道樹，馬路\n4. 動態物件：行人，汽車，公車\n5. 右邉選單可以選定飄落物，可項目：無，雪花，櫻花，可設定行人數、汽車數和公車數\n6. 滑鼠左鍵可以移動，滑鼠滾輪可以zoom in 和 zoom out\n7. 待我確認需求將規畫完交由「實作」分頁，進行實際程式碼開發\n8. 將完確認後的規畫輸出至 `plan.md`\n9. 「實作」完成後，將修改摘要和diff交給「審查」分頁，進行code review，code review 結果輸出到 `review.md`\n10. 若 code review 的結果，請將結果回傳「主導」分頁\n\n",[55,1134,1132],{"__ignoreMap":213},[15,1136,1137,1138,1140],{},"AI 會規畫完整輪出到 ",[55,1139,1124],{},"，對交由「實作」分頁",[1103,1142,1144],{"id":1143},"第二步將方案交給-flash-模型實作","第二步：將方案交給 Flash 模型實作",[15,1146,1147,1148,1112,1151,1153,1154,1157,1158,187],{},"接著在 ",[47,1149,1150],{},"實作分頁",[55,1152,1003],{}," 模型。由 ",[47,1155,1156],{},"主控分頁"," 將規劃方案完整傳入 ",[47,1159,1150],{},[15,1161,1162],{},"這個 Agent 的責任是完成實作，不是重新定義需求。因此交付時應一併提供原始需求與規劃結果，讓它在遇到細節不一致時能回到需求本身判斷。",[1103,1164,1166],{"id":1165},"第三步由-旗艦模型-進行獨立-code-review","第三步：由 旗艦模型 進行獨立 code review",[15,1168,1169,1170,1112,1173,1175,1176,1178,1179,1181,1182,187],{},"再在 ",[47,1171,1172],{},"審查分頁",[55,1174,1019],{}," 模型。",[47,1177,1156],{}," 將原始需求與 ",[47,1180,1150],{}," 的實作結果一起送交 ",[47,1183,1172],{},[15,1185,1186],{},"由不同 Agent 審查，能降低實作者因熟悉自己的方案而忽略缺陷的機率。審查者應特別檢查：需求是否完整落實、錯誤處理與邊界條件、既有功能是否被破壞，以及程式碼是否符合專案慣例。",[1103,1188,1190],{"id":1189},"第四步未通過就回到實作通過才通知主控","第四步：未通過就回到實作，通過才通知主控",[15,1192,1193,1194,1196,1197,1199,1200,1202,1203,1205,1206,1208],{},"如果 ",[47,1195,1172],{}," 的 Pi Agent（",[55,1198,1019],{},"）回報需要修正的問題，",[47,1201,1156],{}," 將審查意見連同原始需求傳回 ",[47,1204,1150],{},"  的 Pi Agent（",[55,1207,1003],{},"）：",[15,1210,1211,1212,1214,1215,1217],{},"完成修正後，",[47,1213,1156],{}," 再把新的實作結果交回 ",[47,1216,1172],{}," 進行下一輪 review。這個迴圈持續到審查通過，或由人類介入處理架構爭議與高風險決策。",[15,1219,1220,1221,1223,1224,1226],{},"當 ",[47,1222,1172],{}," 的 review 通過後，",[47,1225,1156],{}," 會收到完成通知，並確認實作結果是否仍符合原本方案與需求。至此，才算完成一次完整的程式碼實作。",[15,1228,1229],{},[930,1230],{"alt":1231,"src":1232},"多 AI Agent 協作流程圖","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fflow-chart-02.png",[60,1234],{},[63,1236,1237],{"id":1237},"總結",[15,1239,1240],{},"Herdr Skills 讓 AI Agent 不再只是終端中的執行者，也能成為理解工作環境的協作者。",[15,1242,1243,1244,1246],{},"安裝一份 ",[55,1245,72],{}," 後，Agent 可以在 Herdr 的安全範圍內：",[28,1248,1249,1252,1255,1258,1261],{},[31,1250,1251],{},"掌握 workspace、tab 與 pane 的實際狀態",[31,1253,1254],{},"背景執行測試、服務與其他命令",[31,1256,1257],{},"啟動並協調專職的協作 Agent",[31,1259,1260],{},"讀取輸出、等待結果，並辨識被阻擋的工作",[31,1262,1263],{},"保持人類對授權與關鍵決策的最終控制權",[15,1265,1266],{},"如果上一篇的 Ghostty + Herdr 是建立 AI Agent 工作台，那麼 Herdr Skills 就是讓工作台開始具備協作能力的關鍵拼圖。",[60,1268],{},[63,1270,1271],{"id":1271},"相關資源",[28,1273,1274,1281,1287,1294],{},[31,1275,1276],{},[19,1277,1280],{"href":1278,"rel":1279},"https:\u002F\u002Fherdr.dev\u002Fzh-cn\u002Fdocs\u002Fagent-skill\u002F",[291],"Herdr 智能體技能文件官方說明",[31,1282,1283],{},[19,1284,1286],{"href":289,"rel":1285},[291],"Herdr Skill 原始檔",[31,1288,1289],{},[19,1290,1293],{"href":1291,"rel":1292},"https:\u002F\u002Fherdr.dev\u002Fzh-cn\u002Fdocs\u002F",[291],"Herdr 官方文件",[31,1295,1296],{},[19,1297,1300],{"href":1298,"rel":1299},"https:\u002F\u002Fgithub.com\u002Fherdrdev\u002Fherdr",[291],"Herdr GitHub",[1302,1303,1304],"style",{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":213,"searchDepth":387,"depth":387,"links":1306},[1307,1308,1309,1310,1311,1312,1313,1314,1320,1321],{"id":65,"depth":387,"text":66},{"id":124,"depth":387,"text":125},{"id":198,"depth":387,"text":199},{"id":299,"depth":387,"text":300},{"id":365,"depth":387,"text":366},{"id":471,"depth":387,"text":472},{"id":652,"depth":387,"text":653},{"id":938,"depth":387,"text":939,"children":1315},[1316,1317,1318,1319],{"id":1105,"depth":410,"text":1106},{"id":1143,"depth":410,"text":1144},{"id":1165,"depth":410,"text":1166},{"id":1189,"depth":410,"text":1190},{"id":1237,"depth":387,"text":1237},{"id":1271,"depth":387,"text":1271},"ai","在上一篇〈AI Agent 時代終端機新選擇：ghostty+herdr〉中，我們介紹了 Herdr 如何在終端機裡管理多個 AI Agent：工作空間、分頁、窗格，以及一眼就能辨識的 Agent 狀態。","md","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fcover.png",{},"\u002Farticles\u002F2026-09-04-herdr-skills","2026-09-04 10:45",{"title":6,"description":1323},"articles\u002F2026-09-04-herdr-skills","上一篇認識 Ghostty 與 Herdr 後，本篇進一步介紹 Herdr Skills。只要將一份 SKILL.md 安裝給編程 Agent，便能讓 Agent 在安全邊界內觀測、分割與協調 Herdr 窗格，打造真正可協作的終端工作流。",[1333,1334,1335,1336,1337],"AI","AI Agent","Herdr","開發工具","終端機","2G4Ccxu6vW-xv6Zt9dePDYXxWI3oayk4fGdroc9xk2w",{"id":1340,"title":22,"body":1341,"category":1322,"description":2199,"extension":1324,"image":2200,"meta":2201,"navigation":895,"path":21,"pubDate":2202,"seo":2203,"status":895,"stem":2204,"summary":2205,"tags":2206,"__hash__":2209},"content\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr.md",{"type":8,"value":1342,"toc":2177},[1343,1346,1361,1371,1375,1378,1404,1407,1409,1413,1417,1420,1423,1477,1481,1486,1505,1509,1512,1585,1600,1603,1613,1693,1695,1699,1703,1710,1713,1716,1752,1756,1776,1779,1792,1795,1834,1837,1840,1846,1899,1901,1905,1909,1912,1917,1923,1926,1930,1958,1962,1998,2002,2005,2055,2059,2062,2088,2091,2093,2095,2105,2108,2134,2137,2139,2141,2174],[11,1344,22],{"id":1345},"ai-agent-時代終端機新選擇ghosttyherdr",[15,1347,1348,1349,1352,1353,1356,1357,1360],{},"在這個大 AI 時代，使用 AI Agent 進行 ",[55,1350,1351],{},"Vibe Coding"," 已成為工作日常， 而目前各家大廠或開源專案都有提供 ",[55,1354,1355],{},"CLI"," 工作環境，所以終端機效能變得更重要，這也是我選擇 ",[47,1358,1359],{},"ghostty"," 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。",[15,1362,1363,1364,1366,1367,1370],{},"而 ",[47,1365,1335],{}," 更是管理各個 AI Agent CLI 目前最佳解決方案，獨特的 UI 介面可以方便管理工作區、分頁和 Agents，更可以對各 Agents 執行狀態一目了然，更可以透過 ",[55,1368,1369],{},"skills"," 讓不同 agent 相互協作。",[63,1372,1374],{"id":1373},"為什麼終端機需要重新思考","為什麼終端機需要重新思考？",[15,1376,1377],{},"傳統的終端機模擬器在 AI Agent 時代面臨了新的挑戰：",[28,1379,1380,1386,1392,1398],{},[31,1381,1382,1385],{},[47,1383,1384],{},"多代理並行","：一個專案可能同時運行 Claude Code、Codex、OpenCode 等多個代理，傳統終端難以統合管理",[31,1387,1388,1391],{},[47,1389,1390],{},"效能瓶頸","：AI 代理產出大量輸出，CPU 渲染的終端機容易出現卡頓",[31,1393,1394,1397],{},[47,1395,1396],{},"狀態可見性","：哪個代理正在執行？哪個被阻擋？哪個已完成？傳統終端缺乏即時狀態呈現",[31,1399,1400,1403],{},[47,1401,1402],{},"會話持久性","：關閉筆記型電腦後，代理進程隨之消失，無法斷續工作",[15,1405,1406],{},"Ghostty 和 Herdr 分別針對這些痛點提供了解決方案。",[60,1408],{},[63,1410,1412],{"id":1411},"ghosttygpu-加速的下一代終端機","Ghostty：GPU 加速的下一代終端機",[1103,1414,1416],{"id":1415},"什麼是-ghostty","什麼是 Ghostty？",[15,1418,1419],{},"Ghostty 是由 HashiCorp 創辦人 Mitchell Hashimoto 開發的跨平台終端模擬器，使用 Zig 語言構建，並以 GPU 加速渲染為核心特色。2024 年底正式發布 1.0 穩定版（至 2026 年已推進至 1.3+）後，迅速成為開發者社群中最受矚目的終端選擇。",[1103,1421,1422],{"id":1422},"核心特色",[28,1424,1425,1431,1437,1443,1465,1471],{},[31,1426,1427,1430],{},[47,1428,1429],{},"GPU 加速渲染","：透過 OpenGL（Linux）與 Metal（macOS）實現硬體加速，維持約 60fps 的流暢渲染，遠勝 CPU 渲染的傳統終端",[31,1432,1433,1436],{},[47,1434,1435],{},"原生 UI 體驗","：在 macOS 上呈現原生應用外觀，在 Linux 上完美融入 GTK\u002FQt 環境",[31,1438,1439,1442],{},[47,1440,1441],{},"多視窗、分頁、分割畫面","：內建完整的視窗管理功能，無需依賴 tmux",[31,1444,1445,1448,1449,1452,1453,1456,1457,1460,1461,1464],{},[47,1446,1447],{},"即時熱重載配置","：修改 ",[55,1450,1451],{},"~\u002F.config\u002Fghostty\u002Fconfig.ghostty","（1.2.3 前為 ",[55,1454,1455],{},"config","，仍相容）後按 ",[55,1458,1459],{},"cmd+shift+,","（macOS）\u002F ",[55,1462,1463],{},"ctrl+shift+,","（Linux）即可熱重載，無需重啟",[31,1466,1467,1470],{},[47,1468,1469],{},"連字字體與 Nerd Fonts","：原生支援開發者最愛的程式字體",[31,1472,1473,1476],{},[47,1474,1475],{},"智慧搜尋","：1.3.0 版本新增 scrollback search 與原生捲動條",[1103,1478,1480],{"id":1479},"安裝-ghostty","安裝 Ghostty",[1482,1483,1485],"h4",{"id":1484},"macos","macOS",[208,1487,1489],{"className":210,"code":1488,"language":212,"meta":213,"style":213},"brew install --cask ghostty\n",[55,1490,1491],{"__ignoreMap":213},[217,1492,1493,1496,1499,1502],{"class":219,"line":220},[217,1494,1495],{"class":223},"brew",[217,1497,1498],{"class":227}," install",[217,1500,1501],{"class":237}," --cask",[217,1503,1504],{"class":227}," ghostty\n",[1482,1506,1508],{"id":1507},"linux","Linux",[15,1510,1511],{},"Ghostty 官方僅直接發布 macOS 二進制檔，Linux 請透過發行版套件或社群建置安裝：",[208,1513,1515],{"className":210,"code":1514,"language":212,"meta":213,"style":213},"# Arch Linux\npacman -S ghostty\n\n# Ubuntu 26.04+\nsudo apt install ghostty\n\n# Debian \u002F 舊版 Ubuntu（社群 .deb）\n\u002Fbin\u002Fbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fmkasberg\u002Fghostty-ubuntu\u002FHEAD\u002Finstall.sh)\"\n",[55,1516,1517,1523,1533,1537,1542,1554,1558,1564],{"__ignoreMap":213},[217,1518,1519],{"class":219,"line":220},[217,1520,1522],{"class":1521},"sCsY4","# Arch Linux\n",[217,1524,1525,1528,1531],{"class":219,"line":387},[217,1526,1527],{"class":223},"pacman",[217,1529,1530],{"class":237}," -S",[217,1532,1504],{"class":227},[217,1534,1535],{"class":219,"line":410},[217,1536,896],{"emptyLinePlaceholder":895},[217,1538,1539],{"class":219,"line":424},[217,1540,1541],{"class":1521},"# Ubuntu 26.04+\n",[217,1543,1544,1547,1550,1552],{"class":219,"line":441},[217,1545,1546],{"class":223},"sudo",[217,1548,1549],{"class":227}," apt",[217,1551,1498],{"class":227},[217,1553,1504],{"class":227},[217,1555,1556],{"class":219,"line":908},[217,1557,896],{"emptyLinePlaceholder":895},[217,1559,1561],{"class":219,"line":1560},7,[217,1562,1563],{"class":1521},"# Debian \u002F 舊版 Ubuntu（社群 .deb）\n",[217,1565,1567,1570,1573,1576,1579,1582],{"class":219,"line":1566},8,[217,1568,1569],{"class":223},"\u002Fbin\u002Fbash",[217,1571,1572],{"class":237}," -c",[217,1574,1575],{"class":227}," \"$(",[217,1577,1578],{"class":223},"curl",[217,1580,1581],{"class":237}," -fsSL",[217,1583,1584],{"class":227}," https:\u002F\u002Fraw.githubusercontent.com\u002Fmkasberg\u002Fghostty-ubuntu\u002FHEAD\u002Finstall.sh)\"\n",[15,1586,1587,1588,1593,1594,1599],{},"其他發行版請參考 ",[19,1589,1592],{"href":1590,"rel":1591},"https:\u002F\u002Fghostty.org\u002Fdocs\u002Finstall\u002Fbinary",[291],"Ghostty 安裝文件","或從 ",[19,1595,1598],{"href":1596,"rel":1597},"https:\u002F\u002Fgithub.com\u002Fghostty-org\u002Fghostty",[291],"Ghostty GitHub"," 自行編譯。",[1103,1601,1602],{"id":1602},"基本配置",[15,1604,1605,1606,1608,1609,1612],{},"Ghostty 的配置文件位於 ",[55,1607,1451],{},"（相容舊路徑 ",[55,1610,1611],{},"~\u002F.config\u002Fghostty\u002Fconfig",")",[208,1614,1618],{"className":1615,"code":1616,"language":1617,"meta":213,"style":213},"language-ini shiki shiki-themes github-light github-dark github-dark","# ~\u002F.config\u002Fghostty\u002Fconfig.ghostty\n\nfont-family = JetBrains Mono\nfont-size = 24\nfont-feature = calt\n\n# 佈景樣式\ntheme = dark:Catppuccin Mocha,light:Espresso Libre\nbackground-opacity = 0.80\nbackground-blur-radius = 30\nwindow-padding-x = 8\nwindow-padding-y = 8\n\nconfirm-close-surface = false\n","ini",[55,1619,1620,1625,1629,1634,1639,1644,1648,1653,1658,1664,1670,1676,1682,1687],{"__ignoreMap":213},[217,1621,1622],{"class":219,"line":220},[217,1623,1624],{},"# ~\u002F.config\u002Fghostty\u002Fconfig.ghostty\n",[217,1626,1627],{"class":219,"line":387},[217,1628,896],{"emptyLinePlaceholder":895},[217,1630,1631],{"class":219,"line":410},[217,1632,1633],{},"font-family = JetBrains Mono\n",[217,1635,1636],{"class":219,"line":424},[217,1637,1638],{},"font-size = 24\n",[217,1640,1641],{"class":219,"line":441},[217,1642,1643],{},"font-feature = calt\n",[217,1645,1646],{"class":219,"line":908},[217,1647,896],{"emptyLinePlaceholder":895},[217,1649,1650],{"class":219,"line":1560},[217,1651,1652],{},"# 佈景樣式\n",[217,1654,1655],{"class":219,"line":1566},[217,1656,1657],{},"theme = dark:Catppuccin Mocha,light:Espresso Libre\n",[217,1659,1661],{"class":219,"line":1660},9,[217,1662,1663],{},"background-opacity = 0.80\n",[217,1665,1667],{"class":219,"line":1666},10,[217,1668,1669],{},"background-blur-radius = 30\n",[217,1671,1673],{"class":219,"line":1672},11,[217,1674,1675],{},"window-padding-x = 8\n",[217,1677,1679],{"class":219,"line":1678},12,[217,1680,1681],{},"window-padding-y = 8\n",[217,1683,1685],{"class":219,"line":1684},13,[217,1686,896],{"emptyLinePlaceholder":895},[217,1688,1690],{"class":219,"line":1689},14,[217,1691,1692],{},"confirm-close-surface = false\n",[60,1694],{},[63,1696,1698],{"id":1697},"herdr終端原生-ai-代理多工器","Herdr：終端原生 AI 代理多工器",[1103,1700,1702],{"id":1701},"什麼是-herdr","什麼是 Herdr？",[15,1704,1705,1706,1709],{},"Herdr 是一個用 Rust 編寫、基於 Ratatui TUI 庫建構的終端原生 AI 代理多工器。與 tmux 類似，它提供會話持久化與分割畫面管理，但額外增加了 ",[47,1707,1708],{},"AI 代理狀態感知","——能自動偵測每個分割畫面中運行的 AI 代理，並在側邊欄顯示其狀態。",[15,1711,1712],{},"Herdr 的口號是「one terminal for the whole herd」——一個終端機統管所有 AI 代理。",[1103,1714,1422],{"id":1715},"核心特色-1",[28,1717,1718,1724,1730,1736,1746],{},[31,1719,1720,1723],{},[47,1721,1722],{},"代理狀態自動追蹤","：側邊欄即時顯示每個代理的狀態——🔴 blocked、🟡 working、🔵 done、🟢 idle，無需手動配置",[31,1725,1726,1729],{},[47,1727,1728],{},"真實 PTY 分割畫面","：每個代理運行在獨立的真實終端分割畫面中，完整支援全螢幕 TUI 介面（如 Claude Code、Codex 的互動模式）",[31,1731,1732,1735],{},[47,1733,1734],{},"會話持久化","：斷開連線後代理繼續運行，重新連線即可恢復，關閉筆電也不會丟失進程",[31,1737,1738,1741,1742,1745],{},[47,1739,1740],{},"Socket API 自動化","：提供 Unix Socket JSON API（詳見 ",[55,1743,1744],{},"herdr --help"," 與 Socket API 文件，以當前版本為準），代理本身也可以操控 Herdr",[31,1747,1748,1751],{},[47,1749,1750],{},"多代理整合","：支援 Claude Code、Codex、Pi、OpenCode、Cursor 等 15+ 種 AI 編程代理",[1103,1753,1755],{"id":1754},"安裝-herdr","安裝 Herdr",[208,1757,1759],{"className":210,"code":1758,"language":212,"meta":213,"style":213},"curl -fsSL https:\u002F\u002Fherdr.dev\u002Finstall.sh | sh\n",[55,1760,1761],{"__ignoreMap":213},[217,1762,1763,1765,1767,1770,1773],{"class":219,"line":220},[217,1764,1578],{"class":223},[217,1766,1581],{"class":237},[217,1768,1769],{"class":227}," https:\u002F\u002Fherdr.dev\u002Finstall.sh",[217,1771,1772],{"class":323}," |",[217,1774,1775],{"class":223}," sh\n",[15,1777,1778],{},"或使用 Homebrew：",[208,1780,1782],{"className":210,"code":1781,"language":212,"meta":213,"style":213},"brew install herdr\n",[55,1783,1784],{"__ignoreMap":213},[217,1785,1786,1788,1790],{"class":219,"line":220},[217,1787,1495],{"class":223},[217,1789,1498],{"class":227},[217,1791,277],{"class":227},[1103,1793,1794],{"id":1794},"快速開始",[208,1796,1798],{"className":210,"code":1797,"language":212,"meta":213,"style":213},"# 啟動 Herdr\nherdr\n\n# 建立工作空間（以專案為單位）\nherdr workspace create --label my-project\n",[55,1799,1800,1805,1810,1814,1819],{"__ignoreMap":213},[217,1801,1802],{"class":219,"line":220},[217,1803,1804],{"class":1521},"# 啟動 Herdr\n",[217,1806,1807],{"class":219,"line":387},[217,1808,1809],{"class":223},"herdr\n",[217,1811,1812],{"class":219,"line":410},[217,1813,896],{"emptyLinePlaceholder":895},[217,1815,1816],{"class":219,"line":424},[217,1817,1818],{"class":1521},"# 建立工作空間（以專案為單位）\n",[217,1820,1821,1823,1825,1828,1831],{"class":219,"line":441},[217,1822,57],{"class":223},[217,1824,381],{"class":227},[217,1826,1827],{"class":227}," create",[217,1829,1830],{"class":237}," --label",[217,1832,1833],{"class":227}," my-project\n",[1103,1835,1836],{"id":1836},"工作空間與分割畫面架構",[15,1838,1839],{},"Herdr 的架構：",[15,1841,1842],{},[930,1843],{"alt":1844,"src":1845},"Herdr UI","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fherdr-ui.png",[130,1847,1848,1858],{},[133,1849,1850],{},[136,1851,1852,1855],{},[139,1853,1854],{},"層級",[139,1856,1857],{},"說明",[149,1859,1860,1870,1880,1889],{},[136,1861,1862,1867],{},[154,1863,1864],{},[47,1865,1866],{},"Workspace",[154,1868,1869],{},"以 Git 儲存庫或 worktree 為單位，對應一個專案",[136,1871,1872,1877],{},[154,1873,1874],{},[47,1875,1876],{},"Tab",[154,1878,1879],{},"每個工作空間可包含多個標籤頁",[136,1881,1882,1886],{},[154,1883,1884],{},[47,1885,962],{},[154,1887,1888],{},"每個標籤頁可分割為多個真實 PTY 分割畫面，每個運行一個代理",[136,1890,1891,1896],{},[154,1892,1893],{},[47,1894,1895],{},"Agent",[154,1897,1898],{},"自動化與觀測層，能識別並追蹤代理人的執行狀態",[60,1900],{},[63,1902,1904],{"id":1903},"ghostty-herdr終極-ai-agent-開發組合","ghostty + herdr：終極 AI Agent 開發組合",[1103,1906,1908],{"id":1907},"為什麼這組合特別","為什麼這組合特別？",[15,1910,1911],{},"Ghostty 與 Herdr 的結合，形成了一套完整的 AI Agent 開發環境：",[115,1913,1914],{},[15,1915,1916],{},"Herdr 為通用終端多工器，可運行於 iTerm2、Kitty、WezTerm 等任意終端；與 Ghostty 搭配時能額外發揮 GPU 加速與原生 UI 的最佳體驗，兩者並非強綁定。",[208,1918,1921],{"className":1919,"code":1920,"language":355},[353],"┌─────────────────────────────────────────────┐\n│                  Ghostty                     │\n│  ┌──────────────────────────────────────┐   │\n│  │            Herdr TUI                 │   │\n│  │  ┌──────────┐ ┌──────────┐ ┌─────┐ │   │\n│  │  │ Claude   │ │  Codex   │ │Open │ │   │\n│  │  │ 🟢 idle  │ │ 🟡 working│ │Code │ │   │\n│  │  └──────────┘ └──────────┘ └─────┘ │   │\n│  │  ┌──────────┐ ┌──────────┐ ┌─────┐ │   │\n│  │  │   Pi     │ │   Cursor │ │     │ │   │\n│  │  │ 🔴 blocked│ │ 🟢 idle  │ │     │ │   │\n│  │  └──────────┘ └──────────┘ └─────┘ │   │\n│  └──────────────────────────────────────┘   │\n│  GPU 加速 · 原生 UI · 分割畫面 · 熱重載      │\n└─────────────────────────────────────────────┘\n",[55,1922,1920],{"__ignoreMap":213},[1103,1924,1925],{"id":1925},"實際工作流程",[1482,1927,1929],{"id":1928},"_1-啟動環境","1. 啟動環境",[208,1931,1933],{"className":210,"code":1932,"language":212,"meta":213,"style":213},"# 啟動 Ghostty\nghostty\n\n# 在 Ghostty 中啟動 Herdr\nherdr\n",[55,1934,1935,1940,1945,1949,1954],{"__ignoreMap":213},[217,1936,1937],{"class":219,"line":220},[217,1938,1939],{"class":1521},"# 啟動 Ghostty\n",[217,1941,1942],{"class":219,"line":387},[217,1943,1944],{"class":223},"ghostty\n",[217,1946,1947],{"class":219,"line":410},[217,1948,896],{"emptyLinePlaceholder":895},[217,1950,1951],{"class":219,"line":424},[217,1952,1953],{"class":1521},"# 在 Ghostty 中啟動 Herdr\n",[217,1955,1956],{"class":219,"line":441},[217,1957,1809],{"class":223},[1482,1959,1961],{"id":1960},"_2-規劃工作空間","2. 規劃工作空間",[208,1963,1965],{"className":210,"code":1964,"language":212,"meta":213,"style":213},"# 為每個專案建立工作空間\nherdr workspace create --label backend-api\nherdr workspace create --label frontend-app\n",[55,1966,1967,1972,1985],{"__ignoreMap":213},[217,1968,1969],{"class":219,"line":220},[217,1970,1971],{"class":1521},"# 為每個專案建立工作空間\n",[217,1973,1974,1976,1978,1980,1982],{"class":219,"line":387},[217,1975,57],{"class":223},[217,1977,381],{"class":227},[217,1979,1827],{"class":227},[217,1981,1830],{"class":237},[217,1983,1984],{"class":227}," backend-api\n",[217,1986,1987,1989,1991,1993,1995],{"class":219,"line":410},[217,1988,57],{"class":223},[217,1990,381],{"class":227},[217,1992,1827],{"class":227},[217,1994,1830],{"class":237},[217,1996,1997],{"class":227}," frontend-app\n",[1482,1999,2001],{"id":2000},"_3-pane-分配代理","3. PANE 分配代理",[15,2003,2004],{},"每個分割畫面運行一個專門的 AI 代理：",[130,2006,2007,2020],{},[133,2008,2009],{},[136,2010,2011,2014,2017],{},[139,2012,2013],{},"分割畫面",[139,2015,2016],{},"代理",[139,2018,2019],{},"任務",[149,2021,2022,2033,2044],{},[136,2023,2024,2027,2030],{},[154,2025,2026],{},"左上",[154,2028,2029],{},"Claude Code",[154,2031,2032],{},"後端 API 開發",[136,2034,2035,2038,2041],{},[154,2036,2037],{},"右上",[154,2039,2040],{},"OpenCode",[154,2042,2043],{},"前端組件開發",[136,2045,2046,2049,2052],{},[154,2047,2048],{},"下方",[154,2050,2051],{},"Codex",[154,2053,2054],{},"測試與除錯",[1482,2056,2058],{"id":2057},"_4-agents-監控與調度","4. AGENTS 監控與調度",[15,2060,2061],{},"透過 Herdr 側邊欄一目了然：",[28,2063,2064,2070,2076,2082],{},[31,2065,2066,2067,2069],{},"🟢 ",[47,2068,99],{},"：等待指令",[31,2071,2072,2073,2075],{},"🟡 ",[47,2074,103],{},"：正在執行任務",[31,2077,2078,2079,2081],{},"🔴 ",[47,2080,106],{},"：需要人工介入",[31,2083,2084,2085,2087],{},"🔵 ",[47,2086,109],{},"：任務完成",[15,2089,2090],{},"當某個代理被阻擋時，直接點擊對應分割畫面即可介入處理。",[60,2092],{},[63,2094,1237],{"id":1237},[15,2096,2097,2098,2101,2102,2104],{},"在 AI Agent 時代，終端機不再只是執行指令的工具，而是 AI 代理協作的操盤中心。",[47,2099,2100],{},"Ghostty"," 以 GPU 加速與原生 UI 提供了流暢的終端體驗，",[47,2103,1335],{}," 則為終端帶來了專業級的 AI 代理多工管理能力。",[15,2106,2107],{},"這組合的核心優勢在於：",[2109,2110,2111,2117,2123,2128],"ol",{},[31,2112,2113,2116],{},[47,2114,2115],{},"真正的終端原生","：不依賴 GUI 或雲端服務，純粹在終端機中完成一切",[31,2118,2119,2122],{},[47,2120,2121],{},"代理狀態可見性","：側邊欄即時顯示所有代理的狀態，無需切換画面",[31,2124,2125,2127],{},[47,2126,1734],{},"：斷線重連，長時間任務不再擔心",[31,2129,2130,2133],{},[47,2131,2132],{},"高度可程式化","：Socket API 讓代理之間可以互相操控，實現真正的 AgentOps",[15,2135,2136],{},"如果你正在尋找一個強大的 AI Agent 開發環境，Ghostty + Herdr 的組合值得立即嘗試。兩者皆為開源專案，安裝簡單，卻能帶來生產力的巨大提升。",[60,2138],{},[63,2140,1271],{"id":1271},[28,2142,2143,2150,2155,2162,2167],{},[31,2144,2145],{},[19,2146,2149],{"href":2147,"rel":2148},"https:\u002F\u002Fghostty.org",[291],"Ghostty 官方網站",[31,2151,2152],{},[19,2153,1598],{"href":1596,"rel":2154},[291],[31,2156,2157],{},[19,2158,2161],{"href":2159,"rel":2160},"https:\u002F\u002Fherdr.dev",[291],"Herdr 官方網站",[31,2163,2164],{},[19,2165,1300],{"href":1298,"rel":2166},[291],[31,2168,2169],{},[19,2170,2173],{"href":2171,"rel":2172},"https:\u002F\u002Fherdr.dev\u002Fdocs\u002F",[291],"Herdr 文件",[1302,2175,2176],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":213,"searchDepth":387,"depth":387,"links":2178},[2179,2180,2186,2193,2197,2198],{"id":1373,"depth":387,"text":1374},{"id":1411,"depth":387,"text":1412,"children":2181},[2182,2183,2184,2185],{"id":1415,"depth":410,"text":1416},{"id":1422,"depth":410,"text":1422},{"id":1479,"depth":410,"text":1480},{"id":1602,"depth":410,"text":1602},{"id":1697,"depth":387,"text":1698,"children":2187},[2188,2189,2190,2191,2192],{"id":1701,"depth":410,"text":1702},{"id":1715,"depth":410,"text":1422},{"id":1754,"depth":410,"text":1755},{"id":1794,"depth":410,"text":1794},{"id":1836,"depth":410,"text":1836},{"id":1903,"depth":387,"text":1904,"children":2194},[2195,2196],{"id":1907,"depth":410,"text":1908},{"id":1925,"depth":410,"text":1925},{"id":1237,"depth":387,"text":1237},{"id":1271,"depth":387,"text":1271},"在這個大 AI 時代，使用 AI Agent 進行 Vibe Coding 已成為工作日常， 而目前各家大廠或開源專案都有提供 CLI 工作環境，所以終端機效能變得更重要，這也是我選擇 ghostty 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fcover.png",{},"2026-09-01 12:00:00",{"title":22,"description":2199},"articles\u002F2026-09-01-ai-agent-ghostty-herdr","在 AI Agent 時代，終端機不僅是開發工具，更是 AI 代理的操盤中心。Ghostty 以 GPU 加速與原生 UI 重新定義終端體驗，Herdr 則為終端帶來 AI 代理多工管理能力。本文將帶你了解這組強大組合如何打造新一代 AI 開發環境。",[1333,1336,2207,2208],"開源","software","RKLoV9NXyu51ay6Nvvbikch7fnhZR3L93WDtxZvWUt4",{"id":2211,"title":2212,"body":2213,"category":3902,"description":213,"extension":1324,"image":3903,"meta":3904,"navigation":895,"path":3905,"pubDate":3906,"seo":3907,"status":895,"stem":3908,"summary":3909,"tags":3910,"__hash__":3913},"content\u002Farticles\u002F2026-08-23-php-xlswriter.md","PHP 高效處理 XLSX 檔案：xlswriter 安裝與實戰教學",{"type":8,"value":2214,"toc":3885},[2215,2218,2225,2239,2242,2246,2260,2266,2269,2273,2276,2357,2361,2376,2383,2392,2395,2415,2418,2436,2448,2452,2455,2713,2719,2723,2730,3013,3020,3032,3036,3039,3147,3150,3294,3297,3339,3343,3346,3356,3529,3532,3558,3561,3564,3714,3717,3724,3851,3854,3870,3882],[63,2216,2217],{"id":2217},"簡介",[15,2219,2220,2221,2224],{},"系統匯出報表時，資料量一大，常常會遇到記憶體不足或等待時間太久的問題。",[55,2222,2223],{},"PhpSpreadsheet"," 功能完整，但它以純 PHP 建立整份活頁簿物件；若要處理數十萬筆以上資料，記憶體成本會很高。",[15,2226,2227,2234,2235,2238],{},[19,2228,2231],{"href":2229,"rel":2230},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter",[291],[55,2232,2233],{},"xlswriter"," 是以 C 實作的 PHP 擴充套件，底層使用 ",[55,2236,2237],{},"libxlsxwriter","，專門處理 Excel 2007 以上的 XLSX 格式。除了文字與數字，也支援公式、圖片、圖表、合併儲存格、自動篩選與樣式等功能。",[15,2240,2241],{},"官方的百萬列基準測試顯示，xlswriter 在速度與記憶體使用上都很適合大量資料匯出。不過實際結果仍會依照硬體、資料欄位數、字串長度與樣式複雜度而改變，建議以自己的正式環境測試為準。",[63,2243,2245],{"id":2244},"xlswriter-適合哪些情境","xlswriter 適合哪些情境？",[28,2247,2248,2251,2254,2257],{},[31,2249,2250],{},"後台需要匯出大量訂單、會員或交易明細。",[31,2252,2253],{},"需要逐列讀取大型 XLSX，避免一次載入所有資料。",[31,2255,2256],{},"要產生具備公式、格式、篩選或多工作表的 Excel 報表。",[31,2258,2259],{},"伺服器的 PHP 記憶體限制較嚴格。",[15,2261,2262,2263,2265],{},"若只要處理少量資料，或部署環境無法安裝 PHP 擴充套件，使用 Composer 安裝的 ",[55,2264,2223],{}," 仍會較方便；但大量資料匯出時，xlswriter 的固定記憶體模式更合適。",[63,2267,2268],{"id":2268},"安裝",[1103,2270,2272],{"id":2271},"安裝-zlib-相依套件","安裝 zlib 相依套件",[15,2274,2275],{},"xlswriter 編譯時需要 zlib 的開發檔案。先依作業系統安裝：",[208,2277,2279],{"className":210,"code":2278,"language":212,"meta":213,"style":213},"# Debian \u002F Ubuntu\napt-get install -y zlib1g-dev\n\n# Alpine\napk add zlib-dev\n\n# RHEL \u002F CentOS \u002F Fedora\nyum install -y zlib-devel\n\n# macOS\nbrew install zlib\n",[55,2280,2281,2286,2299,2303,2308,2318,2322,2327,2339,2343,2348],{"__ignoreMap":213},[217,2282,2283],{"class":219,"line":220},[217,2284,2285],{"class":1521},"# Debian \u002F Ubuntu\n",[217,2287,2288,2291,2293,2296],{"class":219,"line":387},[217,2289,2290],{"class":223},"apt-get",[217,2292,1498],{"class":227},[217,2294,2295],{"class":237}," -y",[217,2297,2298],{"class":227}," zlib1g-dev\n",[217,2300,2301],{"class":219,"line":410},[217,2302,896],{"emptyLinePlaceholder":895},[217,2304,2305],{"class":219,"line":424},[217,2306,2307],{"class":1521},"# Alpine\n",[217,2309,2310,2313,2315],{"class":219,"line":441},[217,2311,2312],{"class":223},"apk",[217,2314,231],{"class":227},[217,2316,2317],{"class":227}," zlib-dev\n",[217,2319,2320],{"class":219,"line":908},[217,2321,896],{"emptyLinePlaceholder":895},[217,2323,2324],{"class":219,"line":1560},[217,2325,2326],{"class":1521},"# RHEL \u002F CentOS \u002F Fedora\n",[217,2328,2329,2332,2334,2336],{"class":219,"line":1566},[217,2330,2331],{"class":223},"yum",[217,2333,1498],{"class":227},[217,2335,2295],{"class":237},[217,2337,2338],{"class":227}," zlib-devel\n",[217,2340,2341],{"class":219,"line":1660},[217,2342,896],{"emptyLinePlaceholder":895},[217,2344,2345],{"class":219,"line":1666},[217,2346,2347],{"class":1521},"# macOS\n",[217,2349,2350,2352,2354],{"class":219,"line":1672},[217,2351,1495],{"class":223},[217,2353,1498],{"class":227},[217,2355,2356],{"class":227}," zlib\n",[1103,2358,2360],{"id":2359},"使用-pecl-安裝","使用 PECL 安裝",[208,2362,2364],{"className":210,"code":2363,"language":212,"meta":213,"style":213},"pecl install xlswriter\n",[55,2365,2366],{"__ignoreMap":213},[217,2367,2368,2371,2373],{"class":219,"line":220},[217,2369,2370],{"class":223},"pecl",[217,2372,1498],{"class":227},[217,2374,2375],{"class":227}," xlswriter\n",[15,2377,2378,2379,2382],{},"安裝過程中若需要讀取 XLSX，請在提示時啟用 reader。完成後在 ",[55,2380,2381],{},"php.ini"," 加入：",[208,2384,2386],{"className":1615,"code":2385,"language":1617,"meta":213,"style":213},"extension=xlswriter.so\n",[55,2387,2388],{"__ignoreMap":213},[217,2389,2390],{"class":219,"line":220},[217,2391,2385],{},[15,2393,2394],{},"最後確認擴充套件已被載入：",[208,2396,2398],{"className":210,"code":2397,"language":212,"meta":213,"style":213},"php -m | grep xlswriter\n",[55,2399,2400],{"__ignoreMap":213},[217,2401,2402,2405,2408,2410,2413],{"class":219,"line":220},[217,2403,2404],{"class":223},"php",[217,2406,2407],{"class":237}," -m",[217,2409,1772],{"class":323},[217,2411,2412],{"class":223}," grep",[217,2414,2375],{"class":227},[15,2416,2417],{},"也可以使用 PIE 安裝：",[208,2419,2421],{"className":210,"code":2420,"language":212,"meta":213,"style":213},"pie install --auto-install-build-tools viest\u002Fxlswriter\n",[55,2422,2423],{"__ignoreMap":213},[217,2424,2425,2428,2430,2433],{"class":219,"line":220},[217,2426,2427],{"class":223},"pie",[217,2429,1498],{"class":227},[217,2431,2432],{"class":237}," --auto-install-build-tools",[217,2434,2435],{"class":227}," viest\u002Fxlswriter\n",[15,2437,2438,2439,2444,2445,2447],{},"Windows 使用者可從 ",[19,2440,2443],{"href":2441,"rel":2442},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter\u002Freleases",[291],"GitHub Releases"," 下載符合 PHP 版本、執行緒安全設定與架構的 DLL，再於 ",[55,2446,2381],{}," 啟用。",[63,2449,2451],{"id":2450},"建立第一份-xlsx-報表","建立第一份 XLSX 報表",[15,2453,2454],{},"以下範例建立一張「銷售報表」工作表，先寫入欄位標題，再加入資料。",[208,2456,2459],{"className":2457,"code":2458,"language":2404,"meta":213,"style":213},"language-php shiki shiki-themes github-light github-dark github-dark","\u003C?php declare(strict_types=1);\n\n$excel = new \\Vtiful\\Kernel\\Excel([\n    'path' => '.\u002Ftmp',\n]);\n\n$filePath = $excel->fileName('sales-report.xlsx', '銷售報表')\n    ->header(['品項', '金額', '數量'])\n    ->data([\n        ['租金', 10000, 1],\n        ['水電', 2500, 1],\n        ['辦公用品', 3000, 5],\n        ['交通費', 1200, 10],\n    ])\n    ->output();\n\necho \"檔案已儲存至：{$filePath}\\n\";\n",[55,2460,2461,2485,2489,2505,2519,2524,2528,2557,2584,2593,2613,2631,2650,2669,2674,2685,2690],{"__ignoreMap":213},[217,2462,2463,2466,2468,2471,2474,2477,2479,2482],{"class":219,"line":220},[217,2464,2465],{"class":323},"\u003C?",[217,2467,2404],{"class":237},[217,2469,2470],{"class":323}," declare",[217,2472,2473],{"class":319},"(",[217,2475,2476],{"class":237},"strict_types",[217,2478,854],{"class":323},[217,2480,2481],{"class":237},"1",[217,2483,2484],{"class":319},");\n",[217,2486,2487],{"class":219,"line":387},[217,2488,896],{"emptyLinePlaceholder":895},[217,2490,2491,2494,2496,2499,2502],{"class":219,"line":410},[217,2492,2493],{"class":319},"$excel ",[217,2495,854],{"class":323},[217,2497,2498],{"class":323}," new",[217,2500,2501],{"class":237}," \\Vtiful\\Kernel\\Excel",[217,2503,2504],{"class":319},"([\n",[217,2506,2507,2510,2513,2516],{"class":219,"line":424},[217,2508,2509],{"class":227},"    'path'",[217,2511,2512],{"class":323}," =>",[217,2514,2515],{"class":227}," '.\u002Ftmp'",[217,2517,2518],{"class":319},",\n",[217,2520,2521],{"class":219,"line":441},[217,2522,2523],{"class":319},"]);\n",[217,2525,2526],{"class":219,"line":908},[217,2527,896],{"emptyLinePlaceholder":895},[217,2529,2530,2533,2535,2538,2541,2544,2546,2549,2552,2555],{"class":219,"line":1560},[217,2531,2532],{"class":319},"$filePath ",[217,2534,854],{"class":323},[217,2536,2537],{"class":319}," $excel",[217,2539,2540],{"class":323},"->",[217,2542,2543],{"class":223},"fileName",[217,2545,2473],{"class":319},[217,2547,2548],{"class":227},"'sales-report.xlsx'",[217,2550,2551],{"class":319},", ",[217,2553,2554],{"class":227},"'銷售報表'",[217,2556,877],{"class":319},[217,2558,2559,2562,2565,2568,2571,2573,2576,2578,2581],{"class":219,"line":1566},[217,2560,2561],{"class":323},"    ->",[217,2563,2564],{"class":223},"header",[217,2566,2567],{"class":319},"([",[217,2569,2570],{"class":227},"'品項'",[217,2572,2551],{"class":319},[217,2574,2575],{"class":227},"'金額'",[217,2577,2551],{"class":319},[217,2579,2580],{"class":227},"'數量'",[217,2582,2583],{"class":319},"])\n",[217,2585,2586,2588,2591],{"class":219,"line":1660},[217,2587,2561],{"class":323},[217,2589,2590],{"class":223},"data",[217,2592,2504],{"class":319},[217,2594,2595,2598,2601,2603,2606,2608,2610],{"class":219,"line":1666},[217,2596,2597],{"class":319},"        [",[217,2599,2600],{"class":227},"'租金'",[217,2602,2551],{"class":319},[217,2604,2605],{"class":237},"10000",[217,2607,2551],{"class":319},[217,2609,2481],{"class":237},[217,2611,2612],{"class":319},"],\n",[217,2614,2615,2617,2620,2622,2625,2627,2629],{"class":219,"line":1672},[217,2616,2597],{"class":319},[217,2618,2619],{"class":227},"'水電'",[217,2621,2551],{"class":319},[217,2623,2624],{"class":237},"2500",[217,2626,2551],{"class":319},[217,2628,2481],{"class":237},[217,2630,2612],{"class":319},[217,2632,2633,2635,2638,2640,2643,2645,2648],{"class":219,"line":1678},[217,2634,2597],{"class":319},[217,2636,2637],{"class":227},"'辦公用品'",[217,2639,2551],{"class":319},[217,2641,2642],{"class":237},"3000",[217,2644,2551],{"class":319},[217,2646,2647],{"class":237},"5",[217,2649,2612],{"class":319},[217,2651,2652,2654,2657,2659,2662,2664,2667],{"class":219,"line":1684},[217,2653,2597],{"class":319},[217,2655,2656],{"class":227},"'交通費'",[217,2658,2551],{"class":319},[217,2660,2661],{"class":237},"1200",[217,2663,2551],{"class":319},[217,2665,2666],{"class":237},"10",[217,2668,2612],{"class":319},[217,2670,2671],{"class":219,"line":1689},[217,2672,2673],{"class":319},"    ])\n",[217,2675,2677,2679,2682],{"class":219,"line":2676},15,[217,2678,2561],{"class":323},[217,2680,2681],{"class":223},"output",[217,2683,2684],{"class":319},"();\n",[217,2686,2688],{"class":219,"line":2687},16,[217,2689,896],{"emptyLinePlaceholder":895},[217,2691,2693,2696,2699,2702,2705,2708,2710],{"class":219,"line":2692},17,[217,2694,2695],{"class":237},"echo",[217,2697,2698],{"class":227}," \"檔案已儲存至：{",[217,2700,2701],{"class":319},"$filePath",[217,2703,2704],{"class":227},"}",[217,2706,2707],{"class":237},"\\n",[217,2709,512],{"class":227},[217,2711,2712],{"class":319},";\n",[15,2714,2715,2718],{},[55,2716,2717],{},"path"," 是輸出目錄；Web 專案通常可先輸出至暫存目錄，再透過框架的下載回應將檔案交給使用者。請勿直接把使用者輸入當成檔名或路徑，以免產生路徑穿越風險。",[63,2720,2722],{"id":2721},"大量資料匯出固定記憶體模式","大量資料匯出：固定記憶體模式",[15,2724,2725,2726,2729],{},"大量報表最值得使用的是 ",[55,2727,2728],{},"constMemory()","。這個模式會逐列處理資料，記憶體不會隨著工作表資料量持續增加。",[208,2731,2733],{"className":2457,"code":2732,"language":2404,"meta":213,"style":213},"\u003C?php declare(strict_types=1);\n\n$excel = new \\Vtiful\\Kernel\\Excel([\n    'path' => '.\u002Ftmp',\n]);\n\n\u002F\u002F 開啟固定記憶體模式 (參數：檔名, 工作表名稱)\n$file = $excel->constMemory('large_data.xlsx', 'Sheet1');\n\n\u002F\u002F 寫入表頭\n$file->header(['ID', '姓名', '數值']);\n\n\u002F\u002F 迴圈逐行寫入大批量數據\nfor ($i = 1; $i \u003C= 1000000; $i++) {\n    $file->insertText($i - 1, 0, $i);\n    $file->insertText($i - 1, 1, \"使用者 {$i}\");\n    $file->insertText($i - 1, 2, rand(1, 100));\n}\n\n\u002F\u002F 輸出儲存檔案\n$file->output();\n",[55,2734,2735,2753,2757,2769,2779,2783,2787,2792,2818,2822,2827,2853,2857,2862,2893,2919,2949,2985,2991,2996,3002],{"__ignoreMap":213},[217,2736,2737,2739,2741,2743,2745,2747,2749,2751],{"class":219,"line":220},[217,2738,2465],{"class":323},[217,2740,2404],{"class":237},[217,2742,2470],{"class":323},[217,2744,2473],{"class":319},[217,2746,2476],{"class":237},[217,2748,854],{"class":323},[217,2750,2481],{"class":237},[217,2752,2484],{"class":319},[217,2754,2755],{"class":219,"line":387},[217,2756,896],{"emptyLinePlaceholder":895},[217,2758,2759,2761,2763,2765,2767],{"class":219,"line":410},[217,2760,2493],{"class":319},[217,2762,854],{"class":323},[217,2764,2498],{"class":323},[217,2766,2501],{"class":237},[217,2768,2504],{"class":319},[217,2770,2771,2773,2775,2777],{"class":219,"line":424},[217,2772,2509],{"class":227},[217,2774,2512],{"class":323},[217,2776,2515],{"class":227},[217,2778,2518],{"class":319},[217,2780,2781],{"class":219,"line":441},[217,2782,2523],{"class":319},[217,2784,2785],{"class":219,"line":908},[217,2786,896],{"emptyLinePlaceholder":895},[217,2788,2789],{"class":219,"line":1560},[217,2790,2791],{"class":1521},"\u002F\u002F 開啟固定記憶體模式 (參數：檔名, 工作表名稱)\n",[217,2793,2794,2797,2799,2801,2803,2806,2808,2811,2813,2816],{"class":219,"line":1566},[217,2795,2796],{"class":319},"$file ",[217,2798,854],{"class":323},[217,2800,2537],{"class":319},[217,2802,2540],{"class":323},[217,2804,2805],{"class":223},"constMemory",[217,2807,2473],{"class":319},[217,2809,2810],{"class":227},"'large_data.xlsx'",[217,2812,2551],{"class":319},[217,2814,2815],{"class":227},"'Sheet1'",[217,2817,2484],{"class":319},[217,2819,2820],{"class":219,"line":1660},[217,2821,896],{"emptyLinePlaceholder":895},[217,2823,2824],{"class":219,"line":1666},[217,2825,2826],{"class":1521},"\u002F\u002F 寫入表頭\n",[217,2828,2829,2832,2834,2836,2838,2841,2843,2846,2848,2851],{"class":219,"line":1672},[217,2830,2831],{"class":319},"$file",[217,2833,2540],{"class":323},[217,2835,2564],{"class":223},[217,2837,2567],{"class":319},[217,2839,2840],{"class":227},"'ID'",[217,2842,2551],{"class":319},[217,2844,2845],{"class":227},"'姓名'",[217,2847,2551],{"class":319},[217,2849,2850],{"class":227},"'數值'",[217,2852,2523],{"class":319},[217,2854,2855],{"class":219,"line":1678},[217,2856,896],{"emptyLinePlaceholder":895},[217,2858,2859],{"class":219,"line":1684},[217,2860,2861],{"class":1521},"\u002F\u002F 迴圈逐行寫入大批量數據\n",[217,2863,2864,2867,2870,2872,2875,2878,2881,2884,2887,2890],{"class":219,"line":1689},[217,2865,2866],{"class":323},"for",[217,2868,2869],{"class":319}," ($i ",[217,2871,854],{"class":323},[217,2873,2874],{"class":237}," 1",[217,2876,2877],{"class":319},"; $i ",[217,2879,2880],{"class":323},"\u003C=",[217,2882,2883],{"class":237}," 1000000",[217,2885,2886],{"class":319},"; $i",[217,2888,2889],{"class":323},"++",[217,2891,2892],{"class":319},") {\n",[217,2894,2895,2898,2900,2903,2906,2909,2911,2913,2916],{"class":219,"line":2676},[217,2896,2897],{"class":319},"    $file",[217,2899,2540],{"class":323},[217,2901,2902],{"class":223},"insertText",[217,2904,2905],{"class":319},"($i ",[217,2907,2908],{"class":323},"-",[217,2910,2874],{"class":237},[217,2912,2551],{"class":319},[217,2914,2915],{"class":237},"0",[217,2917,2918],{"class":319},", $i);\n",[217,2920,2921,2923,2925,2927,2929,2931,2933,2935,2937,2939,2942,2945,2947],{"class":219,"line":2687},[217,2922,2897],{"class":319},[217,2924,2540],{"class":323},[217,2926,2902],{"class":223},[217,2928,2905],{"class":319},[217,2930,2908],{"class":323},[217,2932,2874],{"class":237},[217,2934,2551],{"class":319},[217,2936,2481],{"class":237},[217,2938,2551],{"class":319},[217,2940,2941],{"class":227},"\"使用者 {",[217,2943,2944],{"class":319},"$i",[217,2946,327],{"class":227},[217,2948,2484],{"class":319},[217,2950,2951,2953,2955,2957,2959,2961,2963,2965,2968,2970,2973,2975,2977,2979,2982],{"class":219,"line":2692},[217,2952,2897],{"class":319},[217,2954,2540],{"class":323},[217,2956,2902],{"class":223},[217,2958,2905],{"class":319},[217,2960,2908],{"class":323},[217,2962,2874],{"class":237},[217,2964,2551],{"class":319},[217,2966,2967],{"class":237},"2",[217,2969,2551],{"class":319},[217,2971,2972],{"class":237},"rand",[217,2974,2473],{"class":319},[217,2976,2481],{"class":237},[217,2978,2551],{"class":319},[217,2980,2981],{"class":237},"100",[217,2983,2984],{"class":319},"));\n",[217,2986,2988],{"class":219,"line":2987},18,[217,2989,2990],{"class":319},"}\n",[217,2992,2994],{"class":219,"line":2993},19,[217,2995,896],{"emptyLinePlaceholder":895},[217,2997,2999],{"class":219,"line":2998},20,[217,3000,3001],{"class":1521},"\u002F\u002F 輸出儲存檔案\n",[217,3003,3005,3007,3009,3011],{"class":219,"line":3004},21,[217,3006,2831],{"class":319},[217,3008,2540],{"class":323},[217,3010,2681],{"class":223},[217,3012,2684],{"class":319},[15,3014,3015,3016,3019],{},"固定記憶體模式的取捨是：資料寫入後不能回頭修改已寫入的儲存格。因此欄位順序、樣式與計算方式要先規劃好；若報表需要任意回寫或重複調整，則使用一般 ",[55,3017,3018],{},"fileName()"," 模式。",[115,3021,3022],{},[15,3023,3024,3027,3028,3031],{},[55,3025,3026],{},"fetchReportRows()"," 代表可逐筆或分批取得資料的 Generator。例如資料庫查詢應避免一次 ",[55,3029,3030],{},"fetchAll()","，才能真正降低整體記憶體用量。",[63,3033,3035],{"id":3034},"讀取-xlsx-檔案","讀取 XLSX 檔案",[15,3037,3038],{},"小型檔案可直接取得工作表全部資料：",[208,3040,3042],{"className":2457,"code":3041,"language":2404,"meta":213,"style":213},"\u003C?php declare(strict_types=1);\n\n$excel = new \\Vtiful\\Kernel\\Excel([\n    'path' => '.\u002Ftmp',\n]);\n\n$data = $excel->openFile('sales-report.xlsx')\n    ->openSheet()\n    ->getSheetData();\n\nprint_r($data);\n",[55,3043,3044,3062,3066,3078,3088,3092,3096,3116,3126,3135,3139],{"__ignoreMap":213},[217,3045,3046,3048,3050,3052,3054,3056,3058,3060],{"class":219,"line":220},[217,3047,2465],{"class":323},[217,3049,2404],{"class":237},[217,3051,2470],{"class":323},[217,3053,2473],{"class":319},[217,3055,2476],{"class":237},[217,3057,854],{"class":323},[217,3059,2481],{"class":237},[217,3061,2484],{"class":319},[217,3063,3064],{"class":219,"line":387},[217,3065,896],{"emptyLinePlaceholder":895},[217,3067,3068,3070,3072,3074,3076],{"class":219,"line":410},[217,3069,2493],{"class":319},[217,3071,854],{"class":323},[217,3073,2498],{"class":323},[217,3075,2501],{"class":237},[217,3077,2504],{"class":319},[217,3079,3080,3082,3084,3086],{"class":219,"line":424},[217,3081,2509],{"class":227},[217,3083,2512],{"class":323},[217,3085,2515],{"class":227},[217,3087,2518],{"class":319},[217,3089,3090],{"class":219,"line":441},[217,3091,2523],{"class":319},[217,3093,3094],{"class":219,"line":908},[217,3095,896],{"emptyLinePlaceholder":895},[217,3097,3098,3101,3103,3105,3107,3110,3112,3114],{"class":219,"line":1560},[217,3099,3100],{"class":319},"$data ",[217,3102,854],{"class":323},[217,3104,2537],{"class":319},[217,3106,2540],{"class":323},[217,3108,3109],{"class":223},"openFile",[217,3111,2473],{"class":319},[217,3113,2548],{"class":227},[217,3115,877],{"class":319},[217,3117,3118,3120,3123],{"class":219,"line":1566},[217,3119,2561],{"class":323},[217,3121,3122],{"class":223},"openSheet",[217,3124,3125],{"class":319},"()\n",[217,3127,3128,3130,3133],{"class":219,"line":1660},[217,3129,2561],{"class":323},[217,3131,3132],{"class":223},"getSheetData",[217,3134,2684],{"class":319},[217,3136,3137],{"class":219,"line":1666},[217,3138,896],{"emptyLinePlaceholder":895},[217,3140,3141,3144],{"class":219,"line":1672},[217,3142,3143],{"class":237},"print_r",[217,3145,3146],{"class":319},"($data);\n",[15,3148,3149],{},"如果上傳檔案可能很大，改用游標逐列讀取。這樣可以一筆一筆驗證與寫入資料庫，不必將整個檔案放進記憶體。",[208,3151,3153],{"className":2457,"code":3152,"language":2404,"meta":213,"style":213},"\u003C?php declare(strict_types=1);\n\n$excel = new \\Vtiful\\Kernel\\Excel([\n    'path' => '.\u002Ftmp',\n]);\n\n$excel->openFile('large_data.xlsx')\n    ->openSheet()\n    ->setSkipRows(1); \u002F\u002F 略過標題列\n\nwhile ($row = $excel->nextRow()) {\n    [$id, $name, $amount] = $row;\n\n    \u002F\u002F 在此驗證資料並分批寫入資料庫\n}\n",[55,3154,3155,3173,3177,3189,3199,3203,3207,3222,3230,3247,3251,3271,3281,3285,3290],{"__ignoreMap":213},[217,3156,3157,3159,3161,3163,3165,3167,3169,3171],{"class":219,"line":220},[217,3158,2465],{"class":323},[217,3160,2404],{"class":237},[217,3162,2470],{"class":323},[217,3164,2473],{"class":319},[217,3166,2476],{"class":237},[217,3168,854],{"class":323},[217,3170,2481],{"class":237},[217,3172,2484],{"class":319},[217,3174,3175],{"class":219,"line":387},[217,3176,896],{"emptyLinePlaceholder":895},[217,3178,3179,3181,3183,3185,3187],{"class":219,"line":410},[217,3180,2493],{"class":319},[217,3182,854],{"class":323},[217,3184,2498],{"class":323},[217,3186,2501],{"class":237},[217,3188,2504],{"class":319},[217,3190,3191,3193,3195,3197],{"class":219,"line":424},[217,3192,2509],{"class":227},[217,3194,2512],{"class":323},[217,3196,2515],{"class":227},[217,3198,2518],{"class":319},[217,3200,3201],{"class":219,"line":441},[217,3202,2523],{"class":319},[217,3204,3205],{"class":219,"line":908},[217,3206,896],{"emptyLinePlaceholder":895},[217,3208,3209,3212,3214,3216,3218,3220],{"class":219,"line":1560},[217,3210,3211],{"class":319},"$excel",[217,3213,2540],{"class":323},[217,3215,3109],{"class":223},[217,3217,2473],{"class":319},[217,3219,2810],{"class":227},[217,3221,877],{"class":319},[217,3223,3224,3226,3228],{"class":219,"line":1566},[217,3225,2561],{"class":323},[217,3227,3122],{"class":223},[217,3229,3125],{"class":319},[217,3231,3232,3234,3237,3239,3241,3244],{"class":219,"line":1660},[217,3233,2561],{"class":323},[217,3235,3236],{"class":223},"setSkipRows",[217,3238,2473],{"class":319},[217,3240,2481],{"class":237},[217,3242,3243],{"class":319},"); ",[217,3245,3246],{"class":1521},"\u002F\u002F 略過標題列\n",[217,3248,3249],{"class":219,"line":1666},[217,3250,896],{"emptyLinePlaceholder":895},[217,3252,3253,3256,3259,3261,3263,3265,3268],{"class":219,"line":1672},[217,3254,3255],{"class":323},"while",[217,3257,3258],{"class":319}," ($row ",[217,3260,854],{"class":323},[217,3262,2537],{"class":319},[217,3264,2540],{"class":323},[217,3266,3267],{"class":223},"nextRow",[217,3269,3270],{"class":319},"()) {\n",[217,3272,3273,3276,3278],{"class":219,"line":1678},[217,3274,3275],{"class":319},"    [$id, $name, $amount] ",[217,3277,854],{"class":323},[217,3279,3280],{"class":319}," $row;\n",[217,3282,3283],{"class":219,"line":1684},[217,3284,896],{"emptyLinePlaceholder":895},[217,3286,3287],{"class":219,"line":1689},[217,3288,3289],{"class":1521},"    \u002F\u002F 在此驗證資料並分批寫入資料庫\n",[217,3291,3292],{"class":219,"line":2676},[217,3293,2990],{"class":319},[15,3295,3296],{},"若檔案有多張工作表，可先取得清單：",[208,3298,3300],{"className":2457,"code":3299,"language":2404,"meta":213,"style":213},"$sheetList = $excel->openFile('sales-report.xlsx')->sheetList();\n\nprint_r($sheetList);\n",[55,3301,3302,3328,3332],{"__ignoreMap":213},[217,3303,3304,3307,3309,3311,3313,3315,3317,3319,3321,3323,3326],{"class":219,"line":220},[217,3305,3306],{"class":319},"$sheetList ",[217,3308,854],{"class":323},[217,3310,2537],{"class":319},[217,3312,2540],{"class":323},[217,3314,3109],{"class":223},[217,3316,2473],{"class":319},[217,3318,2548],{"class":227},[217,3320,1612],{"class":319},[217,3322,2540],{"class":323},[217,3324,3325],{"class":223},"sheetList",[217,3327,2684],{"class":319},[217,3329,3330],{"class":219,"line":387},[217,3331,896],{"emptyLinePlaceholder":895},[217,3333,3334,3336],{"class":219,"line":410},[217,3335,3143],{"class":237},[217,3337,3338],{"class":319},"($sheetList);\n",[63,3340,3342],{"id":3341},"常用-excel-功能","常用 Excel 功能",[1103,3344,3345],{"id":3345},"加入公式與數字格式",[15,3347,3348,3351,3352,3355],{},[55,3349,3350],{},"insertFormula()"," 可寫入 Excel 公式；數字格式可交給 ",[55,3353,3354],{},"insertText()"," 的最後一個參數處理。",[208,3357,3359],{"className":2457,"code":3358,"language":2404,"meta":213,"style":213},"$file = $excel->fileName('expense-report.xlsx')\n    ->header(['品項', '金額']);\n\n$file->data([\n    ['租金', 10000],\n    ['水電', 2500],\n    ['辦公用品', 3000],\n])\n    ->insertText(4, 0, '總計')\n    ->insertFormula(4, 1, '=SUM(B2:B4)')\n    ->insertText(5, 1, 1234567.89, '#,##0.00')\n    ->output();\n",[55,3360,3361,3380,3396,3400,3410,3423,3435,3447,3451,3473,3495,3521],{"__ignoreMap":213},[217,3362,3363,3365,3367,3369,3371,3373,3375,3378],{"class":219,"line":220},[217,3364,2796],{"class":319},[217,3366,854],{"class":323},[217,3368,2537],{"class":319},[217,3370,2540],{"class":323},[217,3372,2543],{"class":223},[217,3374,2473],{"class":319},[217,3376,3377],{"class":227},"'expense-report.xlsx'",[217,3379,877],{"class":319},[217,3381,3382,3384,3386,3388,3390,3392,3394],{"class":219,"line":387},[217,3383,2561],{"class":323},[217,3385,2564],{"class":223},[217,3387,2567],{"class":319},[217,3389,2570],{"class":227},[217,3391,2551],{"class":319},[217,3393,2575],{"class":227},[217,3395,2523],{"class":319},[217,3397,3398],{"class":219,"line":410},[217,3399,896],{"emptyLinePlaceholder":895},[217,3401,3402,3404,3406,3408],{"class":219,"line":424},[217,3403,2831],{"class":319},[217,3405,2540],{"class":323},[217,3407,2590],{"class":223},[217,3409,2504],{"class":319},[217,3411,3412,3415,3417,3419,3421],{"class":219,"line":441},[217,3413,3414],{"class":319},"    [",[217,3416,2600],{"class":227},[217,3418,2551],{"class":319},[217,3420,2605],{"class":237},[217,3422,2612],{"class":319},[217,3424,3425,3427,3429,3431,3433],{"class":219,"line":908},[217,3426,3414],{"class":319},[217,3428,2619],{"class":227},[217,3430,2551],{"class":319},[217,3432,2624],{"class":237},[217,3434,2612],{"class":319},[217,3436,3437,3439,3441,3443,3445],{"class":219,"line":1560},[217,3438,3414],{"class":319},[217,3440,2637],{"class":227},[217,3442,2551],{"class":319},[217,3444,2642],{"class":237},[217,3446,2612],{"class":319},[217,3448,3449],{"class":219,"line":1566},[217,3450,2583],{"class":319},[217,3452,3453,3455,3457,3459,3462,3464,3466,3468,3471],{"class":219,"line":1660},[217,3454,2561],{"class":323},[217,3456,2902],{"class":223},[217,3458,2473],{"class":319},[217,3460,3461],{"class":237},"4",[217,3463,2551],{"class":319},[217,3465,2915],{"class":237},[217,3467,2551],{"class":319},[217,3469,3470],{"class":227},"'總計'",[217,3472,877],{"class":319},[217,3474,3475,3477,3480,3482,3484,3486,3488,3490,3493],{"class":219,"line":1666},[217,3476,2561],{"class":323},[217,3478,3479],{"class":223},"insertFormula",[217,3481,2473],{"class":319},[217,3483,3461],{"class":237},[217,3485,2551],{"class":319},[217,3487,2481],{"class":237},[217,3489,2551],{"class":319},[217,3491,3492],{"class":227},"'=SUM(B2:B4)'",[217,3494,877],{"class":319},[217,3496,3497,3499,3501,3503,3505,3507,3509,3511,3514,3516,3519],{"class":219,"line":1672},[217,3498,2561],{"class":323},[217,3500,2902],{"class":223},[217,3502,2473],{"class":319},[217,3504,2647],{"class":237},[217,3506,2551],{"class":319},[217,3508,2481],{"class":237},[217,3510,2551],{"class":319},[217,3512,3513],{"class":237},"1234567.89",[217,3515,2551],{"class":319},[217,3517,3518],{"class":227},"'#,##0.00'",[217,3520,877],{"class":319},[217,3522,3523,3525,3527],{"class":219,"line":1678},[217,3524,2561],{"class":323},[217,3526,2681],{"class":223},[217,3528,2684],{"class":319},[15,3530,3531],{},"常用格式包括：",[28,3533,3534,3540,3546,3552],{},[31,3535,3536,3539],{},[55,3537,3538],{},"#,##0","：千分位整數",[31,3541,3542,3545],{},[55,3543,3544],{},"#,##0.00","：千分位與兩位小數",[31,3547,3548,3551],{},[55,3549,3550],{},"0.00%","：百分比",[31,3553,3554,3557],{},[55,3555,3556],{},"yyyy-mm-dd","：日期",[1103,3559,3560],{"id":3560},"凍結標題列與自動篩選",[15,3562,3563],{},"這兩個功能很適合明細型報表，使用者捲動資料時仍可看見欄位名稱，也能直接在 Excel 篩選。",[208,3565,3567],{"className":2457,"code":3566,"language":2404,"meta":213,"style":213},"$excel->fileName('employee-report.xlsx')\n    ->header(['姓名', '部門', '薪資'])\n    ->data([\n        ['王小明', '工程部', 60000],\n        ['李小華', '行銷部', 55000],\n        ['陳美玲', '人資部', 58000],\n    ])\n    ->freezePanes(1, 0)\n    ->autoFilter('A1:C4')\n    ->output();\n",[55,3568,3569,3584,3606,3614,3633,3652,3671,3675,3692,3706],{"__ignoreMap":213},[217,3570,3571,3573,3575,3577,3579,3582],{"class":219,"line":220},[217,3572,3211],{"class":319},[217,3574,2540],{"class":323},[217,3576,2543],{"class":223},[217,3578,2473],{"class":319},[217,3580,3581],{"class":227},"'employee-report.xlsx'",[217,3583,877],{"class":319},[217,3585,3586,3588,3590,3592,3594,3596,3599,3601,3604],{"class":219,"line":387},[217,3587,2561],{"class":323},[217,3589,2564],{"class":223},[217,3591,2567],{"class":319},[217,3593,2845],{"class":227},[217,3595,2551],{"class":319},[217,3597,3598],{"class":227},"'部門'",[217,3600,2551],{"class":319},[217,3602,3603],{"class":227},"'薪資'",[217,3605,2583],{"class":319},[217,3607,3608,3610,3612],{"class":219,"line":410},[217,3609,2561],{"class":323},[217,3611,2590],{"class":223},[217,3613,2504],{"class":319},[217,3615,3616,3618,3621,3623,3626,3628,3631],{"class":219,"line":424},[217,3617,2597],{"class":319},[217,3619,3620],{"class":227},"'王小明'",[217,3622,2551],{"class":319},[217,3624,3625],{"class":227},"'工程部'",[217,3627,2551],{"class":319},[217,3629,3630],{"class":237},"60000",[217,3632,2612],{"class":319},[217,3634,3635,3637,3640,3642,3645,3647,3650],{"class":219,"line":441},[217,3636,2597],{"class":319},[217,3638,3639],{"class":227},"'李小華'",[217,3641,2551],{"class":319},[217,3643,3644],{"class":227},"'行銷部'",[217,3646,2551],{"class":319},[217,3648,3649],{"class":237},"55000",[217,3651,2612],{"class":319},[217,3653,3654,3656,3659,3661,3664,3666,3669],{"class":219,"line":908},[217,3655,2597],{"class":319},[217,3657,3658],{"class":227},"'陳美玲'",[217,3660,2551],{"class":319},[217,3662,3663],{"class":227},"'人資部'",[217,3665,2551],{"class":319},[217,3667,3668],{"class":237},"58000",[217,3670,2612],{"class":319},[217,3672,3673],{"class":219,"line":1560},[217,3674,2673],{"class":319},[217,3676,3677,3679,3682,3684,3686,3688,3690],{"class":219,"line":1566},[217,3678,2561],{"class":323},[217,3680,3681],{"class":223},"freezePanes",[217,3683,2473],{"class":319},[217,3685,2481],{"class":237},[217,3687,2551],{"class":319},[217,3689,2915],{"class":237},[217,3691,877],{"class":319},[217,3693,3694,3696,3699,3701,3704],{"class":219,"line":1660},[217,3695,2561],{"class":323},[217,3697,3698],{"class":223},"autoFilter",[217,3700,2473],{"class":319},[217,3702,3703],{"class":227},"'A1:C4'",[217,3705,877],{"class":319},[217,3707,3708,3710,3712],{"class":219,"line":1666},[217,3709,2561],{"class":323},[217,3711,2681],{"class":223},[217,3713,2684],{"class":319},[1103,3715,3716],{"id":3716},"多個工作表",[15,3718,3719,3720,3723],{},"一份檔案需要不同分類資料時，可使用 ",[55,3721,3722],{},"addSheet()"," 新增工作表。",[208,3725,3727],{"className":2457,"code":3726,"language":2404,"meta":213,"style":213},"$file = $excel->fileName('monthly-report.xlsx', '一月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 50000]]);\n\n$file->addSheet('二月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 62000]])\n    ->output();\n",[55,3728,3729,3753,3769,3789,3793,3809,3825,3843],{"__ignoreMap":213},[217,3730,3731,3733,3735,3737,3739,3741,3743,3746,3748,3751],{"class":219,"line":220},[217,3732,2796],{"class":319},[217,3734,854],{"class":323},[217,3736,2537],{"class":319},[217,3738,2540],{"class":323},[217,3740,2543],{"class":223},[217,3742,2473],{"class":319},[217,3744,3745],{"class":227},"'monthly-report.xlsx'",[217,3747,2551],{"class":319},[217,3749,3750],{"class":227},"'一月'",[217,3752,877],{"class":319},[217,3754,3755,3757,3759,3761,3763,3765,3767],{"class":219,"line":387},[217,3756,2561],{"class":323},[217,3758,2564],{"class":223},[217,3760,2567],{"class":319},[217,3762,2570],{"class":227},[217,3764,2551],{"class":319},[217,3766,2575],{"class":227},[217,3768,2583],{"class":319},[217,3770,3771,3773,3775,3778,3781,3783,3786],{"class":219,"line":410},[217,3772,2561],{"class":323},[217,3774,2590],{"class":223},[217,3776,3777],{"class":319},"([[",[217,3779,3780],{"class":227},"'服務收入'",[217,3782,2551],{"class":319},[217,3784,3785],{"class":237},"50000",[217,3787,3788],{"class":319},"]]);\n",[217,3790,3791],{"class":219,"line":424},[217,3792,896],{"emptyLinePlaceholder":895},[217,3794,3795,3797,3799,3802,3804,3807],{"class":219,"line":441},[217,3796,2831],{"class":319},[217,3798,2540],{"class":323},[217,3800,3801],{"class":223},"addSheet",[217,3803,2473],{"class":319},[217,3805,3806],{"class":227},"'二月'",[217,3808,877],{"class":319},[217,3810,3811,3813,3815,3817,3819,3821,3823],{"class":219,"line":908},[217,3812,2561],{"class":323},[217,3814,2564],{"class":223},[217,3816,2567],{"class":319},[217,3818,2570],{"class":227},[217,3820,2551],{"class":319},[217,3822,2575],{"class":227},[217,3824,2583],{"class":319},[217,3826,3827,3829,3831,3833,3835,3837,3840],{"class":219,"line":1560},[217,3828,2561],{"class":323},[217,3830,2590],{"class":223},[217,3832,3777],{"class":319},[217,3834,3780],{"class":227},[217,3836,2551],{"class":319},[217,3838,3839],{"class":237},"62000",[217,3841,3842],{"class":319},"]])\n",[217,3844,3845,3847,3849],{"class":219,"line":1566},[217,3846,2561],{"class":323},[217,3848,2681],{"class":223},[217,3850,2684],{"class":319},[63,3852,3853],{"id":3853},"結論",[15,3855,3856,3857,100,3859,3862,3863,3866,3867,3869],{},"xlswriter 很適合 PHP 專案中「大量資料匯出、低記憶體讀取」的需求。一般報表可從 ",[55,3858,3018],{},[55,3860,3861],{},"header()"," 與 ",[55,3864,3865],{},"data()"," 開始；資料量上來後，再改用 ",[55,3868,2728],{}," 配合逐筆或分批資料來源。",[15,3871,3872,3873,3862,3878,187],{},"更多樣式、圖片、圖表、條件格式與資料驗證的使用方式，可參考 ",[19,3874,3877],{"href":3875,"rel":3876},"https:\u002F\u002Fxlswriter-docs.viest.me\u002F",[291],"xlswriter 官方文件",[19,3879,3881],{"href":2229,"rel":3880},[291],"GitHub 專案說明",[1302,3883,3884],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":213,"searchDepth":387,"depth":387,"links":3886},[3887,3888,3889,3893,3894,3895,3896,3901],{"id":2217,"depth":387,"text":2217},{"id":2244,"depth":387,"text":2245},{"id":2268,"depth":387,"text":2268,"children":3890},[3891,3892],{"id":2271,"depth":410,"text":2272},{"id":2359,"depth":410,"text":2360},{"id":2450,"depth":387,"text":2451},{"id":2721,"depth":387,"text":2722},{"id":3034,"depth":387,"text":3035},{"id":3341,"depth":387,"text":3342,"children":3897},[3898,3899,3900],{"id":3345,"depth":410,"text":3345},{"id":3560,"depth":410,"text":3560},{"id":3716,"depth":410,"text":3716},{"id":3853,"depth":387,"text":3853},"program","\u002Fimages\u002Farticles\u002F2026-08-23-php-xlswriter\u002Fcover.png",{},"\u002Farticles\u002F2026-08-23-php-xlswriter","2026-08-23 16:34:00",{"title":2212,"description":213},"articles\u002F2026-08-23-php-xlswriter","當 PHP 需要匯出或讀取大量 Excel 資料時，xlswriter 能以 C 擴充套件提供低記憶體、高效率的 XLSX 處理方式。本文整理安裝流程、基本讀寫與大檔案實務。",[2404,3911,3912],"xlsx","excel","PjuYpKGMlBP6OKKk89MouFpPRrxi7MEm_mATwpAnBr0",{"id":3915,"title":3916,"body":3917,"category":3985,"description":3986,"extension":1324,"image":3987,"meta":3988,"navigation":895,"path":3989,"pubDate":3990,"seo":3991,"status":895,"stem":3992,"summary":3993,"tags":3994,"__hash__":3995},"content\u002Farticles\u002F2026-08-16-2026-new-theme.md","2026 新版型",{"type":8,"value":3918,"toc":3983},[3919,3922,3942,3960,3963,3974],[11,3920,3921],{"id":3921},"更新內容",[15,3923,3924,3925,3928,3929,3931,3932,3935,3936,3938,3939,3941],{},"這幾年 AI 能力飛越式進步，而 ",[55,3926,3927],{},"vibe coding"," 更是成熱門話題，自己的工作，也開始導入 ",[55,3930,3927],{}," ，最近心血來潮，想著自己的部落格的技術堆疊，也許久沒有更新了，還停留在 2022 年的 ",[55,3933,3934],{},"nuxt.js"," 2 建構，而如今 ",[55,3937,3934],{}," 已然更新至第 4 版了，所以不如用 ",[55,3940,3927],{}," 來重建自己的部落格。",[15,3943,3944,3945,3948,3949,3951,3952,3955,3956,3959],{},"這次主要使用 ",[55,3946,3947],{},"opencode"," 來進行開發，使用了 ",[55,3950,3934],{}," 4、",[55,3953,3954],{},"nuxt\u002Fcontent"," v3 和 ",[55,3957,3958],{},"nuxt\u002Fui"," 等套件來建立這個部落格。",[11,3961,3962],{"id":3962},"感想",[15,3964,3944,3965,3967,3968,3970,3971,3973],{},[55,3966,3927],{}," 旳方式進行開發，整個開發體驗想當不錯，或許開發部落格網站，對於 AI 模型的要求並不高，只用了 ",[55,3969,3947],{}," 官方提供的免費模型，就完成了大部份的功能，也且開發時間，記得舊部格程式前後，也差不多也花了一個多月的空閒時間手刻，不過這次用 ",[55,3972,3927],{}," 整體花的時間，約十多天的天數，就完成大部份的功能。",[15,3975,3976,3977,3979,3980,3982],{},"看來 ",[55,3978,3927],{}," 也成為未來開發系統的主流，後續我也會分享自己 ",[55,3981,3927],{}," 的經驗。",{"title":213,"searchDepth":387,"depth":387,"links":3984},[],"站務","這幾年 AI 能力飛越式進步，而 vibe coding 更是成熱門話題，自己的工作，也開始導入 vibe coding ，最近心血來潮，想著自己的部落格的技術堆疊，也許久沒有更新了，還停留在 2022 年的 nuxt.js 2 建構，而如今 nuxt.js 已然更新至第 4 版了，所以不如用 vibe coding 來重建自己的部落格。","\u002Fimages\u002Farticles\u002F2026-08-16-2026-new-theme\u002Fcover.jpg",{},"\u002Farticles\u002F2026-08-16-2026-new-theme","2026-08-16 15:54:00",{"title":3916,"description":3986},"articles\u002F2026-08-16-2026-new-theme","部落格從 2022 年的 Nuxt 2 升級至 Nuxt 4 與 Nuxt Content v3，全程以 vibe coding 進行，使用 opencode 與免費模型完成大部分功能，開發時間從一個多月縮短至十多天，記錄這次難得的重建體驗。",[3985],"kfi3xMmARhktM-Gn0dE78ZILmke6mSELMjRhOJ857nE",{"id":3997,"title":3998,"body":3999,"category":1322,"description":213,"extension":1324,"image":4579,"meta":4580,"navigation":895,"path":4581,"pubDate":4582,"seo":4583,"status":895,"stem":4584,"summary":4585,"tags":4586,"__hash__":4587},"content\u002Farticles\u002F2026-06-29-opencode-state.md","使用 OpenCode stats 指令掌握 AI 開發成本：完整參數與實戰範例",{"type":8,"value":4000,"toc":4557},[4001,4009,4012,4026,4032,4034,4040,4043,4055,4058,4060,4063,4068,4083,4086,4108,4111,4113,4119,4125,4142,4145,4161,4163,4169,4175,4217,4220,4228,4230,4236,4242,4283,4286,4294,4296,4302,4308,4330,4333,4354,4361,4363,4366,4369,4373,4376,4401,4404,4415,4418,4420,4424,4427,4446,4449,4457,4460,4462,4466,4469,4489,4492,4500,4503,4511,4513,4517,4523,4537,4548,4554],[63,4002,4004,4005,4008],{"id":4003},"為什麼要看-opencode-stats","為什麼要看 ",[55,4006,4007],{},"opencode stats","？",[15,4010,4011],{},"當我們開始大量使用 AI 做開發（Code Review、產生程式碼、寫文件、跑資料分析…），往往會有幾個共同的疑問：",[28,4013,4014,4017,4020,4023],{},[31,4015,4016],{},"最近到底用了多少 Token？",[31,4018,4019],{},"哪些模型最燒錢？",[31,4021,4022],{},"哪些工具（像 bash、webfetch 這類）被呼叫得最頻繁？",[31,4024,4025],{},"某個專案是不是特別花錢？",[15,4027,4028,4029,4031],{},"如果手上沒有清楚的統計數據，很難優化「模型選擇」與「使用習慣」。這時候，OpenCode 的 ",[55,4030,4007],{}," 就派上用場了。",[60,4033],{},[63,4035,4037,4039],{"id":4036},"opencode-stats-基本用法",[55,4038,4007],{}," 基本用法",[15,4041,4042],{},"最基本的指令非常單純：",[208,4044,4046],{"className":210,"code":4045,"language":212,"meta":213,"style":213},"opencode stats  \n",[55,4047,4048],{"__ignoreMap":213},[217,4049,4050,4052],{"class":219,"line":220},[217,4051,3947],{"class":223},[217,4053,4054],{"class":227}," stats\n",[15,4056,4057],{},"不帶任何參數時，它會顯示「所有時間、所有專案」的整體 Token 用量與費用統計，適合當作一個總體健康檢查（Health Check）：最近 AI 用得多不多、成本有沒有暴衝。",[60,4059],{},[63,4061,4062],{"id":4062},"常用參數與行為說明",[15,4064,4065,4067],{},[55,4066,4007],{}," 支援一組 flags，可以自由組合：",[208,4069,4071],{"className":210,"code":4070,"language":212,"meta":213,"style":213},"opencode stats [flags]  \n",[55,4072,4073],{"__ignoreMap":213},[217,4074,4075,4077,4080],{"class":219,"line":220},[217,4076,3947],{"class":223},[217,4078,4079],{"class":227}," stats",[217,4081,4082],{"class":319}," [flags]\n",[15,4084,4085],{},"常用的有這幾個：",[28,4087,4088,4093,4098,4103],{},[31,4089,4090],{},[55,4091,4092],{},"--days N",[31,4094,4095],{},[55,4096,4097],{},"--tools [N]",[31,4099,4100],{},[55,4101,4102],{},"--models [N]",[31,4104,4105],{},[55,4106,4107],{},"--project P",[15,4109,4110],{},"下面逐一說明它們的用途與使用情境。",[60,4112],{},[1103,4114,4116,4118],{"id":4115},"days-n限制查詢時間範圍",[55,4117,4092],{},"：限制查詢時間範圍",[15,4120,4121,4124],{},[55,4122,4123],{},"--days"," 用來控制「要看最近幾天」的用量。例如，只想看最近一週：",[208,4126,4128],{"className":210,"code":4127,"language":212,"meta":213,"style":213},"opencode stats --days 7  \n",[55,4129,4130],{"__ignoreMap":213},[217,4131,4132,4134,4136,4139],{"class":219,"line":220},[217,4133,3947],{"class":223},[217,4135,4079],{"class":227},[217,4137,4138],{"class":237}," --days",[217,4140,4141],{"class":237}," 7\n",[15,4143,4144],{},"這在兩種情境特別好用：",[2109,4146,4147,4154],{},[31,4148,4149,4150,4153],{},"每月或每週例行檢查：例如每到月底看一次 ",[55,4151,4152],{},"--days 30","，檢查這個月 AI 成本。",[31,4155,4156,4157,4160],{},"某次實驗或專案密集期：例如你在最近兩週大量嘗試新模型，就可以用 ",[55,4158,4159],{},"--days 14"," 來看這段期間的影響。",[60,4162],{},[1103,4164,4166,4168],{"id":4165},"tools-n觀察工具使用熱度",[55,4167,4097],{},"：觀察工具使用熱度",[15,4170,4171,4174],{},[55,4172,4173],{},"--tools"," 會列出各個工具（例如 bash、webfetch…）的使用統計。若不帶數字，會顯示全部工具；帶數字則只顯示前 N 名。你可以：",[208,4176,4178],{"className":210,"code":4177,"language":212,"meta":213,"style":213},"# 顯示所有工具用量  \nopencode stats --tools  \n\n# 只顯示使用量前 5 名的工具  \nopencode stats --tools 5  \n",[55,4179,4180,4185,4197,4201,4206],{"__ignoreMap":213},[217,4181,4182],{"class":219,"line":220},[217,4183,4184],{"class":1521},"# 顯示所有工具用量  \n",[217,4186,4187,4189,4191,4194],{"class":219,"line":387},[217,4188,3947],{"class":223},[217,4190,4079],{"class":227},[217,4192,4193],{"class":237}," --tools",[217,4195,4196],{"class":319},"  \n",[217,4198,4199],{"class":219,"line":410},[217,4200,896],{"emptyLinePlaceholder":895},[217,4202,4203],{"class":219,"line":424},[217,4204,4205],{"class":1521},"# 只顯示使用量前 5 名的工具  \n",[217,4207,4208,4210,4212,4214],{"class":219,"line":441},[217,4209,3947],{"class":223},[217,4211,4079],{"class":227},[217,4213,4193],{"class":237},[217,4215,4216],{"class":237}," 5\n",[15,4218,4219],{},"這有幾個實際用途：",[28,4221,4222,4225],{},[31,4223,4224],{},"了解「AI 在幫你做什麼」：是更多在跑 shell 指令、還是瘋狂打 API？",[31,4226,4227],{},"找出可能的最佳化點：某個工具用量特別高，可能代表流程可以再調整，或有機會改成一次性的腳本／排程。",[60,4229],{},[1103,4231,4233,4235],{"id":4232},"models-n檢視模型用量與費用明細",[55,4234,4102],{},"：檢視模型用量與費用明細",[15,4237,4238,4241],{},[55,4239,4240],{},"--models"," 則是針對各個模型（provider\u002Fmodel，例如某家雲廠商的特定模型）的 Token 與費用明細。若不帶數字，會列出所有模型明細；帶數字則只顯示前 N 名。你可以：",[208,4243,4245],{"className":210,"code":4244,"language":212,"meta":213,"style":213},"# 顯示所有模型詳細用量  \nopencode stats --models  \n\n# 只顯示用量前 3 名的模型  \nopencode stats --models 3  \n",[55,4246,4247,4252,4263,4267,4272],{"__ignoreMap":213},[217,4248,4249],{"class":219,"line":220},[217,4250,4251],{"class":1521},"# 顯示所有模型詳細用量  \n",[217,4253,4254,4256,4258,4261],{"class":219,"line":387},[217,4255,3947],{"class":223},[217,4257,4079],{"class":227},[217,4259,4260],{"class":237}," --models",[217,4262,4196],{"class":319},[217,4264,4265],{"class":219,"line":410},[217,4266,896],{"emptyLinePlaceholder":895},[217,4268,4269],{"class":219,"line":424},[217,4270,4271],{"class":1521},"# 只顯示用量前 3 名的模型  \n",[217,4273,4274,4276,4278,4280],{"class":219,"line":441},[217,4275,3947],{"class":223},[217,4277,4079],{"class":227},[217,4279,4260],{"class":237},[217,4281,4282],{"class":237}," 3\n",[15,4284,4285],{},"這對於成本控管特別關鍵：",[28,4287,4288,4291],{},[31,4289,4290],{},"找出哪幾個模型是主力：你日常最常依賴哪些模型。",[31,4292,4293],{},"監控高單價模型：如果某些高價模型意外成為 Top 3，就需要檢查是否有誤用或參數設計不佳的地方。",[60,4295],{},[1103,4297,4299,4301],{"id":4298},"project-p聚焦在特定專案",[55,4300,4107],{},"：聚焦在特定專案",[15,4303,4304,4307],{},[55,4305,4306],{},"--project"," 用來對某個專案做切片統計：",[208,4309,4311],{"className":210,"code":4310,"language":212,"meta":213,"style":213},"# 只看名為 \"project-name\" 的專案  \nopencode stats --project project-name  \n",[55,4312,4313,4318],{"__ignoreMap":213},[217,4314,4315],{"class":219,"line":220},[217,4316,4317],{"class":1521},"# 只看名為 \"project-name\" 的專案  \n",[217,4319,4320,4322,4324,4327],{"class":219,"line":387},[217,4321,3947],{"class":223},[217,4323,4079],{"class":227},[217,4325,4326],{"class":237}," --project",[217,4328,4329],{"class":227}," project-name\n",[15,4331,4332],{},"如果你已經在專案資料夾裡，還可以傳入空字串表示「當前專案」：",[208,4334,4336],{"className":210,"code":4335,"language":212,"meta":213,"style":213},"# 只看目前所在資料夾這個專案的統計  \nopencode stats --project \"\"  \n",[55,4337,4338,4343],{"__ignoreMap":213},[217,4339,4340],{"class":219,"line":220},[217,4341,4342],{"class":1521},"# 只看目前所在資料夾這個專案的統計  \n",[217,4344,4345,4347,4349,4351],{"class":219,"line":387},[217,4346,3947],{"class":223},[217,4348,4079],{"class":227},[217,4350,4326],{"class":237},[217,4352,4353],{"class":227}," \"\"\n",[15,4355,4356,4357,4360],{},"這在你只想分析單一 repo 時特別好用。請注意，若你並不在專案資料夾裡，",[55,4358,4359],{},"--project \"\""," 可能不會取得預期結果。",[60,4362],{},[63,4364,4365],{"id":4365},"實戰組合範例",[15,4367,4368],{},"前面介紹完各個參數，我習慣在實作時搭配成幾個常用的查詢模板。",[1103,4370,4372],{"id":4371},"_1-最近-30-天目前專案的模型-top-5","1. 最近 30 天、目前專案的模型 Top 5",[15,4374,4375],{},"當你在某個專案上大量使用 AI 之後，很適合來一個月度回顧：",[208,4377,4379],{"className":210,"code":4378,"language":212,"meta":213,"style":213},"opencode stats --days 30 --project \"\" --models 5  \n",[55,4380,4381],{"__ignoreMap":213},[217,4382,4383,4385,4387,4389,4392,4394,4397,4399],{"class":219,"line":220},[217,4384,3947],{"class":223},[217,4386,4079],{"class":227},[217,4388,4138],{"class":237},[217,4390,4391],{"class":237}," 30",[217,4393,4326],{"class":237},[217,4395,4396],{"class":227}," \"\"",[217,4398,4260],{"class":237},[217,4400,4216],{"class":237},[15,4402,4403],{},"這條指令會告訴你：",[28,4405,4406,4409,4412],{},[31,4407,4408],{},"最近 30 天，這個專案用了哪些模型？",[31,4410,4411],{},"哪些模型是前五名？用量大概占比多少？",[31,4413,4414],{},"有沒有哪個模型使用量超出你原先的預期？",[15,4416,4417],{},"如果你發現某個昂貴的模型排進 Top 5，而且還不是關鍵需求，就可以考慮換成 CP 值更高的選擇。",[60,4419],{},[1103,4421,4423],{"id":4422},"_2-最近-14-天全工作區工具使用總覽","2. 最近 14 天、全工作區工具使用總覽",[15,4425,4426],{},"如果你想從「工作型態」的角度切入，而不是模型角度，可以這樣看工具用量：",[208,4428,4430],{"className":210,"code":4429,"language":212,"meta":213,"style":213},"opencode stats --days 14 --tools  \n",[55,4431,4432],{"__ignoreMap":213},[217,4433,4434,4436,4438,4440,4443],{"class":219,"line":220},[217,4435,3947],{"class":223},[217,4437,4079],{"class":227},[217,4439,4138],{"class":237},[217,4441,4442],{"class":237}," 14",[217,4444,4445],{"class":237}," --tools\n",[15,4447,4448],{},"透過這個視角，你可以觀察：",[28,4450,4451,4454],{},[31,4452,4453],{},"AI 比較常幫你做 I\u002FO（例如 webfetch），還是純文字推理？",[31,4455,4456],{},"是否大量使用某些 Shell 工具（例如 bash），代表你已經開始把 DevOps 類型的任務交給 AI？",[15,4458,4459],{},"這有助於你調整自己的工作習慣，例如將重複性的 CLI 操作逐步交給 AI 自動化。",[60,4461],{},[1103,4463,4465],{"id":4464},"_3-單一專案的完整成本分析模型-工具","3. 單一專案的完整成本分析（模型 + 工具）",[15,4467,4468],{},"當你想為某個專案做一次「完整的 AI 成本盤點」時，可以把模型與工具一起開：",[208,4470,4472],{"className":210,"code":4471,"language":212,"meta":213,"style":213},"opencode stats --project project-name --models --tools  \n",[55,4473,4474],{"__ignoreMap":213},[217,4475,4476,4478,4480,4482,4485,4487],{"class":219,"line":220},[217,4477,3947],{"class":223},[217,4479,4079],{"class":227},[217,4481,4326],{"class":237},[217,4483,4484],{"class":227}," project-name",[217,4486,4260],{"class":237},[217,4488,4445],{"class":237},[15,4490,4491],{},"用這種方式，你可以同時看到：",[28,4493,4494,4497],{},[31,4495,4496],{},"這個專案用了哪些模型、各自的 Token 與費用。",[31,4498,4499],{},"AI 在這個專案裡最常被拿來搭配哪些工具。",[15,4501,4502],{},"從這些數據出發，你可以進一步調整：",[28,4504,4505,4508],{},[31,4506,4507],{},"Default 模型（讓 Plan \u002F Build 走更便宜或更強大的路線）。",[31,4509,4510],{},"工作流程設計（例如是否將某些重度工具操作改成批次執行，而不是在對話中頻繁觸發）。",[60,4512],{},[63,4514,4516],{"id":4515},"結語用數據讓-ai-助手更划算","結語：用數據讓 AI 助手更「划算」",[15,4518,4519,4520,4522],{},"引入 AI 助手到日常開發流程，不只是為了「變快」或「變輕鬆」，更重要的是能長期、可持續地使用。",[55,4521,4007],{}," 提供的，就是一個將「感覺」轉成「數字」的入口。",[15,4524,4525,4526,4528,4529,4531,4532,3862,4534,4536],{},"透過 ",[55,4527,4123],{}," 控制時間範圍、",[55,4530,4306],{}," 聚焦特定專案，再搭配 ",[55,4533,4240],{},[55,4535,4173],{}," 做細部分析，你可以：",[28,4538,4539,4542,4545],{},[31,4540,4541],{},"找出真正的主力模型與工具。",[31,4543,4544],{},"及早發現成本異常的使用模式。",[31,4546,4547],{},"有依據地調整預設模型與工作流程設計。",[15,4549,4550,4551,4553],{},"如果你已經習慣用 OpenCode 協助開發，建議把幾條常用的 ",[55,4552,4007],{}," 查詢，加到自己的工作流程（甚至包成 script 或 alias），讓「看 AI 成本」和「看 CI\u002FCD 狀態」、「看監控儀表板」一樣自然，成為開發日常的一部分。",[1302,4555,4556],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":4558},[4559,4561,4563,4573,4578],{"id":4003,"depth":387,"text":4560},"為什麼要看 opencode stats？",{"id":4036,"depth":387,"text":4562},"opencode stats 基本用法",{"id":4062,"depth":387,"text":4062,"children":4564},[4565,4567,4569,4571],{"id":4115,"depth":410,"text":4566},"--days N：限制查詢時間範圍",{"id":4165,"depth":410,"text":4568},"--tools [N]：觀察工具使用熱度",{"id":4232,"depth":410,"text":4570},"--models [N]：檢視模型用量與費用明細",{"id":4298,"depth":410,"text":4572},"--project P：聚焦在特定專案",{"id":4365,"depth":387,"text":4365,"children":4574},[4575,4576,4577],{"id":4371,"depth":410,"text":4372},{"id":4422,"depth":410,"text":4423},{"id":4464,"depth":410,"text":4465},{"id":4515,"depth":387,"text":4516},"\u002Fimages\u002Farticles\u002F2026-06-29-opencode-state\u002Fcover.png",{},"\u002Farticles\u002F2026-06-29-opencode-state","2026-06-29 15:02:00",{"title":3998,"description":213},"articles\u002F2026-06-29-opencode-state","當 AI 助手真正進入開發流程後，**量化模型與工具的使用情況、掌握實際成本**就變得非常重要 OpenCode 提供的 `opencode stats` 指令，可以幫你快速統計各模型、各工具、各專案的 Token 用量與花費。從「感覺好像很常用」進化到「有數字、有依據」的資源管理。本文整理 `opencode stats` 的常見參數與組合用法，並分享幾個實務上常用的查詢範例。",[1333,3947,2207,1336],"yQw3h2bKYW2VAUAF2zAXSLe_JOHylI9yq7K7oL9oWVM",{"id":4589,"title":4590,"body":4591,"category":1322,"description":213,"extension":1324,"image":4824,"meta":4825,"navigation":895,"path":4826,"pubDate":4827,"seo":4828,"status":895,"stem":4829,"summary":4830,"tags":4831,"__hash__":4832},"content\u002Farticles\u002F2026-05-15-opencode-context7-mcp.md","告別 AI 幻覺！用 Context7 MCP 讓 Opencode 即時讀取最新官方文件",{"type":8,"value":4592,"toc":4817},[4593,4597,4606,4609,4613,4616,4648,4652,4659,4662,4676,4694,4700,4703,4787,4790,4803,4809,4811,4814],[63,4594,4596],{"id":4595},"何為-mcp","何為  MCP",[15,4598,4599,4600,4605],{},"全名為 Model Context Protocol（模型上下文協定），它是一種讓 AI 可以「連接外部工具、資料、服務」的標準協定。由 ",[19,4601,4604],{"href":4602,"rel":4603},"https:\u002F\u002Fwww.anthropic.com?utm_source=chatgpt.com",[291],"Anthropic"," 在 2024 年提出。",[15,4607,4608],{},"簡單的說讓AI模型與外部工具互通的協定， 摡念就像是不同設備間，可以用 USB 這個通訊協定來互傳資料",[63,4610,4612],{"id":4611},"mcp-可以做什麼","MCP 可以做什麼？",[15,4614,4615],{},"它能讓AI模型做以下事情，甚致更多，只要應用服務商提供 MCP 接口，就可以讓 AI 模型操作各種服務",[28,4617,4618,4621,4624,4627,4630,4633,4636,4639,4642,4645],{},[31,4619,4620],{},"讀檔案",[31,4622,4623],{},"查資料庫",[31,4625,4626],{},"操作 GitHub",[31,4628,4629],{},"控制 Docker",[31,4631,4632],{},"查官方文件",[31,4634,4635],{},"執行 Shell",[31,4637,4638],{},"發 Slack",[31,4640,4641],{},"查 Notion",[31,4643,4644],{},"存取 PostgreSQL",[31,4646,4647],{},"操作 Browser",[63,4649,4651],{"id":4650},"何謂-context7","何謂 Context7",[15,4653,4654,4655,4658],{},"Context7 是 MCP 中很出名的應用服務，它可以讓 AI 模型在 coding 時，可以即時讀取",[47,4656,4657],{},"最新版本的官方文件","，讓 AI 模型在進行回答或 Vibe Coding 時，可以即時查詢官方文件，來回答問題，而非僅靠訓練記憶，更可大幅減少 AI 幻覺。",[15,4660,4661],{},"如可在opencode 中設定 Context7 MCP",[2109,4663,4664,4673],{},[31,4665,4666,4667,4672],{},"在 ",[19,4668,4671],{"href":4669,"rel":4670},"https:\u002F\u002Fcontext7.com\u002F",[291],"Context 7 官網"," 註冊帳號",[31,4674,4675],{},"在命令列執行以下指令：",[208,4677,4679],{"className":210,"code":4678,"language":212,"meta":213,"style":213},"npx ctx7 setup --opencode\n",[55,4680,4681],{"__ignoreMap":213},[217,4682,4683,4685,4688,4691],{"class":219,"line":220},[217,4684,224],{"class":223},[217,4686,4687],{"class":227}," ctx7",[217,4689,4690],{"class":227}," setup",[217,4692,4693],{"class":237}," --opencode\n",[15,4695,4696,4697],{},"此指令將會幫你取得 Context7 API key，建議先入 ",[19,4698,4671],{"href":4669,"rel":4699},[291],[15,4701,4702],{},"安裝成功會出現以下訊息：",[208,4704,4706],{"className":210,"code":4705,"language":212,"meta":213,"style":213},"✔ Context7 setup complete\n\n  OpenCode\n    + MCP server configured with API Key\n      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002Fopencode.json\n    + Rule installed\n      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002FAGENTS.md\n    + Skill installed\n      \u002FUsers\u002Fuser\u002F.agents\u002Fskills\u002Fcontext7-mcp\u002FSKILL.md\n",[55,4707,4708,4721,4725,4730,4753,4758,4768,4773,4782],{"__ignoreMap":213},[217,4709,4710,4713,4716,4718],{"class":219,"line":220},[217,4711,4712],{"class":223},"✔",[217,4714,4715],{"class":227}," Context7",[217,4717,4690],{"class":227},[217,4719,4720],{"class":227}," complete\n",[217,4722,4723],{"class":219,"line":387},[217,4724,896],{"emptyLinePlaceholder":895},[217,4726,4727],{"class":219,"line":410},[217,4728,4729],{"class":223},"  OpenCode\n",[217,4731,4732,4735,4738,4741,4744,4747,4750],{"class":219,"line":424},[217,4733,4734],{"class":223},"    +",[217,4736,4737],{"class":227}," MCP",[217,4739,4740],{"class":227}," server",[217,4742,4743],{"class":227}," configured",[217,4745,4746],{"class":227}," with",[217,4748,4749],{"class":227}," API",[217,4751,4752],{"class":227}," Key\n",[217,4754,4755],{"class":219,"line":441},[217,4756,4757],{"class":223},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002Fopencode.json\n",[217,4759,4760,4762,4765],{"class":219,"line":908},[217,4761,4734],{"class":223},[217,4763,4764],{"class":227}," Rule",[217,4766,4767],{"class":227}," installed\n",[217,4769,4770],{"class":219,"line":1560},[217,4771,4772],{"class":223},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002FAGENTS.md\n",[217,4774,4775,4777,4780],{"class":219,"line":1566},[217,4776,4734],{"class":223},[217,4778,4779],{"class":227}," Skill",[217,4781,4767],{"class":227},[217,4783,4784],{"class":219,"line":1660},[217,4785,4786],{"class":223},"      \u002FUsers\u002Fuser\u002F.agents\u002Fskills\u002Fcontext7-mcp\u002FSKILL.md\n",[63,4788,4789],{"id":4789},"驗證安裝",[15,4791,4666,4792,4794,4795,4798,4799,4802],{},[55,4793,3947],{}," 命令列中，輪入 ",[55,4796,4797],{},"\u002Fmcps"," 在列表中看見 ",[55,4800,4801],{},"context7 connected"," 資訊表示安裝成功",[15,4804,4805],{},[930,4806],{"alt":4807,"src":4808},"Opencode MCP List","\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fopencode-mcp.png",[63,4810,3853],{"id":3853},[15,4812,4813],{},"MCP 協定的出現讓 AI 從單純的「知識庫」轉變為能操作工具的「代理人」。而 Context7 則解決了 AI 最令人頭痛的「過時資訊」問題。將其設定在 Opencode 中後，AI 能夠在即時對接官方文件的基礎上進行編碼，讓開發體驗更加流暢且可靠。",[1302,4815,4816],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":387,"depth":387,"links":4818},[4819,4820,4821,4822,4823],{"id":4595,"depth":387,"text":4596},{"id":4611,"depth":387,"text":4612},{"id":4650,"depth":387,"text":4651},{"id":4789,"depth":387,"text":4789},{"id":3853,"depth":387,"text":3853},"\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fcover.png",{},"\u002Farticles\u002F2026-05-15-opencode-context7-mcp","2026-05-15 14:44:00",{"title":4590,"description":213},"articles\u002F2026-05-15-opencode-context7-mcp","Context7 這款 MCP 應用，它能讓 Opencode 在編碼時即時讀取最新版本的官方文件，而非僅依賴過時的訓練記憶，從而大幅減少 AI 幻覺並提升回答的準確性。",[1333,3947,2207,1336],"MD4aLm9bpk4W1cPswPYYPpPu2SWjkYB6cY0MKJo50aY",{"id":4834,"title":4835,"body":4836,"category":2208,"description":213,"extension":1324,"image":5255,"meta":5256,"navigation":895,"path":5257,"pubDate":5258,"seo":5259,"status":895,"stem":5260,"summary":5261,"tags":5262,"__hash__":5265},"content\u002Farticles\u002F2026-02-27-mole-tutorial.md","Mole 使用教學：macOS 深度清理與優化神器",{"type":8,"value":4837,"toc":5232},[4838,4842,4866,4869,4878,4880,4884,4887,4891,4905,4908,4911,4930,4937,4939,4942,4949,4952,4970,5006,5013,5019,5031,5034,5041,5047,5055,5067,5074,5077,5094,5106,5113,5116,5134,5146,5153,5169,5181,5183,5186,5220,5222,5224,5227,5229],[63,4839,4841],{"id":4840},"什麼是-mole","什麼是 Mole？",[15,4843,4844,4849,4850,4853,4854,4857,4858,4861,4862,4865],{},[19,4845,4848],{"href":4846,"rel":4847},"https:\u002F\u002Fgithub.com\u002Ftw93\u002FMole",[291],"Mole"," 是一個為 macOS 設計的開源全能工具箱。它的目標是取代多個付費或分散的工具，將 ",[47,4851,4852],{},"CleanMyMac","（清理）、",[47,4855,4856],{},"AppCleaner","（解除安裝）、",[47,4859,4860],{},"DaisyDisk","（磁碟分析）以及 ",[47,4863,4864],{},"iStat Menus","（實時監控）的核心功能整合進一個單一的二進位檔案中。",[15,4867,4868],{},"Mole 採用終端機介面（TUI），操作流暢且反應迅速，非常適合喜愛簡潔、高效工作的開發者與進階使用者。",[15,4870,4871,257,4874],{},[47,4872,4873],{},"專案網址",[19,4875,4877],{"href":4846,"rel":4876},[291],"tw93\u002FMole",[60,4879],{},[63,4881,4883],{"id":4882},"安裝-mole","安裝 Mole",[15,4885,4886],{},"安裝 Mole 極其簡單，你可以選擇透過 Homebrew（推薦）或是官方腳本。",[1103,4888,4890],{"id":4889},"使用-homebrew","使用 Homebrew",[208,4892,4894],{"className":210,"code":4893,"language":212,"meta":213,"style":213},"brew install mole\n",[55,4895,4896],{"__ignoreMap":213},[217,4897,4898,4900,4902],{"class":219,"line":220},[217,4899,1495],{"class":223},[217,4901,1498],{"class":227},[217,4903,4904],{"class":227}," mole\n",[1103,4906,4907],{"id":4907},"使用官方腳本",[15,4909,4910],{},"如果你沒有安裝 Homebrew，也可以直接執行安裝腳本：",[208,4912,4914],{"className":210,"code":4913,"language":212,"meta":213,"style":213},"curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh | bash\n",[55,4915,4916],{"__ignoreMap":213},[217,4917,4918,4920,4922,4925,4927],{"class":219,"line":220},[217,4919,1578],{"class":223},[217,4921,1581],{"class":237},[217,4923,4924],{"class":227}," https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh",[217,4926,1772],{"class":323},[217,4928,4929],{"class":223}," bash\n",[15,4931,4932,4933,4936],{},"安裝完成後，在終端機輸入 ",[55,4934,4935],{},"mo"," 即可啟動互動式選單，或直接加上子命令執行特定功能。",[60,4938],{},[63,4940,4941],{"id":4941},"核心功能詳解",[1103,4943,4945,4946,1612],{"id":4944},"_1-深度系統清理-mo-clean","1. 深度系統清理 (",[55,4947,4948],{},"mo clean",[15,4950,4951],{},"這是 Mole 最常用的功能。它會掃描系統中的各種快取、日誌與垃圾檔案，並提供視覺化的清理建議。",[28,4953,4954,4960],{},[31,4955,4956,4959],{},[47,4957,4958],{},"掃描範疇","：應用程式快取、瀏覽器快取（Chrome, Safari, Firefox）、開發者工具（Xcode, Node.js）、系統日誌、垃圾桶等。",[31,4961,4962,4965,4966,4969],{},[47,4963,4964],{},"預覽模式","：建議先執行 ",[55,4967,4968],{},"mo clean --dry-run"," 來查看預計清理的內容與風險等級。",[208,4971,4973],{"className":210,"code":4972,"language":212,"meta":213,"style":213},"# 執行深度清理\nmo clean\n\n# 僅查看預覽，不實際刪除\nmo clean --dry-run\n",[55,4974,4975,4980,4987,4991,4996],{"__ignoreMap":213},[217,4976,4977],{"class":219,"line":220},[217,4978,4979],{"class":1521},"# 執行深度清理\n",[217,4981,4982,4984],{"class":219,"line":387},[217,4983,4935],{"class":223},[217,4985,4986],{"class":227}," clean\n",[217,4988,4989],{"class":219,"line":410},[217,4990,896],{"emptyLinePlaceholder":895},[217,4992,4993],{"class":219,"line":424},[217,4994,4995],{"class":1521},"# 僅查看預覽，不實際刪除\n",[217,4997,4998,5000,5003],{"class":219,"line":441},[217,4999,4935],{"class":223},[217,5001,5002],{"class":227}," clean",[217,5004,5005],{"class":237}," --dry-run\n",[1103,5007,5009,5010,1612],{"id":5008},"_2-智慧解除安裝-mo-uninstall","2. 智慧解除安裝 (",[55,5011,5012],{},"mo uninstall",[15,5014,5015,5016,5018],{},"普通的刪除應用程式往往會留下許多「殘骸」。",[55,5017,5012],{}," 會搜尋並清理所有相關的偏好設定、支援檔案、Launch Agents 以及隱藏的殘留物。",[208,5020,5022],{"className":210,"code":5021,"language":212,"meta":213,"style":213},"mo uninstall\n",[55,5023,5024],{"__ignoreMap":213},[217,5025,5026,5028],{"class":219,"line":220},[217,5027,4935],{"class":223},[217,5029,5030],{"class":227}," uninstall\n",[15,5032,5033],{},"執行後會彈出清單，讓你選擇想要徹底移除的應用程式。",[1103,5035,5037,5038,1612],{"id":5036},"_3-系統優化-mo-optimize","3. 系統優化 (",[55,5039,5040],{},"mo optimize",[15,5042,5043,5044,5046],{},"當你感覺電腦變慢或網路異常時，",[55,5045,5040],{}," 可以幫助你快速重整系統狀態。",[28,5048,5049],{},[31,5050,5051,5054],{},[47,5052,5053],{},"功能包括","：重建系統資料庫、重置網路服務、重啟 Finder 與 Dock、清理診斷紀錄、重建 Spotlight 索引等。",[208,5056,5058],{"className":210,"code":5057,"language":212,"meta":213,"style":213},"mo optimize\n",[55,5059,5060],{"__ignoreMap":213},[217,5061,5062,5064],{"class":219,"line":220},[217,5063,4935],{"class":223},[217,5065,5066],{"class":227}," optimize\n",[1103,5068,5070,5071,1612],{"id":5069},"_4-磁碟空間分析-mo-analyze","4. 磁碟空間分析 (",[55,5072,5073],{},"mo analyze",[15,5075,5076],{},"類似於 DaisyDisk，這個功能會以視覺化條狀圖顯示各個目錄的空間佔用情況，並讓你輕鬆找出隱藏的大檔案。",[28,5078,5079,5085],{},[31,5080,5081,5084],{},[47,5082,5083],{},"導覽方式","：支援方向鍵與 Vim 鍵位（h\u002Fj\u002Fk\u002Fl）。",[31,5086,5087,5090,5091,187],{},[47,5088,5089],{},"外部磁碟","：預設跳過外部磁碟以加快速度，若要分析外接硬碟可指定路徑：",[55,5092,5093],{},"mo analyze \u002FVolumes",[208,5095,5097],{"className":210,"code":5096,"language":212,"meta":213,"style":213},"mo analyze\n",[55,5098,5099],{"__ignoreMap":213},[217,5100,5101,5103],{"class":219,"line":220},[217,5102,4935],{"class":223},[217,5104,5105],{"class":227}," analyze\n",[1103,5107,5109,5110,1612],{"id":5108},"_5-實時系統狀態-mo-status","5. 實時系統狀態 (",[55,5111,5112],{},"mo status",[15,5114,5115],{},"這是一個精美的實時儀表板，提供 CPU、GPU、記憶體、磁碟 I\u002FO、網路流量以及硬體健康度（如電池循環、溫度、風扇轉速）的完整資訊。",[28,5117,5118,5124],{},[31,5119,5120,5123],{},[47,5121,5122],{},"Health Score","：根據系統壓力自動計算的健康分數。",[31,5125,5126,5129,5130,5133],{},[47,5127,5128],{},"小彩蛋","：在狀態頁面按下 ",[55,5131,5132],{},"k"," 可以召喚「太空貓」陪你工作。",[208,5135,5137],{"className":210,"code":5136,"language":212,"meta":213,"style":213},"mo status\n",[55,5138,5139],{"__ignoreMap":213},[217,5140,5141,5143],{"class":219,"line":220},[217,5142,4935],{"class":223},[217,5144,5145],{"class":227}," status\n",[1103,5147,5149,5150,1612],{"id":5148},"_6-專案快取清理-mo-purge","6. 專案快取清理 (",[55,5151,5152],{},"mo purge",[15,5154,5155,5156,100,5159,100,5162,5165,5166,5168],{},"對於開發者來說，硬碟空間常被無數專案的 ",[55,5157,5158],{},"node_modules",[55,5160,5161],{},"target",[55,5163,5164],{},"build"," 等資料夾吞噬。",[55,5167,5152],{}," 能自動找出並清理這些舊專案的構建產物。",[208,5170,5172],{"className":210,"code":5171,"language":212,"meta":213,"style":213},"mo purge\n",[55,5173,5174],{"__ignoreMap":213},[217,5175,5176,5178],{"class":219,"line":220},[217,5177,4935],{"class":223},[217,5179,5180],{"class":227}," purge\n",[60,5182],{},[63,5184,5185],{"id":5185},"使用技巧與安全性",[28,5187,5188,5200,5210],{},[31,5189,5190,5193,5194,5196,5197,5199],{},[47,5191,5192],{},"安全第一","：Mole 刪除的檔案通常是永久性的。請務必仔細檢查清理清單，特別是在執行 ",[55,5195,4948],{}," 或 ",[55,5198,5152],{}," 時。",[31,5201,5202,5205,5206,5209],{},[47,5203,5204],{},"白名單功能","：如果你希望保護特定的快取不被清理，可以使用 ",[55,5207,5208],{},"mo clean --whitelist"," 進行設定。",[31,5211,5212,5215,5216,5219],{},[47,5213,5214],{},"日誌追蹤","：所有的檔案操作都會記錄在 ",[55,5217,5218],{},"~\u002F.config\u002Fmole\u002Foperations.log","，方便事後追蹤。",[60,5221],{},[63,5223,1237],{"id":1237},[15,5225,5226],{},"Mole 不僅是一個清理工具，更是一個讓 Mac 保持最佳狀態的隨身護理師。它開源、輕量且極致快速的原生體驗，使其成為 macOS 平台上非常具有競爭力的開源方案。如果你還在為磁碟空間不足或系統卡頓煩惱，不妨現在就安裝 Mole 體驗一下！",[60,5228],{},[1302,5230,5231],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":5233},[5234,5235,5239,5253,5254],{"id":4840,"depth":387,"text":4841},{"id":4882,"depth":387,"text":4883,"children":5236},[5237,5238],{"id":4889,"depth":410,"text":4890},{"id":4907,"depth":410,"text":4907},{"id":4941,"depth":387,"text":4941,"children":5240},[5241,5243,5245,5247,5249,5251],{"id":4944,"depth":410,"text":5242},"1. 深度系統清理 (mo clean)",{"id":5008,"depth":410,"text":5244},"2. 智慧解除安裝 (mo uninstall)",{"id":5036,"depth":410,"text":5246},"3. 系統優化 (mo optimize)",{"id":5069,"depth":410,"text":5248},"4. 磁碟空間分析 (mo analyze)",{"id":5108,"depth":410,"text":5250},"5. 實時系統狀態 (mo status)",{"id":5148,"depth":410,"text":5252},"6. 專案快取清理 (mo purge)",{"id":5185,"depth":387,"text":5185},{"id":1237,"depth":387,"text":1237},"\u002Fimages\u002Farticles\u002F2026-02-27-mole-tutorial\u002Fcover.png",{},"\u002Farticles\u002F2026-02-27-mole-tutorial","2026-02-27 14:15:00",{"title":4835,"description":213},"articles\u002F2026-02-27-mole-tutorial","Mole 是一個開源的全能 macOS 優化工具，結合了 CleanMyMac、AppCleaner、DaisyDisk 和 iStat Menus 的核心功能。本文將帶你一步步掌握 Mole 的各項強大功能，讓你的 Mac 恢復往日的流暢與潔淨。",[5263,5264,2207],"MacOS","系統優化","mziUNXsCHKI6FoJ52Gvu-RdbPJ5he5GSmjS74gVH9ME",{"id":5267,"title":5268,"body":5269,"category":1322,"description":213,"extension":1324,"image":6459,"meta":6460,"navigation":895,"path":6461,"pubDate":6462,"seo":6463,"status":895,"stem":6464,"summary":6465,"tags":6466,"__hash__":6467},"content\u002Farticles\u002F2026-02-24-opencode.md","OpenCode 完全指南：開源 AI 程式碼助手讓開發效率飆升",{"type":8,"value":5270,"toc":6421},[5271,5275,5278,5282,5314,5316,5320,5323,5327,5330,5348,5351,5365,5369,5372,5432,5435,5516,5518,5522,5525,5529,5532,5556,5560,5563,5565,5568,5571,5589,5592,5601,5608,5610,5614,5617,5624,5630,5633,5636,5639,5656,5659,5662,5668,5671,5678,5684,5687,5689,5693,5696,5700,5707,5893,5897,5900,6190,6194,6203,6260,6264,6270,6284,6340,6343,6345,6348,6351,6354,6357,6360,6363,6366,6369,6372,6376,6379,6383,6386,6388,6391,6394,6396,6399,6405,6407,6409,6412,6418],[63,5272,5274],{"id":5273},"什麼是-opencode","什麼是 OpenCode？",[15,5276,5277],{},"OpenCode 是一個開源的 AI 程式碼助手，致力於讓開發者能夠在終端機、IDE 或桌面環境中更高效地撰寫程式碼。由 Anomaly 團隊開發，目前在 GitHub 上已累積超過 10 萬顆星標，擁有超過 700 位貢獻者，每月服務超過 250 萬名開發者。",[1103,5279,5281],{"id":5280},"opencode-的核心特點","OpenCode 的核心特點",[28,5283,5284,5290,5296,5302,5308],{},[31,5285,5286,5289],{},[47,5287,5288],{},"LSP 自動啟用","：自動載入正確的 LSP（Language Server Protocol）服務",[31,5291,5292,5295],{},[47,5293,5294],{},"多工作階段","：可同時在同一專案上啟動多個代理程式",[31,5297,5298,5301],{},[47,5299,5300],{},"分享連結","：可分享工作階段連結供他人參考或除錯",[31,5303,5304,5307],{},[47,5305,5306],{},"廣泛模型支援","：支援 75 種以上的 LLM 提供者，包括 Claude、GPT、Gemini 等",[31,5309,5310,5313],{},[47,5311,5312],{},"隱私優先","：不儲存任何程式碼或上下文資料，確保隱私安全",[60,5315],{},[63,5317,5319],{"id":5318},"安裝-opencode","安裝 OpenCode",[15,5321,5322],{},"OpenCode 支援多種安裝方式，以下是各平台的安裝方法：",[1103,5324,5326],{"id":5325},"linux-和-macos","Linux 和 macOS",[15,5328,5329],{},"使用官方安裝腳本是最簡單的方式：",[208,5331,5333],{"className":210,"code":5332,"language":212,"meta":213,"style":213},"curl -fsSL https:\u002F\u002Fopencode.ai\u002Finstall | bash\n",[55,5334,5335],{"__ignoreMap":213},[217,5336,5337,5339,5341,5344,5346],{"class":219,"line":220},[217,5338,1578],{"class":223},[217,5340,1581],{"class":237},[217,5342,5343],{"class":227}," https:\u002F\u002Fopencode.ai\u002Finstall",[217,5345,1772],{"class":323},[217,5347,4929],{"class":223},[15,5349,5350],{},"或者使用 Homebrew：",[208,5352,5354],{"className":210,"code":5353,"language":212,"meta":213,"style":213},"brew install anomalyco\u002Ftap\u002Fopencode\n",[55,5355,5356],{"__ignoreMap":213},[217,5357,5358,5360,5362],{"class":219,"line":220},[217,5359,1495],{"class":223},[217,5361,1498],{"class":227},[217,5363,5364],{"class":227}," anomalyco\u002Ftap\u002Fopencode\n",[1103,5366,5368],{"id":5367},"windows","Windows",[15,5370,5371],{},"在 Windows 上建議使用 WSL（Windows Subsystem for Linux）以獲得最佳體驗：",[208,5373,5375],{"className":210,"code":5374,"language":212,"meta":213,"style":213},"# 使用 Chocolatey\nchoco install opencode\n\n# 使用 Scoop\nscoop install opencode\n\n# 使用 NPM\nnpm install -g opencode-ai\n",[55,5376,5377,5382,5392,5396,5401,5410,5414,5419],{"__ignoreMap":213},[217,5378,5379],{"class":219,"line":220},[217,5380,5381],{"class":1521},"# 使用 Chocolatey\n",[217,5383,5384,5387,5389],{"class":219,"line":387},[217,5385,5386],{"class":223},"choco",[217,5388,1498],{"class":227},[217,5390,5391],{"class":227}," opencode\n",[217,5393,5394],{"class":219,"line":410},[217,5395,896],{"emptyLinePlaceholder":895},[217,5397,5398],{"class":219,"line":424},[217,5399,5400],{"class":1521},"# 使用 Scoop\n",[217,5402,5403,5406,5408],{"class":219,"line":441},[217,5404,5405],{"class":223},"scoop",[217,5407,1498],{"class":227},[217,5409,5391],{"class":227},[217,5411,5412],{"class":219,"line":908},[217,5413,896],{"emptyLinePlaceholder":895},[217,5415,5416],{"class":219,"line":1560},[217,5417,5418],{"class":1521},"# 使用 NPM\n",[217,5420,5421,5424,5426,5429],{"class":219,"line":1566},[217,5422,5423],{"class":223},"npm",[217,5425,1498],{"class":227},[217,5427,5428],{"class":237}," -g",[217,5430,5431],{"class":227}," opencode-ai\n",[1103,5433,5434],{"id":5434},"使用套件管理器",[208,5436,5438],{"className":210,"code":5437,"language":212,"meta":213,"style":213},"# Node.js (npm)\nnpm install -g opencode-ai\n\n# Bun\nbun install -g opencode-ai\n\n# pnpm\npnpm install -g opencode-ai\n\n# Yarn\nyarn global add opencode-ai\n",[55,5439,5440,5445,5455,5459,5464,5475,5479,5484,5495,5499,5504],{"__ignoreMap":213},[217,5441,5442],{"class":219,"line":220},[217,5443,5444],{"class":1521},"# Node.js (npm)\n",[217,5446,5447,5449,5451,5453],{"class":219,"line":387},[217,5448,5423],{"class":223},[217,5450,1498],{"class":227},[217,5452,5428],{"class":237},[217,5454,5431],{"class":227},[217,5456,5457],{"class":219,"line":410},[217,5458,896],{"emptyLinePlaceholder":895},[217,5460,5461],{"class":219,"line":424},[217,5462,5463],{"class":1521},"# Bun\n",[217,5465,5466,5469,5471,5473],{"class":219,"line":441},[217,5467,5468],{"class":223},"bun",[217,5470,1498],{"class":227},[217,5472,5428],{"class":237},[217,5474,5431],{"class":227},[217,5476,5477],{"class":219,"line":908},[217,5478,896],{"emptyLinePlaceholder":895},[217,5480,5481],{"class":219,"line":1560},[217,5482,5483],{"class":1521},"# pnpm\n",[217,5485,5486,5489,5491,5493],{"class":219,"line":1566},[217,5487,5488],{"class":223},"pnpm",[217,5490,1498],{"class":227},[217,5492,5428],{"class":237},[217,5494,5431],{"class":227},[217,5496,5497],{"class":219,"line":1660},[217,5498,896],{"emptyLinePlaceholder":895},[217,5500,5501],{"class":219,"line":1666},[217,5502,5503],{"class":1521},"# Yarn\n",[217,5505,5506,5509,5512,5514],{"class":219,"line":1672},[217,5507,5508],{"class":223},"yarn",[217,5510,5511],{"class":227}," global",[217,5513,231],{"class":227},[217,5515,5431],{"class":227},[60,5517],{},[63,5519,5521],{"id":5520},"配置-opencode","配置 OpenCode",[15,5523,5524],{},"安裝完成後，需要配置 LLM 提供者才能開始使用。",[1103,5526,5528],{"id":5527},"連接-opencode-zen推薦","連接 OpenCode Zen（推薦）",[15,5530,5531],{},"OpenCode Zen 是經過團隊測試和驗證的優化模型集合，無需擔心模型品質不一致的問題。",[2109,5533,5534,5541,5550,5553],{},[31,5535,5536,5537,5540],{},"在終端機中輸入 ",[55,5538,5539],{},"\u002Fconnect"," 命令",[31,5542,5543,5544,5549],{},"選擇 opencode 並前往 ",[19,5545,5548],{"href":5546,"rel":5547},"https:\u002F\u002Fopencode.ai\u002Fauth",[291],"opencode.ai\u002Fauth"," 進行驗證",[31,5551,5552],{},"登入後新增付款資訊並複製 API 金鑰",[31,5554,5555],{},"將 API 金鑰貼上即可完成配置",[1103,5557,5559],{"id":5558},"其他-llm-提供者","其他 LLM 提供者",[15,5561,5562],{},"如果你想使用其他 LLM 提供者（如 Claude、GPT、Gemini 等），也可以手動配置各提供者的 API 金鑰。",[60,5564],{},[63,5566,5567],{"id":5567},"初始化專案",[15,5569,5570],{},"配置完成後，即可開始使用 OpenCode：",[208,5572,5574],{"className":210,"code":5573,"language":212,"meta":213,"style":213},"cd \u002Fpath\u002Fto\u002Fyour\u002Fproject\nopencode\n",[55,5575,5576,5584],{"__ignoreMap":213},[217,5577,5578,5581],{"class":219,"line":220},[217,5579,5580],{"class":237},"cd",[217,5582,5583],{"class":227}," \u002Fpath\u002Fto\u002Fyour\u002Fproject\n",[217,5585,5586],{"class":219,"line":387},[217,5587,5588],{"class":223},"opencode\n",[15,5590,5591],{},"初始化專案：",[208,5593,5595],{"className":210,"code":5594,"language":212,"meta":213,"style":213},"\u002Finit\n",[55,5596,5597],{"__ignoreMap":213},[217,5598,5599],{"class":219,"line":220},[217,5600,5594],{"class":223},[15,5602,5603,5604,5607],{},"這會讓 OpenCode 分析你的專案並在專案根目錄建立 ",[55,5605,5606],{},"AGENTS.md"," 檔案。建議將此檔案提交至 Git，這能幫助 OpenCode 理解專案結構和編碼規範。",[60,5609],{},[63,5611,5613],{"id":5612},"opencode-實際應用","OpenCode 實際應用",[1103,5615,5616],{"id":5616},"提問與解答",[15,5618,5619,5620,5623],{},"你可以讓 OpenCode 幫你解釋程式碼。使用 ",[55,5621,5622],{},"@"," 鍵可模糊搜尋專案中的檔案：",[208,5625,5628],{"className":5626,"code":5627,"language":355},[353],"How is authentication handled in @packages\u002Ffunctions\u002Fsrc\u002Fapi\u002Findex.ts\n",[55,5629,5627],{"__ignoreMap":213},[15,5631,5632],{},"這對於了解他人撰寫的程式碼特別有幫助。",[1103,5634,5635],{"id":5635},"新增功能",[15,5637,5638],{},"OpenCode 的「規劃模式」是其強大功能之一。在這個模式下，OpenCode 不會直接修改程式碼，而是會提出實作計畫供你審視。",[2109,5640,5641,5647,5650,5653],{},[31,5642,5643,5644,5646],{},"按下 ",[47,5645,1876],{}," 鍵切換到規劃模式（畫面右下角會顯示指示器）",[31,5648,5649],{},"描述你想要的功能",[31,5651,5652],{},"檢視計畫並提供回饋或補充細節",[31,5654,5655],{},"確認計畫後，再切換回「建置模式」讓 OpenCode 執行修改",[1103,5657,5658],{"id":5658},"程式碼修改",[15,5660,5661],{},"對於較簡單的修改，你可以直接要求 OpenCode 進行修改：",[208,5663,5666],{"className":5664,"code":5665,"language":355},[353],"We need to add authentication to the \u002Fsettings route. Take a look at how this is handled in the \u002Fnotes route in @packages\u002Ffunctions\u002Fsrc\u002Fnotes.ts and implement the same logic in @packages\u002Ffunctions\u002Fsrc\u002Fsettings.ts\n",[55,5667,5665],{"__ignoreMap":213},[1103,5669,5670],{"id":5670},"復原變更",[15,5672,5673,5674,5677],{},"如果修改結果不滿意，可以使用 ",[55,5675,5676],{},"\u002Fundo"," 命令復原：",[208,5679,5682],{"className":5680,"code":5681,"language":355},[353],"\u002Fundo\n",[55,5683,5681],{"__ignoreMap":213},[15,5685,5686],{},"OpenCode 會恢復變更並顯示你原本的訊息，讓你可以調整提示後再試一次。",[60,5688],{},[63,5690,5692],{"id":5691},"opencode-常用指令","OpenCode 常用指令",[15,5694,5695],{},"OpenCode 提供了豐富的指令來提升開發效率。這些指令可分為 TUI 指令和 CLI 指令兩種類型。",[1103,5697,5699],{"id":5698},"tui-指令","TUI 指令",[15,5701,5702,5703,5706],{},"在 OpenCode 終端機介面中，輸入 ",[55,5704,5705],{},"\u002F"," 後跟指令名稱即可執行。以下是常用的 TUI 指令：",[130,5708,5709,5718],{},[133,5710,5711],{},[136,5712,5713,5716],{},[139,5714,5715],{},"指令",[139,5717,1857],{},[149,5719,5720,5733,5746,5755,5765,5775,5785,5801,5811,5821,5830,5843,5853,5863,5873,5883],{},[136,5721,5722,5727],{},[154,5723,5724],{},[55,5725,5726],{},"\u002Finit",[154,5728,5729,5730,5732],{},"建立或更新 ",[55,5731,5606],{}," 檔案，分析專案結構並建立開發規範文件",[136,5734,5735,5740],{},[154,5736,5737],{},[55,5738,5739],{},"\u002Fnew",[154,5741,5742,5743],{},"開始新的工作階段，別名：",[55,5744,5745],{},"\u002Fclear",[136,5747,5748,5752],{},[154,5749,5750],{},[55,5751,5676],{},[154,5753,5754],{},"復原對話中的最後一條訊息，包括所有檔案變更",[136,5756,5757,5762],{},[154,5758,5759],{},[55,5760,5761],{},"\u002Fredo",[154,5763,5764],{},"重做之前復原的訊息",[136,5766,5767,5772],{},[154,5768,5769],{},[55,5770,5771],{},"\u002Fshare",[154,5773,5774],{},"分享當前工作階段，建立可分享的連結",[136,5776,5777,5782],{},[154,5778,5779],{},[55,5780,5781],{},"\u002Funshare",[154,5783,5784],{},"取消分享當前工作階段",[136,5786,5787,5792],{},[154,5788,5789],{},[55,5790,5791],{},"\u002Fsessions",[154,5793,5794,5795,100,5798],{},"列出工作階段並在工作階段之間切換，別名：",[55,5796,5797],{},"\u002Fresume",[55,5799,5800],{},"\u002Fcontinue",[136,5802,5803,5808],{},[154,5804,5805],{},[55,5806,5807],{},"\u002Fmodels",[154,5809,5810],{},"列出所有可用的模型",[136,5812,5813,5818],{},[154,5814,5815],{},[55,5816,5817],{},"\u002Fthemes",[154,5819,5820],{},"列出可用的主題",[136,5822,5823,5827],{},[154,5824,5825],{},[55,5826,5539],{},[154,5828,5829],{},"將 LLM 提供者新增到 OpenCode",[136,5831,5832,5837],{},[154,5833,5834],{},[55,5835,5836],{},"\u002Fcompact",[154,5838,5839,5840],{},"壓縮當前工作階段，別名：",[55,5841,5842],{},"\u002Fsummarize",[136,5844,5845,5850],{},[154,5846,5847],{},[55,5848,5849],{},"\u002Fdetails",[154,5851,5852],{},"切換工具執行詳情的顯示",[136,5854,5855,5860],{},[154,5856,5857],{},[55,5858,5859],{},"\u002Feditor",[154,5861,5862],{},"開啟外部編輯器來撰寫訊息",[136,5864,5865,5870],{},[154,5866,5867],{},[55,5868,5869],{},"\u002Fexport",[154,5871,5872],{},"將當前對話匯出為 Markdown",[136,5874,5875,5880],{},[154,5876,5877],{},[55,5878,5879],{},"\u002Fthinking",[154,5881,5882],{},"切換思考\u002F推理區塊的可見性",[136,5884,5885,5890],{},[154,5886,5887],{},[55,5888,5889],{},"\u002Fhelp",[154,5891,5892],{},"顯示說明對話框",[1103,5894,5896],{"id":5895},"cli-指令","CLI 指令",[15,5898,5899],{},"除了 TUI 指令，OpenCode 還提供強大的命令列工具。以下是常用的 CLI 指令：",[208,5901,5903],{"className":210,"code":5902,"language":212,"meta":213,"style":213},"# 啟動 OpenCode\nopencode                          # 啟動 TUI\nopencode \u002Fpath\u002Fto\u002Fproject         # 指定專案目錄啟動\nopencode --continue               # 繼續上一個工作階段\n\n# 模型管理\nopencode models                   # 列出所有可用模型\nopencode models anthropic         # 列出特定提供者的模型\nopencode models --refresh         # 重新整理模型快取\n\n# 代理管理\nopencode agent create             # 建立新代理\nopencode agent list               # 列出所有代理\n\n# MCP 伺服器管理\nopencode mcp add                  # 新增 MCP 伺服器\nopencode mcp list                 # 列出所有 MCP 伺服器\nopencode mcp auth                 # 對 MCP 伺服器進行認證\n\n# 工作階段管理\nopencode session list             # 列出所有工作階段\nopencode export                   # 匯出工作階段資料\nopencode import                   # 匯入工作階段資料\n\n# 統計資訊\nopencode stats                    # 顯示 Token 用量和費用統計\nopencode stats --days 30          # 顯示最近 30 天的統計\n\n# 其他實用指令\nopencode run \"提示詞\"             # 非互動模式執行\nopencode serve                    # 啟動 API 伺服器\nopencode web                      # 啟動 Web 介面\nopencode upgrade                  # 更新 OpenCode\n",[55,5904,5905,5910,5917,5927,5937,5941,5946,5956,5968,5980,5984,5989,6000,6011,6015,6020,6032,6043,6055,6059,6064,6076,6087,6098,6103,6109,6119,6133,6138,6144,6157,6168,6179],{"__ignoreMap":213},[217,5906,5907],{"class":219,"line":220},[217,5908,5909],{"class":1521},"# 啟動 OpenCode\n",[217,5911,5912,5914],{"class":219,"line":387},[217,5913,3947],{"class":223},[217,5915,5916],{"class":1521},"                          # 啟動 TUI\n",[217,5918,5919,5921,5924],{"class":219,"line":410},[217,5920,3947],{"class":223},[217,5922,5923],{"class":227}," \u002Fpath\u002Fto\u002Fproject",[217,5925,5926],{"class":1521},"         # 指定專案目錄啟動\n",[217,5928,5929,5931,5934],{"class":219,"line":424},[217,5930,3947],{"class":223},[217,5932,5933],{"class":237}," --continue",[217,5935,5936],{"class":1521},"               # 繼續上一個工作階段\n",[217,5938,5939],{"class":219,"line":441},[217,5940,896],{"emptyLinePlaceholder":895},[217,5942,5943],{"class":219,"line":908},[217,5944,5945],{"class":1521},"# 模型管理\n",[217,5947,5948,5950,5953],{"class":219,"line":1560},[217,5949,3947],{"class":223},[217,5951,5952],{"class":227}," models",[217,5954,5955],{"class":1521},"                   # 列出所有可用模型\n",[217,5957,5958,5960,5962,5965],{"class":219,"line":1566},[217,5959,3947],{"class":223},[217,5961,5952],{"class":227},[217,5963,5964],{"class":227}," anthropic",[217,5966,5967],{"class":1521},"         # 列出特定提供者的模型\n",[217,5969,5970,5972,5974,5977],{"class":219,"line":1660},[217,5971,3947],{"class":223},[217,5973,5952],{"class":227},[217,5975,5976],{"class":237}," --refresh",[217,5978,5979],{"class":1521},"         # 重新整理模型快取\n",[217,5981,5982],{"class":219,"line":1666},[217,5983,896],{"emptyLinePlaceholder":895},[217,5985,5986],{"class":219,"line":1672},[217,5987,5988],{"class":1521},"# 代理管理\n",[217,5990,5991,5993,5995,5997],{"class":219,"line":1678},[217,5992,3947],{"class":223},[217,5994,446],{"class":227},[217,5996,1827],{"class":227},[217,5998,5999],{"class":1521},"             # 建立新代理\n",[217,6001,6002,6004,6006,6008],{"class":219,"line":1684},[217,6003,3947],{"class":223},[217,6005,446],{"class":227},[217,6007,395],{"class":227},[217,6009,6010],{"class":1521},"               # 列出所有代理\n",[217,6012,6013],{"class":219,"line":1689},[217,6014,896],{"emptyLinePlaceholder":895},[217,6016,6017],{"class":219,"line":2676},[217,6018,6019],{"class":1521},"# MCP 伺服器管理\n",[217,6021,6022,6024,6027,6029],{"class":219,"line":2687},[217,6023,3947],{"class":223},[217,6025,6026],{"class":227}," mcp",[217,6028,231],{"class":227},[217,6030,6031],{"class":1521},"                  # 新增 MCP 伺服器\n",[217,6033,6034,6036,6038,6040],{"class":219,"line":2692},[217,6035,3947],{"class":223},[217,6037,6026],{"class":227},[217,6039,395],{"class":227},[217,6041,6042],{"class":1521},"                 # 列出所有 MCP 伺服器\n",[217,6044,6045,6047,6049,6052],{"class":219,"line":2987},[217,6046,3947],{"class":223},[217,6048,6026],{"class":227},[217,6050,6051],{"class":227}," auth",[217,6053,6054],{"class":1521},"                 # 對 MCP 伺服器進行認證\n",[217,6056,6057],{"class":219,"line":2993},[217,6058,896],{"emptyLinePlaceholder":895},[217,6060,6061],{"class":219,"line":2998},[217,6062,6063],{"class":1521},"# 工作階段管理\n",[217,6065,6066,6068,6071,6073],{"class":219,"line":3004},[217,6067,3947],{"class":223},[217,6069,6070],{"class":227}," session",[217,6072,395],{"class":227},[217,6074,6075],{"class":1521},"             # 列出所有工作階段\n",[217,6077,6079,6081,6084],{"class":219,"line":6078},22,[217,6080,3947],{"class":223},[217,6082,6083],{"class":227}," export",[217,6085,6086],{"class":1521},"                   # 匯出工作階段資料\n",[217,6088,6090,6092,6095],{"class":219,"line":6089},23,[217,6091,3947],{"class":223},[217,6093,6094],{"class":227}," import",[217,6096,6097],{"class":1521},"                   # 匯入工作階段資料\n",[217,6099,6101],{"class":219,"line":6100},24,[217,6102,896],{"emptyLinePlaceholder":895},[217,6104,6106],{"class":219,"line":6105},25,[217,6107,6108],{"class":1521},"# 統計資訊\n",[217,6110,6112,6114,6116],{"class":219,"line":6111},26,[217,6113,3947],{"class":223},[217,6115,4079],{"class":227},[217,6117,6118],{"class":1521},"                    # 顯示 Token 用量和費用統計\n",[217,6120,6122,6124,6126,6128,6130],{"class":219,"line":6121},27,[217,6123,3947],{"class":223},[217,6125,4079],{"class":227},[217,6127,4138],{"class":237},[217,6129,4391],{"class":237},[217,6131,6132],{"class":1521},"          # 顯示最近 30 天的統計\n",[217,6134,6136],{"class":219,"line":6135},28,[217,6137,896],{"emptyLinePlaceholder":895},[217,6139,6141],{"class":219,"line":6140},29,[217,6142,6143],{"class":1521},"# 其他實用指令\n",[217,6145,6147,6149,6151,6154],{"class":219,"line":6146},30,[217,6148,3947],{"class":223},[217,6150,555],{"class":227},[217,6152,6153],{"class":227}," \"提示詞\"",[217,6155,6156],{"class":1521},"             # 非互動模式執行\n",[217,6158,6160,6162,6165],{"class":219,"line":6159},31,[217,6161,3947],{"class":223},[217,6163,6164],{"class":227}," serve",[217,6166,6167],{"class":1521},"                    # 啟動 API 伺服器\n",[217,6169,6171,6173,6176],{"class":219,"line":6170},32,[217,6172,3947],{"class":223},[217,6174,6175],{"class":227}," web",[217,6177,6178],{"class":1521},"                      # 啟動 Web 介面\n",[217,6180,6182,6184,6187],{"class":219,"line":6181},33,[217,6183,3947],{"class":223},[217,6185,6186],{"class":227}," upgrade",[217,6188,6189],{"class":1521},"                  # 更新 OpenCode\n",[1103,6191,6193],{"id":6192},"代理agents","代理（Agents）",[15,6195,6196,6197,6199,6200,6202],{},"OpenCode 內建了多種代理類型，可透過 ",[47,6198,1876],{}," 鍵切換或使用 ",[55,6201,5622],{}," 提及呼叫：",[130,6204,6205,6216],{},[133,6206,6207],{},[136,6208,6209,6211,6214],{},[139,6210,2016],{},[139,6212,6213],{},"類型",[139,6215,1857],{},[149,6217,6218,6229,6239,6250],{},[136,6219,6220,6223,6226],{},[154,6221,6222],{},"Build",[154,6224,6225],{},"主代理",[154,6227,6228],{},"預設代理，啟用所有工具",[136,6230,6231,6234,6236],{},[154,6232,6233],{},"Plan",[154,6235,6225],{},[154,6237,6238],{},"規劃和分析代理，無法修改檔案",[136,6240,6241,6244,6247],{},[154,6242,6243],{},"General",[154,6245,6246],{},"子代理",[154,6248,6249],{},"通用研究代理，完整工具存取",[136,6251,6252,6255,6257],{},[154,6253,6254],{},"Explore",[154,6256,6246],{},[154,6258,6259],{},"快速唯讀代理，用於探索程式碼庫",[1103,6261,6263],{"id":6262},"技能skills","技能（Skills）",[15,6265,6266,6267,6269],{},"技能是可重複使用的行為定義，透過 ",[55,6268,72],{}," 檔案設定。技能檔案放置位置：",[28,6271,6272,6278],{},[31,6273,6274,6275],{},"專案：",[55,6276,6277],{},".opencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[31,6279,6280,6281],{},"全域：",[55,6282,6283],{},"~\u002F.config\u002Fopencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[208,6285,6289],{"className":6286,"code":6287,"language":6288,"meta":213,"style":213},"language-yaml shiki shiki-themes github-light github-dark github-dark","---\nname: git-release\ndescription: Create consistent releases and changelogs\n---\n## What I do\n- Draft release notes from merged PRs\n- Propose a version bump\n- Provide a copy-pasteable git command\n## When to use me\nUse this when you are preparing a tagged release.\n","yaml",[55,6290,6291,6296,6301,6306,6310,6315,6320,6325,6330,6335],{"__ignoreMap":213},[217,6292,6293],{"class":219,"line":220},[217,6294,6295],{},"---\n",[217,6297,6298],{"class":219,"line":387},[217,6299,6300],{},"name: git-release\n",[217,6302,6303],{"class":219,"line":410},[217,6304,6305],{},"description: Create consistent releases and changelogs\n",[217,6307,6308],{"class":219,"line":424},[217,6309,6295],{},[217,6311,6312],{"class":219,"line":441},[217,6313,6314],{},"## What I do\n",[217,6316,6317],{"class":219,"line":908},[217,6318,6319],{},"- Draft release notes from merged PRs\n",[217,6321,6322],{"class":219,"line":1560},[217,6323,6324],{},"- Propose a version bump\n",[217,6326,6327],{"class":219,"line":1566},[217,6328,6329],{},"- Provide a copy-pasteable git command\n",[217,6331,6332],{"class":219,"line":1660},[217,6333,6334],{},"## When to use me\n",[217,6336,6337],{"class":219,"line":1666},[217,6338,6339],{},"Use this when you are preparing a tagged release.\n",[15,6341,6342],{},"透過靈活運用這些指令和快捷鍵，可以大幅提升使用 OpenCode 的開發效率。",[60,6344],{},[63,6346,6347],{"id":6347},"進階功能",[1103,6349,6350],{"id":6350},"主題自訂",[15,6352,6353],{},"OpenCode 支援多種主題，你可以根據喜好進行設定。",[1103,6355,6356],{"id":6356},"快捷鍵自訂",[15,6358,6359],{},"自訂鍵位綁定以符合個人工作流程。",[1103,6361,6362],{"id":6362},"程式碼格式化",[15,6364,6365],{},"配置程式碼格式化工具，確保程式碼風格一致。",[1103,6367,6368],{"id":6368},"自訂命令",[15,6370,6371],{},"建立重複使用的自訂命令，提高工作效率。",[1103,6373,6375],{"id":6374},"整合-github-copilot","整合 GitHub Copilot",[15,6377,6378],{},"登入 GitHub 即可使用現有的 Copilot 帳戶。",[1103,6380,6382],{"id":6381},"整合-ide","整合 IDE",[15,6384,6385],{},"OpenCode 提供 IDE 擴充功能，讓你可在喜愛的編輯器中使用。",[60,6387],{},[63,6389,6390],{"id":6390},"圖片支援",[15,6392,6393],{},"OpenCode 支援圖片分析功能。你可以將圖片拖曳到終端機中，OpenCode 會掃描圖片並將其加入提示中。這對於設計 UI 時參考範例圖片特別有用。",[60,6395],{},[63,6397,6398],{"id":6398},"分享功能",[15,6400,6401,6402,6404],{},"使用 ",[55,6403,5771],{}," 命令可建立當前對話的分享連結，讓團隊成員能夠參考你的工作階段或協助除錯。",[60,6406],{},[63,6408,1237],{"id":1237},[15,6410,6411],{},"OpenCode 作為一個開源的 AI 程式碼助手，提供了豐富的功能來提升開發效率。從自動化的 LSP 支援到多模型整合，再到強大的規劃和復原機制，OpenCode 為開發者提供了一個靈活且強大的 AI 輔助工具。",[15,6413,6414,6415,6417],{},"對於團隊開發而言，將 ",[55,6416,5606],{}," 提交至版本控制系統，能確保所有成員都能獲得一致的 AI 輔助體驗。而其隱私優先的設計理念，更讓企業和重視資料安全的開發者能夠放心使用。",[1302,6419,6420],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":6422},[6423,6426,6431,6435,6436,6442,6448,6456,6457,6458],{"id":5273,"depth":387,"text":5274,"children":6424},[6425],{"id":5280,"depth":410,"text":5281},{"id":5318,"depth":387,"text":5319,"children":6427},[6428,6429,6430],{"id":5325,"depth":410,"text":5326},{"id":5367,"depth":410,"text":5368},{"id":5434,"depth":410,"text":5434},{"id":5520,"depth":387,"text":5521,"children":6432},[6433,6434],{"id":5527,"depth":410,"text":5528},{"id":5558,"depth":410,"text":5559},{"id":5567,"depth":387,"text":5567},{"id":5612,"depth":387,"text":5613,"children":6437},[6438,6439,6440,6441],{"id":5616,"depth":410,"text":5616},{"id":5635,"depth":410,"text":5635},{"id":5658,"depth":410,"text":5658},{"id":5670,"depth":410,"text":5670},{"id":5691,"depth":387,"text":5692,"children":6443},[6444,6445,6446,6447],{"id":5698,"depth":410,"text":5699},{"id":5895,"depth":410,"text":5896},{"id":6192,"depth":410,"text":6193},{"id":6262,"depth":410,"text":6263},{"id":6347,"depth":387,"text":6347,"children":6449},[6450,6451,6452,6453,6454,6455],{"id":6350,"depth":410,"text":6350},{"id":6356,"depth":410,"text":6356},{"id":6362,"depth":410,"text":6362},{"id":6368,"depth":410,"text":6368},{"id":6374,"depth":410,"text":6375},{"id":6381,"depth":410,"text":6382},{"id":6390,"depth":387,"text":6390},{"id":6398,"depth":387,"text":6398},{"id":1237,"depth":387,"text":1237},"\u002Fimages\u002Farticles\u002F2026-02-24-opencode\u002Fcover.png",{},"\u002Farticles\u002F2026-02-24-opencode","2026-02-24 12:00:00",{"title":5268,"description":213},"articles\u002F2026-02-24-opencode","OpenCode 是一個開源的 AI 程式碼助手，支援終端機、桌面應用程式和 IDE 擴充功能。本文將帶你深入了解 OpenCode 的安裝、配置和各項強大功能，讓你體驗 AI 輔助開發的便利性。",[3947,1333,1336,2207],"hCbyfY05rfnLeV9qp9nMDhmuIDOO6nXzSa_pGswgHzA",{"id":6469,"title":6470,"body":6471,"category":2208,"description":213,"extension":1324,"image":6873,"meta":6874,"navigation":895,"path":6875,"pubDate":6876,"seo":6877,"status":895,"stem":6878,"summary":6879,"tags":6880,"__hash__":6882},"content\u002Farticles\u002F2025-11-16-ffmpeg-getting-started.md","FFmpeg 新手入門：從安裝到常用指令實戰",{"type":8,"value":6472,"toc":6865},[6473,6475,6478,6480,6483,6497,6500,6513,6516,6519,6537,6540,6568,6582,6585,6601,6604,6620,6623,6648,6667,6670,6673,6706,6730,6733,6736,6773,6793,6796,6846,6851,6853,6862],[63,6474,2217],{"id":2217},[15,6476,6477],{},"FFmpeg 是一套以命令列為主的開源多媒體處理工具，支援幾乎所有常見的音訊與影像格式（編碼\u002F封裝）。\n對開發者、系統工程師與內容創作者而言，FFmpeg 是自動化轉檔、批次處理、串流轉封裝與影音後製流程中不可或缺的工具。\n本文以實務為導向，示範安裝步驟與常用命令（轉檔、壓縮、截圖、合併、裁切等），並說明常見選項與應用場景，協助你快速在專案或腳本中整合 FFmpeg。",[63,6479,2268],{"id":2268},[15,6481,6482],{},"一、在 MacOS 安裝 ffmpeg",[208,6484,6486],{"className":210,"code":6485,"language":212,"meta":213,"style":213},"brew install ffmpeg\n",[55,6487,6488],{"__ignoreMap":213},[217,6489,6490,6492,6494],{"class":219,"line":220},[217,6491,1495],{"class":223},[217,6493,1498],{"class":227},[217,6495,6496],{"class":227}," ffmpeg\n",[15,6498,6499],{},"二、在終端機輸入以下指令，可取得 ffmpeg 版本號和相關設定資訊",[208,6501,6503],{"className":210,"code":6502,"language":212,"meta":213,"style":213},"ffmpeg -version\n",[55,6504,6505],{"__ignoreMap":213},[217,6506,6507,6510],{"class":219,"line":220},[217,6508,6509],{"class":223},"ffmpeg",[217,6511,6512],{"class":237}," -version\n",[63,6514,6515],{"id":6515},"轉檔",[15,6517,6518],{},"一、基本轉檔",[208,6520,6522],{"className":210,"code":6521,"language":212,"meta":213,"style":213},"ffmpeg -i input.mov output.mp4\n",[55,6523,6524],{"__ignoreMap":213},[217,6525,6526,6528,6531,6534],{"class":219,"line":220},[217,6527,6509],{"class":223},[217,6529,6530],{"class":237}," -i",[217,6532,6533],{"class":227}," input.mov",[217,6535,6536],{"class":227}," output.mp4\n",[15,6538,6539],{},"二、更換影片和音訊的編碼",[208,6541,6543],{"className":210,"code":6542,"language":212,"meta":213,"style":213},"ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4\n",[55,6544,6545],{"__ignoreMap":213},[217,6546,6547,6549,6551,6554,6557,6560,6563,6566],{"class":219,"line":220},[217,6548,6509],{"class":223},[217,6550,6530],{"class":237},[217,6552,6553],{"class":227}," input.mp4",[217,6555,6556],{"class":237}," -c:v",[217,6558,6559],{"class":227}," libx264",[217,6561,6562],{"class":237}," -c:a",[217,6564,6565],{"class":227}," aac",[217,6567,6536],{"class":227},[28,6569,6570,6576],{},[31,6571,6572,6575],{},[55,6573,6574],{},"-c:v libx264","：指定使用 H.264 編碼器進行影片編碼。",[31,6577,6578,6581],{},[55,6579,6580],{},"-c:a aac","： 指定使用 AAC 編碼器進行音頻編碼。",[15,6583,6584],{},"三、影片轉成序列圖片檔",[208,6586,6588],{"className":210,"code":6587,"language":212,"meta":213,"style":213},"ffmpeg -i input.mp4 video\u002Foutput_%04d.png\n",[55,6589,6590],{"__ignoreMap":213},[217,6591,6592,6594,6596,6598],{"class":219,"line":220},[217,6593,6509],{"class":223},[217,6595,6530],{"class":237},[217,6597,6553],{"class":227},[217,6599,6600],{"class":227}," video\u002Foutput_%04d.png\n",[15,6602,6603],{},"四、影片轉成音訊檔",[208,6605,6607],{"className":210,"code":6606,"language":212,"meta":213,"style":213},"ffmpeg -i input.mp4 music\u002Foutput.mp3\n",[55,6608,6609],{"__ignoreMap":213},[217,6610,6611,6613,6615,6617],{"class":219,"line":220},[217,6612,6509],{"class":223},[217,6614,6530],{"class":237},[217,6616,6553],{"class":227},[217,6618,6619],{"class":227}," music\u002Foutput.mp3\n",[15,6621,6622],{},"五、序列圖片轉成影片檔",[208,6624,6626],{"className":210,"code":6625,"language":212,"meta":213,"style":213},"ffmpeg -framerate 30 -i video\u002Foutput_%04d.png -c:v libx264 output.mp4\n",[55,6627,6628],{"__ignoreMap":213},[217,6629,6630,6632,6635,6637,6639,6642,6644,6646],{"class":219,"line":220},[217,6631,6509],{"class":223},[217,6633,6634],{"class":237}," -framerate",[217,6636,4391],{"class":237},[217,6638,6530],{"class":237},[217,6640,6641],{"class":227}," video\u002Foutput_%04d.png",[217,6643,6556],{"class":237},[217,6645,6559],{"class":227},[217,6647,6536],{"class":227},[28,6649,6650,6656,6662],{},[31,6651,6652,6655],{},[55,6653,6654],{},"framerate","：影格率（fps）",[31,6657,6658,6661],{},[55,6659,6660],{},"-i","：輸入",[31,6663,6664,6666],{},[55,6665,6574],{},"：使用 H264 編碼",[63,6668,6669],{"id":6669},"剪裁",[15,6671,6672],{},"一、時間裁切（截取片段）",[208,6674,6676],{"className":210,"code":6675,"language":212,"meta":213,"style":213},"ffmpeg -ss - -i input.mp4 -t 10 -c copy output_trim.mp4\n",[55,6677,6678],{"__ignoreMap":213},[217,6679,6680,6682,6685,6688,6690,6692,6695,6698,6700,6703],{"class":219,"line":220},[217,6681,6509],{"class":223},[217,6683,6684],{"class":237}," -ss",[217,6686,6687],{"class":227}," -",[217,6689,6530],{"class":237},[217,6691,6553],{"class":227},[217,6693,6694],{"class":237}," -t",[217,6696,6697],{"class":237}," 10",[217,6699,1572],{"class":237},[217,6701,6702],{"class":227}," copy",[217,6704,6705],{"class":227}," output_trim.mp4\n",[28,6707,6708,6714,6718,6724],{},[31,6709,6710,6713],{},[55,6711,6712],{},"-ss","： 開始時間",[31,6715,6716,6661],{},[55,6717,6660],{},[31,6719,6720,6723],{},[55,6721,6722],{},"-t","：截取時間(秒)",[31,6725,6726,6729],{},[55,6727,6728],{},"-c copy","：不進行重新編碼-",[63,6731,6732],{"id":6732},"合併",[15,6734,6735],{},"一、合併影片檔和聲音檔",[208,6737,6739],{"className":210,"code":6738,"language":212,"meta":213,"style":213},"ffmpeg -i input.mp4 -i audio.wav -c:v copy -c:a aac -b:a 192k -shortest output.mp4\n",[55,6740,6741],{"__ignoreMap":213},[217,6742,6743,6745,6747,6749,6751,6754,6756,6758,6760,6762,6765,6768,6771],{"class":219,"line":220},[217,6744,6509],{"class":223},[217,6746,6530],{"class":237},[217,6748,6553],{"class":227},[217,6750,6530],{"class":237},[217,6752,6753],{"class":227}," audio.wav",[217,6755,6556],{"class":237},[217,6757,6702],{"class":227},[217,6759,6562],{"class":237},[217,6761,6565],{"class":227},[217,6763,6764],{"class":237}," -b:a",[217,6766,6767],{"class":227}," 192k",[217,6769,6770],{"class":237}," -shortest",[217,6772,6536],{"class":227},[28,6774,6775,6781,6787],{},[31,6776,6777,6780],{},[55,6778,6779],{},"-c:v copy","：複製原影片，不重新編碼（保留畫質、速度快）",[31,6782,6783,6786],{},[55,6784,6785],{},"-c:a aac -b:a 192k","： 把音訊編成 AAC，192 kbps 常見且相容性好。",[31,6788,6789,6792],{},[55,6790,6791],{},"-shortest","：以較短的軌為準，避免多出黑畫面或靜音尾巴",[15,6794,6795],{},"二、合併圖片",[28,6797,6798,6810],{},[31,6799,6800,6801,6804],{},"建立影像清單 ",[55,6802,6803],{},"filelist.txt",[208,6805,6808],{"className":6806,"code":6807,"language":355,"meta":213},[353],"file 'part1.mp4'\nfile 'part2.mp4'\nfile 'part3.mp4'\n",[55,6809,6807],{"__ignoreMap":213},[31,6811,6812,6813],{},"串連輸出",[208,6814,6816],{"className":210,"code":6815,"language":212,"meta":213,"style":213},"ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_concat.mp4\n",[55,6817,6818],{"__ignoreMap":213},[217,6819,6820,6822,6825,6828,6831,6834,6836,6839,6841,6843],{"class":219,"line":220},[217,6821,6509],{"class":223},[217,6823,6824],{"class":237}," -f",[217,6826,6827],{"class":227}," concat",[217,6829,6830],{"class":237}," -safe",[217,6832,6833],{"class":237}," 0",[217,6835,6530],{"class":237},[217,6837,6838],{"class":227}," filelist.txt",[217,6840,1572],{"class":237},[217,6842,6702],{"class":227},[217,6844,6845],{"class":227}," output_concat.mp4\n",[15,6847,6848],{},[47,6849,6850],{},"注意：所有影片片段編碼參數需相同，否則會有導致音畫不同步，或是合併失敗",[63,6852,3853],{"id":3853},[15,6854,6855,6856,6861],{},"總結來說，FFmpeg 是一個功能強大的影音處理工具，只是功能對一般人來說複雜，而本文整理常用的使用情境，期望讓使用快速上手，若要更詳細的功能使用，可以參考",[19,6857,6860],{"href":6858,"rel":6859},"https:\u002F\u002Fffmpeg.org\u002Fffmpeg.html",[291],"官方文件","，希望這份指南能幫助你更好地利用 FFmpeg，打造更完美的影音作品！",[1302,6863,6864],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":213,"searchDepth":387,"depth":387,"links":6866},[6867,6868,6869,6870,6871,6872],{"id":2217,"depth":387,"text":2217},{"id":2268,"depth":387,"text":2268},{"id":6515,"depth":387,"text":6515},{"id":6669,"depth":387,"text":6669},{"id":6732,"depth":387,"text":6732},{"id":3853,"depth":387,"text":3853},"\u002Fimages\u002Farticles\u002F2025-11-16-ffmpeg-getting-started\u002Fcover.png",{},"\u002Farticles\u002F2025-11-16-ffmpeg-getting-started","2025-11-16 16:54:00",{"title":6470,"description":213},"articles\u002F2025-11-16-ffmpeg-getting-started","FFmpeg 是一個跨平台的開源多媒體工具組，用來處理音樂與影片。",[6881,2208,2207],"video","ZdvGeair61zT3Br9J0Csx2v78hP1q2MfzpRednjS9zw",{"id":6884,"title":6885,"body":6886,"category":1322,"description":213,"extension":1324,"image":7057,"meta":7058,"navigation":895,"path":7059,"pubDate":7060,"seo":7061,"status":895,"stem":7062,"summary":7063,"tags":7064,"__hash__":7066},"content\u002Farticles\u002F2025-08-05-ai-upscayl.md","告別模糊！用 Upscayl 輕鬆放大照片，讓細節更清晰",{"type":8,"value":6887,"toc":7049},[6888,6892,6895,6898,6953,6956,6962,6965,6971,7022,7025,7039,7041,7044],[63,6889,6891],{"id":6890},"什麼是-upscayl","什麼是 Upscayl？",[15,6893,6894],{},"Upscayl 是一款免費、開源的圖像放大（upscaling）工具，利用 AI（人工智慧）技術，尤其是 圖像超解析度（Super-Resolution）模型，將低解析度的圖片放大為高解析度，同時盡可能保留或重建細節，讓圖片變得更清晰、更銳利。",[63,6896,6897],{"id":6897},"主要特色",[28,6899,6900,6922,6935,6941,6947],{},[31,6901,6902,6905,6906,100,6909,100,6912,100,6915,100,6918,6921],{},[47,6903,6904],{},"多個AI模型可選擇","： ",[55,6907,6908],{},"Upscayl",[55,6910,6911],{},"Upscayl lite",[55,6913,6914],{},"Remacri",[55,6916,6917],{},"Ultramax",[55,6919,6920],{},"Ultrasharp"," 等可以選擇",[31,6923,6924,6927,6928,100,6930,6932,6933],{},[47,6925,6926],{},"跨平台","：支援 ",[55,6929,5368],{},[55,6931,1508],{}," 和 ",[55,6934,5263],{},[31,6936,6937,6940],{},[47,6938,6939],{},"開援授權","：採用 MIT 授權",[31,6942,6943,6946],{},[47,6944,6945],{},"支援批次處理","：可以處理多張圖片",[31,6948,6949,6952],{},[47,6950,6951],{},"操作簡單","：使用介面非常友善，新手小白輕易上手",[63,6954,6955],{"id":6955},"下載網址",[15,6957,6958],{},[19,6959,6960],{"href":6960,"rel":6961},"https:\u002F\u002Fupscayl.github.io\u002F",[291],[63,6963,6964],{"id":6964},"操作介紹",[15,6966,6967],{},[930,6968],{"alt":6969,"src":6970},"操作介面","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-01.png",[2109,6972,6973,6979,6985,6994,7000,7006,7012],{},[31,6974,6975,6978],{},[47,6976,6977],{},"選擇批次處理","：可選擇單張圖片放大，或批次放大",[31,6980,6981,6984],{},[47,6982,6983],{},"選舉圖片","：若單張放大時，則選擇圖片，若選擇批次放大，則選擇目錄",[31,6986,6987,6990,6991],{},[47,6988,6989],{},"選擇放大模型","：可以依自已需求，選擇放大模型 ",[930,6992],{"alt":6989,"src":6993},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-02.png",[31,6995,6996,6999],{},[47,6997,6998],{},"雙次放大","：進行兩次放大",[31,7001,7002,7005],{},[47,7003,7004],{},"放大比例","：可選擇放大倍率",[31,7007,7008,7011],{},[47,7009,7010],{},"選擇輸出位置","：可選擇輸出目錄",[31,7013,7014,7017,7018],{},[47,7015,7016],{},"開始處理","：開始放大 ",[930,7019],{"alt":7020,"src":7021},"放大後可瀏覽結果","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-03.png",[63,7023,7024],{"id":7024},"使用情境",[28,7026,7027,7030,7033,7036],{},[31,7028,7029],{},"放大老照片或低清圖片",[31,7031,7032],{},"為插圖、漫畫、像素風圖片增強清晰度",[31,7034,7035],{},"為網路下載的壓縮圖片進行畫質修復",[31,7037,7038],{},"用於 2D 遊戲素材的升級",[63,7040,3853],{"id":3853},[15,7042,7043],{},"Upscayl 是一款結合人工智慧與開源精神的圖像放大工具，讓使用者即使沒有專業技術背景，也能輕鬆將模糊、低解析度的圖片轉換為更清晰、可用的高解析版本。無論是修復舊照片、強化插圖，還是優化網路圖片，Upscayl 都提供了一種快速且免費的解決方案，是創作者與設計師不可或缺的好幫手。",[15,7045,7046],{},[47,7047,7048],{},"注意！Upscayl 提供部份模型是無法使用於商用",{"title":213,"searchDepth":387,"depth":387,"links":7050},[7051,7052,7053,7054,7055,7056],{"id":6890,"depth":387,"text":6891},{"id":6897,"depth":387,"text":6897},{"id":6955,"depth":387,"text":6955},{"id":6964,"depth":387,"text":6964},{"id":7024,"depth":387,"text":7024},{"id":3853,"depth":387,"text":3853},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002Fcover.png",{},"\u002Farticles\u002F2025-08-05-ai-upscayl","2025-08-05 20:38:00",{"title":6885,"description":213},"articles\u002F2025-08-05-ai-upscayl","Upscayl 是一個基於開源人工智慧的免費圖片放大軟體，可以有效地提升低解析度的圖片品質。它支援 Linux、Windows 和 macOS 平台，並能將照片放大到超越原始畫質的程度。",[1333,7065,2208,2207],"圖片處理","tRflg5x3IYHijIQy2fPVyq0DlJreuDRMFZP2NyCvLa0",{"id":7068,"title":7069,"body":7070,"category":1322,"description":9797,"extension":1324,"image":9798,"meta":9799,"navigation":895,"path":9800,"pubDate":9801,"seo":9802,"status":895,"stem":9803,"summary":9804,"tags":9805,"__hash__":9806},"content\u002Farticles\u002F2025-07-12-gemini-cli.md","Gemini CLI 教學：善用 AI 提升你的終端機開發效率",{"type":8,"value":7071,"toc":9784},[7072,7076,7090,7094,7097,7101,7139,7143,7147,7194,7198,7201,7206,7212,7218,7224,7230,7239,7242,7496,7501,7678,7683,9570,9573,9580,9586,9591,9597,9621,9627,9633,9637,9645,9651,9655,9667,9751,9757,9759,9762,9765,9781],[11,7073,7075],{"id":7074},"gemini-cli-教學將-gemini-的強大-ai-能力帶入你的終端機","Gemini CLI 教學：將 Gemini 的強大 AI 能力帶入你的終端機",[15,7077,7078,7079,7082,7083,7085,7086,7089],{},"Google 發最新的 AI 開發工具 ",[55,7080,7081],{},"Gemini CLI","，可以對標 Anthropic 的 ",[55,7084,2029],{}," 和 OpenAI 的 ",[55,7087,7088],{},"Codex CLI","等 AI 開發工具，也讓使得 AI開發工具的竸爭進入白熱化。",[63,7091,7093],{"id":7092},"gemini-cli-是什麼","Gemini CLI 是什麼？",[15,7095,7096],{},"Gemini CLI 是一個開源的 AI 代理（AI Agent），它將 Google 的 Gemini 模型（特別是 Gemini 2.5 Pro）的能力直接整合到你的終端機環境中。這意味著你可以在不離開終端機的情況下，利用 AI 來協助你完成各種開發工作。",[1103,7098,7100],{"id":7099},"主要特色與優勢","主要特色與優勢：",[28,7102,7103,7109,7115,7121,7127,7133],{},[31,7104,7105,7108],{},[47,7106,7107],{},"無縫整合 Gemini 模型："," 直接在終端機中使用 Gemini 2.5 Pro 的強大功能，包括其高達 100 萬詞元的長脈絡（context window）。",[31,7110,7111,7114],{},[47,7112,7113],{},"開源且高度擴充："," 採用 Apache 2.0 授權，原始碼公開透明，並支援 Model Context Protocol (MCP) 等擴充功能，讓你可以自訂和擴展其能力。",[31,7116,7117,7120],{},[47,7118,7119],{},"多功能性："," 不僅限於程式碼生成，還能協助檔案操作、指令執行、動態故障排除、內容生成、問題解決、深入研究和任務管理。",[31,7122,7123,7126],{},[47,7124,7125],{},"個人開發者免費額度："," 使用個人 Google 帳戶即可免費使用 Gemini CLI，提供業界領先的免費使用額度（每分鐘 60 次，每日最多 1,000 次模型執行）。",[31,7128,7129,7132],{},[47,7130,7131],{},"AI-First Coding 概念："," 鼓勵開發者以 AI 為優先，將 AI 視為協作夥伴，透過清晰的提示詞引導 AI 完成任務，並審核其產出。",[31,7134,7135,7138],{},[47,7136,7137],{},"與 Gemini Code Assist 整合："," 與 Google 的 AI 程式碼編寫輔助工具 Gemini Code Assist 採用相同核心技術，提供更一致的 AI 開發體驗。",[63,7140,7142],{"id":7141},"開始使用-gemini-cli","開始使用 Gemini CLI",[1103,7144,7146],{"id":7145},"安裝步驟","安裝步驟：",[2109,7148,7149,7162,7184],{},[31,7150,7151,7154,7155,7158,7159,187],{},[47,7152,7153],{},"安裝 Node.js："," 確保你的系統已安裝 Node.js 版本 ",[55,7156,7157],{},"18"," 或以上，建議使用版本 ",[55,7160,7161],{},"20",[31,7163,7164,7167,7168],{},[47,7165,7166],{},"安裝 Gemini CLI："," 在終端機中執行以下指令進行全域安裝：\n",[208,7169,7171],{"className":210,"code":7170,"language":212,"meta":213,"style":213},"npm install -g @google\u002Fgemini-cli\n",[55,7172,7173],{"__ignoreMap":213},[217,7174,7175,7177,7179,7181],{"class":219,"line":220},[217,7176,5423],{"class":223},[217,7178,1498],{"class":227},[217,7180,5428],{"class":237},[217,7182,7183],{"class":227}," @google\u002Fgemini-cli\n",[31,7185,7186,7189,7190,7193],{},[47,7187,7188],{},"初步設定："," 執行 ",[55,7191,7192],{},"gemini"," 指令，依照提示完成初步設定，例如選擇你偏好的 Theme 和進行身份驗證（通常是登入你的 Google 帳戶）。",[1103,7195,7197],{"id":7196},"快速入門","快速入門：",[15,7199,7200],{},"讓我們透過一個簡單的範例來體驗 Gemini CLI 的強大之處。假設我們想生成一個計算費式數列的 Python 程式碼，並將其儲存並執行。",[15,7202,7203],{},[47,7204,7205],{},"Prompt：",[208,7207,7210],{"className":7208,"code":7209,"language":355},[353],"使用html5開發一個飛機射擊遊戲，需有計分系統，每擊敗普通怪物得5分，擊敗Boss級怪物得100分，專案目錄：`~\u002Fwww\u002FAircraft-shooting`\n",[55,7211,7209],{"__ignoreMap":213},[15,7213,7214,7215,7217],{},"在執行過程中，",[55,7216,7081],{}," 會使用詢問互動方式，來協助使用者完成專案",[15,7219,7220,7221,7223],{},"建立檔案產與寫入檔案時，",[55,7222,7081],{}," 會讓使用者確認",[15,7225,7226],{},[930,7227],{"alt":7228,"src":7229},"Gemini CLI詢問使用者是否建立檔案","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-01.png",[15,7231,7232,7233,7235,7236,7238],{},"確認後 ",[55,7234,7081],{}," 會開始建立相關程式，以此為例，",[55,7237,7081],{}," 建了以下程式",[15,7240,7241],{},"1 index.html",[208,7243,7247],{"className":7244,"code":7245,"language":7246,"meta":213,"style":213},"language-html shiki shiki-themes github-light github-dark github-dark","\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Ctitle>Aircraft Shooting Game\u003C\u002Ftitle>\n    \u003Clink rel=\"stylesheet\" href=\"style.css\">\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003Ch1>Aircraft Shooting Game\u003C\u002Fh1>\n    \u003Ccanvas id=\"gameCanvas\" width=\"800\" height=\"600\">\u003C\u002Fcanvas>\n    \u003Cdiv id=\"score\">Score: 0\u003C\u002Fdiv>\n    \u003Cscript src=\"game.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[55,7248,7249,7263,7280,7289,7307,7331,7345,7370,7379,7388,7400,7438,7459,7480,7488],{"__ignoreMap":213},[217,7250,7251,7254,7258,7261],{"class":219,"line":220},[217,7252,7253],{"class":319},"\u003C!",[217,7255,7257],{"class":7256},"sByVh","DOCTYPE",[217,7259,7260],{"class":223}," html",[217,7262,765],{"class":319},[217,7264,7265,7268,7270,7273,7275,7278],{"class":219,"line":387},[217,7266,7267],{"class":319},"\u003C",[217,7269,7246],{"class":7256},[217,7271,7272],{"class":223}," lang",[217,7274,854],{"class":319},[217,7276,7277],{"class":227},"\"en\"",[217,7279,765],{"class":319},[217,7281,7282,7284,7287],{"class":219,"line":410},[217,7283,7267],{"class":319},[217,7285,7286],{"class":7256},"head",[217,7288,765],{"class":319},[217,7290,7291,7294,7297,7300,7302,7305],{"class":219,"line":424},[217,7292,7293],{"class":319},"    \u003C",[217,7295,7296],{"class":7256},"meta",[217,7298,7299],{"class":223}," charset",[217,7301,854],{"class":319},[217,7303,7304],{"class":227},"\"UTF-8\"",[217,7306,765],{"class":319},[217,7308,7309,7311,7313,7316,7318,7321,7324,7326,7329],{"class":219,"line":441},[217,7310,7293],{"class":319},[217,7312,7296],{"class":7256},[217,7314,7315],{"class":223}," name",[217,7317,854],{"class":319},[217,7319,7320],{"class":227},"\"viewport\"",[217,7322,7323],{"class":223}," content",[217,7325,854],{"class":319},[217,7327,7328],{"class":227},"\"width=device-width, initial-scale=1.0\"",[217,7330,765],{"class":319},[217,7332,7333,7335,7338,7341,7343],{"class":219,"line":908},[217,7334,7293],{"class":319},[217,7336,7337],{"class":7256},"title",[217,7339,7340],{"class":319},">Aircraft Shooting Game\u003C\u002F",[217,7342,7337],{"class":7256},[217,7344,765],{"class":319},[217,7346,7347,7349,7352,7355,7357,7360,7363,7365,7368],{"class":219,"line":1560},[217,7348,7293],{"class":319},[217,7350,7351],{"class":7256},"link",[217,7353,7354],{"class":223}," rel",[217,7356,854],{"class":319},[217,7358,7359],{"class":227},"\"stylesheet\"",[217,7361,7362],{"class":223}," href",[217,7364,854],{"class":319},[217,7366,7367],{"class":227},"\"style.css\"",[217,7369,765],{"class":319},[217,7371,7372,7375,7377],{"class":219,"line":1566},[217,7373,7374],{"class":319},"\u003C\u002F",[217,7376,7286],{"class":7256},[217,7378,765],{"class":319},[217,7380,7381,7383,7386],{"class":219,"line":1660},[217,7382,7267],{"class":319},[217,7384,7385],{"class":7256},"body",[217,7387,765],{"class":319},[217,7389,7390,7392,7394,7396,7398],{"class":219,"line":1666},[217,7391,7293],{"class":319},[217,7393,11],{"class":7256},[217,7395,7340],{"class":319},[217,7397,11],{"class":7256},[217,7399,765],{"class":319},[217,7401,7402,7404,7407,7410,7412,7415,7418,7420,7423,7426,7428,7431,7434,7436],{"class":219,"line":1672},[217,7403,7293],{"class":319},[217,7405,7406],{"class":7256},"canvas",[217,7408,7409],{"class":223}," id",[217,7411,854],{"class":319},[217,7413,7414],{"class":227},"\"gameCanvas\"",[217,7416,7417],{"class":223}," width",[217,7419,854],{"class":319},[217,7421,7422],{"class":227},"\"800\"",[217,7424,7425],{"class":223}," height",[217,7427,854],{"class":319},[217,7429,7430],{"class":227},"\"600\"",[217,7432,7433],{"class":319},">\u003C\u002F",[217,7435,7406],{"class":7256},[217,7437,765],{"class":319},[217,7439,7440,7442,7445,7447,7449,7452,7455,7457],{"class":219,"line":1678},[217,7441,7293],{"class":319},[217,7443,7444],{"class":7256},"div",[217,7446,7409],{"class":223},[217,7448,854],{"class":319},[217,7450,7451],{"class":227},"\"score\"",[217,7453,7454],{"class":319},">Score: 0\u003C\u002F",[217,7456,7444],{"class":7256},[217,7458,765],{"class":319},[217,7460,7461,7463,7466,7469,7471,7474,7476,7478],{"class":219,"line":1684},[217,7462,7293],{"class":319},[217,7464,7465],{"class":7256},"script",[217,7467,7468],{"class":223}," src",[217,7470,854],{"class":319},[217,7472,7473],{"class":227},"\"game.js\"",[217,7475,7433],{"class":319},[217,7477,7465],{"class":7256},[217,7479,765],{"class":319},[217,7481,7482,7484,7486],{"class":219,"line":1689},[217,7483,7374],{"class":319},[217,7485,7385],{"class":7256},[217,7487,765],{"class":319},[217,7489,7490,7492,7494],{"class":219,"line":2676},[217,7491,7374],{"class":319},[217,7493,7246],{"class":7256},[217,7495,765],{"class":319},[2109,7497,7498],{"start":387},[31,7499,7500],{},"style.css",[208,7502,7506],{"className":7503,"code":7504,"language":7505,"meta":213,"style":213},"language-css shiki shiki-themes github-light github-dark github-dark","body {\n    font-family: sans-serif;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin: 0;\n    background-color: #f0f0f0;\n}\n\ncanvas {\n    border: 1px solid black;\n    background-color: #fff;\n}\n\n#score {\n    margin-top: 10px;\n    font-size: 24px;\n}\n","css",[55,7507,7508,7515,7528,7540,7552,7564,7575,7587,7591,7595,7601,7621,7632,7636,7640,7647,7660,7674],{"__ignoreMap":213},[217,7509,7510,7512],{"class":219,"line":220},[217,7511,7385],{"class":7256},[217,7513,7514],{"class":319}," {\n",[217,7516,7517,7520,7523,7526],{"class":219,"line":387},[217,7518,7519],{"class":237},"    font-family",[217,7521,7522],{"class":319},": ",[217,7524,7525],{"class":237},"sans-serif",[217,7527,2712],{"class":319},[217,7529,7530,7533,7535,7538],{"class":219,"line":410},[217,7531,7532],{"class":237},"    display",[217,7534,7522],{"class":319},[217,7536,7537],{"class":237},"flex",[217,7539,2712],{"class":319},[217,7541,7542,7545,7547,7550],{"class":219,"line":424},[217,7543,7544],{"class":237},"    flex-direction",[217,7546,7522],{"class":319},[217,7548,7549],{"class":237},"column",[217,7551,2712],{"class":319},[217,7553,7554,7557,7559,7562],{"class":219,"line":441},[217,7555,7556],{"class":237},"    align-items",[217,7558,7522],{"class":319},[217,7560,7561],{"class":237},"center",[217,7563,2712],{"class":319},[217,7565,7566,7569,7571,7573],{"class":219,"line":908},[217,7567,7568],{"class":237},"    margin",[217,7570,7522],{"class":319},[217,7572,2915],{"class":237},[217,7574,2712],{"class":319},[217,7576,7577,7580,7582,7585],{"class":219,"line":1560},[217,7578,7579],{"class":237},"    background-color",[217,7581,7522],{"class":319},[217,7583,7584],{"class":237},"#f0f0f0",[217,7586,2712],{"class":319},[217,7588,7589],{"class":219,"line":1566},[217,7590,2990],{"class":319},[217,7592,7593],{"class":219,"line":1660},[217,7594,896],{"emptyLinePlaceholder":895},[217,7596,7597,7599],{"class":219,"line":1666},[217,7598,7406],{"class":7256},[217,7600,7514],{"class":319},[217,7602,7603,7606,7608,7610,7613,7616,7619],{"class":219,"line":1672},[217,7604,7605],{"class":237},"    border",[217,7607,7522],{"class":319},[217,7609,2481],{"class":237},[217,7611,7612],{"class":323},"px",[217,7614,7615],{"class":237}," solid",[217,7617,7618],{"class":237}," black",[217,7620,2712],{"class":319},[217,7622,7623,7625,7627,7630],{"class":219,"line":1678},[217,7624,7579],{"class":237},[217,7626,7522],{"class":319},[217,7628,7629],{"class":237},"#fff",[217,7631,2712],{"class":319},[217,7633,7634],{"class":219,"line":1684},[217,7635,2990],{"class":319},[217,7637,7638],{"class":219,"line":1689},[217,7639,896],{"emptyLinePlaceholder":895},[217,7641,7642,7645],{"class":219,"line":2676},[217,7643,7644],{"class":223},"#score",[217,7646,7514],{"class":319},[217,7648,7649,7652,7654,7656,7658],{"class":219,"line":2687},[217,7650,7651],{"class":237},"    margin-top",[217,7653,7522],{"class":319},[217,7655,2666],{"class":237},[217,7657,7612],{"class":323},[217,7659,2712],{"class":319},[217,7661,7662,7665,7667,7670,7672],{"class":219,"line":2692},[217,7663,7664],{"class":237},"    font-size",[217,7666,7522],{"class":319},[217,7668,7669],{"class":237},"24",[217,7671,7612],{"class":323},[217,7673,2712],{"class":319},[217,7675,7676],{"class":219,"line":2987},[217,7677,2990],{"class":319},[2109,7679,7680],{"start":410},[31,7681,7682],{},"game.js",[208,7684,7688],{"className":7685,"code":7686,"language":7687,"meta":213,"style":213},"language-javascript shiki shiki-themes github-light github-dark github-dark","const canvas = document.getElementById('gameCanvas');\nconst ctx = canvas.getContext('2d');\nconst scoreElement = document.getElementById('score');\n\nlet score = 0;\nlet keys = {};\n\nclass Player {\n    constructor(x, y, width, height, color) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        this.color = color;\n        this.speed = 5;\n    }\n\n    draw() {\n        ctx.fillStyle = this.color;\n        ctx.fillRect(this.x, this.y, this.width, this.height);\n    }\n\n    update() {\n        if (keys['ArrowLeft'] && this.x > 0) {\n            this.x -= this.speed;\n        }\n        if (keys['ArrowRight'] && this.x \u003C canvas.width - this.width) {\n            this.x += this.speed;\n        }\n    }\n}\n\nclass Bullet {\n    constructor(x, y, width, height, color, speed) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        this.color = color;\n        this.speed = speed;\n    }\n\n    draw() {\n        ctx.fillStyle = this.color;\n        ctx.fillRect(this.x, this.y, this.width, this.height);\n    }\n\n    update() {\n        this.y -= this.speed;\n    }\n}\n\nclass Enemy {\n    constructor(x, y, width, height, color, speed, isBoss = false) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        this.color = color;\n        this.speed = speed;\n        this.isBoss = isBoss;\n    }\n\n    draw() {\n        ctx.fillStyle = this.color;\n        ctx.fillRect(this.x, this.y, this.width, this.height);\n    }\n\n    update() {\n        this.y += this.speed;\n    }\n}\n\nconst player = new Player(canvas.width \u002F 2 - 25, canvas.height - 60, 50, 50, 'blue');\nconst bullets = [];\nconst enemies = [];\n\nfunction spawnEnemy() {\n    const isBoss = Math.random() \u003C 0.1; \u002F\u002F 10% chance of being a boss\n    const width = isBoss ? 100 : 30;\n    const height = isBoss ? 100 : 30;\n    const color = isBoss ? 'red' : 'green';\n    const speed = isBoss ? 1 : 0.5;\n    const x = Math.random() * (canvas.width - width);\n    const y = -height;\n    enemies.push(new Enemy(x, y, width, height, color, speed, isBoss));\n}\n\nfunction updateScore(points) {\n    score += points;\n    scoreElement.textContent = `Score: ${score}`;\n}\n\nfunction collision(a, b) {\n    return a.x \u003C b.x + b.width &&\n           a.x + a.width > b.x &&\n           a.y \u003C b.y + b.height &&\n           a.y + a.height > b.y;\n}\n\nfunction gameLoop() {\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n    player.update();\n    player.draw();\n\n    bullets.forEach((bullet, bulletIndex) => {\n        bullet.update();\n        bullet.draw();\n\n        if (bullet.y \u003C 0) {\n            bullets.splice(bulletIndex, 1);\n        }\n\n        enemies.forEach((enemy, enemyIndex) => {\n            if (collision(bullet, enemy)) {\n                bullets.splice(bulletIndex, 1);\n                enemies.splice(enemyIndex, 1);\n                updateScore(enemy.isBoss ? 100 : 5);\n            }\n        });\n    });\n\n    enemies.forEach((enemy, enemyIndex) => {\n        enemy.update();\n        enemy.draw();\n\n        if (enemy.y > canvas.height) {\n            enemies.splice(enemyIndex, 1);\n        }\n\n        if (collision(player, enemy)) {\n            alert('Game Over!');\n            document.location.reload();\n        }\n    });\n\n    requestAnimationFrame(gameLoop);\n}\n\nwindow.addEventListener('keydown', (e) => {\n    keys[e.key] = true;\n    if (e.key === ' ') {\n        bullets.push(new Bullet(player.x + player.width \u002F 2 - 2.5, player.y, 5, 10, 'black', 7));\n    }\n});\n\nwindow.addEventListener('keyup', (e) => {\n    keys[e.key] = false;\n});\n\nsetInterval(spawnEnemy, 2000);\ngameLoop();\n","javascript",[55,7689,7690,7713,7735,7755,7759,7773,7785,7789,7799,7832,7845,7857,7869,7881,7893,7907,7912,7916,7924,7937,7968,7972,7976,7983,8010,8025,8030,8059,8072,8076,8080,8084,8088,8097,8129,8140,8151,8162,8173,8184,8196,8201,8206,8213,8224,8249,8254,8259,8266,8279,8284,8289,8294,8304,8345,8356,8367,8378,8389,8400,8411,8424,8429,8434,8441,8452,8477,8482,8487,8494,8507,8512,8517,8522,8573,8586,8598,8603,8614,8645,8670,8691,8715,8738,8765,8780,8799,8804,8809,8824,8835,8854,8859,8864,8883,8906,8923,8941,8956,8961,8966,8976,8996,9001,9012,9022,9027,9055,9065,9074,9079,9093,9109,9114,9119,9143,9158,9172,9187,9206,9212,9218,9224,9229,9250,9260,9269,9274,9287,9301,9306,9311,9323,9336,9347,9352,9357,9362,9371,9376,9381,9407,9420,9437,9489,9494,9500,9505,9527,9538,9543,9548,9562],{"__ignoreMap":213},[217,7691,7692,7695,7698,7700,7703,7706,7708,7711],{"class":219,"line":220},[217,7693,7694],{"class":323},"const",[217,7696,7697],{"class":237}," canvas",[217,7699,330],{"class":323},[217,7701,7702],{"class":319}," document.",[217,7704,7705],{"class":223},"getElementById",[217,7707,2473],{"class":319},[217,7709,7710],{"class":227},"'gameCanvas'",[217,7712,2484],{"class":319},[217,7714,7715,7717,7720,7722,7725,7728,7730,7733],{"class":219,"line":387},[217,7716,7694],{"class":323},[217,7718,7719],{"class":237}," ctx",[217,7721,330],{"class":323},[217,7723,7724],{"class":319}," canvas.",[217,7726,7727],{"class":223},"getContext",[217,7729,2473],{"class":319},[217,7731,7732],{"class":227},"'2d'",[217,7734,2484],{"class":319},[217,7736,7737,7739,7742,7744,7746,7748,7750,7753],{"class":219,"line":410},[217,7738,7694],{"class":323},[217,7740,7741],{"class":237}," scoreElement",[217,7743,330],{"class":323},[217,7745,7702],{"class":319},[217,7747,7705],{"class":223},[217,7749,2473],{"class":319},[217,7751,7752],{"class":227},"'score'",[217,7754,2484],{"class":319},[217,7756,7757],{"class":219,"line":424},[217,7758,896],{"emptyLinePlaceholder":895},[217,7760,7761,7764,7767,7769,7771],{"class":219,"line":441},[217,7762,7763],{"class":323},"let",[217,7765,7766],{"class":319}," score ",[217,7768,854],{"class":323},[217,7770,6833],{"class":237},[217,7772,2712],{"class":319},[217,7774,7775,7777,7780,7782],{"class":219,"line":908},[217,7776,7763],{"class":323},[217,7778,7779],{"class":319}," keys ",[217,7781,854],{"class":323},[217,7783,7784],{"class":319}," {};\n",[217,7786,7787],{"class":219,"line":1560},[217,7788,896],{"emptyLinePlaceholder":895},[217,7790,7791,7794,7797],{"class":219,"line":1566},[217,7792,7793],{"class":323},"class",[217,7795,7796],{"class":223}," Player",[217,7798,7514],{"class":319},[217,7800,7801,7804,7806,7810,7812,7815,7817,7820,7822,7825,7827,7830],{"class":219,"line":1660},[217,7802,7803],{"class":323},"    constructor",[217,7805,2473],{"class":319},[217,7807,7809],{"class":7808},"sQHwn","x",[217,7811,2551],{"class":319},[217,7813,7814],{"class":7808},"y",[217,7816,2551],{"class":319},[217,7818,7819],{"class":7808},"width",[217,7821,2551],{"class":319},[217,7823,7824],{"class":7808},"height",[217,7826,2551],{"class":319},[217,7828,7829],{"class":7808},"color",[217,7831,2892],{"class":319},[217,7833,7834,7837,7840,7842],{"class":219,"line":1666},[217,7835,7836],{"class":237},"        this",[217,7838,7839],{"class":319},".x ",[217,7841,854],{"class":323},[217,7843,7844],{"class":319}," x;\n",[217,7846,7847,7849,7852,7854],{"class":219,"line":1672},[217,7848,7836],{"class":237},[217,7850,7851],{"class":319},".y ",[217,7853,854],{"class":323},[217,7855,7856],{"class":319}," y;\n",[217,7858,7859,7861,7864,7866],{"class":219,"line":1678},[217,7860,7836],{"class":237},[217,7862,7863],{"class":319},".width ",[217,7865,854],{"class":323},[217,7867,7868],{"class":319}," width;\n",[217,7870,7871,7873,7876,7878],{"class":219,"line":1684},[217,7872,7836],{"class":237},[217,7874,7875],{"class":319},".height ",[217,7877,854],{"class":323},[217,7879,7880],{"class":319}," height;\n",[217,7882,7883,7885,7888,7890],{"class":219,"line":1689},[217,7884,7836],{"class":237},[217,7886,7887],{"class":319},".color ",[217,7889,854],{"class":323},[217,7891,7892],{"class":319}," color;\n",[217,7894,7895,7897,7900,7902,7905],{"class":219,"line":2676},[217,7896,7836],{"class":237},[217,7898,7899],{"class":319},".speed ",[217,7901,854],{"class":323},[217,7903,7904],{"class":237}," 5",[217,7906,2712],{"class":319},[217,7908,7909],{"class":219,"line":2687},[217,7910,7911],{"class":319},"    }\n",[217,7913,7914],{"class":219,"line":2692},[217,7915,896],{"emptyLinePlaceholder":895},[217,7917,7918,7921],{"class":219,"line":2987},[217,7919,7920],{"class":223},"    draw",[217,7922,7923],{"class":319},"() {\n",[217,7925,7926,7929,7931,7934],{"class":219,"line":2993},[217,7927,7928],{"class":319},"        ctx.fillStyle ",[217,7930,854],{"class":323},[217,7932,7933],{"class":237}," this",[217,7935,7936],{"class":319},".color;\n",[217,7938,7939,7942,7945,7947,7950,7953,7955,7958,7960,7963,7965],{"class":219,"line":2998},[217,7940,7941],{"class":319},"        ctx.",[217,7943,7944],{"class":223},"fillRect",[217,7946,2473],{"class":319},[217,7948,7949],{"class":237},"this",[217,7951,7952],{"class":319},".x, ",[217,7954,7949],{"class":237},[217,7956,7957],{"class":319},".y, ",[217,7959,7949],{"class":237},[217,7961,7962],{"class":319},".width, ",[217,7964,7949],{"class":237},[217,7966,7967],{"class":319},".height);\n",[217,7969,7970],{"class":219,"line":3004},[217,7971,7911],{"class":319},[217,7973,7974],{"class":219,"line":6078},[217,7975,896],{"emptyLinePlaceholder":895},[217,7977,7978,7981],{"class":219,"line":6089},[217,7979,7980],{"class":223},"    update",[217,7982,7923],{"class":319},[217,7984,7985,7988,7991,7994,7997,8000,8002,8004,8006,8008],{"class":219,"line":6100},[217,7986,7987],{"class":323},"        if",[217,7989,7990],{"class":319}," (keys[",[217,7992,7993],{"class":227},"'ArrowLeft'",[217,7995,7996],{"class":319},"] ",[217,7998,7999],{"class":323},"&&",[217,8001,7933],{"class":237},[217,8003,7839],{"class":319},[217,8005,567],{"class":323},[217,8007,6833],{"class":237},[217,8009,2892],{"class":319},[217,8011,8012,8015,8017,8020,8022],{"class":219,"line":6105},[217,8013,8014],{"class":237},"            this",[217,8016,7839],{"class":319},[217,8018,8019],{"class":323},"-=",[217,8021,7933],{"class":237},[217,8023,8024],{"class":319},".speed;\n",[217,8026,8027],{"class":219,"line":6111},[217,8028,8029],{"class":319},"        }\n",[217,8031,8032,8034,8036,8039,8041,8043,8045,8047,8049,8052,8054,8056],{"class":219,"line":6121},[217,8033,7987],{"class":323},[217,8035,7990],{"class":319},[217,8037,8038],{"class":227},"'ArrowRight'",[217,8040,7996],{"class":319},[217,8042,7999],{"class":323},[217,8044,7933],{"class":237},[217,8046,7839],{"class":319},[217,8048,7267],{"class":323},[217,8050,8051],{"class":319}," canvas.width ",[217,8053,2908],{"class":323},[217,8055,7933],{"class":237},[217,8057,8058],{"class":319},".width) {\n",[217,8060,8061,8063,8065,8068,8070],{"class":219,"line":6135},[217,8062,8014],{"class":237},[217,8064,7839],{"class":319},[217,8066,8067],{"class":323},"+=",[217,8069,7933],{"class":237},[217,8071,8024],{"class":319},[217,8073,8074],{"class":219,"line":6140},[217,8075,8029],{"class":319},[217,8077,8078],{"class":219,"line":6146},[217,8079,7911],{"class":319},[217,8081,8082],{"class":219,"line":6159},[217,8083,2990],{"class":319},[217,8085,8086],{"class":219,"line":6170},[217,8087,896],{"emptyLinePlaceholder":895},[217,8089,8090,8092,8095],{"class":219,"line":6181},[217,8091,7793],{"class":323},[217,8093,8094],{"class":223}," Bullet",[217,8096,7514],{"class":319},[217,8098,8100,8102,8104,8106,8108,8110,8112,8114,8116,8118,8120,8122,8124,8127],{"class":219,"line":8099},34,[217,8101,7803],{"class":323},[217,8103,2473],{"class":319},[217,8105,7809],{"class":7808},[217,8107,2551],{"class":319},[217,8109,7814],{"class":7808},[217,8111,2551],{"class":319},[217,8113,7819],{"class":7808},[217,8115,2551],{"class":319},[217,8117,7824],{"class":7808},[217,8119,2551],{"class":319},[217,8121,7829],{"class":7808},[217,8123,2551],{"class":319},[217,8125,8126],{"class":7808},"speed",[217,8128,2892],{"class":319},[217,8130,8132,8134,8136,8138],{"class":219,"line":8131},35,[217,8133,7836],{"class":237},[217,8135,7839],{"class":319},[217,8137,854],{"class":323},[217,8139,7844],{"class":319},[217,8141,8143,8145,8147,8149],{"class":219,"line":8142},36,[217,8144,7836],{"class":237},[217,8146,7851],{"class":319},[217,8148,854],{"class":323},[217,8150,7856],{"class":319},[217,8152,8154,8156,8158,8160],{"class":219,"line":8153},37,[217,8155,7836],{"class":237},[217,8157,7863],{"class":319},[217,8159,854],{"class":323},[217,8161,7868],{"class":319},[217,8163,8165,8167,8169,8171],{"class":219,"line":8164},38,[217,8166,7836],{"class":237},[217,8168,7875],{"class":319},[217,8170,854],{"class":323},[217,8172,7880],{"class":319},[217,8174,8176,8178,8180,8182],{"class":219,"line":8175},39,[217,8177,7836],{"class":237},[217,8179,7887],{"class":319},[217,8181,854],{"class":323},[217,8183,7892],{"class":319},[217,8185,8187,8189,8191,8193],{"class":219,"line":8186},40,[217,8188,7836],{"class":237},[217,8190,7899],{"class":319},[217,8192,854],{"class":323},[217,8194,8195],{"class":319}," speed;\n",[217,8197,8199],{"class":219,"line":8198},41,[217,8200,7911],{"class":319},[217,8202,8204],{"class":219,"line":8203},42,[217,8205,896],{"emptyLinePlaceholder":895},[217,8207,8209,8211],{"class":219,"line":8208},43,[217,8210,7920],{"class":223},[217,8212,7923],{"class":319},[217,8214,8216,8218,8220,8222],{"class":219,"line":8215},44,[217,8217,7928],{"class":319},[217,8219,854],{"class":323},[217,8221,7933],{"class":237},[217,8223,7936],{"class":319},[217,8225,8227,8229,8231,8233,8235,8237,8239,8241,8243,8245,8247],{"class":219,"line":8226},45,[217,8228,7941],{"class":319},[217,8230,7944],{"class":223},[217,8232,2473],{"class":319},[217,8234,7949],{"class":237},[217,8236,7952],{"class":319},[217,8238,7949],{"class":237},[217,8240,7957],{"class":319},[217,8242,7949],{"class":237},[217,8244,7962],{"class":319},[217,8246,7949],{"class":237},[217,8248,7967],{"class":319},[217,8250,8252],{"class":219,"line":8251},46,[217,8253,7911],{"class":319},[217,8255,8257],{"class":219,"line":8256},47,[217,8258,896],{"emptyLinePlaceholder":895},[217,8260,8262,8264],{"class":219,"line":8261},48,[217,8263,7980],{"class":223},[217,8265,7923],{"class":319},[217,8267,8269,8271,8273,8275,8277],{"class":219,"line":8268},49,[217,8270,7836],{"class":237},[217,8272,7851],{"class":319},[217,8274,8019],{"class":323},[217,8276,7933],{"class":237},[217,8278,8024],{"class":319},[217,8280,8282],{"class":219,"line":8281},50,[217,8283,7911],{"class":319},[217,8285,8287],{"class":219,"line":8286},51,[217,8288,2990],{"class":319},[217,8290,8292],{"class":219,"line":8291},52,[217,8293,896],{"emptyLinePlaceholder":895},[217,8295,8297,8299,8302],{"class":219,"line":8296},53,[217,8298,7793],{"class":323},[217,8300,8301],{"class":223}," Enemy",[217,8303,7514],{"class":319},[217,8305,8307,8309,8311,8313,8315,8317,8319,8321,8323,8325,8327,8329,8331,8333,8335,8338,8340,8343],{"class":219,"line":8306},54,[217,8308,7803],{"class":323},[217,8310,2473],{"class":319},[217,8312,7809],{"class":7808},[217,8314,2551],{"class":319},[217,8316,7814],{"class":7808},[217,8318,2551],{"class":319},[217,8320,7819],{"class":7808},[217,8322,2551],{"class":319},[217,8324,7824],{"class":7808},[217,8326,2551],{"class":319},[217,8328,7829],{"class":7808},[217,8330,2551],{"class":319},[217,8332,8126],{"class":7808},[217,8334,2551],{"class":319},[217,8336,8337],{"class":7808},"isBoss",[217,8339,330],{"class":323},[217,8341,8342],{"class":237}," false",[217,8344,2892],{"class":319},[217,8346,8348,8350,8352,8354],{"class":219,"line":8347},55,[217,8349,7836],{"class":237},[217,8351,7839],{"class":319},[217,8353,854],{"class":323},[217,8355,7844],{"class":319},[217,8357,8359,8361,8363,8365],{"class":219,"line":8358},56,[217,8360,7836],{"class":237},[217,8362,7851],{"class":319},[217,8364,854],{"class":323},[217,8366,7856],{"class":319},[217,8368,8370,8372,8374,8376],{"class":219,"line":8369},57,[217,8371,7836],{"class":237},[217,8373,7863],{"class":319},[217,8375,854],{"class":323},[217,8377,7868],{"class":319},[217,8379,8381,8383,8385,8387],{"class":219,"line":8380},58,[217,8382,7836],{"class":237},[217,8384,7875],{"class":319},[217,8386,854],{"class":323},[217,8388,7880],{"class":319},[217,8390,8392,8394,8396,8398],{"class":219,"line":8391},59,[217,8393,7836],{"class":237},[217,8395,7887],{"class":319},[217,8397,854],{"class":323},[217,8399,7892],{"class":319},[217,8401,8403,8405,8407,8409],{"class":219,"line":8402},60,[217,8404,7836],{"class":237},[217,8406,7899],{"class":319},[217,8408,854],{"class":323},[217,8410,8195],{"class":319},[217,8412,8414,8416,8419,8421],{"class":219,"line":8413},61,[217,8415,7836],{"class":237},[217,8417,8418],{"class":319},".isBoss ",[217,8420,854],{"class":323},[217,8422,8423],{"class":319}," isBoss;\n",[217,8425,8427],{"class":219,"line":8426},62,[217,8428,7911],{"class":319},[217,8430,8432],{"class":219,"line":8431},63,[217,8433,896],{"emptyLinePlaceholder":895},[217,8435,8437,8439],{"class":219,"line":8436},64,[217,8438,7920],{"class":223},[217,8440,7923],{"class":319},[217,8442,8444,8446,8448,8450],{"class":219,"line":8443},65,[217,8445,7928],{"class":319},[217,8447,854],{"class":323},[217,8449,7933],{"class":237},[217,8451,7936],{"class":319},[217,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471,8473,8475],{"class":219,"line":8454},66,[217,8456,7941],{"class":319},[217,8458,7944],{"class":223},[217,8460,2473],{"class":319},[217,8462,7949],{"class":237},[217,8464,7952],{"class":319},[217,8466,7949],{"class":237},[217,8468,7957],{"class":319},[217,8470,7949],{"class":237},[217,8472,7962],{"class":319},[217,8474,7949],{"class":237},[217,8476,7967],{"class":319},[217,8478,8480],{"class":219,"line":8479},67,[217,8481,7911],{"class":319},[217,8483,8485],{"class":219,"line":8484},68,[217,8486,896],{"emptyLinePlaceholder":895},[217,8488,8490,8492],{"class":219,"line":8489},69,[217,8491,7980],{"class":223},[217,8493,7923],{"class":319},[217,8495,8497,8499,8501,8503,8505],{"class":219,"line":8496},70,[217,8498,7836],{"class":237},[217,8500,7851],{"class":319},[217,8502,8067],{"class":323},[217,8504,7933],{"class":237},[217,8506,8024],{"class":319},[217,8508,8510],{"class":219,"line":8509},71,[217,8511,7911],{"class":319},[217,8513,8515],{"class":219,"line":8514},72,[217,8516,2990],{"class":319},[217,8518,8520],{"class":219,"line":8519},73,[217,8521,896],{"emptyLinePlaceholder":895},[217,8523,8525,8527,8530,8532,8534,8536,8539,8541,8544,8546,8549,8552,8554,8557,8559,8562,8564,8566,8568,8571],{"class":219,"line":8524},74,[217,8526,7694],{"class":323},[217,8528,8529],{"class":237}," player",[217,8531,330],{"class":323},[217,8533,2498],{"class":323},[217,8535,7796],{"class":223},[217,8537,8538],{"class":319},"(canvas.width ",[217,8540,5705],{"class":323},[217,8542,8543],{"class":237}," 2",[217,8545,6687],{"class":323},[217,8547,8548],{"class":237}," 25",[217,8550,8551],{"class":319},", canvas.height ",[217,8553,2908],{"class":323},[217,8555,8556],{"class":237}," 60",[217,8558,2551],{"class":319},[217,8560,8561],{"class":237},"50",[217,8563,2551],{"class":319},[217,8565,8561],{"class":237},[217,8567,2551],{"class":319},[217,8569,8570],{"class":227},"'blue'",[217,8572,2484],{"class":319},[217,8574,8576,8578,8581,8583],{"class":219,"line":8575},75,[217,8577,7694],{"class":323},[217,8579,8580],{"class":237}," bullets",[217,8582,330],{"class":323},[217,8584,8585],{"class":319}," [];\n",[217,8587,8589,8591,8594,8596],{"class":219,"line":8588},76,[217,8590,7694],{"class":323},[217,8592,8593],{"class":237}," enemies",[217,8595,330],{"class":323},[217,8597,8585],{"class":319},[217,8599,8601],{"class":219,"line":8600},77,[217,8602,896],{"emptyLinePlaceholder":895},[217,8604,8606,8609,8612],{"class":219,"line":8605},78,[217,8607,8608],{"class":323},"function",[217,8610,8611],{"class":223}," spawnEnemy",[217,8613,7923],{"class":319},[217,8615,8617,8620,8623,8625,8628,8631,8634,8636,8639,8642],{"class":219,"line":8616},79,[217,8618,8619],{"class":323},"    const",[217,8621,8622],{"class":237}," isBoss",[217,8624,330],{"class":323},[217,8626,8627],{"class":319}," Math.",[217,8629,8630],{"class":223},"random",[217,8632,8633],{"class":319},"() ",[217,8635,7267],{"class":323},[217,8637,8638],{"class":237}," 0.1",[217,8640,8641],{"class":319},"; ",[217,8643,8644],{"class":1521},"\u002F\u002F 10% chance of being a boss\n",[217,8646,8648,8650,8652,8654,8657,8660,8663,8666,8668],{"class":219,"line":8647},80,[217,8649,8619],{"class":323},[217,8651,7417],{"class":237},[217,8653,330],{"class":323},[217,8655,8656],{"class":319}," isBoss ",[217,8658,8659],{"class":323},"?",[217,8661,8662],{"class":237}," 100",[217,8664,8665],{"class":323}," :",[217,8667,4391],{"class":237},[217,8669,2712],{"class":319},[217,8671,8673,8675,8677,8679,8681,8683,8685,8687,8689],{"class":219,"line":8672},81,[217,8674,8619],{"class":323},[217,8676,7425],{"class":237},[217,8678,330],{"class":323},[217,8680,8656],{"class":319},[217,8682,8659],{"class":323},[217,8684,8662],{"class":237},[217,8686,8665],{"class":323},[217,8688,4391],{"class":237},[217,8690,2712],{"class":319},[217,8692,8694,8696,8699,8701,8703,8705,8708,8710,8713],{"class":219,"line":8693},82,[217,8695,8619],{"class":323},[217,8697,8698],{"class":237}," color",[217,8700,330],{"class":323},[217,8702,8656],{"class":319},[217,8704,8659],{"class":323},[217,8706,8707],{"class":227}," 'red'",[217,8709,8665],{"class":323},[217,8711,8712],{"class":227}," 'green'",[217,8714,2712],{"class":319},[217,8716,8718,8720,8723,8725,8727,8729,8731,8733,8736],{"class":219,"line":8717},83,[217,8719,8619],{"class":323},[217,8721,8722],{"class":237}," speed",[217,8724,330],{"class":323},[217,8726,8656],{"class":319},[217,8728,8659],{"class":323},[217,8730,2874],{"class":237},[217,8732,8665],{"class":323},[217,8734,8735],{"class":237}," 0.5",[217,8737,2712],{"class":319},[217,8739,8741,8743,8746,8748,8750,8752,8754,8757,8760,8762],{"class":219,"line":8740},84,[217,8742,8619],{"class":323},[217,8744,8745],{"class":237}," x",[217,8747,330],{"class":323},[217,8749,8627],{"class":319},[217,8751,8630],{"class":223},[217,8753,8633],{"class":319},[217,8755,8756],{"class":323},"*",[217,8758,8759],{"class":319}," (canvas.width ",[217,8761,2908],{"class":323},[217,8763,8764],{"class":319}," width);\n",[217,8766,8768,8770,8773,8775,8777],{"class":219,"line":8767},85,[217,8769,8619],{"class":323},[217,8771,8772],{"class":237}," y",[217,8774,330],{"class":323},[217,8776,6687],{"class":323},[217,8778,8779],{"class":319},"height;\n",[217,8781,8783,8786,8789,8791,8794,8796],{"class":219,"line":8782},86,[217,8784,8785],{"class":319},"    enemies.",[217,8787,8788],{"class":223},"push",[217,8790,2473],{"class":319},[217,8792,8793],{"class":323},"new",[217,8795,8301],{"class":223},[217,8797,8798],{"class":319},"(x, y, width, height, color, speed, isBoss));\n",[217,8800,8802],{"class":219,"line":8801},87,[217,8803,2990],{"class":319},[217,8805,8807],{"class":219,"line":8806},88,[217,8808,896],{"emptyLinePlaceholder":895},[217,8810,8812,8814,8817,8819,8822],{"class":219,"line":8811},89,[217,8813,8608],{"class":323},[217,8815,8816],{"class":223}," updateScore",[217,8818,2473],{"class":319},[217,8820,8821],{"class":7808},"points",[217,8823,2892],{"class":319},[217,8825,8827,8830,8832],{"class":219,"line":8826},90,[217,8828,8829],{"class":319},"    score ",[217,8831,8067],{"class":323},[217,8833,8834],{"class":319}," points;\n",[217,8836,8838,8841,8843,8846,8849,8852],{"class":219,"line":8837},91,[217,8839,8840],{"class":319},"    scoreElement.textContent ",[217,8842,854],{"class":323},[217,8844,8845],{"class":227}," `Score: ${",[217,8847,8848],{"class":319},"score",[217,8850,8851],{"class":227},"}`",[217,8853,2712],{"class":319},[217,8855,8857],{"class":219,"line":8856},92,[217,8858,2990],{"class":319},[217,8860,8862],{"class":219,"line":8861},93,[217,8863,896],{"emptyLinePlaceholder":895},[217,8865,8867,8869,8872,8874,8876,8878,8881],{"class":219,"line":8866},94,[217,8868,8608],{"class":323},[217,8870,8871],{"class":223}," collision",[217,8873,2473],{"class":319},[217,8875,19],{"class":7808},[217,8877,2551],{"class":319},[217,8879,8880],{"class":7808},"b",[217,8882,2892],{"class":319},[217,8884,8886,8889,8892,8894,8897,8900,8903],{"class":219,"line":8885},95,[217,8887,8888],{"class":323},"    return",[217,8890,8891],{"class":319}," a.x ",[217,8893,7267],{"class":323},[217,8895,8896],{"class":319}," b.x ",[217,8898,8899],{"class":323},"+",[217,8901,8902],{"class":319}," b.width ",[217,8904,8905],{"class":323},"&&\n",[217,8907,8909,8912,8914,8917,8919,8921],{"class":219,"line":8908},96,[217,8910,8911],{"class":319},"           a.x ",[217,8913,8899],{"class":323},[217,8915,8916],{"class":319}," a.width ",[217,8918,567],{"class":323},[217,8920,8896],{"class":319},[217,8922,8905],{"class":323},[217,8924,8926,8929,8931,8934,8936,8939],{"class":219,"line":8925},97,[217,8927,8928],{"class":319},"           a.y ",[217,8930,7267],{"class":323},[217,8932,8933],{"class":319}," b.y ",[217,8935,8899],{"class":323},[217,8937,8938],{"class":319}," b.height ",[217,8940,8905],{"class":323},[217,8942,8944,8946,8948,8951,8953],{"class":219,"line":8943},98,[217,8945,8928],{"class":319},[217,8947,8899],{"class":323},[217,8949,8950],{"class":319}," a.height ",[217,8952,567],{"class":323},[217,8954,8955],{"class":319}," b.y;\n",[217,8957,8959],{"class":219,"line":8958},99,[217,8960,2990],{"class":319},[217,8962,8964],{"class":219,"line":8963},100,[217,8965,896],{"emptyLinePlaceholder":895},[217,8967,8969,8971,8974],{"class":219,"line":8968},101,[217,8970,8608],{"class":323},[217,8972,8973],{"class":223}," gameLoop",[217,8975,7923],{"class":319},[217,8977,8979,8982,8985,8987,8989,8991,8993],{"class":219,"line":8978},102,[217,8980,8981],{"class":319},"    ctx.",[217,8983,8984],{"class":223},"clearRect",[217,8986,2473],{"class":319},[217,8988,2915],{"class":237},[217,8990,2551],{"class":319},[217,8992,2915],{"class":237},[217,8994,8995],{"class":319},", canvas.width, canvas.height);\n",[217,8997,8999],{"class":219,"line":8998},103,[217,9000,896],{"emptyLinePlaceholder":895},[217,9002,9004,9007,9010],{"class":219,"line":9003},104,[217,9005,9006],{"class":319},"    player.",[217,9008,9009],{"class":223},"update",[217,9011,2684],{"class":319},[217,9013,9015,9017,9020],{"class":219,"line":9014},105,[217,9016,9006],{"class":319},[217,9018,9019],{"class":223},"draw",[217,9021,2684],{"class":319},[217,9023,9025],{"class":219,"line":9024},106,[217,9026,896],{"emptyLinePlaceholder":895},[217,9028,9030,9033,9036,9039,9042,9044,9047,9050,9053],{"class":219,"line":9029},107,[217,9031,9032],{"class":319},"    bullets.",[217,9034,9035],{"class":223},"forEach",[217,9037,9038],{"class":319},"((",[217,9040,9041],{"class":7808},"bullet",[217,9043,2551],{"class":319},[217,9045,9046],{"class":7808},"bulletIndex",[217,9048,9049],{"class":319},") ",[217,9051,9052],{"class":323},"=>",[217,9054,7514],{"class":319},[217,9056,9058,9061,9063],{"class":219,"line":9057},108,[217,9059,9060],{"class":319},"        bullet.",[217,9062,9009],{"class":223},[217,9064,2684],{"class":319},[217,9066,9068,9070,9072],{"class":219,"line":9067},109,[217,9069,9060],{"class":319},[217,9071,9019],{"class":223},[217,9073,2684],{"class":319},[217,9075,9077],{"class":219,"line":9076},110,[217,9078,896],{"emptyLinePlaceholder":895},[217,9080,9082,9084,9087,9089,9091],{"class":219,"line":9081},111,[217,9083,7987],{"class":323},[217,9085,9086],{"class":319}," (bullet.y ",[217,9088,7267],{"class":323},[217,9090,6833],{"class":237},[217,9092,2892],{"class":319},[217,9094,9096,9099,9102,9105,9107],{"class":219,"line":9095},112,[217,9097,9098],{"class":319},"            bullets.",[217,9100,9101],{"class":223},"splice",[217,9103,9104],{"class":319},"(bulletIndex, ",[217,9106,2481],{"class":237},[217,9108,2484],{"class":319},[217,9110,9112],{"class":219,"line":9111},113,[217,9113,8029],{"class":319},[217,9115,9117],{"class":219,"line":9116},114,[217,9118,896],{"emptyLinePlaceholder":895},[217,9120,9122,9125,9127,9129,9132,9134,9137,9139,9141],{"class":219,"line":9121},115,[217,9123,9124],{"class":319},"        enemies.",[217,9126,9035],{"class":223},[217,9128,9038],{"class":319},[217,9130,9131],{"class":7808},"enemy",[217,9133,2551],{"class":319},[217,9135,9136],{"class":7808},"enemyIndex",[217,9138,9049],{"class":319},[217,9140,9052],{"class":323},[217,9142,7514],{"class":319},[217,9144,9146,9149,9152,9155],{"class":219,"line":9145},116,[217,9147,9148],{"class":323},"            if",[217,9150,9151],{"class":319}," (",[217,9153,9154],{"class":223},"collision",[217,9156,9157],{"class":319},"(bullet, enemy)) {\n",[217,9159,9161,9164,9166,9168,9170],{"class":219,"line":9160},117,[217,9162,9163],{"class":319},"                bullets.",[217,9165,9101],{"class":223},[217,9167,9104],{"class":319},[217,9169,2481],{"class":237},[217,9171,2484],{"class":319},[217,9173,9175,9178,9180,9183,9185],{"class":219,"line":9174},118,[217,9176,9177],{"class":319},"                enemies.",[217,9179,9101],{"class":223},[217,9181,9182],{"class":319},"(enemyIndex, ",[217,9184,2481],{"class":237},[217,9186,2484],{"class":319},[217,9188,9190,9193,9196,9198,9200,9202,9204],{"class":219,"line":9189},119,[217,9191,9192],{"class":223},"                updateScore",[217,9194,9195],{"class":319},"(enemy.isBoss ",[217,9197,8659],{"class":323},[217,9199,8662],{"class":237},[217,9201,8665],{"class":323},[217,9203,7904],{"class":237},[217,9205,2484],{"class":319},[217,9207,9209],{"class":219,"line":9208},120,[217,9210,9211],{"class":319},"            }\n",[217,9213,9215],{"class":219,"line":9214},121,[217,9216,9217],{"class":319},"        });\n",[217,9219,9221],{"class":219,"line":9220},122,[217,9222,9223],{"class":319},"    });\n",[217,9225,9227],{"class":219,"line":9226},123,[217,9228,896],{"emptyLinePlaceholder":895},[217,9230,9232,9234,9236,9238,9240,9242,9244,9246,9248],{"class":219,"line":9231},124,[217,9233,8785],{"class":319},[217,9235,9035],{"class":223},[217,9237,9038],{"class":319},[217,9239,9131],{"class":7808},[217,9241,2551],{"class":319},[217,9243,9136],{"class":7808},[217,9245,9049],{"class":319},[217,9247,9052],{"class":323},[217,9249,7514],{"class":319},[217,9251,9253,9256,9258],{"class":219,"line":9252},125,[217,9254,9255],{"class":319},"        enemy.",[217,9257,9009],{"class":223},[217,9259,2684],{"class":319},[217,9261,9263,9265,9267],{"class":219,"line":9262},126,[217,9264,9255],{"class":319},[217,9266,9019],{"class":223},[217,9268,2684],{"class":319},[217,9270,9272],{"class":219,"line":9271},127,[217,9273,896],{"emptyLinePlaceholder":895},[217,9275,9277,9279,9282,9284],{"class":219,"line":9276},128,[217,9278,7987],{"class":323},[217,9280,9281],{"class":319}," (enemy.y ",[217,9283,567],{"class":323},[217,9285,9286],{"class":319}," canvas.height) {\n",[217,9288,9290,9293,9295,9297,9299],{"class":219,"line":9289},129,[217,9291,9292],{"class":319},"            enemies.",[217,9294,9101],{"class":223},[217,9296,9182],{"class":319},[217,9298,2481],{"class":237},[217,9300,2484],{"class":319},[217,9302,9304],{"class":219,"line":9303},130,[217,9305,8029],{"class":319},[217,9307,9309],{"class":219,"line":9308},131,[217,9310,896],{"emptyLinePlaceholder":895},[217,9312,9314,9316,9318,9320],{"class":219,"line":9313},132,[217,9315,7987],{"class":323},[217,9317,9151],{"class":319},[217,9319,9154],{"class":223},[217,9321,9322],{"class":319},"(player, enemy)) {\n",[217,9324,9326,9329,9331,9334],{"class":219,"line":9325},133,[217,9327,9328],{"class":223},"            alert",[217,9330,2473],{"class":319},[217,9332,9333],{"class":227},"'Game Over!'",[217,9335,2484],{"class":319},[217,9337,9339,9342,9345],{"class":219,"line":9338},134,[217,9340,9341],{"class":319},"            document.location.",[217,9343,9344],{"class":223},"reload",[217,9346,2684],{"class":319},[217,9348,9350],{"class":219,"line":9349},135,[217,9351,8029],{"class":319},[217,9353,9355],{"class":219,"line":9354},136,[217,9356,9223],{"class":319},[217,9358,9360],{"class":219,"line":9359},137,[217,9361,896],{"emptyLinePlaceholder":895},[217,9363,9365,9368],{"class":219,"line":9364},138,[217,9366,9367],{"class":223},"    requestAnimationFrame",[217,9369,9370],{"class":319},"(gameLoop);\n",[217,9372,9374],{"class":219,"line":9373},139,[217,9375,2990],{"class":319},[217,9377,9379],{"class":219,"line":9378},140,[217,9380,896],{"emptyLinePlaceholder":895},[217,9382,9384,9387,9390,9392,9395,9398,9401,9403,9405],{"class":219,"line":9383},141,[217,9385,9386],{"class":319},"window.",[217,9388,9389],{"class":223},"addEventListener",[217,9391,2473],{"class":319},[217,9393,9394],{"class":227},"'keydown'",[217,9396,9397],{"class":319},", (",[217,9399,9400],{"class":7808},"e",[217,9402,9049],{"class":319},[217,9404,9052],{"class":323},[217,9406,7514],{"class":319},[217,9408,9410,9413,9415,9418],{"class":219,"line":9409},142,[217,9411,9412],{"class":319},"    keys[e.key] ",[217,9414,854],{"class":323},[217,9416,9417],{"class":237}," true",[217,9419,2712],{"class":319},[217,9421,9423,9426,9429,9432,9435],{"class":219,"line":9422},143,[217,9424,9425],{"class":323},"    if",[217,9427,9428],{"class":319}," (e.key ",[217,9430,9431],{"class":323},"===",[217,9433,9434],{"class":227}," ' '",[217,9436,2892],{"class":319},[217,9438,9440,9443,9445,9447,9449,9451,9454,9456,9459,9461,9463,9465,9468,9471,9473,9475,9477,9479,9482,9484,9487],{"class":219,"line":9439},144,[217,9441,9442],{"class":319},"        bullets.",[217,9444,8788],{"class":223},[217,9446,2473],{"class":319},[217,9448,8793],{"class":323},[217,9450,8094],{"class":223},[217,9452,9453],{"class":319},"(player.x ",[217,9455,8899],{"class":323},[217,9457,9458],{"class":319}," player.width ",[217,9460,5705],{"class":323},[217,9462,8543],{"class":237},[217,9464,6687],{"class":323},[217,9466,9467],{"class":237}," 2.5",[217,9469,9470],{"class":319},", player.y, ",[217,9472,2647],{"class":237},[217,9474,2551],{"class":319},[217,9476,2666],{"class":237},[217,9478,2551],{"class":319},[217,9480,9481],{"class":227},"'black'",[217,9483,2551],{"class":319},[217,9485,9486],{"class":237},"7",[217,9488,2984],{"class":319},[217,9490,9492],{"class":219,"line":9491},145,[217,9493,7911],{"class":319},[217,9495,9497],{"class":219,"line":9496},146,[217,9498,9499],{"class":319},"});\n",[217,9501,9503],{"class":219,"line":9502},147,[217,9504,896],{"emptyLinePlaceholder":895},[217,9506,9508,9510,9512,9514,9517,9519,9521,9523,9525],{"class":219,"line":9507},148,[217,9509,9386],{"class":319},[217,9511,9389],{"class":223},[217,9513,2473],{"class":319},[217,9515,9516],{"class":227},"'keyup'",[217,9518,9397],{"class":319},[217,9520,9400],{"class":7808},[217,9522,9049],{"class":319},[217,9524,9052],{"class":323},[217,9526,7514],{"class":319},[217,9528,9530,9532,9534,9536],{"class":219,"line":9529},149,[217,9531,9412],{"class":319},[217,9533,854],{"class":323},[217,9535,8342],{"class":237},[217,9537,2712],{"class":319},[217,9539,9541],{"class":219,"line":9540},150,[217,9542,9499],{"class":319},[217,9544,9546],{"class":219,"line":9545},151,[217,9547,896],{"emptyLinePlaceholder":895},[217,9549,9551,9554,9557,9560],{"class":219,"line":9550},152,[217,9552,9553],{"class":223},"setInterval",[217,9555,9556],{"class":319},"(spawnEnemy, ",[217,9558,9559],{"class":237},"2000",[217,9561,2484],{"class":319},[217,9563,9565,9568],{"class":219,"line":9564},153,[217,9566,9567],{"class":223},"gameLoop",[217,9569,2684],{"class":319},[15,9571,9572],{},"4 遊戲玩法",[15,9574,9575,9576,9579],{},"遊戲建立完成，",[55,9577,9578],{},"Gemnini CLI"," 也會提示遊戲玩法",[15,9581,9582],{},[930,9583],{"alt":9584,"src":9585},"Gemini CLI遊戲玩法","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-03.png",[2109,9587,9588],{"start":441},[31,9589,9590],{},"執行結果",[15,9592,9593],{},[930,9594],{"alt":9595,"src":9596},"Gemini CLI執行結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-04.png",[2109,9598,9599,9618],{"start":908},[31,9600,9601,9602,9605,9606,9608,9609],{},"更改風格",[9603,9604],"br",{},"如果你覺得畫面太陽春，你他可以請 ",[55,9607,7081],{}," 幫你優化",[208,9610,9612],{"className":210,"code":9611,"language":212,"meta":213,"style":213},"請將遊戲畫面風格換成2000年街機風格\n",[55,9613,9614],{"__ignoreMap":213},[217,9615,9616],{"class":219,"line":220},[217,9617,9611],{"class":223},[31,9619,9620],{},"修改過後的結果",[15,9622,9623],{},[930,9624],{"alt":9625,"src":9626},"Gemini CLI修改過後的結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-05.png",[15,9628,9629,9630,9632],{},"以上是 ",[55,9631,9578],{}," 簡易使用範例",[1103,9634,9636],{"id":9635},"gemini-cli-的相關指令","Gemini CLI 的相關指令",[15,9638,9639,9641,9642,9644],{},[55,9640,9578],{}," 內建了一個常用指令，詳細可用 ",[55,9643,5889],{}," 進行指令查詢",[15,9646,9647],{},[930,9648],{"alt":9649,"src":9650},"Gemini CLi help","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-help.png",[1103,9652,9654],{"id":9653},"記憶功態-memory","記憶功態 (Memory)",[15,9656,9657,9658,9660,9661,9663,9664,9666],{},"若你要處理比較複雜的問題，由於 LLM 對於長文處理，有時會有失憶的問題，或當我們重啟 ",[55,9659,7081],{},"，",[55,9662,7081],{}," 忘記之前互動的要求，因此 ",[55,9665,7081],{}," 有了記憶功能，而使用方式如下：",[28,9668,9669,9711,9732],{},[31,9670,9671,9672,9674,9675,9678,9679,9696,9698,9699,9701,9702,9704,9705,9707,9708,9710],{},"以",[55,9673,1042],{},"格式，建立 ",[55,9676,9677],{},"GEMINI.md","，你可以將之記錄",[28,9680,9681,9684,9687,9690,9693],{},[31,9682,9683],{},"環境設定",[31,9685,9686],{},"工作需求",[31,9688,9689],{},"工作項目",[31,9691,9692],{},"使用相關 MCP 指令",[31,9694,9695],{},"程式碼風格",[9603,9697],{},"當你在某個目錄下啟動 ",[55,9700,7081],{}," 代理模式時，它會分層搜尋 ",[55,9703,9677],{}," 檔案：從當前工作目錄開始，向上搜尋到專案根目錄，甚至到你的主目錄。它也會搜尋子目錄中的 ",[55,9706,9677],{}," 檔案。所有找到的 ",[55,9709,9677],{}," 檔案的內容會被合併，作為「指令上下文」提供給 Gemini 模型。",[31,9712,9713,9714,4666,9716,9718,9719],{},"更新記憶內容",[9603,9715],{},[55,9717,7081],{}," 下達指令：",[208,9720,9722],{"className":210,"code":9721,"language":212,"meta":213,"style":213},"\u002Fmemory refresh\n",[55,9723,9724],{"__ignoreMap":213},[217,9725,9726,9729],{"class":219,"line":220},[217,9727,9728],{"class":223},"\u002Fmemory",[217,9730,9731],{"class":227}," refresh\n",[31,9733,9734,9735,4666,9737,9718,9739],{},"顯示記憶內容：",[9603,9736],{},[55,9738,7081],{},[208,9740,9742],{"className":210,"code":9741,"language":212,"meta":213,"style":213},"\u002Fmemory show\n",[55,9743,9744],{"__ignoreMap":213},[217,9745,9746,9748],{"class":219,"line":220},[217,9747,9728],{"class":223},[217,9749,9750],{"class":227}," show\n",[15,9752,9753,9754,9756],{},"如此 ",[55,9755,7081],{}," 在執行專案開發時，更能依據我的需求，完成我們的任務。",[63,9758,3853],{"id":3853},[15,9760,9761],{},"Gemini CLI 是一個功能強大且易於使用的工具，它將先進的 AI 能力帶入了開發者最熟悉的終端機環境。透過清晰的提示詞和適當的審核，你可以大幅提升開發效率，加速專案進程。立即安裝 Gemini CLI，體驗用AI開發的魅力吧，而目前提供的免費額度可以完成一些簡單的小專案，若要完成更大的專案，當然就需要考慮付費。",[63,9763,9764],{"id":9764},"相關網站",[28,9766,9767,9774],{},[31,9768,9769,9770],{},"Gemini CLI Github: ",[19,9771,9772],{"href":9772,"rel":9773},"https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli",[291],[31,9775,9776,9777],{},"Google 官方部落格資訊: ",[19,9778,9779],{"href":9779,"rel":9780},"https:\u002F\u002Fblog.google\u002Fintl\u002Fzh-tw\u002Fproducts\u002Fcloud\u002Fgemini-cli-your-open-source-ai-agent\u002F",[291],[1302,9782,9783],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sByVh, html code.shiki .sByVh{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":9785},[9786,9789,9795,9796],{"id":7092,"depth":387,"text":7093,"children":9787},[9788],{"id":7099,"depth":410,"text":7100},{"id":7141,"depth":387,"text":7142,"children":9790},[9791,9792,9793,9794],{"id":7145,"depth":410,"text":7146},{"id":7196,"depth":410,"text":7197},{"id":9635,"depth":410,"text":9636},{"id":9653,"depth":410,"text":9654},{"id":3853,"depth":387,"text":3853},{"id":9764,"depth":387,"text":9764},"Google 發最新的 AI 開發工具 Gemini CLI，可以對標 Anthropic 的 Claude Code 和 OpenAI 的 Codex CLI等 AI 開發工具，也讓使得 AI開發工具的竸爭進入白熱化。","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fcover.png",{},"\u002Farticles\u002F2025-07-12-gemini-cli","2025-07-12 20:38:00",{"title":7069,"description":9797},"articles\u002F2025-07-12-gemini-cli","本文將帶你了解 Gemini CLI，一個能將 Gemini 強大 AI 能力整合至終端機的開源工具。學習如何安裝、使用 Gemini CLI 進行程式碼生成、任務自動化，並體驗 AI-First Coding 的開發模式。",[1333,1336,2207],"06YY6CfnzHfs2KDK962SeuY3nvJMZ0lWwdR0AfkGsr8",{"id":9808,"title":9809,"body":9810,"category":1322,"description":213,"extension":1324,"image":10595,"meta":10596,"navigation":895,"path":10597,"pubDate":10598,"seo":10599,"status":895,"stem":10600,"summary":10601,"tags":10602,"__hash__":10603},"content\u002Farticles\u002F2025-03-17-open-manus.md","使用 OpenManus 在本地端玩轉 AI Agent",{"type":8,"value":9811,"toc":10571},[9812,9814,9817,9820,9844,9846,9852,9856,9860,9894,9898,9921,9924,9942,9946,9950,9969,9972,9990,9993,10033,10036,10054,10057,10060,10076,10079,10439,10450,10461,10464,10475,10488,10491,10494,10507,10510,10546,10549,10552,10559,10561,10568],[63,9813,2217],{"id":2217},[15,9815,9816],{},"OpenManus 是一個開源的通用型 AI Agent，是 Manus 的替代方案，無需等待昂貴的激活碼即可使用。以下是 OpenManus 的使用教學，希望能幫助你快速上手：",[63,9818,9819],{"id":9819},"環境需求",[28,9821,9822,9834],{},[31,9823,9824,257,9827,9829,9830,9829,9832],{},[47,9825,9826],{},"作業系統",[55,9828,1508],{}," \u002F ",[55,9831,5368],{},[55,9833,5263],{},[31,9835,9836,9839,9840,9843],{},[47,9837,9838],{},"Python","：版本 ",[55,9841,9842],{},"3.10"," 以上",[63,9845,4873],{"id":4873},[15,9847,9848],{},[19,9849,9850],{"href":9850,"rel":9851},"https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus",[291],[63,9853,9855],{"id":9854},"使用-conda-安裝","使用 Conda 安裝",[1103,9857,9859],{"id":9858},"建立新的-conda-環境","建立新的 Conda 環境",[208,9861,9863],{"className":210,"code":9862,"language":212,"meta":213,"style":213},"conda create -n open_manus python=3.12\nconda activate open_manus\n",[55,9864,9865,9884],{"__ignoreMap":213},[217,9866,9867,9870,9872,9875,9878,9881],{"class":219,"line":220},[217,9868,9869],{"class":223},"conda",[217,9871,1827],{"class":227},[217,9873,9874],{"class":237}," -n",[217,9876,9877],{"class":227}," open_manus",[217,9879,9880],{"class":227}," python=",[217,9882,9883],{"class":237},"3.12\n",[217,9885,9886,9888,9891],{"class":219,"line":387},[217,9887,9869],{"class":223},[217,9889,9890],{"class":227}," activate",[217,9892,9893],{"class":227}," open_manus\n",[1103,9895,9897],{"id":9896},"clone-儲存庫","Clone 儲存庫",[208,9899,9901],{"className":210,"code":9900,"language":212,"meta":213,"style":213},"git clone https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\ncd OpenManus\n",[55,9902,9903,9914],{"__ignoreMap":213},[217,9904,9905,9908,9911],{"class":219,"line":220},[217,9906,9907],{"class":223},"git",[217,9909,9910],{"class":227}," clone",[217,9912,9913],{"class":227}," https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\n",[217,9915,9916,9918],{"class":219,"line":387},[217,9917,5580],{"class":237},[217,9919,9920],{"class":227}," OpenManus\n",[1103,9922,9923],{"id":9923},"安裝相依套件",[208,9925,9927],{"className":210,"code":9926,"language":212,"meta":213,"style":213},"pip install -r requirements.txt\n",[55,9928,9929],{"__ignoreMap":213},[217,9930,9931,9934,9936,9939],{"class":219,"line":220},[217,9932,9933],{"class":223},"pip",[217,9935,1498],{"class":227},[217,9937,9938],{"class":237}," -r",[217,9940,9941],{"class":227}," requirements.txt\n",[63,9943,9945],{"id":9944},"使用-uv-安裝","使用 uv 安裝",[1103,9947,9949],{"id":9948},"安裝-uv-環境","安裝 uv 環境",[208,9951,9953],{"className":210,"code":9952,"language":212,"meta":213,"style":213},"curl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n",[55,9954,9955],{"__ignoreMap":213},[217,9956,9957,9959,9962,9965,9967],{"class":219,"line":220},[217,9958,1578],{"class":223},[217,9960,9961],{"class":237}," -LsSf",[217,9963,9964],{"class":227}," https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh",[217,9966,1772],{"class":323},[217,9968,1775],{"class":223},[1103,9970,9897],{"id":9971},"clone-儲存庫-1",[208,9973,9974],{"className":210,"code":9900,"language":212,"meta":213,"style":213},[55,9975,9976,9984],{"__ignoreMap":213},[217,9977,9978,9980,9982],{"class":219,"line":220},[217,9979,9907],{"class":223},[217,9981,9910],{"class":227},[217,9983,9913],{"class":227},[217,9985,9986,9988],{"class":219,"line":387},[217,9987,5580],{"class":237},[217,9989,9920],{"class":227},[1103,9991,9992],{"id":9992},"建立新的虛擬環境並啟動它",[208,9994,9996],{"className":210,"code":9995,"language":212,"meta":213,"style":213},"uv venv --python 3.12\nsource .venv\u002Fbin\u002Factivate  # On Unix\u002FmacOS\n# Or on Windows:\n# .venv\\Scripts\\activate\n",[55,9997,9998,10012,10023,10028],{"__ignoreMap":213},[217,9999,10000,10003,10006,10009],{"class":219,"line":220},[217,10001,10002],{"class":223},"uv",[217,10004,10005],{"class":227}," venv",[217,10007,10008],{"class":237}," --python",[217,10010,10011],{"class":237}," 3.12\n",[217,10013,10014,10017,10020],{"class":219,"line":387},[217,10015,10016],{"class":237},"source",[217,10018,10019],{"class":227}," .venv\u002Fbin\u002Factivate",[217,10021,10022],{"class":1521},"  # On Unix\u002FmacOS\n",[217,10024,10025],{"class":219,"line":410},[217,10026,10027],{"class":1521},"# Or on Windows:\n",[217,10029,10030],{"class":219,"line":424},[217,10031,10032],{"class":1521},"# .venv\\Scripts\\activate\n",[1103,10034,9923],{"id":10035},"安裝相依套件-1",[208,10037,10039],{"className":210,"code":10038,"language":212,"meta":213,"style":213},"uv pip install -r requirements.txt\n",[55,10040,10041],{"__ignoreMap":213},[217,10042,10043,10045,10048,10050,10052],{"class":219,"line":220},[217,10044,10002],{"class":223},[217,10046,10047],{"class":227}," pip",[217,10049,1498],{"class":227},[217,10051,9938],{"class":237},[217,10053,9941],{"class":227},[63,10055,10056],{"id":10056},"設定",[1103,10058,10059],{"id":10059},"建立設定檔",[208,10061,10063],{"className":210,"code":10062,"language":212,"meta":213,"style":213},"cp config\u002Fconfig.example.toml config\u002Fconfig.toml\n",[55,10064,10065],{"__ignoreMap":213},[217,10066,10067,10070,10073],{"class":219,"line":220},[217,10068,10069],{"class":223},"cp",[217,10071,10072],{"class":227}," config\u002Fconfig.example.toml",[217,10074,10075],{"class":227}," config\u002Fconfig.toml\n",[1103,10077,10078],{"id":10078},"編輯設定檔",[208,10080,10082],{"className":210,"code":10081,"language":212,"meta":213,"style":213},"# [llm] #AZURE OPENAI:\n# api_type= 'azure'\n# model = \"YOUR_MODEL_NAME\" #\"gpt-4o-mini\"\n# base_url = \"{YOUR_AZURE_ENDPOINT.rstrip('\u002F')}\u002Fopenai\u002Fdeployments\u002F{AZURE_DEPOLYMENT_ID}\"\n# api_key = \"AZURE API KEY\"\n# max_tokens = 8096\n# temperature = 0.0\n# api_version=\"AZURE API VERSION\" #\"2024-08-01-preview\"\n\n [llm] #OLLAMA:\n api_type = 'ollama'\n model = \"llama3\"\n base_url = \"http:\u002F\u002F127.0.0.1:11434\u002Fv1\"\n api_key = \"ollama\"\n max_tokens = 4096\n temperature = 0.0\n\n# Optional configuration for specific LLM models\n#[llm.vision]\n# model = \"claude-3-7-sonnet\"    # The vision model to use\n# base_url = \"https:\u002F\u002Fapi.openai.com\u002Fv1\"    # API endpoint URL for vision model\n# api_key = \"sk-...\"    # Your API key for vision model\n# max_tokens = 8192     # Maximum number of tokens in the response\n# temperature = 0.0     # Controls randomness for vision model\n\n[llm.vision] #OLLAMA VISION:\napi_type = 'ollama'\nmodel = \"llama3.2-vision:latest\"\nbase_url = \"http:\u002F\u002F127.0.0.1:11434\u002Fv1\"\napi_key = \"ollama\"\nmax_tokens = 4096\ntemperature = 0.0\n\n# Optional configuration for specific browser configuration\n# [browser]\n# Whether to run browser in headless mode (default: false)\n#headless = false\n# Disable browser security features (default: true)\n#disable_security = true\n# Extra arguments to pass to the browser\n#extra_chromium_args = []\n# Path to a Chrome instance to use to connect to your normal browser\n# e.g. '\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome'\n#chrome_instance_path = \"\"\n# Connect to a browser instance via WebSocket\n#wss_url = \"\"\n# Connect to a browser instance via CDP\n#cdp_url = \"\"\n\n# Optional configuration, Proxy settings for the browser\n# [browser.proxy]\n# server = \"http:\u002F\u002Fproxy-server:port\"\n# username = \"proxy-username\"\n# password = \"proxy-password\"\n\n# Optional configuration, Search settings.\n# [search]\n# Search engine for agent to use. Default is \"Google\", can be set to \"Baidu\" or \"DuckDuckGo\".\nengine = \"Google\"\n",[55,10083,10084,10089,10094,10099,10104,10109,10114,10119,10124,10128,10136,10146,10156,10166,10176,10186,10196,10200,10205,10210,10215,10220,10225,10230,10235,10239,10247,10256,10266,10275,10284,10293,10302,10306,10311,10316,10321,10326,10331,10336,10341,10346,10351,10356,10361,10366,10371,10376,10381,10385,10390,10395,10400,10405,10410,10414,10419,10424,10429],{"__ignoreMap":213},[217,10085,10086],{"class":219,"line":220},[217,10087,10088],{"class":1521},"# [llm] #AZURE OPENAI:\n",[217,10090,10091],{"class":219,"line":387},[217,10092,10093],{"class":1521},"# api_type= 'azure'\n",[217,10095,10096],{"class":219,"line":410},[217,10097,10098],{"class":1521},"# model = \"YOUR_MODEL_NAME\" #\"gpt-4o-mini\"\n",[217,10100,10101],{"class":219,"line":424},[217,10102,10103],{"class":1521},"# base_url = \"{YOUR_AZURE_ENDPOINT.rstrip('\u002F')}\u002Fopenai\u002Fdeployments\u002F{AZURE_DEPOLYMENT_ID}\"\n",[217,10105,10106],{"class":219,"line":441},[217,10107,10108],{"class":1521},"# api_key = \"AZURE API KEY\"\n",[217,10110,10111],{"class":219,"line":908},[217,10112,10113],{"class":1521},"# max_tokens = 8096\n",[217,10115,10116],{"class":219,"line":1560},[217,10117,10118],{"class":1521},"# temperature = 0.0\n",[217,10120,10121],{"class":219,"line":1566},[217,10122,10123],{"class":1521},"# api_version=\"AZURE API VERSION\" #\"2024-08-01-preview\"\n",[217,10125,10126],{"class":219,"line":1660},[217,10127,896],{"emptyLinePlaceholder":895},[217,10129,10130,10133],{"class":219,"line":1666},[217,10131,10132],{"class":319}," [llm] ",[217,10134,10135],{"class":1521},"#OLLAMA:\n",[217,10137,10138,10141,10143],{"class":219,"line":1672},[217,10139,10140],{"class":223}," api_type",[217,10142,330],{"class":227},[217,10144,10145],{"class":227}," 'ollama'\n",[217,10147,10148,10151,10153],{"class":219,"line":1678},[217,10149,10150],{"class":223}," model",[217,10152,330],{"class":227},[217,10154,10155],{"class":227}," \"llama3\"\n",[217,10157,10158,10161,10163],{"class":219,"line":1684},[217,10159,10160],{"class":223}," base_url",[217,10162,330],{"class":227},[217,10164,10165],{"class":227}," \"http:\u002F\u002F127.0.0.1:11434\u002Fv1\"\n",[217,10167,10168,10171,10173],{"class":219,"line":1689},[217,10169,10170],{"class":223}," api_key",[217,10172,330],{"class":227},[217,10174,10175],{"class":227}," \"ollama\"\n",[217,10177,10178,10181,10183],{"class":219,"line":2676},[217,10179,10180],{"class":223}," max_tokens",[217,10182,330],{"class":227},[217,10184,10185],{"class":237}," 4096\n",[217,10187,10188,10191,10193],{"class":219,"line":2687},[217,10189,10190],{"class":223}," temperature",[217,10192,330],{"class":227},[217,10194,10195],{"class":237}," 0.0\n",[217,10197,10198],{"class":219,"line":2692},[217,10199,896],{"emptyLinePlaceholder":895},[217,10201,10202],{"class":219,"line":2987},[217,10203,10204],{"class":1521},"# Optional configuration for specific LLM models\n",[217,10206,10207],{"class":219,"line":2993},[217,10208,10209],{"class":1521},"#[llm.vision]\n",[217,10211,10212],{"class":219,"line":2998},[217,10213,10214],{"class":1521},"# model = \"claude-3-7-sonnet\"    # The vision model to use\n",[217,10216,10217],{"class":219,"line":3004},[217,10218,10219],{"class":1521},"# base_url = \"https:\u002F\u002Fapi.openai.com\u002Fv1\"    # API endpoint URL for vision model\n",[217,10221,10222],{"class":219,"line":6078},[217,10223,10224],{"class":1521},"# api_key = \"sk-...\"    # Your API key for vision model\n",[217,10226,10227],{"class":219,"line":6089},[217,10228,10229],{"class":1521},"# max_tokens = 8192     # Maximum number of tokens in the response\n",[217,10231,10232],{"class":219,"line":6100},[217,10233,10234],{"class":1521},"# temperature = 0.0     # Controls randomness for vision model\n",[217,10236,10237],{"class":219,"line":6105},[217,10238,896],{"emptyLinePlaceholder":895},[217,10240,10241,10244],{"class":219,"line":6111},[217,10242,10243],{"class":319},"[llm.vision] ",[217,10245,10246],{"class":1521},"#OLLAMA VISION:\n",[217,10248,10249,10252,10254],{"class":219,"line":6121},[217,10250,10251],{"class":223},"api_type",[217,10253,330],{"class":227},[217,10255,10145],{"class":227},[217,10257,10258,10261,10263],{"class":219,"line":6135},[217,10259,10260],{"class":223},"model",[217,10262,330],{"class":227},[217,10264,10265],{"class":227}," \"llama3.2-vision:latest\"\n",[217,10267,10268,10271,10273],{"class":219,"line":6140},[217,10269,10270],{"class":223},"base_url",[217,10272,330],{"class":227},[217,10274,10165],{"class":227},[217,10276,10277,10280,10282],{"class":219,"line":6146},[217,10278,10279],{"class":223},"api_key",[217,10281,330],{"class":227},[217,10283,10175],{"class":227},[217,10285,10286,10289,10291],{"class":219,"line":6159},[217,10287,10288],{"class":223},"max_tokens",[217,10290,330],{"class":227},[217,10292,10185],{"class":237},[217,10294,10295,10298,10300],{"class":219,"line":6170},[217,10296,10297],{"class":223},"temperature",[217,10299,330],{"class":227},[217,10301,10195],{"class":237},[217,10303,10304],{"class":219,"line":6181},[217,10305,896],{"emptyLinePlaceholder":895},[217,10307,10308],{"class":219,"line":8099},[217,10309,10310],{"class":1521},"# Optional configuration for specific browser configuration\n",[217,10312,10313],{"class":219,"line":8131},[217,10314,10315],{"class":1521},"# [browser]\n",[217,10317,10318],{"class":219,"line":8142},[217,10319,10320],{"class":1521},"# Whether to run browser in headless mode (default: false)\n",[217,10322,10323],{"class":219,"line":8153},[217,10324,10325],{"class":1521},"#headless = false\n",[217,10327,10328],{"class":219,"line":8164},[217,10329,10330],{"class":1521},"# Disable browser security features (default: true)\n",[217,10332,10333],{"class":219,"line":8175},[217,10334,10335],{"class":1521},"#disable_security = true\n",[217,10337,10338],{"class":219,"line":8186},[217,10339,10340],{"class":1521},"# Extra arguments to pass to the browser\n",[217,10342,10343],{"class":219,"line":8198},[217,10344,10345],{"class":1521},"#extra_chromium_args = []\n",[217,10347,10348],{"class":219,"line":8203},[217,10349,10350],{"class":1521},"# Path to a Chrome instance to use to connect to your normal browser\n",[217,10352,10353],{"class":219,"line":8208},[217,10354,10355],{"class":1521},"# e.g. '\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome'\n",[217,10357,10358],{"class":219,"line":8215},[217,10359,10360],{"class":1521},"#chrome_instance_path = \"\"\n",[217,10362,10363],{"class":219,"line":8226},[217,10364,10365],{"class":1521},"# Connect to a browser instance via WebSocket\n",[217,10367,10368],{"class":219,"line":8251},[217,10369,10370],{"class":1521},"#wss_url = \"\"\n",[217,10372,10373],{"class":219,"line":8256},[217,10374,10375],{"class":1521},"# Connect to a browser instance via CDP\n",[217,10377,10378],{"class":219,"line":8261},[217,10379,10380],{"class":1521},"#cdp_url = \"\"\n",[217,10382,10383],{"class":219,"line":8268},[217,10384,896],{"emptyLinePlaceholder":895},[217,10386,10387],{"class":219,"line":8281},[217,10388,10389],{"class":1521},"# Optional configuration, Proxy settings for the browser\n",[217,10391,10392],{"class":219,"line":8286},[217,10393,10394],{"class":1521},"# [browser.proxy]\n",[217,10396,10397],{"class":219,"line":8291},[217,10398,10399],{"class":1521},"# server = \"http:\u002F\u002Fproxy-server:port\"\n",[217,10401,10402],{"class":219,"line":8296},[217,10403,10404],{"class":1521},"# username = \"proxy-username\"\n",[217,10406,10407],{"class":219,"line":8306},[217,10408,10409],{"class":1521},"# password = \"proxy-password\"\n",[217,10411,10412],{"class":219,"line":8347},[217,10413,896],{"emptyLinePlaceholder":895},[217,10415,10416],{"class":219,"line":8358},[217,10417,10418],{"class":1521},"# Optional configuration, Search settings.\n",[217,10420,10421],{"class":219,"line":8369},[217,10422,10423],{"class":1521},"# [search]\n",[217,10425,10426],{"class":219,"line":8380},[217,10427,10428],{"class":1521},"# Search engine for agent to use. Default is \"Google\", can be set to \"Baidu\" or \"DuckDuckGo\".\n",[217,10430,10431,10434,10436],{"class":219,"line":8391},[217,10432,10433],{"class":223},"engine",[217,10435,330],{"class":227},[217,10437,10438],{"class":227}," \"Google\"\n",[15,10440,247,10441,10444,10445],{},[55,10442,10443],{},"[llm]"," 的 ollama model 並非所有 model 著支援，目前只支援 ",[19,10446,10449],{"href":10447,"rel":10448},"https:\u002F\u002Follama.com\u002Fsearch?c=tools",[291],"ollama tool 模型",[15,10451,1363,10452,10455,10456],{},[55,10453,10454],{},"[llm.vision]"," 的 ollama model 則必需支援",[19,10457,10460],{"href":10458,"rel":10459},"https:\u002F\u002Follama.com\u002Fsearch?c=vision",[291],"視覺的模型",[63,10462,10463],{"id":10463},"瀏覽器安裝",[15,10465,10466,10467,10470,10471,10474],{},"在使用 ",[55,10468,10469],{},"OpenManus"," 時，有時需要使用網路爬蟲時，會要求你安裝 ",[55,10472,10473],{},"Chromium"," 瀏覽器，你可以事先透過下列指令進行安裝",[208,10476,10478],{"className":210,"code":10477,"language":212,"meta":213,"style":213},"playwright install\n",[55,10479,10480],{"__ignoreMap":213},[217,10481,10482,10485],{"class":219,"line":220},[217,10483,10484],{"class":223},"playwright",[217,10486,10487],{"class":227}," install\n",[63,10489,10490],{"id":10490},"啟用服務",[15,10492,10493],{},"上面安裝完成後，就可以啟用服務",[208,10495,10497],{"className":210,"code":10496,"language":212,"meta":213,"style":213},"python main.py\n",[55,10498,10499],{"__ignoreMap":213},[217,10500,10501,10504],{"class":219,"line":220},[217,10502,10503],{"class":223},"python",[217,10505,10506],{"class":227}," main.py\n",[63,10508,10509],{"id":10509},"啟用服務的畫面",[208,10511,10513],{"className":210,"code":10512,"language":212,"meta":213,"style":213},"INFO     [browser_use] BrowserUse logging setup complete with level info\nINFO     [root] Anonymized telemetry enabled. See https:\u002F\u002Fdocs.browser-use.com\u002Fdevelopment\u002Ftelemetry for more information.\nEnter your prompt:\n",[55,10514,10515,10523,10535],{"__ignoreMap":213},[217,10516,10517,10520],{"class":219,"line":220},[217,10518,10519],{"class":223},"INFO",[217,10521,10522],{"class":319},"     [browser_use] BrowserUse logging setup complete with level info\n",[217,10524,10525,10527,10530,10532],{"class":219,"line":387},[217,10526,10519],{"class":223},[217,10528,10529],{"class":319},"     [root] Anonymized telemetry enabled. See https:\u002F\u002Fdocs.browser-use.com\u002Fdevelopment\u002Ftelemetry ",[217,10531,2866],{"class":323},[217,10533,10534],{"class":319}," more information.\n",[217,10536,10537,10540,10543],{"class":219,"line":410},[217,10538,10539],{"class":223},"Enter",[217,10541,10542],{"class":227}," your",[217,10544,10545],{"class":227}," prompt:\n",[15,10547,10548],{},"在終端機輸入你的需求提示詞",[15,10550,10551],{},"如：請從網路上搜尋 近期熱門的 LLM 大語言模型的介紹，並以繁體中文整理成一篇文章，以 markdown 格式輸出 \"LLM_大語言模型介紹.md\"",[15,10553,10554,10555,10558],{},"執行結果會儲存在 ",[55,10556,10557],{},"OpenManus\u002Fworkspace"," 資料夾",[63,10560,3853],{"id":3853},[15,10562,10563,10564,10567],{},"總而言之，OpenManus 提供了一個無需等待邀請碼、即可在本地端體驗 AI Agent 功能的開源方案。透過搭配 Ollama，使用者可以輕鬆地利用各種大型語言模型和視覺模型，執行從網路資訊蒐集到文章撰寫等多種任務。儘管目前 Ollama 對於 ",[55,10565,10566],{},"tool"," 模型和視覺模型的支援仍在發展中，OpenManus 仍然為對 AI Agent 技術感興趣的使用者提供了一個方便且彈性的實驗平台。隨著專案的持續發展和更多模型的支援，OpenManus 有望成為本地端 AI 應用的重要工具之一。",[1302,10569,10570],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":213,"searchDepth":387,"depth":387,"links":10572},[10573,10574,10575,10576,10581,10587,10591,10592,10593,10594],{"id":2217,"depth":387,"text":2217},{"id":9819,"depth":387,"text":9819},{"id":4873,"depth":387,"text":4873},{"id":9854,"depth":387,"text":9855,"children":10577},[10578,10579,10580],{"id":9858,"depth":410,"text":9859},{"id":9896,"depth":410,"text":9897},{"id":9923,"depth":410,"text":9923},{"id":9944,"depth":387,"text":9945,"children":10582},[10583,10584,10585,10586],{"id":9948,"depth":410,"text":9949},{"id":9971,"depth":410,"text":9897},{"id":9992,"depth":410,"text":9992},{"id":10035,"depth":410,"text":9923},{"id":10056,"depth":387,"text":10056,"children":10588},[10589,10590],{"id":10059,"depth":410,"text":10059},{"id":10078,"depth":410,"text":10078},{"id":10463,"depth":387,"text":10463},{"id":10490,"depth":387,"text":10490},{"id":10509,"depth":387,"text":10509},{"id":3853,"depth":387,"text":3853},"\u002Fimages\u002Farticles\u002F2025-03-17-open-manus\u002Fcover.png",{},"\u002Farticles\u002F2025-03-17-open-manus","2025-03-17 14:38:00",{"title":9809,"description":213},"articles\u002F2025-03-17-open-manus","最近的 Manus 爆紅的 AI 工具，但需要邀請碼，而 OpenManus 則是開源版，且可以在本地配合 ollama 使用",[1333],"3Et6YOZPsuqir3pZgApsjYIZn_5nPPKlO4oaWvr2Sj0",{"id":10605,"title":10606,"body":10607,"category":10780,"description":213,"extension":1324,"image":10781,"meta":10782,"navigation":895,"path":10783,"pubDate":10784,"seo":10785,"status":895,"stem":10786,"summary":10787,"tags":10788,"__hash__":10789},"content\u002Farticles\u002F2025-02-05-linux-nohup.md","nohup 指令：讓程式在登出後繼續執行的秘訣",{"type":8,"value":10608,"toc":10772},[10609,10616,10621,10624,10636,10650,10653,10663,10690,10704,10708,10714,10740,10758,10760,10763,10769],[63,10610,10612,10613,4008],{"id":10611},"什麼是-nohup","什麼是 ",[55,10614,10615],{},"nohup",[15,10617,10618,10620],{},[55,10619,10615],{}," 是Linux系統中的一個命令，用於讓指定的程式在用戶登出或終端機連接斷開後繼續執行。它會忽略SIGHUP（掛起）信號，使程序能夠在背景下不受干擾地運行。",[63,10622,10623],{"id":10623},"基本語法",[208,10625,10627],{"className":210,"code":10626,"language":212,"meta":213,"style":213},"nohup [指令] &\n",[55,10628,10629],{"__ignoreMap":213},[217,10630,10631,10633],{"class":219,"line":220},[217,10632,10615],{"class":223},[217,10634,10635],{"class":319}," [指令] &\n",[28,10637,10638,10644],{},[31,10639,10640,10643],{},[55,10641,10642],{},"[指令]","：您希望在背景執行的命令。",[31,10645,10646,10649],{},[55,10647,10648],{},"&","：表示將命令放在後台執行",[63,10651,10652],{"id":10652},"使用範例",[15,10654,10655,10656,10659,10660,10662],{},"假設我們有一個簡單的Python腳本 ",[55,10657,10658],{},"my_script.py","，它會運行一個耗時的計算任務。我們可以使用 ",[55,10661,10615],{}," 命令來確保該任務即使在登出後仍能繼續執行：",[208,10664,10666],{"className":210,"code":10665,"language":212,"meta":213,"style":213},"nohup python my_script.py >> output.log 2>&1 &\n",[55,10667,10668],{"__ignoreMap":213},[217,10669,10670,10672,10675,10678,10681,10684,10687],{"class":219,"line":220},[217,10671,10615],{"class":223},[217,10673,10674],{"class":227}," python",[217,10676,10677],{"class":227}," my_script.py",[217,10679,10680],{"class":323}," >>",[217,10682,10683],{"class":227}," output.log",[217,10685,10686],{"class":323}," 2>&1",[217,10688,10689],{"class":319}," &\n",[28,10691,10692,10698],{},[31,10693,10694,10697],{},[55,10695,10696],{},">>"," output.log：將標準輸出重定向到output.log文件。",[31,10699,10700,10703],{},[55,10701,10702],{},"2>&1","：將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[63,10705,10707],{"id":10706},"過濾-nohup-ignoring-input-訊息","過濾 nohup: ignoring input 訊息",[15,10709,10710,10711,10713],{},"當你使用 ",[55,10712,10615],{}," 執行命令時，它會輸出 nohup: ignoring input，這是因為 nohup 預設會忽略標準輸入 (stdin)，以確保命令不會因等待輸入而中斷。這條訊息通常會寫入 nohup.out 或你指定的 log 檔案。如果你不想讓這行訊息出現在 log 檔案中，可以使用以下方法：",[208,10715,10717],{"className":210,"code":10716,"language":212,"meta":213,"style":213},"nohup python my_script.py >> output.log 2>&1 \u003C \u002Fdev\u002Fnull &\n",[55,10718,10719],{"__ignoreMap":213},[217,10720,10721,10723,10725,10727,10729,10731,10733,10735,10738],{"class":219,"line":220},[217,10722,10615],{"class":223},[217,10724,10674],{"class":227},[217,10726,10677],{"class":227},[217,10728,10680],{"class":323},[217,10730,10683],{"class":227},[217,10732,10686],{"class":323},[217,10734,558],{"class":323},[217,10736,10737],{"class":227}," \u002Fdev\u002Fnull",[217,10739,10689],{"class":319},[28,10741,10742,10747,10752],{},[31,10743,10744,10746],{},[55,10745,10696],{}," 將標準輸出導向 output.log",[31,10748,10749,10751],{},[55,10750,10702],{}," 將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[31,10753,10754,10757],{},[55,10755,10756],{},"\u003C \u002Fdev\u002Fnull"," 讓標準輸入 (stdin) 來自空設備，避免 nohup 顯示 ignoring input",[63,10759,3853],{"id":3853},[15,10761,10762],{},"掌握nohup指令對Linux使用者來說是非常有用的，特別是在需要長時間運行的任務中。利用這個簡單但強大的工具，您可以讓程序在后台無受干擾地執行，從而提高工作效率。",[15,10764,10765,10766,10768],{},"透過本文介紹的範例和技巧，相信您已經能夠自如地使用 ",[55,10767,10615],{}," 指令來管理您的Linux系統上的背景任務了！",[1302,10770,10771],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":213,"searchDepth":387,"depth":387,"links":10773},[10774,10776,10777,10778,10779],{"id":10611,"depth":387,"text":10775},"什麼是 nohup？",{"id":10623,"depth":387,"text":10623},{"id":10652,"depth":387,"text":10652},{"id":10706,"depth":387,"text":10707},{"id":3853,"depth":387,"text":3853},"dev_ops","\u002Fimages\u002Farticles\u002F2025-02-05-linux-nohup\u002Fcover.png",{},"\u002Farticles\u002F2025-02-05-linux-nohup","2025-02-05 14:30:00",{"title":10606,"description":213},"articles\u002F2025-02-05-linux-nohup","在Linux環境下進行長時間運行的任務時，我們常常希望即使用戶登出終端機或連線中斷，任務也能繼續執行。nohup指令正是為此而生！本文將介紹如何使用nohup來執行背景任務，並重定向其輸出，確保您的程序在離線後仍能順利運行。",[10780,1508],"CwukBZ_XTh1QBVKDTwDEghU7F3HeG06Wv0jF4kxOzVI",{"id":10791,"title":10792,"body":10793,"category":2208,"description":10797,"extension":1324,"image":11471,"meta":11472,"navigation":895,"path":11473,"pubDate":11474,"seo":11475,"status":895,"stem":11476,"summary":11477,"tags":11478,"__hash__":11479},"content\u002Farticles\u002F2025-01-24-mac-os-app.md","MacOS：2025 我推的 Mac 好用 App",{"type":8,"value":10794,"toc":11411},[10795,10798,10800,10805,10809,10812,10819,10823,10826,10832,10836,10839,10845,10849,10852,10858,10862,10865,10871,10875,10878,10884,10888,10891,10897,10901,10904,10910,10914,10917,10923,10927,10930,10936,10940,10943,10949,10953,10956,10962,10965,10971,10975,10978,10984,10988,10991,10997,11001,11004,11010,11013,11019,11023,11026,11032,11035,11040,11044,11047,11053,11057,11062,11066,11069,11075,11078,11083,11087,11090,11096,11099,11104,11107,11110,11116,11120,11123,11129,11133,11136,11142,11146,11149,11155,11159,11162,11168,11172,11175,11181,11185,11188,11194,11198,11201,11207,11211,11214,11220,11224,11227,11233,11240,11244,11247,11253,11256,11261,11265,11268,11274,11277,11280,11286,11290,11293,11299,11303,11306,11312,11316,11319,11325,11329,11334,11337,11350,11356,11360,11363,11369,11373,11376,11383,11387,11390,11393,11399,11402,11405],[15,10796,10797],{},"農曆年假期將近，想要重新安裝我使用 MacOS ，在這邊整理一下目前自已常用的 Mac App。",[63,10799,1336],{"id":1336},[15,10801,10802],{},[930,10803],{"alt":1336,"src":10804},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fdev-tool.png",[1103,10806,10808],{"id":10807},"vscode","VSCode",[15,10810,10811],{},"一款輕量級但功能強大的源代碼編輯器，支援多種編程語言，並具有豐富的擴展生態系統。",[15,10813,10814,10815],{},"官網：",[19,10816,10817],{"href":10817,"rel":10818},"https:\u002F\u002Fcode.visualstudio.com\u002F",[291],[1103,10820,10822],{"id":10821},"iterm2","Iterm2",[15,10824,10825],{},"一款功能強大的終端模擬器，提供分屏、標籤頁、熱鍵等多種功能，適合開發者使用。",[15,10827,10814,10828],{},[19,10829,10830],{"href":10830,"rel":10831},"https:\u002F\u002Fiterm2.com\u002F",[291],[1103,10833,10835],{"id":10834},"utm","UTM",[15,10837,10838],{},"一款虛擬機應用程式，允許用戶在 macOS 上運行其他操作系統，如 Windows 和 Linux。",[15,10840,10814,10841],{},[19,10842,10843],{"href":10843,"rel":10844},"https:\u002F\u002Fmac.getutm.app\u002F",[291],[1103,10846,10848],{"id":10847},"postman","Postman",[15,10850,10851],{},"API 開發和測試工具，方便發送 HTTP 請求、檢視回應。",[15,10853,10814,10854],{},[19,10855,10856],{"href":10856,"rel":10857},"https:\u002F\u002Fwww.postman.com\u002F",[291],[1103,10859,10861],{"id":10860},"github-desktop","GitHub Desktop",[15,10863,10864],{},"GitHub 官方推出的桌面應用，提供圖形化界面，方便用戶管理 GitHub 上的代碼庫。",[15,10866,10814,10867],{},[19,10868,10869],{"href":10869,"rel":10870},"https:\u002F\u002Fgithub.com\u002Fapps\u002Fdesktop",[291],[1103,10872,10874],{"id":10873},"textmate","TextMate",[15,10876,10877],{},"一款功能強大的文本編輯器，支援多種編程語言，具有語法高亮、代碼折疊等功能。",[15,10879,10814,10880],{},[19,10881,10882],{"href":10882,"rel":10883},"https:\u002F\u002Fmacromates.com\u002F",[291],[1103,10885,10887],{"id":10886},"docker","Docker",[15,10889,10890],{},"一個開源的容器化平台，允許開發者打包應用及其依賴，實現跨平台運行。",[15,10892,10814,10893],{},[19,10894,10895],{"href":10895,"rel":10896},"https:\u002F\u002Fwww.docker.com\u002F",[291],[1103,10898,10900],{"id":10899},"orbstack","Orbstack",[15,10902,10903],{},"一款輕量級的虛擬化工具，專為 macOS 設計，簡化容器和虛擬機的管理。",[15,10905,10814,10906],{},[19,10907,10908],{"href":10908,"rel":10909},"https:\u002F\u002Forbstack.dev\u002F",[291],[1103,10911,10913],{"id":10912},"devtoys","DevToys",[15,10915,10916],{},"提供許多開發者常用的小工具，例如 JSON 格式化、編碼轉換等",[15,10918,10814,10919],{},[19,10920,10921],{"href":10921,"rel":10922},"https:\u002F\u002Fdevtoys.app\u002F",[291],[1103,10924,10926],{"id":10925},"dbeaver","DBeaver",[15,10928,10929],{},"通用資料庫管理工具，支援多種資料庫系統，包含 MySQL、SQLite、PostgreSQL、MongoDB 等。",[15,10931,10814,10932],{},[19,10933,10934],{"href":10934,"rel":10935},"https:\u002F\u002Fdbeaver.io\u002F",[291],[1103,10937,10939],{"id":10938},"pgadmin4","PgAdmin4",[15,10941,10942],{},"PostgreSQL 資料庫的管理工具。",[15,10944,10814,10945],{},[19,10946,10947],{"href":10947,"rel":10948},"https:\u002F\u002Fwww.pgadmin.org\u002F",[291],[1103,10950,10952],{"id":10951},"frame0","Frame0",[15,10954,10955],{},"可以快速建置手繪風格 UI Prototype 的工具。",[15,10957,10814,10958],{},[19,10959,10960],{"href":10960,"rel":10961},"https:\u002F\u002Fframe0.app",[291],[63,10963,10964],{"id":10964},"網路工具",[15,10966,10967],{},[930,10968],{"alt":10969,"src":10970},"瀏覽器","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fbrowser.png",[1103,10972,10974],{"id":10973},"arc-browser","Arc Browser",[15,10976,10977],{},"rc 瀏覽器由 The Browser Company 開發，旨在重新定義網頁瀏覽體驗。它基於 Chromium 引擎，並使用 Swift 編寫，支援 Chrome 擴充功能，預設搜尋引擎為 Google。",[15,10979,10814,10980],{},[19,10981,10982],{"href":10982,"rel":10983},"https:\u002F\u002Farc.net\u002F",[291],[1103,10985,10987],{"id":10986},"firefox","Firefox",[15,10989,10990],{},"Mozilla Firefox（簡稱 Firefox）是一款由 Mozilla 基金會及其子公司 Mozilla 公司開發的自由且開源的網頁瀏覽器。自 2004 年 11 月 9 日首次發布以來，Firefox 一直致力於提供快速、安全且注重隱私的瀏覽體驗",[15,10992,10814,10993],{},[19,10994,10995],{"href":10995,"rel":10996},"https:\u002F\u002Fwww.mozilla.org\u002Fzh-TW\u002Ffirefox\u002Fnew\u002F",[291],[1103,10998,11000],{"id":10999},"neat-download-manager","Neat Download Manager",[15,11002,11003],{},"Neat Download Manager 是一款免費且輕量級的下載管理器，適用於 Windows 和 macOS 平台。\n該軟體支援多執行緒下載，能有效提升下載速度，並提供續傳、暫停等功能，方便管理下載任務。",[15,11005,10814,11006],{},[19,11007,11008],{"href":11008,"rel":11009},"https:\u002F\u002Fwww.neatdownloadmanager.com\u002Findex.php\u002Fen\u002F",[291],[63,11011,11012],{"id":11012},"筆記軟體",[15,11014,11015],{},[930,11016],{"alt":11017,"src":11018},"筆記","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FNotebook.png",[1103,11020,11022],{"id":11021},"obsidian","Obsidian",[15,11024,11025],{},"Obsidian 是一款免費且開源的筆記軟體，支援 Markdown 語法，所有筆記以 .md 檔案形式儲存在指定的資料夾中，方便使用者將檔案匯入其他軟體。",[15,11027,10814,11028],{},[19,11029,11030],{"href":11030,"rel":11031},"https:\u002F\u002Fobsidian.md\u002F",[291],[63,11033,11034],{"id":11034},"媒體播放器",[15,11036,11037],{},[930,11038],{"alt":11034,"src":11039},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fmedia-player.png",[1103,11041,11043],{"id":11042},"iina","IINA",[15,11045,11046],{},"IINA 是一款專為 macOS 設計的免費開源多媒體播放器，基於 mpv 引擎，使用 Swift 編寫，旨在提供現代化且直覺的使用體驗。",[15,11048,10814,11049],{},[19,11050,11051],{"href":11051,"rel":11052},"https:\u002F\u002Fiina.io\u002F",[291],[63,11054,11056],{"id":11055},"壓縮解壓","壓縮\u002F解壓",[15,11058,11059],{},[930,11060],{"alt":11056,"src":11061},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fzip.png",[1103,11063,11065],{"id":11064},"keka","Keka",[15,11067,11068],{},"Keka 是一款專為 macOS 設計的免費開源壓縮與解壓縮軟體，支援多種壓縮格式，包括 7Z、ZIP、TAR、GZIP、BZIP2、XZ、LZIP、DMG、ISO、BROTLI、ZSTD、LRZIP、WIM 等。",[15,11070,10814,11071],{},[19,11072,11073],{"href":11073,"rel":11074},"https:\u002F\u002Fwww.keka.io\u002F",[291],[63,11076,11077],{"id":11077},"密碼管理",[15,11079,11080],{},[930,11081],{"alt":11077,"src":11082},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpassword.png",[1103,11084,11086],{"id":11085},"keepassxc","KeePassXC",[15,11088,11089],{},"KeePassXC 是一款免費且開源的密碼管理器，旨在安全地存儲和管理您的敏感資訊。它基於 KeePassX，並使用 Qt5 庫構建，支援 Windows、macOS 和 Linux 等多個平台。",[15,11091,10814,11092],{},[19,11093,11094],{"href":11094,"rel":11095},"https:\u002F\u002Fkeepassxc.org\u002F",[291],[63,11097,11098],{"id":11098},"系統管理",[15,11100,11101],{},[930,11102],{"alt":11098,"src":11103},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fsystem.png",[1103,11105,4856],{"id":11106},"appcleaner",[15,11108,11109],{},"AppCleaner 是一款免費且開源的 macOS 應用程式卸載工具，旨在徹底移除應用程式及其相關檔案，避免遺留不必要的設定或暫存檔案。",[15,11111,10814,11112],{},[19,11113,11114],{"href":11114,"rel":11115},"https:\u002F\u002Ffreemacsoft.net\u002Fappcleaner\u002F",[291],[1103,11117,11119],{"id":11118},"stats","Stats",[15,11121,11122],{},"Stats 是一個免費的 macOS 應用程式，可以顯示系統資源使用情況，包括 CPU、記憶體和磁盤空間。它也提供了一些有用的工具來管理這些資源。",[15,11124,10814,11125],{},[19,11126,11127],{"href":11127,"rel":11128},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats",[291],[1103,11130,11132],{"id":11131},"raycast","Raycast",[15,11134,11135],{},"Raycast 是一個 macOS 的應用程式，可以幫助你快速找到和操作文件和資料夾。它還提供了許多其他有用的功能，如搜索、排序和分類。",[15,11137,10814,11138],{},[19,11139,11140],{"href":11140,"rel":11141},"https:\u002F\u002Fraycast.app\u002F",[291],[1103,11143,11145],{"id":11144},"aidente","AIDente",[15,11147,11148],{},"調整 MacBook 電池充電上限的工具，以延長電池壽命。",[15,11150,10814,11151],{},[19,11152,11153],{"href":11153,"rel":11154},"https:\u002F\u002Fapphousekitchen.com",[291],[1103,11156,11158],{"id":11157},"shotter","Shotter",[15,11160,11161],{},"功能強大的螢幕截圖工具，支援滾動截圖、圖片編輯等",[15,11163,10814,11164],{},[19,11165,11166],{"href":11166,"rel":11167},"https:\u002F\u002Fshottr.cc\u002F",[291],[1103,11169,11171],{"id":11170},"xnip","Xnip",[15,11173,11174],{},"另一款好用的截圖工具，提供多種截圖模式和編輯功能。",[15,11176,10814,11177],{},[19,11178,11179],{"href":11179,"rel":11180},"https:\u002F\u002Fxnipapp.com\u002F",[291],[1103,11182,11184],{"id":11183},"mos","Mos",[15,11186,11187],{},"平滑滑鼠滾動的工具，提升使用體驗。",[15,11189,10814,11190],{},[19,11191,11192],{"href":11192,"rel":11193},"https:\u002F\u002Fmos.caldis.me",[291],[1103,11195,11197],{"id":11196},"prettyclean","PrettyClean",[15,11199,11200],{},"清理系統垃圾檔案的工具",[15,11202,10814,11203],{},[19,11204,11205],{"href":11205,"rel":11206},"https:\u002F\u002Fwww.prettyclean.cc\u002Fen",[291],[1103,11208,11210],{"id":11209},"betterdisplay","BetterDisplay",[15,11212,11213],{},"調整螢幕解析度、亮度、對比度等設定的工具",[15,11215,10814,11216],{},[19,11217,11218],{"href":11218,"rel":11219},"https:\u002F\u002Fgithub.com\u002Fwaydabber\u002FBetterDisplay",[291],[1103,11221,11223],{"id":11222},"ntfstool","NTFSTool",[15,11225,11226],{},"在 macOS 上讀寫 NTFS 格式硬碟的工具",[15,11228,10814,11229],{},[19,11230,11231],{"href":11231,"rel":11232},"https:\u002F\u002Fntfstool.com",[291],[15,11234,11235,11236],{},"GitHub：",[19,11237,11238],{"href":11238,"rel":11239},"https:\u002F\u002Fgithub.com\u002Fntfstool\u002Fntfstool",[291],[1103,11241,11243],{"id":11242},"landrop","LANDrop",[15,11245,11246],{},"在區域網路內傳輸檔案的工具，支援多種平台，包含 macOS、Windows、 Linux、Android 和 iOS。",[15,11248,10814,11249],{},[19,11250,11251],{"href":11251,"rel":11252},"https:\u002F\u002Flandrop.app",[291],[63,11254,11255],{"id":11255},"圖像處理",[15,11257,11258],{},[930,11259],{"alt":11255,"src":11260},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpicture.png",[1103,11262,11264],{"id":11263},"inkscape","Inkscape",[15,11266,11267],{},"開源的向量圖形編輯器，類似 Adobe Illustrator。",[15,11269,10814,11270],{},[19,11271,11272],{"href":11272,"rel":11273},"https:\u002F\u002Finkscape.org\u002F",[291],[1103,11275,11276],{"id":11276},"krita",[15,11278,11279],{},"開源的繪圖軟體，適合數位繪畫和插圖創作，支援 PNG、JPEG 和 TIFF 等格式。",[15,11281,10814,11282],{},[19,11283,11284],{"href":11284,"rel":11285},"https:\u002F\u002Fkrita.org\u002Fzh-tw\u002F",[291],[1103,11287,11289],{"id":11288},"photoscape-x","Photoscape X",[15,11291,11292],{},"免費的圖片編輯軟體，提供多種編輯工具和特效。",[15,11294,10814,11295],{},[19,11296,11297],{"href":11297,"rel":11298},"http:\u002F\u002Fx.photoscape.org",[291],[1103,11300,11302],{"id":11301},"picture-view","Picture View",[15,11304,11305],{},"Picture View - 是一款輕巧快速的 macOS 圖片瀏覽應用程式。體積小巧，方便快速的檢視圖片，不產生緩存，適合作為預設看圖應用。多種看圖模式，操作方便快捷，支援查看EXIF訊息，支援防止系統休眠",[15,11307,10814,11308],{},[19,11309,11310],{"href":11310,"rel":11311},"https:\u002F\u002Fwl879.github.io\u002Fapps\u002Fpicview\u002Findex.html",[291],[1103,11313,11315],{"id":11314},"itsycal","Itsycal",[15,11317,11318],{},"在選單列顯示小巧的日曆",[15,11320,10814,11321],{},[19,11322,11323],{"href":11323,"rel":11324},"https:\u002F\u002Fwww.mowglii.com\u002Fitsycal\u002F",[291],[63,11326,11328],{"id":11327},"ai工具","AI工具",[15,11330,11331],{},[930,11332],{"alt":11328,"src":11333},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FAI.png",[1103,11335,11336],{"id":11336},"ollama",[15,11338,11339,11340,100,11343,100,11346,11349],{},"在本地運行大型語言模型的工具，常見的開源模型如 ",[55,11341,11342],{},"LLama3",[55,11344,11345],{},"Phi4",[55,11347,11348],{},"gemma2","等。",[15,11351,10814,11352],{},[19,11353,11354],{"href":11354,"rel":11355},"https:\u002F\u002Follama.ai\u002F",[291],[1103,11357,11359],{"id":11358},"chatbox-ai","Chatbox AI",[15,11361,11362],{},"Chatbox 是一款免費且開源的跨平台 AI 客戶端應用和智能助手，支援多種先進的 AI 模型和 API，旨在提升用戶的工作與學習效率。",[15,11364,10814,11365],{},[19,11366,11367],{"href":11367,"rel":11368},"https:\u002F\u002Fchatboxai.app\u002Fzh-TW",[291],[1103,11370,11372],{"id":11371},"open-webui","Open WebUI",[15,11374,11375],{},"Open WebUI 是一款免費且開源的自託管 Web 使用者介面，旨在為大型語言模型（LLM）提供直觀且功能豐富的操作平台",[15,11377,11378,11379],{},"網址：",[19,11380,11381],{"href":11381,"rel":11382},"https:\u002F\u002Fopenwebui.com\u002F",[291],[1103,11384,11386],{"id":11385},"pinokio","Pinokio",[15,11388,11389],{},"Pinokio 是一款免費且開源的 AI 應用管理工具，旨在簡化各種 AI 應用和模型的安裝與管理過程。",[15,11391,11392],{},"透過 Pinokio，用戶無需進行繁瑣的環境配置或使用終端命令，即可一鍵安裝和運行多種 AI 工具，如大型語言模型（LLM）、AI 繪畫、AI 語音、AI 視頻以及 AI 音樂等。",[15,11394,11378,11395],{},[19,11396,11397],{"href":11397,"rel":11398},"https:\u002F\u002Fpinokio.computer\u002F",[291],[1103,11400,6908],{"id":11401},"upscayl",[15,11403,11404],{},"使用 AI 技術將圖像轉換為更清晰的版本，並添加更多的细節。Upscayl 是一個非常有用的工具，特別適合需要高質量圖像的人像。",[15,11406,10814,11407],{},[19,11408,11409],{"href":11409,"rel":11410},"https:\u002F\u002Fupscayl.org\u002F",[291],{"title":213,"searchDepth":387,"depth":387,"links":11412},[11413,11427,11432,11435,11438,11441,11444,11457,11464],{"id":1336,"depth":387,"text":1336,"children":11414},[11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426],{"id":10807,"depth":410,"text":10808},{"id":10821,"depth":410,"text":10822},{"id":10834,"depth":410,"text":10835},{"id":10847,"depth":410,"text":10848},{"id":10860,"depth":410,"text":10861},{"id":10873,"depth":410,"text":10874},{"id":10886,"depth":410,"text":10887},{"id":10899,"depth":410,"text":10900},{"id":10912,"depth":410,"text":10913},{"id":10925,"depth":410,"text":10926},{"id":10938,"depth":410,"text":10939},{"id":10951,"depth":410,"text":10952},{"id":10964,"depth":387,"text":10964,"children":11428},[11429,11430,11431],{"id":10973,"depth":410,"text":10974},{"id":10986,"depth":410,"text":10987},{"id":10999,"depth":410,"text":11000},{"id":11012,"depth":387,"text":11012,"children":11433},[11434],{"id":11021,"depth":410,"text":11022},{"id":11034,"depth":387,"text":11034,"children":11436},[11437],{"id":11042,"depth":410,"text":11043},{"id":11055,"depth":387,"text":11056,"children":11439},[11440],{"id":11064,"depth":410,"text":11065},{"id":11077,"depth":387,"text":11077,"children":11442},[11443],{"id":11085,"depth":410,"text":11086},{"id":11098,"depth":387,"text":11098,"children":11445},[11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456],{"id":11106,"depth":410,"text":4856},{"id":11118,"depth":410,"text":11119},{"id":11131,"depth":410,"text":11132},{"id":11144,"depth":410,"text":11145},{"id":11157,"depth":410,"text":11158},{"id":11170,"depth":410,"text":11171},{"id":11183,"depth":410,"text":11184},{"id":11196,"depth":410,"text":11197},{"id":11209,"depth":410,"text":11210},{"id":11222,"depth":410,"text":11223},{"id":11242,"depth":410,"text":11243},{"id":11255,"depth":387,"text":11255,"children":11458},[11459,11460,11461,11462,11463],{"id":11263,"depth":410,"text":11264},{"id":11276,"depth":410,"text":11276},{"id":11288,"depth":410,"text":11289},{"id":11301,"depth":410,"text":11302},{"id":11314,"depth":410,"text":11315},{"id":11327,"depth":387,"text":11328,"children":11465},[11466,11467,11468,11469,11470],{"id":11336,"depth":410,"text":11336},{"id":11358,"depth":410,"text":11359},{"id":11371,"depth":410,"text":11372},{"id":11385,"depth":410,"text":11386},{"id":11401,"depth":410,"text":6908},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fcover.png",{},"\u002Farticles\u002F2025-01-24-mac-os-app","2025-01-24 18:30:00",{"title":10792,"description":10797},"articles\u002F2025-01-24-mac-os-app","整理目前自已常用 Mac App，包含開發工具、網路工具、筆記軟體、媒體播放器、壓縮\u002F解壓、密碼管理、系統管理、圖像處理及AI工具",[5263,2208],"N4MPdGJ1ZPhYGjQBN5k3ooU7PUeIDvfSyYFtfWfW1dY",{"id":11481,"title":11482,"body":11483,"category":11793,"description":213,"extension":1324,"image":11794,"meta":11795,"navigation":895,"path":11796,"pubDate":11797,"seo":11798,"status":895,"stem":11799,"summary":11800,"tags":11801,"__hash__":11803},"content\u002Farticles\u002F2025-01-20-postgresql-materialzed-view.md","PostgreSQL 的高效查詢策略：利用 Materialized View 達成更快的回應速度",{"type":8,"value":11484,"toc":11779},[11485,11489,11499,11503,11506,11509,11535,11538,11598,11602,11616,11620,11623,11626,11646,11650,11657,11686,11689,11692,11713,11717,11724,11733,11737,11740,11771,11773,11776],[63,11486,11488],{"id":11487},"postgresql-view-檢視表-和-materialized-view-實體化檢視表","PostgreSQL VIEW (檢視表) 和 Materialized View (實體化檢視表)",[15,11490,11491,11492,6932,11495,11498],{},"PostgreSQL 提供了 ",[55,11493,11494],{},"VIEW",[55,11496,11497],{},"MATERIALIZED VIEW"," 兩種檢示表，分別用於查詢和儲存結果。",[1103,11500,11502],{"id":11501},"view-檢視表","VIEW (檢視表)",[15,11504,11505],{},"是一種虛擬表，它會根據查詢語句來生成資料。當查詢時，PostgreSQL 會自動計算並返回結果集。",[15,11507,11508],{},"其優點如下：",[28,11510,11511,11517,11523,11529],{},[31,11512,11513,11516],{},[47,11514,11515],{},"簡化查詢","：將複雜查詢存為檢示表，可以簡化後續的查詢。",[31,11518,11519,11522],{},[47,11520,11521],{},"提高安全性","：檢視表可以避免直接對數據庫進行操作，提高了安全性，並可以限制用戶對數據資料的查詢權限。",[31,11524,11525,11528],{},[47,11526,11527],{},"可重用性","：檢視表可以被多次使用，而不需要重新計算。",[31,11530,11531,11534],{},[47,11532,11533],{},"節省空間","：不保存數據，節省空間。",[1103,11536,11537],{"id":11537},"範例",[208,11539,11543],{"className":11540,"code":11541,"language":11542,"meta":213,"style":213},"language-sql shiki shiki-themes github-light github-dark github-dark","CREATE  VIEW my_view AS\nSELECT column1, column2, COUNT(*) AS total_count\nFROM my_table\nGROUP BY column1, column2;\n","sql",[55,11544,11545,11559,11582,11590],{"__ignoreMap":213},[217,11546,11547,11550,11553,11556],{"class":219,"line":220},[217,11548,11549],{"class":323},"CREATE",[217,11551,11552],{"class":323},"  VIEW",[217,11554,11555],{"class":223}," my_view",[217,11557,11558],{"class":323}," AS\n",[217,11560,11561,11564,11567,11570,11572,11574,11576,11579],{"class":219,"line":387},[217,11562,11563],{"class":323},"SELECT",[217,11565,11566],{"class":319}," column1, column2, ",[217,11568,11569],{"class":237},"COUNT",[217,11571,2473],{"class":319},[217,11573,8756],{"class":323},[217,11575,9049],{"class":319},[217,11577,11578],{"class":323},"AS",[217,11580,11581],{"class":319}," total_count\n",[217,11583,11584,11587],{"class":219,"line":410},[217,11585,11586],{"class":323},"FROM",[217,11588,11589],{"class":319}," my_table\n",[217,11591,11592,11595],{"class":219,"line":424},[217,11593,11594],{"class":323},"GROUP BY",[217,11596,11597],{"class":319}," column1, column2;\n",[1103,11599,11601],{"id":11600},"view-的缺點","VIEW 的缺點",[28,11603,11604,11610],{},[31,11605,11606,11609],{},[47,11607,11608],{},"性能問題","：太複雜的檢示表查詢可能會影響性能。",[31,11611,11612,11615],{},[47,11613,11614],{},"無法建立索引","：檢視表本身不能直接建立索引，需要對原始數據進行索引。",[63,11617,11619],{"id":11618},"materialized-view-實體化檢視表","Materialized View (實體化檢視表)",[15,11621,11622],{},"Materialized View 是一種檢視表，它會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[15,11624,11625],{},"其特點如下：",[28,11627,11628,11634,11640],{},[31,11629,11630,11633],{},[47,11631,11632],{},"資料存儲","：Materialized View 會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[31,11635,11636,11639],{},[47,11637,11638],{},"性能優勢","：因為資料已經被計算好，所以查詢速度會更快，特別是複雜的查詢。",[31,11641,11642,11645],{},[47,11643,11644],{},"索引支持","：Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。",[1103,11647,11649],{"id":11648},"建立-materialized-view","建立 Materialized View",[15,11651,11652,11653,11656],{},"在 PostgreSQL 中，可以使用 ",[55,11654,11655],{},"CREATE MATERIALIZED VIEW"," 语句來建立 Materialized View。以下是一個簡單的示例：",[208,11658,11660],{"className":11540,"code":11659,"language":11542,"meta":213,"style":213},"CREATE MATERIALIZED VIEW my_materialized_view AS\nSELECT column1, column2, ...\nFROM my_table;\n",[55,11661,11662,11672,11679],{"__ignoreMap":213},[217,11663,11664,11666,11669],{"class":219,"line":220},[217,11665,11549],{"class":323},[217,11667,11668],{"class":319}," MATERIALIZED VIEW my_materialized_view ",[217,11670,11671],{"class":323},"AS\n",[217,11673,11674,11676],{"class":219,"line":387},[217,11675,11563],{"class":323},[217,11677,11678],{"class":319}," column1, column2, ...\n",[217,11680,11681,11683],{"class":219,"line":410},[217,11682,11586],{"class":323},[217,11684,11685],{"class":319}," my_table;\n",[1103,11687,11688],{"id":11688},"建立索引",[15,11690,11691],{},"Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[208,11693,11695],{"className":11540,"code":11694,"language":11542,"meta":213,"style":213},"CREATE INDEX idx_my_materialized_view_column1 ON my_materialized_view(column1);\n",[55,11696,11697],{"__ignoreMap":213},[217,11698,11699,11701,11704,11707,11710],{"class":219,"line":220},[217,11700,11549],{"class":323},[217,11702,11703],{"class":323}," INDEX",[217,11705,11706],{"class":223}," idx_my_materialized_view_column1",[217,11708,11709],{"class":323}," ON",[217,11711,11712],{"class":319}," my_materialized_view(column1);\n",[1103,11714,11716],{"id":11715},"更新-materialized-view","更新 Materialized View",[15,11718,11719,11720,11723],{},"Materialized View 會自動更新，當數據庫中的表發生更改時。你可以使用 ",[55,11721,11722],{},"REFRESH MATERIALIZED VIEW"," 语句來刷新 Materialized View：",[208,11725,11727],{"className":11540,"code":11726,"language":11542,"meta":213,"style":213},"REFRESH MATERIALIZED VIEW my_materialized_view;\n",[55,11728,11729],{"__ignoreMap":213},[217,11730,11731],{"class":219,"line":220},[217,11732,11726],{"class":319},[1103,11734,11736],{"id":11735},"使用-materialized-view","使用 Materialized View",[15,11738,11739],{},"Materialized View 可以像普通表一樣使用，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[208,11741,11743],{"className":11540,"code":11742,"language":11542,"meta":213,"style":213},"SELECT * FROM my_materialized_view WHERE column1 = 'value';\n",[55,11744,11745],{"__ignoreMap":213},[217,11746,11747,11749,11752,11755,11758,11761,11764,11766,11769],{"class":219,"line":220},[217,11748,11563],{"class":323},[217,11750,11751],{"class":323}," *",[217,11753,11754],{"class":323}," FROM",[217,11756,11757],{"class":319}," my_materialized_view ",[217,11759,11760],{"class":323},"WHERE",[217,11762,11763],{"class":319}," column1 ",[217,11765,854],{"class":323},[217,11767,11768],{"class":227}," 'value'",[217,11770,2712],{"class":319},[63,11772,3853],{"id":3853},[15,11774,11775],{},"Materialized View 是一個非常有用的工具，它可以在數據庫中提供快速的查詢結果。通過使用索引和定期刷新，Materialized View 可以提高查詢性能，使應用程序更加高效。",[1302,11777,11778],{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}",{"title":213,"searchDepth":387,"depth":387,"links":11780},[11781,11786,11792],{"id":11487,"depth":387,"text":11488,"children":11782},[11783,11784,11785],{"id":11501,"depth":410,"text":11502},{"id":11537,"depth":410,"text":11537},{"id":11600,"depth":410,"text":11601},{"id":11618,"depth":387,"text":11619,"children":11787},[11788,11789,11790,11791],{"id":11648,"depth":410,"text":11649},{"id":11688,"depth":410,"text":11688},{"id":11715,"depth":410,"text":11716},{"id":11735,"depth":410,"text":11736},{"id":3853,"depth":387,"text":3853},"database","\u002Fimages\u002Farticles\u002F2025-01-20-postgresql-materialized-view\u002Fcover.png",{},"\u002Farticles\u002F2025-01-20-postgresql-materialzed-view","2025-01-20 15:25:00",{"title":11482,"description":213},"articles\u002F2025-01-20-postgresql-materialzed-view","PostgreSQL Materialized View 是一種數據視圖，它會將查詢結果儲存到一個表中，以便在需要時快速訪問。",[11802],"Postgresql","OtEICcXMOXYLMC9l2mst1JtQEi3zUxzEx8O9Q062GcY",{"id":11805,"title":11806,"body":11807,"category":3985,"description":213,"extension":1324,"image":11847,"meta":11848,"navigation":895,"path":11849,"pubDate":11850,"seo":11851,"status":895,"stem":11852,"summary":11853,"tags":11854,"__hash__":11855},"content\u002Farticles\u002F2025-01-19-2025-new-theme.md","2025 新版型",{"type":8,"value":11808,"toc":11844},[11809,11811,11826,11835],[63,11810,3921],{"id":3921},[15,11812,11813,11814,11817,11818,11821,11822,11825],{},"年初時，我對自己的部落格進行了重新設計和結構化。這次重構依然採用了 ",[55,11815,11816],{},"Nuxt.js"," 和其 ",[55,11819,11820],{},"Nuxt\u002Fcontent"," 模組來管理文章內容，並利用 ",[55,11823,11824],{},"Tailwind CSS"," 進行樣式設定。",[15,11827,11828,11829,11831,11832,11834],{},"原本打算使用 ",[55,11830,11816],{}," V3 來完成此次更新，因為網站已經接近完成狀態。然而，在生成靜態頁面時遇到了一些問題，因此決定先以穩定的 ",[55,11833,11816],{}," V2 進行重構工作。",[15,11836,11837,11838,11840,11841,11843],{},"尽管如此，我仍將持續研究 ",[55,11839,11816],{}," V3 的相關功能，並期待將這些新特性引入到我的項目中。即使官方對 ",[55,11842,11816],{}," V2 還會提供安全更新，但許多令人興奮的新功能僅在 V3 中實現。",{"title":213,"searchDepth":387,"depth":387,"links":11845},[11846],{"id":3921,"depth":387,"text":3921},"\u002Fimages\u002Farticles\u002F2025-01-19-2025-new-theme\u002Fcover.png",{},"\u002Farticles\u002F2025-01-19-2025-new-theme","2025-01-19 22:48:30",{"title":11806,"description":213},"articles\u002F2025-01-19-2025-new-theme","替網站做了新版型，新版型回歸簡約風格",[3985],"MsdGgluY9CLV2K69xHavUg9vNq1FVnQLpldIMwcohqI",{"id":11857,"title":11858,"body":11859,"category":1322,"description":213,"extension":1324,"image":12244,"meta":12245,"navigation":895,"path":12246,"pubDate":12247,"seo":12248,"status":895,"stem":12249,"summary":12250,"tags":12251,"__hash__":12252},"content\u002Farticles\u002F2024-06-07-ollama.md","用 ollama 來玩免費開源語言模型",{"type":8,"value":11860,"toc":12229},[11861,11863,11880,11883,11900,11904,11907,11911,11929,11933,11948,11950,12046,12050,12053,12086,12089,12128,12132,12147,12159,12202,12206,12218,12226],[63,11862,2217],{"id":2217},[15,11864,11865,11866,11869,11870,11869,11873,11869,11876,11879],{},"Ollama 是一個支持 ",[55,11867,11868],{},"Llama 3"," 、 ",[55,11871,11872],{},"Mistral",[55,11874,11875],{},"Gemma",[55,11877,11878],{},"Phi 3"," 等大型語言模型的框架，適用於 macOS、Windows、Linux 和 Docker。",[63,11881,11882],{"id":11882},"下載",[15,11884,11885,11886,11891,11892,11891,11896,1772],{},"下載位址：\n| ",[19,11887,11890],{"href":11888,"rel":11889},"https:\u002F\u002Follama.com\u002Fdownload\u002Fmac",[291],"MAC"," | ",[19,11893,1508],{"href":11894,"rel":11895},"https:\u002F\u002Follama.com\u002Fdownload\u002Flinux",[291],[19,11897,5368],{"href":11898,"rel":11899},"https:\u002F\u002Follama.com\u002Fdownload\u002Fwindows",[291],[1103,11901,11903],{"id":11902},"windows-macos-安裝","Windows \u002F MacOS 安裝",[15,11905,11906],{},"依安裝精靈進行即可",[1103,11908,11910],{"id":11909},"linux-在透過-curl-安裝","Linux 在透過 curl 安裝",[208,11912,11914],{"className":210,"code":11913,"language":212,"meta":213,"style":213},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n",[55,11915,11916],{"__ignoreMap":213},[217,11917,11918,11920,11922,11925,11927],{"class":219,"line":220},[217,11919,1578],{"class":223},[217,11921,1581],{"class":237},[217,11923,11924],{"class":227}," https:\u002F\u002Follama.com\u002Finstall.sh",[217,11926,1772],{"class":323},[217,11928,1775],{"class":223},[1103,11930,11932],{"id":11931},"docker-安裝","Docker 安裝",[208,11934,11936],{"className":210,"code":11935,"language":212,"meta":213,"style":213},"docker pull ollama\u002Follama\n",[55,11937,11938],{"__ignoreMap":213},[217,11939,11940,11942,11945],{"class":219,"line":220},[217,11941,10886],{"class":223},[217,11943,11944],{"class":227}," pull",[217,11946,11947],{"class":227}," ollama\u002Follama\n",[63,11949,1794],{"id":1794},[2109,11951,11952,11972,11992,12008,12029],{},[31,11953,11954,11955,11957,11958],{},"運行 ",[55,11956,11868],{}," 模型",[208,11959,11961],{"className":210,"code":11960,"language":212,"meta":213,"style":213},"ollama run llama3\n",[55,11962,11963],{"__ignoreMap":213},[217,11964,11965,11967,11969],{"class":219,"line":220},[217,11966,11336],{"class":223},[217,11968,555],{"class":227},[217,11970,11971],{"class":227}," llama3\n",[31,11973,11974,11975,11986,11988],{},"查看所有支持的模型：",[208,11976,11978],{"className":210,"code":11977,"language":212,"meta":213,"style":213},"ollama list\n",[55,11979,11980],{"__ignoreMap":213},[217,11981,11982,11984],{"class":219,"line":220},[217,11983,11336],{"class":223},[217,11985,384],{"class":227},[9603,11987],{},[930,11989],{"alt":11990,"src":11991,"title":11990},"ollama list","\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Follama-list.png",[31,11993,11994,11995],{},"拉取模型",[208,11996,11998],{"className":210,"code":11997,"language":212,"meta":213,"style":213},"ollama pull llama3\n",[55,11999,12000],{"__ignoreMap":213},[217,12001,12002,12004,12006],{"class":219,"line":220},[217,12003,11336],{"class":223},[217,12005,11944],{"class":227},[217,12007,11971],{"class":227},[31,12009,12010,12011],{},"複製模型",[208,12012,12014],{"className":210,"code":12013,"language":212,"meta":213,"style":213},"ollama cp llama3 my-model\n",[55,12015,12016],{"__ignoreMap":213},[217,12017,12018,12020,12023,12026],{"class":219,"line":220},[217,12019,11336],{"class":223},[217,12021,12022],{"class":227}," cp",[217,12024,12025],{"class":227}," llama3",[217,12027,12028],{"class":227}," my-model\n",[31,12030,12031,12032],{},"刪除模型",[208,12033,12035],{"className":210,"code":12034,"language":212,"meta":213,"style":213},"ollama rm llama3\n",[55,12036,12037],{"__ignoreMap":213},[217,12038,12039,12041,12044],{"class":219,"line":220},[217,12040,11336],{"class":223},[217,12042,12043],{"class":227}," rm",[217,12045,11971],{"class":227},[63,12047,12049],{"id":12048},"利用-rest-api","利用 REST API",[1103,12051,12052],{"id":12052},"產生回應",[208,12054,12056],{"className":210,"code":12055,"language":212,"meta":213,"style":213},"curl http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate -d '{\n  \"model\": \"llama3\",\n  \"prompt\":\"Why is the sky blue?\"\n}'\n",[55,12057,12058,12071,12076,12081],{"__ignoreMap":213},[217,12059,12060,12062,12065,12068],{"class":219,"line":220},[217,12061,1578],{"class":223},[217,12063,12064],{"class":227}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate",[217,12066,12067],{"class":237}," -d",[217,12069,12070],{"class":227}," '{\n",[217,12072,12073],{"class":219,"line":387},[217,12074,12075],{"class":227},"  \"model\": \"llama3\",\n",[217,12077,12078],{"class":219,"line":410},[217,12079,12080],{"class":227},"  \"prompt\":\"Why is the sky blue?\"\n",[217,12082,12083],{"class":219,"line":424},[217,12084,12085],{"class":227},"}'\n",[1103,12087,12088],{"id":12088},"使用一個模型聊天",[208,12090,12092],{"className":210,"code":12091,"language":212,"meta":213,"style":213},"curl http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fchat -d '{\n  \"model\": \"llama3\",\n  \"messages\": [\n    { \"role\": \"user\", \"content\": \"why is the sky blue?\" }\n  ]\n}'\n",[55,12093,12094,12105,12109,12114,12119,12124],{"__ignoreMap":213},[217,12095,12096,12098,12101,12103],{"class":219,"line":220},[217,12097,1578],{"class":223},[217,12099,12100],{"class":227}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fchat",[217,12102,12067],{"class":237},[217,12104,12070],{"class":227},[217,12106,12107],{"class":219,"line":387},[217,12108,12075],{"class":227},[217,12110,12111],{"class":219,"line":410},[217,12112,12113],{"class":227},"  \"messages\": [\n",[217,12115,12116],{"class":219,"line":424},[217,12117,12118],{"class":227},"    { \"role\": \"user\", \"content\": \"why is the sky blue?\" }\n",[217,12120,12121],{"class":219,"line":441},[217,12122,12123],{"class":227},"  ]\n",[217,12125,12126],{"class":219,"line":908},[217,12127,12085],{"class":227},[63,12129,12131],{"id":12130},"open-webui-圖型化介面","Open WebUI 圖型化介面",[15,12133,12134,12135,187,12137,12139,12140,12143,12144,12146],{},"由於 ollama 是開源，所以有不少開源軟體，幫 ollama 製作圖型化介面。而目前站長推薦使用 ",[55,12136,11372],{},[55,12138,11372],{},"的操作介面和 ",[55,12141,12142],{},"chatGPT"," 很接近，是運行在 ",[55,12145,10886],{},"的環境下。",[15,12148,12149,12150,12152,12153,12155,12156,12158],{},"只要安裝好",[55,12151,10887],{},"的環境後和",[55,12154,11336],{},"的服務後，只要執行下列指令就可以開始玩",[55,12157,11336],{},"了",[208,12160,12162],{"className":210,"code":12161,"language":212,"meta":213,"style":213},"docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:\u002Fapp\u002Fbackend\u002Fdata --name open-webui --restart always ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[55,12163,12164],{"__ignoreMap":213},[217,12165,12166,12168,12170,12172,12175,12178,12181,12184,12187,12190,12193,12196,12199],{"class":219,"line":220},[217,12167,10886],{"class":223},[217,12169,555],{"class":227},[217,12171,12067],{"class":237},[217,12173,12174],{"class":237}," -p",[217,12176,12177],{"class":227}," 3000:8080",[217,12179,12180],{"class":237}," --add-host=host.docker.internal:host-gateway",[217,12182,12183],{"class":237}," -v",[217,12185,12186],{"class":227}," open-webui:\u002Fapp\u002Fbackend\u002Fdata",[217,12188,12189],{"class":237}," --name",[217,12191,12192],{"class":227}," open-webui",[217,12194,12195],{"class":237}," --restart",[217,12197,12198],{"class":227}," always",[217,12200,12201],{"class":227}," ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[63,12203,12205],{"id":12204},"使用-vscode-插件","使用 VScode 插件",[15,12207,12208,12209,12211,12212,12215,12216],{},"除了用 ",[55,12210,11372],{}," 之外，有在使用 ",[55,12213,12214],{},"VScode"," 編輯器，可以安裝下面插件，就可使用 ",[55,12217,11336],{},[15,12219,12220,12221],{},"插件網址： ",[19,12222,12225],{"href":12223,"rel":12224},"https:\u002F\u002Fwww.continue.dev\u002F",[291],"插件官網",[1302,12227,12228],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":387,"depth":387,"links":12230},[12231,12232,12237,12238,12242,12243],{"id":2217,"depth":387,"text":2217},{"id":11882,"depth":387,"text":11882,"children":12233},[12234,12235,12236],{"id":11902,"depth":410,"text":11903},{"id":11909,"depth":410,"text":11910},{"id":11931,"depth":410,"text":11932},{"id":1794,"depth":387,"text":1794},{"id":12048,"depth":387,"text":12049,"children":12239},[12240,12241],{"id":12052,"depth":410,"text":12052},{"id":12088,"depth":410,"text":12088},{"id":12130,"depth":387,"text":12131},{"id":12204,"depth":387,"text":12205},"\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Fcover.png",{},"\u002Farticles\u002F2024-06-07-ollama","2024-06-07 22:48:30",{"title":11858,"description":213},"articles\u002F2024-06-07-ollama","在 ChatGPT 問世後，大多數科技大廠都推出了自家的語言模型，而有不少開源模型出現。我們可以透過 OLLAMA 在自己的電腦中，建立私有的語言模型服務，並且能夠自由控制和定制模型的性能和功能。",[1333,2208],"msNB0mNO6nmpAdDzC7_7HVLJFs6WFG8kMP_fzndMH6A",{"id":12254,"title":12255,"body":12256,"category":3902,"description":213,"extension":1324,"image":13810,"meta":13811,"navigation":895,"path":13812,"pubDate":13813,"seo":13814,"status":895,"stem":13815,"summary":13816,"tags":13817,"__hash__":13818},"content\u002Farticles\u002F2023-10-04-php-carbon.md","【PHP】如何利用 nesbot\u002Fcarbon 處理日期和時間",{"type":8,"value":12257,"toc":13800},[12258,12260,12269,12284,12287,12344,12347,12355,12358,12462,12464,13286,13289,13338,13341,13797],[63,12259,2268],{"id":2268},[15,12261,6401,12262,12265,12266],{},[55,12263,12264],{},"composer"," 安裝 ",[55,12267,12268],{},"carbon",[208,12270,12272],{"className":210,"code":12271,"language":212,"meta":213,"style":213},"composer require nesbot\u002Fcarbon\n",[55,12273,12274],{"__ignoreMap":213},[217,12275,12276,12278,12281],{"class":219,"line":220},[217,12277,12264],{"class":223},[217,12279,12280],{"class":227}," require",[217,12282,12283],{"class":227}," nesbot\u002Fcarbon\n",[15,12285,12286],{},"簡易使用範例：",[208,12288,12290],{"className":2457,"code":12289,"language":2404,"meta":213,"style":213},"require 'vendor\u002Fautoload.php';\n\nuse Carbon\\Carbon;\n\nprintf(\"Now: %s\", Carbon::now());\n",[55,12291,12292,12302,12306,12316,12320],{"__ignoreMap":213},[217,12293,12294,12297,12300],{"class":219,"line":220},[217,12295,12296],{"class":323},"require",[217,12298,12299],{"class":227}," 'vendor\u002Fautoload.php'",[217,12301,2712],{"class":319},[217,12303,12304],{"class":219,"line":387},[217,12305,896],{"emptyLinePlaceholder":895},[217,12307,12308,12311,12314],{"class":219,"line":410},[217,12309,12310],{"class":323},"use",[217,12312,12313],{"class":237}," Carbon\\Carbon",[217,12315,2712],{"class":319},[217,12317,12318],{"class":219,"line":424},[217,12319,896],{"emptyLinePlaceholder":895},[217,12321,12322,12325,12327,12330,12332,12335,12338,12341],{"class":219,"line":441},[217,12323,12324],{"class":237},"printf",[217,12326,2473],{"class":319},[217,12328,12329],{"class":227},"\"Now: %s\"",[217,12331,2551],{"class":319},[217,12333,12334],{"class":237},"Carbon",[217,12336,12337],{"class":323},"::",[217,12339,12340],{"class":223},"now",[217,12342,12343],{"class":319},"());\n",[63,12345,12346],{"id":12346},"日期格式化",[28,12348,12349],{},[31,12350,12351,12354],{},[55,12352,12353],{},"format($value)","：將日期時間進行格式化輸出，其中格式",[63,12356,12357],{"id":12357},"取得與調整時間",[28,12359,12360,12366,12372,12378,12384,12396,12407,12418,12429,12440,12451],{},[31,12361,12362,12365],{},[55,12363,12364],{},"now()","：獲得當前的日期與時間",[31,12367,12368,12371],{},[55,12369,12370],{},"today()","：獲得當天的日期",[31,12373,12374,12377],{},[55,12375,12376],{},"tomorrow()","：獲取明天的日期",[31,12379,12380,12383],{},[55,12381,12382],{},"yesterday()","：：獲取昨天的日期",[31,12385,12386,9829,12389,12392,12393],{},[55,12387,12388],{},"addYear($value)",[55,12390,12391],{},"subYear($value)","：將年份增加\u002F減少 ",[55,12394,12395],{},"$value",[31,12397,12398,9829,12401,12404,12405],{},[55,12399,12400],{},"addQuarter($value)",[55,12402,12403],{},"subQuarter($value)","：將季度增加\u002F減少 ",[55,12406,12395],{},[31,12408,12409,9829,12412,12415,12416],{},[55,12410,12411],{},"addMonth($value)",[55,12413,12414],{},"subMonth($value)","：將月份增加\u002F減少 ",[55,12417,12395],{},[31,12419,12420,9829,12423,12426,12427],{},[55,12421,12422],{},"addDay($value)",[55,12424,12425],{},"subDay($value)","：將天數增加\u002F減少 ",[55,12428,12395],{},[31,12430,12431,9829,12434,12437,12438],{},[55,12432,12433],{},"addHour($value)",[55,12435,12436],{},"subHour($value)","：將小時增加\u002F減少 ",[55,12439,12395],{},[31,12441,12442,9829,12445,12448,12449],{},[55,12443,12444],{},"addMinute($value)",[55,12446,12447],{},"subMinute($value)","：將分鐘增加\u002F減少 ",[55,12450,12395],{},[31,12452,12453,9829,12456,12459,12460],{},[55,12454,12455],{},"addSecond($value)",[55,12457,12458],{},"subSecond($value)","：將秒數增加\u002F減少 ",[55,12461,12395],{},[1103,12463,11537],{"id":11537},[208,12465,12467],{"className":2457,"code":12466,"language":2404,"meta":213,"style":213},"use Carbon\\Carbon;\n\n\u002F**\n * ：獲得當前的日期與時間\n *\u002F\necho Carbon::now();\n\n\u002F\u002F印出結果：2023-10-25 07:12:30\n\n\u002F**\n * 獲得當天的日期\n *\u002F\necho Carbon::today()->format(\"Y-m-d\");\n\n\u002F\u002F印出結果：2023-10-25\n\n\u002F**\n * 獲取明天的日期\n *\u002F\n\necho Carbon::tomorrow()->format(\"Y-m-d\");\n\n\u002F\u002F印出結果：2023-10-26\n\n\u002F**\n * 獲取昨天的日期\n *\u002F\n\necho Carbon::yesterday()->format(\"Y-m-d\");\n\n\u002F\u002F印出結果： 2023-10-24\n\n\u002F**\n * 將年份增加\u002F減少 `$value`\n *\u002F\n\necho Carbon::now()->addYear(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->subYear(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果： 2024-10-25 07:30:52 \u002F 2022-10-25 07:30:52\n\n\u002F**\n * 將季度增加\u002F減少 `$value`\n *\u002F\n\necho Carbon::now()->addQuarter(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->subQuarter(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果：2024-01-25 07:31:57 \u002F 2023-07-25 07:31:57\n\n\u002F**\n * 將月份增加\u002F減少 `$value`\n *\u002F\necho Carbon::now()->subMonth(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->addMonth(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果：2023-09-25 07:37:37 \u002F 2023-11-25 07:37:37\n\n\u002F**\n * 將天數增加\u002F減少 `$value`\n *\u002F\necho Carbon::now()->subDay(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->addDay(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果：2023-10-24 07:38:45 \u002F 2023-10-26 07:38:45\n\n\u002F**\n * 將小時增加\u002F減少 `$value`\n *\u002F\necho Carbon::now()->subHour(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->addHour(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果：2023-10-25 06:48:25 \u002F 2023-10-25 08:48:25\n\n\u002F**\n * 將秒數增加\u002F減少 `$value`\n *\u002F\necho Carbon::now()->subSecond(1)->format(\"Y-m-d H:i:s\");\necho \" \u002F \";\necho Carbon::now()->addSecond(1)->format(\"Y-m-d H:i:s\");\n\n\u002F\u002F印出結果：2023-10-25 07:49:58 \u002F 2023-10-25 07:50:00\n",[55,12468,12469,12477,12481,12486,12491,12496,12509,12513,12518,12522,12526,12531,12535,12561,12565,12570,12574,12578,12583,12587,12591,12614,12618,12623,12627,12631,12636,12640,12644,12667,12671,12676,12680,12684,12689,12693,12697,12731,12740,12773,12777,12782,12786,12790,12795,12799,12803,12836,12844,12877,12881,12886,12890,12894,12899,12903,12936,12944,12977,12981,12986,12990,12994,12999,13003,13036,13044,13077,13081,13086,13090,13094,13099,13103,13136,13144,13177,13181,13186,13190,13194,13199,13203,13236,13244,13277,13281],{"__ignoreMap":213},[217,12470,12471,12473,12475],{"class":219,"line":220},[217,12472,12310],{"class":323},[217,12474,12313],{"class":237},[217,12476,2712],{"class":319},[217,12478,12479],{"class":219,"line":387},[217,12480,896],{"emptyLinePlaceholder":895},[217,12482,12483],{"class":219,"line":410},[217,12484,12485],{"class":1521},"\u002F**\n",[217,12487,12488],{"class":219,"line":424},[217,12489,12490],{"class":1521}," * ：獲得當前的日期與時間\n",[217,12492,12493],{"class":219,"line":441},[217,12494,12495],{"class":1521}," *\u002F\n",[217,12497,12498,12500,12503,12505,12507],{"class":219,"line":908},[217,12499,2695],{"class":237},[217,12501,12502],{"class":237}," Carbon",[217,12504,12337],{"class":323},[217,12506,12340],{"class":223},[217,12508,2684],{"class":319},[217,12510,12511],{"class":219,"line":1560},[217,12512,896],{"emptyLinePlaceholder":895},[217,12514,12515],{"class":219,"line":1566},[217,12516,12517],{"class":1521},"\u002F\u002F印出結果：2023-10-25 07:12:30\n",[217,12519,12520],{"class":219,"line":1660},[217,12521,896],{"emptyLinePlaceholder":895},[217,12523,12524],{"class":219,"line":1666},[217,12525,12485],{"class":1521},[217,12527,12528],{"class":219,"line":1672},[217,12529,12530],{"class":1521}," * 獲得當天的日期\n",[217,12532,12533],{"class":219,"line":1678},[217,12534,12495],{"class":1521},[217,12536,12537,12539,12541,12543,12546,12549,12551,12554,12556,12559],{"class":219,"line":1684},[217,12538,2695],{"class":237},[217,12540,12502],{"class":237},[217,12542,12337],{"class":323},[217,12544,12545],{"class":223},"today",[217,12547,12548],{"class":319},"()",[217,12550,2540],{"class":323},[217,12552,12553],{"class":223},"format",[217,12555,2473],{"class":319},[217,12557,12558],{"class":227},"\"Y-m-d\"",[217,12560,2484],{"class":319},[217,12562,12563],{"class":219,"line":1689},[217,12564,896],{"emptyLinePlaceholder":895},[217,12566,12567],{"class":219,"line":2676},[217,12568,12569],{"class":1521},"\u002F\u002F印出結果：2023-10-25\n",[217,12571,12572],{"class":219,"line":2687},[217,12573,896],{"emptyLinePlaceholder":895},[217,12575,12576],{"class":219,"line":2692},[217,12577,12485],{"class":1521},[217,12579,12580],{"class":219,"line":2987},[217,12581,12582],{"class":1521}," * 獲取明天的日期\n",[217,12584,12585],{"class":219,"line":2993},[217,12586,12495],{"class":1521},[217,12588,12589],{"class":219,"line":2998},[217,12590,896],{"emptyLinePlaceholder":895},[217,12592,12593,12595,12597,12599,12602,12604,12606,12608,12610,12612],{"class":219,"line":3004},[217,12594,2695],{"class":237},[217,12596,12502],{"class":237},[217,12598,12337],{"class":323},[217,12600,12601],{"class":223},"tomorrow",[217,12603,12548],{"class":319},[217,12605,2540],{"class":323},[217,12607,12553],{"class":223},[217,12609,2473],{"class":319},[217,12611,12558],{"class":227},[217,12613,2484],{"class":319},[217,12615,12616],{"class":219,"line":6078},[217,12617,896],{"emptyLinePlaceholder":895},[217,12619,12620],{"class":219,"line":6089},[217,12621,12622],{"class":1521},"\u002F\u002F印出結果：2023-10-26\n",[217,12624,12625],{"class":219,"line":6100},[217,12626,896],{"emptyLinePlaceholder":895},[217,12628,12629],{"class":219,"line":6105},[217,12630,12485],{"class":1521},[217,12632,12633],{"class":219,"line":6111},[217,12634,12635],{"class":1521}," * 獲取昨天的日期\n",[217,12637,12638],{"class":219,"line":6121},[217,12639,12495],{"class":1521},[217,12641,12642],{"class":219,"line":6135},[217,12643,896],{"emptyLinePlaceholder":895},[217,12645,12646,12648,12650,12652,12655,12657,12659,12661,12663,12665],{"class":219,"line":6140},[217,12647,2695],{"class":237},[217,12649,12502],{"class":237},[217,12651,12337],{"class":323},[217,12653,12654],{"class":223},"yesterday",[217,12656,12548],{"class":319},[217,12658,2540],{"class":323},[217,12660,12553],{"class":223},[217,12662,2473],{"class":319},[217,12664,12558],{"class":227},[217,12666,2484],{"class":319},[217,12668,12669],{"class":219,"line":6146},[217,12670,896],{"emptyLinePlaceholder":895},[217,12672,12673],{"class":219,"line":6159},[217,12674,12675],{"class":1521},"\u002F\u002F印出結果： 2023-10-24\n",[217,12677,12678],{"class":219,"line":6170},[217,12679,896],{"emptyLinePlaceholder":895},[217,12681,12682],{"class":219,"line":6181},[217,12683,12485],{"class":1521},[217,12685,12686],{"class":219,"line":8099},[217,12687,12688],{"class":1521}," * 將年份增加\u002F減少 `$value`\n",[217,12690,12691],{"class":219,"line":8131},[217,12692,12495],{"class":1521},[217,12694,12695],{"class":219,"line":8142},[217,12696,896],{"emptyLinePlaceholder":895},[217,12698,12699,12701,12703,12705,12707,12709,12711,12714,12716,12718,12720,12722,12724,12726,12729],{"class":219,"line":8153},[217,12700,2695],{"class":237},[217,12702,12502],{"class":237},[217,12704,12337],{"class":323},[217,12706,12340],{"class":223},[217,12708,12548],{"class":319},[217,12710,2540],{"class":323},[217,12712,12713],{"class":223},"addYear",[217,12715,2473],{"class":319},[217,12717,2481],{"class":237},[217,12719,1612],{"class":319},[217,12721,2540],{"class":323},[217,12723,12553],{"class":223},[217,12725,2473],{"class":319},[217,12727,12728],{"class":227},"\"Y-m-d H:i:s\"",[217,12730,2484],{"class":319},[217,12732,12733,12735,12738],{"class":219,"line":8164},[217,12734,2695],{"class":237},[217,12736,12737],{"class":227}," \" \u002F \"",[217,12739,2712],{"class":319},[217,12741,12742,12744,12746,12748,12750,12752,12754,12757,12759,12761,12763,12765,12767,12769,12771],{"class":219,"line":8175},[217,12743,2695],{"class":237},[217,12745,12502],{"class":237},[217,12747,12337],{"class":323},[217,12749,12340],{"class":223},[217,12751,12548],{"class":319},[217,12753,2540],{"class":323},[217,12755,12756],{"class":223},"subYear",[217,12758,2473],{"class":319},[217,12760,2481],{"class":237},[217,12762,1612],{"class":319},[217,12764,2540],{"class":323},[217,12766,12553],{"class":223},[217,12768,2473],{"class":319},[217,12770,12728],{"class":227},[217,12772,2484],{"class":319},[217,12774,12775],{"class":219,"line":8186},[217,12776,896],{"emptyLinePlaceholder":895},[217,12778,12779],{"class":219,"line":8198},[217,12780,12781],{"class":1521},"\u002F\u002F印出結果： 2024-10-25 07:30:52 \u002F 2022-10-25 07:30:52\n",[217,12783,12784],{"class":219,"line":8203},[217,12785,896],{"emptyLinePlaceholder":895},[217,12787,12788],{"class":219,"line":8208},[217,12789,12485],{"class":1521},[217,12791,12792],{"class":219,"line":8215},[217,12793,12794],{"class":1521}," * 將季度增加\u002F減少 `$value`\n",[217,12796,12797],{"class":219,"line":8226},[217,12798,12495],{"class":1521},[217,12800,12801],{"class":219,"line":8251},[217,12802,896],{"emptyLinePlaceholder":895},[217,12804,12805,12807,12809,12811,12813,12815,12817,12820,12822,12824,12826,12828,12830,12832,12834],{"class":219,"line":8256},[217,12806,2695],{"class":237},[217,12808,12502],{"class":237},[217,12810,12337],{"class":323},[217,12812,12340],{"class":223},[217,12814,12548],{"class":319},[217,12816,2540],{"class":323},[217,12818,12819],{"class":223},"addQuarter",[217,12821,2473],{"class":319},[217,12823,2481],{"class":237},[217,12825,1612],{"class":319},[217,12827,2540],{"class":323},[217,12829,12553],{"class":223},[217,12831,2473],{"class":319},[217,12833,12728],{"class":227},[217,12835,2484],{"class":319},[217,12837,12838,12840,12842],{"class":219,"line":8261},[217,12839,2695],{"class":237},[217,12841,12737],{"class":227},[217,12843,2712],{"class":319},[217,12845,12846,12848,12850,12852,12854,12856,12858,12861,12863,12865,12867,12869,12871,12873,12875],{"class":219,"line":8268},[217,12847,2695],{"class":237},[217,12849,12502],{"class":237},[217,12851,12337],{"class":323},[217,12853,12340],{"class":223},[217,12855,12548],{"class":319},[217,12857,2540],{"class":323},[217,12859,12860],{"class":223},"subQuarter",[217,12862,2473],{"class":319},[217,12864,2481],{"class":237},[217,12866,1612],{"class":319},[217,12868,2540],{"class":323},[217,12870,12553],{"class":223},[217,12872,2473],{"class":319},[217,12874,12728],{"class":227},[217,12876,2484],{"class":319},[217,12878,12879],{"class":219,"line":8281},[217,12880,896],{"emptyLinePlaceholder":895},[217,12882,12883],{"class":219,"line":8286},[217,12884,12885],{"class":1521},"\u002F\u002F印出結果：2024-01-25 07:31:57 \u002F 2023-07-25 07:31:57\n",[217,12887,12888],{"class":219,"line":8291},[217,12889,896],{"emptyLinePlaceholder":895},[217,12891,12892],{"class":219,"line":8296},[217,12893,12485],{"class":1521},[217,12895,12896],{"class":219,"line":8306},[217,12897,12898],{"class":1521}," * 將月份增加\u002F減少 `$value`\n",[217,12900,12901],{"class":219,"line":8347},[217,12902,12495],{"class":1521},[217,12904,12905,12907,12909,12911,12913,12915,12917,12920,12922,12924,12926,12928,12930,12932,12934],{"class":219,"line":8358},[217,12906,2695],{"class":237},[217,12908,12502],{"class":237},[217,12910,12337],{"class":323},[217,12912,12340],{"class":223},[217,12914,12548],{"class":319},[217,12916,2540],{"class":323},[217,12918,12919],{"class":223},"subMonth",[217,12921,2473],{"class":319},[217,12923,2481],{"class":237},[217,12925,1612],{"class":319},[217,12927,2540],{"class":323},[217,12929,12553],{"class":223},[217,12931,2473],{"class":319},[217,12933,12728],{"class":227},[217,12935,2484],{"class":319},[217,12937,12938,12940,12942],{"class":219,"line":8369},[217,12939,2695],{"class":237},[217,12941,12737],{"class":227},[217,12943,2712],{"class":319},[217,12945,12946,12948,12950,12952,12954,12956,12958,12961,12963,12965,12967,12969,12971,12973,12975],{"class":219,"line":8380},[217,12947,2695],{"class":237},[217,12949,12502],{"class":237},[217,12951,12337],{"class":323},[217,12953,12340],{"class":223},[217,12955,12548],{"class":319},[217,12957,2540],{"class":323},[217,12959,12960],{"class":223},"addMonth",[217,12962,2473],{"class":319},[217,12964,2481],{"class":237},[217,12966,1612],{"class":319},[217,12968,2540],{"class":323},[217,12970,12553],{"class":223},[217,12972,2473],{"class":319},[217,12974,12728],{"class":227},[217,12976,2484],{"class":319},[217,12978,12979],{"class":219,"line":8391},[217,12980,896],{"emptyLinePlaceholder":895},[217,12982,12983],{"class":219,"line":8402},[217,12984,12985],{"class":1521},"\u002F\u002F印出結果：2023-09-25 07:37:37 \u002F 2023-11-25 07:37:37\n",[217,12987,12988],{"class":219,"line":8413},[217,12989,896],{"emptyLinePlaceholder":895},[217,12991,12992],{"class":219,"line":8426},[217,12993,12485],{"class":1521},[217,12995,12996],{"class":219,"line":8431},[217,12997,12998],{"class":1521}," * 將天數增加\u002F減少 `$value`\n",[217,13000,13001],{"class":219,"line":8436},[217,13002,12495],{"class":1521},[217,13004,13005,13007,13009,13011,13013,13015,13017,13020,13022,13024,13026,13028,13030,13032,13034],{"class":219,"line":8443},[217,13006,2695],{"class":237},[217,13008,12502],{"class":237},[217,13010,12337],{"class":323},[217,13012,12340],{"class":223},[217,13014,12548],{"class":319},[217,13016,2540],{"class":323},[217,13018,13019],{"class":223},"subDay",[217,13021,2473],{"class":319},[217,13023,2481],{"class":237},[217,13025,1612],{"class":319},[217,13027,2540],{"class":323},[217,13029,12553],{"class":223},[217,13031,2473],{"class":319},[217,13033,12728],{"class":227},[217,13035,2484],{"class":319},[217,13037,13038,13040,13042],{"class":219,"line":8454},[217,13039,2695],{"class":237},[217,13041,12737],{"class":227},[217,13043,2712],{"class":319},[217,13045,13046,13048,13050,13052,13054,13056,13058,13061,13063,13065,13067,13069,13071,13073,13075],{"class":219,"line":8479},[217,13047,2695],{"class":237},[217,13049,12502],{"class":237},[217,13051,12337],{"class":323},[217,13053,12340],{"class":223},[217,13055,12548],{"class":319},[217,13057,2540],{"class":323},[217,13059,13060],{"class":223},"addDay",[217,13062,2473],{"class":319},[217,13064,2481],{"class":237},[217,13066,1612],{"class":319},[217,13068,2540],{"class":323},[217,13070,12553],{"class":223},[217,13072,2473],{"class":319},[217,13074,12728],{"class":227},[217,13076,2484],{"class":319},[217,13078,13079],{"class":219,"line":8484},[217,13080,896],{"emptyLinePlaceholder":895},[217,13082,13083],{"class":219,"line":8489},[217,13084,13085],{"class":1521},"\u002F\u002F印出結果：2023-10-24 07:38:45 \u002F 2023-10-26 07:38:45\n",[217,13087,13088],{"class":219,"line":8496},[217,13089,896],{"emptyLinePlaceholder":895},[217,13091,13092],{"class":219,"line":8509},[217,13093,12485],{"class":1521},[217,13095,13096],{"class":219,"line":8514},[217,13097,13098],{"class":1521}," * 將小時增加\u002F減少 `$value`\n",[217,13100,13101],{"class":219,"line":8519},[217,13102,12495],{"class":1521},[217,13104,13105,13107,13109,13111,13113,13115,13117,13120,13122,13124,13126,13128,13130,13132,13134],{"class":219,"line":8524},[217,13106,2695],{"class":237},[217,13108,12502],{"class":237},[217,13110,12337],{"class":323},[217,13112,12340],{"class":223},[217,13114,12548],{"class":319},[217,13116,2540],{"class":323},[217,13118,13119],{"class":223},"subHour",[217,13121,2473],{"class":319},[217,13123,2481],{"class":237},[217,13125,1612],{"class":319},[217,13127,2540],{"class":323},[217,13129,12553],{"class":223},[217,13131,2473],{"class":319},[217,13133,12728],{"class":227},[217,13135,2484],{"class":319},[217,13137,13138,13140,13142],{"class":219,"line":8575},[217,13139,2695],{"class":237},[217,13141,12737],{"class":227},[217,13143,2712],{"class":319},[217,13145,13146,13148,13150,13152,13154,13156,13158,13161,13163,13165,13167,13169,13171,13173,13175],{"class":219,"line":8588},[217,13147,2695],{"class":237},[217,13149,12502],{"class":237},[217,13151,12337],{"class":323},[217,13153,12340],{"class":223},[217,13155,12548],{"class":319},[217,13157,2540],{"class":323},[217,13159,13160],{"class":223},"addHour",[217,13162,2473],{"class":319},[217,13164,2481],{"class":237},[217,13166,1612],{"class":319},[217,13168,2540],{"class":323},[217,13170,12553],{"class":223},[217,13172,2473],{"class":319},[217,13174,12728],{"class":227},[217,13176,2484],{"class":319},[217,13178,13179],{"class":219,"line":8600},[217,13180,896],{"emptyLinePlaceholder":895},[217,13182,13183],{"class":219,"line":8605},[217,13184,13185],{"class":1521},"\u002F\u002F印出結果：2023-10-25 06:48:25 \u002F 2023-10-25 08:48:25\n",[217,13187,13188],{"class":219,"line":8616},[217,13189,896],{"emptyLinePlaceholder":895},[217,13191,13192],{"class":219,"line":8647},[217,13193,12485],{"class":1521},[217,13195,13196],{"class":219,"line":8672},[217,13197,13198],{"class":1521}," * 將秒數增加\u002F減少 `$value`\n",[217,13200,13201],{"class":219,"line":8693},[217,13202,12495],{"class":1521},[217,13204,13205,13207,13209,13211,13213,13215,13217,13220,13222,13224,13226,13228,13230,13232,13234],{"class":219,"line":8717},[217,13206,2695],{"class":237},[217,13208,12502],{"class":237},[217,13210,12337],{"class":323},[217,13212,12340],{"class":223},[217,13214,12548],{"class":319},[217,13216,2540],{"class":323},[217,13218,13219],{"class":223},"subSecond",[217,13221,2473],{"class":319},[217,13223,2481],{"class":237},[217,13225,1612],{"class":319},[217,13227,2540],{"class":323},[217,13229,12553],{"class":223},[217,13231,2473],{"class":319},[217,13233,12728],{"class":227},[217,13235,2484],{"class":319},[217,13237,13238,13240,13242],{"class":219,"line":8740},[217,13239,2695],{"class":237},[217,13241,12737],{"class":227},[217,13243,2712],{"class":319},[217,13245,13246,13248,13250,13252,13254,13256,13258,13261,13263,13265,13267,13269,13271,13273,13275],{"class":219,"line":8767},[217,13247,2695],{"class":237},[217,13249,12502],{"class":237},[217,13251,12337],{"class":323},[217,13253,12340],{"class":223},[217,13255,12548],{"class":319},[217,13257,2540],{"class":323},[217,13259,13260],{"class":223},"addSecond",[217,13262,2473],{"class":319},[217,13264,2481],{"class":237},[217,13266,1612],{"class":319},[217,13268,2540],{"class":323},[217,13270,12553],{"class":223},[217,13272,2473],{"class":319},[217,13274,12728],{"class":227},[217,13276,2484],{"class":319},[217,13278,13279],{"class":219,"line":8782},[217,13280,896],{"emptyLinePlaceholder":895},[217,13282,13283],{"class":219,"line":8801},[217,13284,13285],{"class":1521},"\u002F\u002F印出結果：2023-10-25 07:49:58 \u002F 2023-10-25 07:50:00\n",[63,13287,13288],{"id":13288},"比較時間",[28,13290,13291,13301,13309,13317,13325],{},[31,13292,13293,13296,13297,13300],{},[55,13294,13295],{},"eq($datetime)","：是否等於 ",[55,13298,13299],{},"$datetime","，回傳布林值",[31,13302,13303,13306,13307,13300],{},[55,13304,13305],{},"ne($datetime)","：是否不等於 ",[55,13308,13299],{},[31,13310,13311,13314,13315,13300],{},[55,13312,13313],{},"gt($datetime)","：是否大於 ",[55,13316,13299],{},[31,13318,13319,13322,13323,13300],{},[55,13320,13321],{},"lt($datetime)","：是否小於 ",[55,13324,13299],{},[31,13326,13327,13330,13331,100,13334,13337],{},[55,13328,13329],{},"between($startTime, $endTime)","：是否介於 ",[55,13332,13333],{},"$startTime",[55,13335,13336],{},"$endTime"," 之間，回傳布林值",[1103,13339,11537],{"id":13340},"範例-1",[208,13342,13344],{"className":2457,"code":13343,"language":2404,"meta":213,"style":213},"use Carbon\\Carbon;\n\n\u002F**\n * 比較兩個時間，是否相等\n *\u002F\nvar_dump(Carbon::today()->eq(Carbon::today()));\n\u002F\u002F印出結果：bool(true)\nvar_dump(Carbon::today()->eq(Carbon::now()));\n\u002F\u002F印出結果：bool(false)\n\n\u002F**\n * 比較兩個時間，是否不相等\n *\u002F\nvar_dump(Carbon::today()->ne(Carbon::today()));\n\u002F\u002F印出結果：bool(false)\nvar_dump(Carbon::today()->ne(Carbon::tomorrow()));\n\u002F\u002F印出結果：bool(true)\n\n\u002F**\n * 比較兩個時間，是否大於\n *\u002F\nvar_dump(Carbon::tomorrow()->gt(Carbon::now()));\n\u002F\u002F印出結果：bool(true)\nvar_dump(Carbon::now()->gt(Carbon::tomorrow()));\n\u002F\u002F印出結果：bool(false)\n\n\u002F**\n * 比較兩個時間，是否小於\n *\u002F\nvar_dump(Carbon::now()->lt(Carbon::tomorrow()));\n\u002F\u002F印出結果：bool(true)\nvar_dump(Carbon::tomorrow()->lt(Carbon::now()));\n\u002F\u002F印出結果：bool(false)\n\n\u002F**\n * 是否介於 `$startTime`、`$endTime` 之間\n *\u002F\nvar_dump(Carbon::now()->between(Carbon::yesterday(), Carbon::tomorrow()));\n\u002F\u002F 印出結果：bool(true)\nvar_dump(Carbon::now()->addDay(2)->between(Carbon::yesterday(), Carbon::tomorrow()));\n\u002F\u002F 印出結果：bool(false)\n",[55,13345,13346,13354,13358,13362,13367,13371,13402,13407,13435,13440,13444,13448,13453,13457,13486,13490,13518,13522,13526,13530,13535,13539,13568,13572,13600,13604,13608,13612,13617,13621,13650,13654,13682,13686,13690,13694,13699,13703,13741,13746,13792],{"__ignoreMap":213},[217,13347,13348,13350,13352],{"class":219,"line":220},[217,13349,12310],{"class":323},[217,13351,12313],{"class":237},[217,13353,2712],{"class":319},[217,13355,13356],{"class":219,"line":387},[217,13357,896],{"emptyLinePlaceholder":895},[217,13359,13360],{"class":219,"line":410},[217,13361,12485],{"class":1521},[217,13363,13364],{"class":219,"line":424},[217,13365,13366],{"class":1521}," * 比較兩個時間，是否相等\n",[217,13368,13369],{"class":219,"line":441},[217,13370,12495],{"class":1521},[217,13372,13373,13376,13378,13380,13382,13384,13386,13388,13391,13393,13395,13397,13399],{"class":219,"line":908},[217,13374,13375],{"class":237},"var_dump",[217,13377,2473],{"class":319},[217,13379,12334],{"class":237},[217,13381,12337],{"class":323},[217,13383,12545],{"class":223},[217,13385,12548],{"class":319},[217,13387,2540],{"class":323},[217,13389,13390],{"class":223},"eq",[217,13392,2473],{"class":319},[217,13394,12334],{"class":237},[217,13396,12337],{"class":323},[217,13398,12545],{"class":223},[217,13400,13401],{"class":319},"()));\n",[217,13403,13404],{"class":219,"line":1560},[217,13405,13406],{"class":1521},"\u002F\u002F印出結果：bool(true)\n",[217,13408,13409,13411,13413,13415,13417,13419,13421,13423,13425,13427,13429,13431,13433],{"class":219,"line":1566},[217,13410,13375],{"class":237},[217,13412,2473],{"class":319},[217,13414,12334],{"class":237},[217,13416,12337],{"class":323},[217,13418,12545],{"class":223},[217,13420,12548],{"class":319},[217,13422,2540],{"class":323},[217,13424,13390],{"class":223},[217,13426,2473],{"class":319},[217,13428,12334],{"class":237},[217,13430,12337],{"class":323},[217,13432,12340],{"class":223},[217,13434,13401],{"class":319},[217,13436,13437],{"class":219,"line":1660},[217,13438,13439],{"class":1521},"\u002F\u002F印出結果：bool(false)\n",[217,13441,13442],{"class":219,"line":1666},[217,13443,896],{"emptyLinePlaceholder":895},[217,13445,13446],{"class":219,"line":1672},[217,13447,12485],{"class":1521},[217,13449,13450],{"class":219,"line":1678},[217,13451,13452],{"class":1521}," * 比較兩個時間，是否不相等\n",[217,13454,13455],{"class":219,"line":1684},[217,13456,12495],{"class":1521},[217,13458,13459,13461,13463,13465,13467,13469,13471,13473,13476,13478,13480,13482,13484],{"class":219,"line":1689},[217,13460,13375],{"class":237},[217,13462,2473],{"class":319},[217,13464,12334],{"class":237},[217,13466,12337],{"class":323},[217,13468,12545],{"class":223},[217,13470,12548],{"class":319},[217,13472,2540],{"class":323},[217,13474,13475],{"class":223},"ne",[217,13477,2473],{"class":319},[217,13479,12334],{"class":237},[217,13481,12337],{"class":323},[217,13483,12545],{"class":223},[217,13485,13401],{"class":319},[217,13487,13488],{"class":219,"line":2676},[217,13489,13439],{"class":1521},[217,13491,13492,13494,13496,13498,13500,13502,13504,13506,13508,13510,13512,13514,13516],{"class":219,"line":2687},[217,13493,13375],{"class":237},[217,13495,2473],{"class":319},[217,13497,12334],{"class":237},[217,13499,12337],{"class":323},[217,13501,12545],{"class":223},[217,13503,12548],{"class":319},[217,13505,2540],{"class":323},[217,13507,13475],{"class":223},[217,13509,2473],{"class":319},[217,13511,12334],{"class":237},[217,13513,12337],{"class":323},[217,13515,12601],{"class":223},[217,13517,13401],{"class":319},[217,13519,13520],{"class":219,"line":2692},[217,13521,13406],{"class":1521},[217,13523,13524],{"class":219,"line":2987},[217,13525,896],{"emptyLinePlaceholder":895},[217,13527,13528],{"class":219,"line":2993},[217,13529,12485],{"class":1521},[217,13531,13532],{"class":219,"line":2998},[217,13533,13534],{"class":1521}," * 比較兩個時間，是否大於\n",[217,13536,13537],{"class":219,"line":3004},[217,13538,12495],{"class":1521},[217,13540,13541,13543,13545,13547,13549,13551,13553,13555,13558,13560,13562,13564,13566],{"class":219,"line":6078},[217,13542,13375],{"class":237},[217,13544,2473],{"class":319},[217,13546,12334],{"class":237},[217,13548,12337],{"class":323},[217,13550,12601],{"class":223},[217,13552,12548],{"class":319},[217,13554,2540],{"class":323},[217,13556,13557],{"class":223},"gt",[217,13559,2473],{"class":319},[217,13561,12334],{"class":237},[217,13563,12337],{"class":323},[217,13565,12340],{"class":223},[217,13567,13401],{"class":319},[217,13569,13570],{"class":219,"line":6089},[217,13571,13406],{"class":1521},[217,13573,13574,13576,13578,13580,13582,13584,13586,13588,13590,13592,13594,13596,13598],{"class":219,"line":6100},[217,13575,13375],{"class":237},[217,13577,2473],{"class":319},[217,13579,12334],{"class":237},[217,13581,12337],{"class":323},[217,13583,12340],{"class":223},[217,13585,12548],{"class":319},[217,13587,2540],{"class":323},[217,13589,13557],{"class":223},[217,13591,2473],{"class":319},[217,13593,12334],{"class":237},[217,13595,12337],{"class":323},[217,13597,12601],{"class":223},[217,13599,13401],{"class":319},[217,13601,13602],{"class":219,"line":6105},[217,13603,13439],{"class":1521},[217,13605,13606],{"class":219,"line":6111},[217,13607,896],{"emptyLinePlaceholder":895},[217,13609,13610],{"class":219,"line":6121},[217,13611,12485],{"class":1521},[217,13613,13614],{"class":219,"line":6135},[217,13615,13616],{"class":1521}," * 比較兩個時間，是否小於\n",[217,13618,13619],{"class":219,"line":6140},[217,13620,12495],{"class":1521},[217,13622,13623,13625,13627,13629,13631,13633,13635,13637,13640,13642,13644,13646,13648],{"class":219,"line":6146},[217,13624,13375],{"class":237},[217,13626,2473],{"class":319},[217,13628,12334],{"class":237},[217,13630,12337],{"class":323},[217,13632,12340],{"class":223},[217,13634,12548],{"class":319},[217,13636,2540],{"class":323},[217,13638,13639],{"class":223},"lt",[217,13641,2473],{"class":319},[217,13643,12334],{"class":237},[217,13645,12337],{"class":323},[217,13647,12601],{"class":223},[217,13649,13401],{"class":319},[217,13651,13652],{"class":219,"line":6159},[217,13653,13406],{"class":1521},[217,13655,13656,13658,13660,13662,13664,13666,13668,13670,13672,13674,13676,13678,13680],{"class":219,"line":6170},[217,13657,13375],{"class":237},[217,13659,2473],{"class":319},[217,13661,12334],{"class":237},[217,13663,12337],{"class":323},[217,13665,12601],{"class":223},[217,13667,12548],{"class":319},[217,13669,2540],{"class":323},[217,13671,13639],{"class":223},[217,13673,2473],{"class":319},[217,13675,12334],{"class":237},[217,13677,12337],{"class":323},[217,13679,12340],{"class":223},[217,13681,13401],{"class":319},[217,13683,13684],{"class":219,"line":6181},[217,13685,13439],{"class":1521},[217,13687,13688],{"class":219,"line":8099},[217,13689,896],{"emptyLinePlaceholder":895},[217,13691,13692],{"class":219,"line":8131},[217,13693,12485],{"class":1521},[217,13695,13696],{"class":219,"line":8142},[217,13697,13698],{"class":1521}," * 是否介於 `$startTime`、`$endTime` 之間\n",[217,13700,13701],{"class":219,"line":8153},[217,13702,12495],{"class":1521},[217,13704,13705,13707,13709,13711,13713,13715,13717,13719,13722,13724,13726,13728,13730,13733,13735,13737,13739],{"class":219,"line":8164},[217,13706,13375],{"class":237},[217,13708,2473],{"class":319},[217,13710,12334],{"class":237},[217,13712,12337],{"class":323},[217,13714,12340],{"class":223},[217,13716,12548],{"class":319},[217,13718,2540],{"class":323},[217,13720,13721],{"class":223},"between",[217,13723,2473],{"class":319},[217,13725,12334],{"class":237},[217,13727,12337],{"class":323},[217,13729,12654],{"class":223},[217,13731,13732],{"class":319},"(), ",[217,13734,12334],{"class":237},[217,13736,12337],{"class":323},[217,13738,12601],{"class":223},[217,13740,13401],{"class":319},[217,13742,13743],{"class":219,"line":8175},[217,13744,13745],{"class":1521},"\u002F\u002F 印出結果：bool(true)\n",[217,13747,13748,13750,13752,13754,13756,13758,13760,13762,13764,13766,13768,13770,13772,13774,13776,13778,13780,13782,13784,13786,13788,13790],{"class":219,"line":8186},[217,13749,13375],{"class":237},[217,13751,2473],{"class":319},[217,13753,12334],{"class":237},[217,13755,12337],{"class":323},[217,13757,12340],{"class":223},[217,13759,12548],{"class":319},[217,13761,2540],{"class":323},[217,13763,13060],{"class":223},[217,13765,2473],{"class":319},[217,13767,2967],{"class":237},[217,13769,1612],{"class":319},[217,13771,2540],{"class":323},[217,13773,13721],{"class":223},[217,13775,2473],{"class":319},[217,13777,12334],{"class":237},[217,13779,12337],{"class":323},[217,13781,12654],{"class":223},[217,13783,13732],{"class":319},[217,13785,12334],{"class":237},[217,13787,12337],{"class":323},[217,13789,12601],{"class":223},[217,13791,13401],{"class":319},[217,13793,13794],{"class":219,"line":8198},[217,13795,13796],{"class":1521},"\u002F\u002F 印出結果：bool(false)\n",[1302,13798,13799],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":13801},[13802,13803,13804,13807],{"id":2268,"depth":387,"text":2268},{"id":12346,"depth":387,"text":12346},{"id":12357,"depth":387,"text":12357,"children":13805},[13806],{"id":11537,"depth":410,"text":11537},{"id":13288,"depth":387,"text":13288,"children":13808},[13809],{"id":13340,"depth":410,"text":11537},"\u002Fimages\u002Farticles\u002F2023-10-04-php-carbon\u002Fcover.png",{},"\u002Farticles\u002F2023-10-04-php-carbon","2023-10-04 18:34:00",{"title":12255,"description":213},"articles\u002F2023-10-04-php-carbon","PHP語言在處理日期和時間時，Carbon 套件是一個非常有用的工具。Carbon 套件繼承了原生的 Datetime，並新增了許多語意化的行為，讓處理時間的難度降低許多。在這篇教學中，將會介紹 Carbon 套件的基本使用方法，以及如何在 PHP 中使用 Carbon 套件來處理日期和時間。",[2404],"Xh7cdroYoCQtQdwWDDM6GaqTsi98DBN_3I6O6Srqow4",{"id":13820,"title":13821,"body":13822,"category":3902,"description":213,"extension":1324,"image":13900,"meta":13901,"navigation":895,"path":13902,"pubDate":13813,"seo":13903,"status":895,"stem":13904,"summary":13905,"tags":13906,"__hash__":13908},"content\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id.md","如何取得 Telegram Bot 所有的 Chat ID",{"type":8,"value":13823,"toc":13893},[13824,13828,13831,13835,13842,13847,13850,13854,13857,13861,13868,13872,13881],[63,13825,13827],{"id":13826},"步驟1-創建-telegram-bot-並獲取-api-token","步驟1: 創建 Telegram Bot 並獲取 API Token",[15,13829,13830],{},"首先,我們需要透過 Telegram 的 @BotFather 創建一個新的 Bot,並獲取該 Bot 的 API Token。API Token 是一個類似於 \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\" 的字串,用於向 Telegram 的 API 服務器進行身份驗證。",[63,13832,13834],{"id":13833},"步驟2-使用-getupdates-方法獲取更新","步驟2: 使用 getUpdates 方法獲取更新",[15,13836,13837,13838],{},"接下來,我們可以在瀏覽器中訪問以下 URL,將 ",[13839,13840,13841],"token",{}," 替換為你的 API Token:",[15,13843,13844],{},[55,13845,13846],{},"https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002FgetUpdates",[15,13848,13849],{},"這將返回一個 JSON 格式的數據,包含了最近的更新。",[63,13851,13853],{"id":13852},"步驟3-從更新中提取-chat-id","步驟3: 從更新中提取 Chat ID",[15,13855,13856],{},"在返回的 JSON 數據中,查找 \"result\" 數組。每個元素代表一個更新,其中包含 \"message\" 或 \"channel_post\" 對象。在這些對象中,可以找到 \"chat\" 對象,其 \"id\" 字段就是該會話的 Chat ID。\n對於私人會話,Chat ID 為正整數。對於群組,Chat ID 為負數,需要在前面加 \"-100\"。",[63,13858,13860],{"id":13859},"步驟4-儲存所有-chat-id","步驟4: 儲存所有 Chat ID",[15,13862,13863,13864,13867],{},"遍歷所有更新的 \"chat\" 對象,獲取並儲存所有的 Chat ID。需要注意的是,",[55,13865,13866],{},"getUpdates"," 只能獲取最近的更新,如果要獲取所有的 Chat ID,可能需要多次調用該方法。",[63,13869,13871],{"id":13870},"在-php-語言中如何快速取得","在 PHP 語言中，如何快速取得",[15,13873,13874,13875,13880],{},"可使用 ",[19,13876,13879],{"href":13877,"rel":13878},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore",[291],"php-telegram-bot\u002Fcore"," 這個套件處理。",[15,13882,13883,13884,13887,13888],{},"透過 Webhook 方式，使用 ",[55,13885,13886],{},"getupdates"," 函式來取得 chat id, 可參考 ",[19,13889,13892],{"href":13890,"rel":13891},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore?tab=readme-ov-file#getupdates-installation",[291],"官方教學",{"title":213,"searchDepth":387,"depth":387,"links":13894},[13895,13896,13897,13898,13899],{"id":13826,"depth":387,"text":13827},{"id":13833,"depth":387,"text":13834},{"id":13852,"depth":387,"text":13853},{"id":13859,"depth":387,"text":13860},{"id":13870,"depth":387,"text":13871},"\u002Fimages\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id\u002Fcover.png",{},"\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id",{"title":13821,"description":213},"articles\u002F2024-05-01-telegram-bot-get-chat-id","在開發 Telegram Bot 時,有時候我們需要獲取所有與 Bot 互動過的 Chat ID,無論是私人對話還是群組對話。取得這些 Chat ID 對於發送廣播消息或管理會話非常有用。本文將詳細介紹如何透過 Telegram Bot API 獲取所有的 Chat ID。",[13907,2404],"Telegram","NGatZI0ync1nfpUr5-l0cWDQlW30EzCC3zULFpvSyyw",{"id":13910,"title":13911,"body":13912,"category":3902,"description":213,"extension":1324,"image":14785,"meta":14786,"navigation":895,"path":14787,"pubDate":14788,"seo":14789,"status":895,"stem":14790,"summary":14791,"tags":14792,"__hash__":14793},"content\u002Farticles\u002F2023-05-07-go-function.md","《Go 學習筆記6》函式",{"type":8,"value":13913,"toc":14781},[13914,13919,13922,13925,13986,13990,14118,14122,14143,14147,14195,14199,14327,14331,14340,14344,14349,14416,14420,14749,14753,14778],[115,13915,13916],{},[15,13917,13918],{},"這是自學 Go lang 的筆記，若內容有誤，請留言區提醒，我會儘快改正，謝謝",[15,13920,13921],{},"在 Go 語中，為了可以重復使用某個程式碼片段，我們使用函式 (function) 來進實作。而在 Go 語言中，function 可以輸入多個參數值，也可以回傳多個參數值",[15,13923,13924],{},"##無 return 函式",[208,13926,13930],{"className":13927,"code":13928,"language":13929,"meta":213,"style":213},"language-go shiki shiki-themes github-light github-dark github-dark","func 函式名 (參數1 變數型態, 參數2 變數型態, ...) {\n    \u002F\u002F執行程式片段\n}\n\n\u002F\u002F呼叫方式\n函式名(參數1, 參數2)\n","go",[55,13931,13932,13960,13965,13969,13973,13978],{"__ignoreMap":213},[217,13933,13934,13937,13940,13943,13946,13948,13951,13953,13955,13958],{"class":219,"line":220},[217,13935,13936],{"class":323},"func",[217,13938,13939],{"class":319}," 函式名 (",[217,13941,13942],{"class":7808},"參數1",[217,13944,13945],{"class":223}," 變數型態",[217,13947,2551],{"class":319},[217,13949,13950],{"class":7808},"參數2",[217,13952,13945],{"class":223},[217,13954,2551],{"class":319},[217,13956,13957],{"class":323},"...",[217,13959,2892],{"class":319},[217,13961,13962],{"class":219,"line":387},[217,13963,13964],{"class":1521},"    \u002F\u002F執行程式片段\n",[217,13966,13967],{"class":219,"line":410},[217,13968,2990],{"class":319},[217,13970,13971],{"class":219,"line":424},[217,13972,896],{"emptyLinePlaceholder":895},[217,13974,13975],{"class":219,"line":441},[217,13976,13977],{"class":1521},"\u002F\u002F呼叫方式\n",[217,13979,13980,13983],{"class":219,"line":908},[217,13981,13982],{"class":223},"函式名",[217,13984,13985],{"class":319},"(參數1, 參數2)\n",[15,13987,13988],{},[47,13989,11537],{},[208,13991,13993],{"className":13927,"code":13992,"language":13929,"meta":213,"style":213},"package main\nimport \"fmt\"\nfunc main() {\n    hello(\"Allen\", 23)\n}\n\nfunc hello(name string, age int8) {\n    fmt.Printf(\"Hello %s\\r\\n\", name)\n    fmt.Printf(\"年紀 %d\\r\\n\", age)\n}\n",[55,13994,13995,14003,14015,14024,14041,14045,14049,14074,14095,14114],{"__ignoreMap":213},[217,13996,13997,14000],{"class":219,"line":220},[217,13998,13999],{"class":323},"package",[217,14001,14002],{"class":223}," main\n",[217,14004,14005,14008,14010,14013],{"class":219,"line":387},[217,14006,14007],{"class":323},"import",[217,14009,401],{"class":227},[217,14011,14012],{"class":223},"fmt",[217,14014,407],{"class":227},[217,14016,14017,14019,14022],{"class":219,"line":410},[217,14018,13936],{"class":323},[217,14020,14021],{"class":223}," main",[217,14023,7923],{"class":319},[217,14025,14026,14029,14031,14034,14036,14039],{"class":219,"line":424},[217,14027,14028],{"class":223},"    hello",[217,14030,2473],{"class":319},[217,14032,14033],{"class":227},"\"Allen\"",[217,14035,2551],{"class":319},[217,14037,14038],{"class":237},"23",[217,14040,877],{"class":319},[217,14042,14043],{"class":219,"line":441},[217,14044,2990],{"class":319},[217,14046,14047],{"class":219,"line":908},[217,14048,896],{"emptyLinePlaceholder":895},[217,14050,14051,14053,14056,14058,14061,14064,14066,14069,14072],{"class":219,"line":1560},[217,14052,13936],{"class":323},[217,14054,14055],{"class":223}," hello",[217,14057,2473],{"class":319},[217,14059,14060],{"class":7808},"name",[217,14062,14063],{"class":323}," string",[217,14065,2551],{"class":319},[217,14067,14068],{"class":7808},"age",[217,14070,14071],{"class":323}," int8",[217,14073,2892],{"class":319},[217,14075,14076,14079,14082,14084,14087,14090,14092],{"class":219,"line":1566},[217,14077,14078],{"class":319},"    fmt.",[217,14080,14081],{"class":223},"Printf",[217,14083,2473],{"class":319},[217,14085,14086],{"class":227},"\"Hello ",[217,14088,14089],{"class":237},"%s\\r\\n",[217,14091,512],{"class":227},[217,14093,14094],{"class":319},", name)\n",[217,14096,14097,14099,14101,14103,14106,14109,14111],{"class":219,"line":1660},[217,14098,14078],{"class":319},[217,14100,14081],{"class":223},[217,14102,2473],{"class":319},[217,14104,14105],{"class":227},"\"年紀 ",[217,14107,14108],{"class":237},"%d\\r\\n",[217,14110,512],{"class":227},[217,14112,14113],{"class":319},", age)\n",[217,14115,14116],{"class":219,"line":1666},[217,14117,2990],{"class":319},[15,14119,14120],{},[47,14121,9590],{},[208,14123,14125],{"className":210,"code":14124,"language":212,"meta":213,"style":213},"Hello Allen\n年紀 23\n",[55,14126,14127,14135],{"__ignoreMap":213},[217,14128,14129,14132],{"class":219,"line":220},[217,14130,14131],{"class":223},"Hello",[217,14133,14134],{"class":227}," Allen\n",[217,14136,14137,14140],{"class":219,"line":387},[217,14138,14139],{"class":223},"年紀",[217,14141,14142],{"class":237}," 23\n",[63,14144,14146],{"id":14145},"return-函式","return 函式",[208,14148,14150],{"className":13927,"code":14149,"language":13929,"meta":213,"style":213},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) 回傳型態 {\n    \u002F\u002F執行程式片段\n    return 回傳值\n}\n",[55,14151,14152,14180,14184,14191],{"__ignoreMap":213},[217,14153,14154,14156,14159,14161,14163,14165,14167,14169,14171,14173,14175,14178],{"class":219,"line":220},[217,14155,13936],{"class":323},[217,14157,14158],{"class":319}," 函式名  (",[217,14160,13942],{"class":7808},[217,14162,13945],{"class":223},[217,14164,2551],{"class":319},[217,14166,13950],{"class":7808},[217,14168,13945],{"class":223},[217,14170,2551],{"class":319},[217,14172,13957],{"class":323},[217,14174,9049],{"class":319},[217,14176,14177],{"class":223},"回傳型態",[217,14179,7514],{"class":319},[217,14181,14182],{"class":219,"line":387},[217,14183,13964],{"class":1521},[217,14185,14186,14188],{"class":219,"line":410},[217,14187,8888],{"class":323},[217,14189,14190],{"class":319}," 回傳值\n",[217,14192,14193],{"class":219,"line":424},[217,14194,2990],{"class":319},[15,14196,14197],{},[47,14198,11537],{},[208,14200,14202],{"className":13927,"code":14201,"language":13929,"meta":213,"style":213},"package main\nimport \"fmt\"\nfunc main() {\n    total := sum(4, 2, 3)\n    fmt.Println(total)\n}\n\nfunc sum(x int, y int, z int) int {\n    return x + y + z\n}\n\n",[55,14203,14204,14210,14220,14228,14254,14265,14269,14273,14306,14323],{"__ignoreMap":213},[217,14205,14206,14208],{"class":219,"line":220},[217,14207,13999],{"class":323},[217,14209,14002],{"class":223},[217,14211,14212,14214,14216,14218],{"class":219,"line":387},[217,14213,14007],{"class":323},[217,14215,401],{"class":227},[217,14217,14012],{"class":223},[217,14219,407],{"class":227},[217,14221,14222,14224,14226],{"class":219,"line":410},[217,14223,13936],{"class":323},[217,14225,14021],{"class":223},[217,14227,7923],{"class":319},[217,14229,14230,14233,14236,14239,14241,14243,14245,14247,14249,14252],{"class":219,"line":424},[217,14231,14232],{"class":319},"    total ",[217,14234,14235],{"class":323},":=",[217,14237,14238],{"class":223}," sum",[217,14240,2473],{"class":319},[217,14242,3461],{"class":237},[217,14244,2551],{"class":319},[217,14246,2967],{"class":237},[217,14248,2551],{"class":319},[217,14250,14251],{"class":237},"3",[217,14253,877],{"class":319},[217,14255,14256,14259,14262],{"class":219,"line":441},[217,14257,14258],{"class":319},"    fmt.",[217,14260,14261],{"class":223},"Println",[217,14263,14264],{"class":319},"(total)\n",[217,14266,14267],{"class":219,"line":908},[217,14268,2990],{"class":319},[217,14270,14271],{"class":219,"line":1560},[217,14272,896],{"emptyLinePlaceholder":895},[217,14274,14275,14277,14279,14281,14283,14286,14288,14290,14292,14294,14297,14299,14301,14304],{"class":219,"line":1566},[217,14276,13936],{"class":323},[217,14278,14238],{"class":223},[217,14280,2473],{"class":319},[217,14282,7809],{"class":7808},[217,14284,14285],{"class":323}," int",[217,14287,2551],{"class":319},[217,14289,7814],{"class":7808},[217,14291,14285],{"class":323},[217,14293,2551],{"class":319},[217,14295,14296],{"class":7808},"z",[217,14298,14285],{"class":323},[217,14300,9049],{"class":319},[217,14302,14303],{"class":323},"int",[217,14305,7514],{"class":319},[217,14307,14308,14310,14313,14315,14318,14320],{"class":219,"line":1660},[217,14309,8888],{"class":323},[217,14311,14312],{"class":319}," x ",[217,14314,8899],{"class":323},[217,14316,14317],{"class":319}," y ",[217,14319,8899],{"class":323},[217,14321,14322],{"class":319}," z\n",[217,14324,14325],{"class":219,"line":1666},[217,14326,2990],{"class":319},[15,14328,14329],{},[47,14330,9590],{},[208,14332,14334],{"className":210,"code":14333,"language":212,"meta":213,"style":213},"9\n",[55,14335,14336],{"__ignoreMap":213},[217,14337,14338],{"class":219,"line":220},[217,14339,14333],{"class":223},[63,14341,14343],{"id":14342},"return-多個值","return 多個值",[15,14345,14346],{},[47,14347,14348],{},"格式",[208,14350,14352],{"className":13927,"code":14351,"language":13929,"meta":213,"style":213},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) (回傳型態1, 回傳型態2, 回傳型態3,...) {\n    \u002F\u002F執行程式片段1\n    return 回傳值1, 回傳值2, 回傳值3,...\n}\n",[55,14353,14354,14397,14402,14412],{"__ignoreMap":213},[217,14355,14356,14358,14360,14362,14364,14366,14368,14370,14372,14374,14377,14380,14382,14385,14387,14390,14393,14395],{"class":219,"line":220},[217,14357,13936],{"class":323},[217,14359,14158],{"class":319},[217,14361,13942],{"class":7808},[217,14363,13945],{"class":223},[217,14365,2551],{"class":319},[217,14367,13950],{"class":7808},[217,14369,13945],{"class":223},[217,14371,2551],{"class":319},[217,14373,13957],{"class":323},[217,14375,14376],{"class":319},") (",[217,14378,14379],{"class":223},"回傳型態1",[217,14381,2551],{"class":319},[217,14383,14384],{"class":223},"回傳型態2",[217,14386,2551],{"class":319},[217,14388,14389],{"class":223},"回傳型態3",[217,14391,14392],{"class":319},",",[217,14394,13957],{"class":323},[217,14396,2892],{"class":319},[217,14398,14399],{"class":219,"line":387},[217,14400,14401],{"class":1521},"    \u002F\u002F執行程式片段1\n",[217,14403,14404,14406,14409],{"class":219,"line":410},[217,14405,8888],{"class":323},[217,14407,14408],{"class":319}," 回傳值1, 回傳值2, 回傳值3,",[217,14410,14411],{"class":323},"...\n",[217,14413,14414],{"class":219,"line":424},[217,14415,2990],{"class":319},[15,14417,14418],{},[47,14419,11537],{},[208,14421,14423],{"className":13927,"code":14422,"language":13929,"meta":213,"style":213},"package main\nimport \"fmt\"\n\nfunc main() {\n    var name string\n    var sex bool\n    var height float32\n    var weight float32\n    var sexString string\n    \n    name, sex, height, weight = getPersonData()\n\n    sexString = getSexString(sex)\n\n    fmt.Printf(\"姓名：%s\\r\\n\", name)\n    fmt.Printf(\"性別：%s\\r\\n\", sexString)\n    fmt.Printf(\"身高：%.2f\\r\\n\", height)\n    fmt.Printf(\"體重：%.2f\\r\\n\", weight)\n}\n\n\nfunc getPersonData() (string, bool, float32, float32) {\n    return \"小明\", true, 175.0, 60.5\n}\n\nfunc getSexString(sex bool) string {\n    if sex == true {\n        return \"男\"\n    } else {\n        return \"女\"\n    }\n}\n",[55,14424,14425,14431,14441,14445,14453,14464,14474,14484,14493,14502,14507,14519,14523,14536,14540,14557,14575,14594,14612,14616,14620,14624,14652,14674,14678,14682,14702,14715,14723,14733,14740,14745],{"__ignoreMap":213},[217,14426,14427,14429],{"class":219,"line":220},[217,14428,13999],{"class":323},[217,14430,14002],{"class":223},[217,14432,14433,14435,14437,14439],{"class":219,"line":387},[217,14434,14007],{"class":323},[217,14436,401],{"class":227},[217,14438,14012],{"class":223},[217,14440,407],{"class":227},[217,14442,14443],{"class":219,"line":410},[217,14444,896],{"emptyLinePlaceholder":895},[217,14446,14447,14449,14451],{"class":219,"line":424},[217,14448,13936],{"class":323},[217,14450,14021],{"class":223},[217,14452,7923],{"class":319},[217,14454,14455,14458,14461],{"class":219,"line":441},[217,14456,14457],{"class":323},"    var",[217,14459,14460],{"class":319}," name ",[217,14462,14463],{"class":323},"string\n",[217,14465,14466,14468,14471],{"class":219,"line":908},[217,14467,14457],{"class":323},[217,14469,14470],{"class":319}," sex ",[217,14472,14473],{"class":323},"bool\n",[217,14475,14476,14478,14481],{"class":219,"line":1560},[217,14477,14457],{"class":323},[217,14479,14480],{"class":319}," height ",[217,14482,14483],{"class":323},"float32\n",[217,14485,14486,14488,14491],{"class":219,"line":1566},[217,14487,14457],{"class":323},[217,14489,14490],{"class":319}," weight ",[217,14492,14483],{"class":323},[217,14494,14495,14497,14500],{"class":219,"line":1660},[217,14496,14457],{"class":323},[217,14498,14499],{"class":319}," sexString ",[217,14501,14463],{"class":323},[217,14503,14504],{"class":219,"line":1666},[217,14505,14506],{"class":319},"    \n",[217,14508,14509,14512,14514,14517],{"class":219,"line":1672},[217,14510,14511],{"class":319},"    name, sex, height, weight ",[217,14513,854],{"class":323},[217,14515,14516],{"class":223}," getPersonData",[217,14518,3125],{"class":319},[217,14520,14521],{"class":219,"line":1678},[217,14522,896],{"emptyLinePlaceholder":895},[217,14524,14525,14528,14530,14533],{"class":219,"line":1684},[217,14526,14527],{"class":319},"    sexString ",[217,14529,854],{"class":323},[217,14531,14532],{"class":223}," getSexString",[217,14534,14535],{"class":319},"(sex)\n",[217,14537,14538],{"class":219,"line":1689},[217,14539,896],{"emptyLinePlaceholder":895},[217,14541,14542,14544,14546,14548,14551,14553,14555],{"class":219,"line":2676},[217,14543,14258],{"class":319},[217,14545,14081],{"class":223},[217,14547,2473],{"class":319},[217,14549,14550],{"class":227},"\"姓名：",[217,14552,14089],{"class":237},[217,14554,512],{"class":227},[217,14556,14094],{"class":319},[217,14558,14559,14561,14563,14565,14568,14570,14572],{"class":219,"line":2687},[217,14560,14258],{"class":319},[217,14562,14081],{"class":223},[217,14564,2473],{"class":319},[217,14566,14567],{"class":227},"\"性別：",[217,14569,14089],{"class":237},[217,14571,512],{"class":227},[217,14573,14574],{"class":319},", sexString)\n",[217,14576,14577,14579,14581,14583,14586,14589,14591],{"class":219,"line":2692},[217,14578,14258],{"class":319},[217,14580,14081],{"class":223},[217,14582,2473],{"class":319},[217,14584,14585],{"class":227},"\"身高：",[217,14587,14588],{"class":237},"%.2f\\r\\n",[217,14590,512],{"class":227},[217,14592,14593],{"class":319},", height)\n",[217,14595,14596,14598,14600,14602,14605,14607,14609],{"class":219,"line":2987},[217,14597,14258],{"class":319},[217,14599,14081],{"class":223},[217,14601,2473],{"class":319},[217,14603,14604],{"class":227},"\"體重：",[217,14606,14588],{"class":237},[217,14608,512],{"class":227},[217,14610,14611],{"class":319},", weight)\n",[217,14613,14614],{"class":219,"line":2993},[217,14615,2990],{"class":319},[217,14617,14618],{"class":219,"line":2998},[217,14619,896],{"emptyLinePlaceholder":895},[217,14621,14622],{"class":219,"line":3004},[217,14623,896],{"emptyLinePlaceholder":895},[217,14625,14626,14628,14630,14633,14636,14638,14641,14643,14646,14648,14650],{"class":219,"line":6078},[217,14627,13936],{"class":323},[217,14629,14516],{"class":223},[217,14631,14632],{"class":319},"() (",[217,14634,14635],{"class":323},"string",[217,14637,2551],{"class":319},[217,14639,14640],{"class":323},"bool",[217,14642,2551],{"class":319},[217,14644,14645],{"class":323},"float32",[217,14647,2551],{"class":319},[217,14649,14645],{"class":323},[217,14651,2892],{"class":319},[217,14653,14654,14656,14659,14661,14664,14666,14669,14671],{"class":219,"line":6089},[217,14655,8888],{"class":323},[217,14657,14658],{"class":227}," \"小明\"",[217,14660,2551],{"class":319},[217,14662,14663],{"class":237},"true",[217,14665,2551],{"class":319},[217,14667,14668],{"class":237},"175.0",[217,14670,2551],{"class":319},[217,14672,14673],{"class":237},"60.5\n",[217,14675,14676],{"class":219,"line":6100},[217,14677,2990],{"class":319},[217,14679,14680],{"class":219,"line":6105},[217,14681,896],{"emptyLinePlaceholder":895},[217,14683,14684,14686,14688,14690,14693,14696,14698,14700],{"class":219,"line":6111},[217,14685,13936],{"class":323},[217,14687,14532],{"class":223},[217,14689,2473],{"class":319},[217,14691,14692],{"class":7808},"sex",[217,14694,14695],{"class":323}," bool",[217,14697,9049],{"class":319},[217,14699,14635],{"class":323},[217,14701,7514],{"class":319},[217,14703,14704,14706,14708,14711,14713],{"class":219,"line":6121},[217,14705,9425],{"class":323},[217,14707,14470],{"class":319},[217,14709,14710],{"class":323},"==",[217,14712,9417],{"class":237},[217,14714,7514],{"class":319},[217,14716,14717,14720],{"class":219,"line":6135},[217,14718,14719],{"class":323},"        return",[217,14721,14722],{"class":227}," \"男\"\n",[217,14724,14725,14728,14731],{"class":219,"line":6140},[217,14726,14727],{"class":319},"    } ",[217,14729,14730],{"class":323},"else",[217,14732,7514],{"class":319},[217,14734,14735,14737],{"class":219,"line":6146},[217,14736,14719],{"class":323},[217,14738,14739],{"class":227}," \"女\"\n",[217,14741,14742],{"class":219,"line":6159},[217,14743,14744],{"class":319},"    }\n",[217,14746,14747],{"class":219,"line":6170},[217,14748,2990],{"class":319},[15,14750,14751],{},[47,14752,9590],{},[208,14754,14756],{"className":210,"code":14755,"language":212,"meta":213,"style":213},"姓名：小明\n性別：男\n身高：175.00\n體重：60.50\n",[55,14757,14758,14763,14768,14773],{"__ignoreMap":213},[217,14759,14760],{"class":219,"line":220},[217,14761,14762],{"class":223},"姓名：小明\n",[217,14764,14765],{"class":219,"line":387},[217,14766,14767],{"class":223},"性別：男\n",[217,14769,14770],{"class":219,"line":410},[217,14771,14772],{"class":223},"身高：175.00\n",[217,14774,14775],{"class":219,"line":424},[217,14776,14777],{"class":223},"體重：60.50\n",[1302,14779,14780],{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":213,"searchDepth":387,"depth":387,"links":14782},[14783,14784],{"id":14145,"depth":387,"text":14146},{"id":14342,"depth":387,"text":14343},"\u002Fimages\u002Farticles\u002F2023-02-26-go-lang-setup\u002Fcover.png",{},"\u002Farticles\u002F2023-05-07-go-function","2023-04-07 22:34:00",{"title":13911,"description":213},"articles\u002F2023-05-07-go-function","這篇文章，會介紹 Go 語言中，function 的使用方式",[13929],"kPWUrG71WxLeaVN03IJAFQyE8rs9AzsGWm7HLFKYbUw",{"id":14795,"title":14796,"body":14797,"category":3902,"description":213,"extension":1324,"image":14785,"meta":17631,"navigation":895,"path":17632,"pubDate":17633,"seo":17634,"status":895,"stem":17635,"summary":17636,"tags":17637,"__hash__":17638},"content\u002Farticles\u002F2023-03-28-flow control.md","《Go 學習筆記5》流程控制",{"type":8,"value":14798,"toc":17622},[14799,14803,14807,14811,14864,14868,15066,15070,15091,15094,15097,15101,15155,15159,15411,15415,15424,15428,15433,15454,15458,15535,15538,15712,15716,16656,16659,16662,16885,16889,16946,16949,16952,17252,17256,17368,17372,17381,17384,17391,17417,17422,17553,17557,17616,17619],[115,14800,14801],{},[15,14802,13918],{},[63,14804,14806],{"id":14805},"if-判斷","if 判斷",[15,14808,14809],{},[47,14810,14348],{},[208,14812,14814],{"className":13927,"code":14813,"language":13929,"meta":213,"style":213},"if 條件1 {\n  \u002F\u002F若條件1成立，則執行此段程式\n} else if 條件2 {\n  \u002F\u002F若條件2成立，則執行此段程式\n} else {\n  \u002F\u002F若上述條件都位成立，則執行本段程式\n}\n",[55,14815,14816,14824,14829,14842,14847,14855,14860],{"__ignoreMap":213},[217,14817,14818,14821],{"class":219,"line":220},[217,14819,14820],{"class":323},"if",[217,14822,14823],{"class":319}," 條件1 {\n",[217,14825,14826],{"class":219,"line":387},[217,14827,14828],{"class":1521},"  \u002F\u002F若條件1成立，則執行此段程式\n",[217,14830,14831,14834,14836,14839],{"class":219,"line":410},[217,14832,14833],{"class":319},"} ",[217,14835,14730],{"class":323},[217,14837,14838],{"class":323}," if",[217,14840,14841],{"class":319}," 條件2 {\n",[217,14843,14844],{"class":219,"line":424},[217,14845,14846],{"class":1521},"  \u002F\u002F若條件2成立，則執行此段程式\n",[217,14848,14849,14851,14853],{"class":219,"line":441},[217,14850,14833],{"class":319},[217,14852,14730],{"class":323},[217,14854,7514],{"class":319},[217,14856,14857],{"class":219,"line":908},[217,14858,14859],{"class":1521},"  \u002F\u002F若上述條件都位成立，則執行本段程式\n",[217,14861,14862],{"class":219,"line":1560},[217,14863,2990],{"class":319},[15,14865,14866],{},[47,14867,11537],{},[208,14869,14871],{"className":13927,"code":14870,"language":13929,"meta":213,"style":213},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    var grade float32\n    fmt.Print(\"請輸入分數：\")\n    fmt.Scan(&grade)\n\n    if grade >= 80 {\n        fmt.Printf(\"你的成績為：%.2f，成績不錯唷\\r\\n\", grade)\n    } else if grade >= 60 {\n        fmt.Printf(\"您的成積為 %.2f ，恭喜你及格了\\r\\n\", grade)\n    } else {\n        fmt.Printf(\"您的成績為 %.2f ，不及格~再努力\\r\\n\", grade)\n    }\n}\n",[55,14872,14873,14879,14883,14893,14897,14905,14909,14918,14932,14946,14950,14964,14990,15006,15028,15036,15058,15062],{"__ignoreMap":213},[217,14874,14875,14877],{"class":219,"line":220},[217,14876,13999],{"class":323},[217,14878,14002],{"class":223},[217,14880,14881],{"class":219,"line":387},[217,14882,896],{"emptyLinePlaceholder":895},[217,14884,14885,14887,14889,14891],{"class":219,"line":410},[217,14886,14007],{"class":323},[217,14888,401],{"class":227},[217,14890,14012],{"class":223},[217,14892,407],{"class":227},[217,14894,14895],{"class":219,"line":424},[217,14896,896],{"emptyLinePlaceholder":895},[217,14898,14899,14901,14903],{"class":219,"line":441},[217,14900,13936],{"class":323},[217,14902,14021],{"class":223},[217,14904,7923],{"class":319},[217,14906,14907],{"class":219,"line":908},[217,14908,896],{"emptyLinePlaceholder":895},[217,14910,14911,14913,14916],{"class":219,"line":1560},[217,14912,14457],{"class":323},[217,14914,14915],{"class":319}," grade ",[217,14917,14483],{"class":323},[217,14919,14920,14922,14925,14927,14930],{"class":219,"line":1566},[217,14921,14258],{"class":319},[217,14923,14924],{"class":223},"Print",[217,14926,2473],{"class":319},[217,14928,14929],{"class":227},"\"請輸入分數：\"",[217,14931,877],{"class":319},[217,14933,14934,14936,14939,14941,14943],{"class":219,"line":1660},[217,14935,14258],{"class":319},[217,14937,14938],{"class":223},"Scan",[217,14940,2473],{"class":319},[217,14942,10648],{"class":323},[217,14944,14945],{"class":319},"grade)\n",[217,14947,14948],{"class":219,"line":1666},[217,14949,896],{"emptyLinePlaceholder":895},[217,14951,14952,14954,14956,14959,14962],{"class":219,"line":1672},[217,14953,9425],{"class":323},[217,14955,14915],{"class":319},[217,14957,14958],{"class":323},">=",[217,14960,14961],{"class":237}," 80",[217,14963,7514],{"class":319},[217,14965,14966,14969,14971,14973,14976,14979,14982,14985,14987],{"class":219,"line":1678},[217,14967,14968],{"class":319},"        fmt.",[217,14970,14081],{"class":223},[217,14972,2473],{"class":319},[217,14974,14975],{"class":227},"\"你的成績為：",[217,14977,14978],{"class":237},"%.2f",[217,14980,14981],{"class":227},"，成績不錯唷",[217,14983,14984],{"class":237},"\\r\\n",[217,14986,512],{"class":227},[217,14988,14989],{"class":319},", grade)\n",[217,14991,14992,14994,14996,14998,15000,15002,15004],{"class":219,"line":1684},[217,14993,14727],{"class":319},[217,14995,14730],{"class":323},[217,14997,14838],{"class":323},[217,14999,14915],{"class":319},[217,15001,14958],{"class":323},[217,15003,8556],{"class":237},[217,15005,7514],{"class":319},[217,15007,15008,15010,15012,15014,15017,15019,15022,15024,15026],{"class":219,"line":1689},[217,15009,14968],{"class":319},[217,15011,14081],{"class":223},[217,15013,2473],{"class":319},[217,15015,15016],{"class":227},"\"您的成積為 ",[217,15018,14978],{"class":237},[217,15020,15021],{"class":227}," ，恭喜你及格了",[217,15023,14984],{"class":237},[217,15025,512],{"class":227},[217,15027,14989],{"class":319},[217,15029,15030,15032,15034],{"class":219,"line":2676},[217,15031,14727],{"class":319},[217,15033,14730],{"class":323},[217,15035,7514],{"class":319},[217,15037,15038,15040,15042,15044,15047,15049,15052,15054,15056],{"class":219,"line":2687},[217,15039,14968],{"class":319},[217,15041,14081],{"class":223},[217,15043,2473],{"class":319},[217,15045,15046],{"class":227},"\"您的成績為 ",[217,15048,14978],{"class":237},[217,15050,15051],{"class":227}," ，不及格~再努力",[217,15053,14984],{"class":237},[217,15055,512],{"class":227},[217,15057,14989],{"class":319},[217,15059,15060],{"class":219,"line":2692},[217,15061,7911],{"class":319},[217,15063,15064],{"class":219,"line":2987},[217,15065,2990],{"class":319},[15,15067,15068],{},[47,15069,9590],{},[208,15071,15073],{"className":210,"code":15072,"language":212,"meta":213,"style":213},"請輸入分數：59.99\n您的成績為 59.99 ，不及格~再努力\n",[55,15074,15075,15080],{"__ignoreMap":213},[217,15076,15077],{"class":219,"line":220},[217,15078,15079],{"class":223},"請輸入分數：59.99\n",[217,15081,15082,15085,15088],{"class":219,"line":387},[217,15083,15084],{"class":223},"您的成績為",[217,15086,15087],{"class":237}," 59.99",[217,15089,15090],{"class":227}," ，不及格~再努力\n",[63,15092,15093],{"id":15093},"switch",[15,15095,15096],{},"也是一個判斷語法，會依不用結執行該段程式",[15,15098,15099],{},[47,15100,14348],{},[208,15102,15104],{"className":13927,"code":15103,"language":13929,"meta":213,"style":213},"switch (判斷式) {\n    case value1:\n        \u002F\u002F程式片段1\n    case value2:\n        \u002F\u002F程式片段2\n    default:\n        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n}\n    \n",[55,15105,15106,15113,15121,15126,15133,15138,15146,15151],{"__ignoreMap":213},[217,15107,15108,15110],{"class":219,"line":220},[217,15109,15093],{"class":323},[217,15111,15112],{"class":319}," (判斷式) {\n",[217,15114,15115,15118],{"class":219,"line":387},[217,15116,15117],{"class":323},"    case",[217,15119,15120],{"class":319}," value1:\n",[217,15122,15123],{"class":219,"line":410},[217,15124,15125],{"class":1521},"        \u002F\u002F程式片段1\n",[217,15127,15128,15130],{"class":219,"line":424},[217,15129,15117],{"class":323},[217,15131,15132],{"class":319}," value2:\n",[217,15134,15135],{"class":219,"line":441},[217,15136,15137],{"class":1521},"        \u002F\u002F程式片段2\n",[217,15139,15140,15143],{"class":219,"line":908},[217,15141,15142],{"class":323},"    default",[217,15144,15145],{"class":319},":\n",[217,15147,15148],{"class":219,"line":1560},[217,15149,15150],{"class":1521},"        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n",[217,15152,15153],{"class":219,"line":1566},[217,15154,2990],{"class":319},[15,15156,15157],{},[47,15158,11537],{},[208,15160,15162],{"className":13927,"code":15161,"language":13929,"meta":213,"style":213},"package main\n\nimport (\n    \"fmt\"\n    \"time\"\n)\n\nfunc main() {\n    now := time.Now()\n    week := now.Weekday()\n    switch week {\n    case 0:\n        fmt.Println(\"星期日\")\n    case 1:\n        fmt.Println(\"星期一\")\n    case 2:\n        fmt.Println(\"星期二\")\n    case 3:\n        fmt.Println(\"星期三\")\n    case 4:\n        fmt.Println(\"星期四\")\n    case 5:\n        fmt.Println(\"星期五\")\n    case 6:\n        fmt.Println(\"星期六\")\n    }\n}\n",[55,15163,15164,15170,15174,15181,15190,15199,15203,15207,15215,15230,15245,15253,15261,15274,15282,15295,15303,15316,15325,15338,15347,15360,15368,15381,15390,15403,15407],{"__ignoreMap":213},[217,15165,15166,15168],{"class":219,"line":220},[217,15167,13999],{"class":323},[217,15169,14002],{"class":223},[217,15171,15172],{"class":219,"line":387},[217,15173,896],{"emptyLinePlaceholder":895},[217,15175,15176,15178],{"class":219,"line":410},[217,15177,14007],{"class":323},[217,15179,15180],{"class":319}," (\n",[217,15182,15183,15186,15188],{"class":219,"line":424},[217,15184,15185],{"class":227},"    \"",[217,15187,14012],{"class":223},[217,15189,407],{"class":227},[217,15191,15192,15194,15197],{"class":219,"line":441},[217,15193,15185],{"class":227},[217,15195,15196],{"class":223},"time",[217,15198,407],{"class":227},[217,15200,15201],{"class":219,"line":908},[217,15202,877],{"class":319},[217,15204,15205],{"class":219,"line":1560},[217,15206,896],{"emptyLinePlaceholder":895},[217,15208,15209,15211,15213],{"class":219,"line":1566},[217,15210,13936],{"class":323},[217,15212,14021],{"class":223},[217,15214,7923],{"class":319},[217,15216,15217,15220,15222,15225,15228],{"class":219,"line":1660},[217,15218,15219],{"class":319},"    now ",[217,15221,14235],{"class":323},[217,15223,15224],{"class":319}," time.",[217,15226,15227],{"class":223},"Now",[217,15229,3125],{"class":319},[217,15231,15232,15235,15237,15240,15243],{"class":219,"line":1666},[217,15233,15234],{"class":319},"    week ",[217,15236,14235],{"class":323},[217,15238,15239],{"class":319}," now.",[217,15241,15242],{"class":223},"Weekday",[217,15244,3125],{"class":319},[217,15246,15247,15250],{"class":219,"line":1672},[217,15248,15249],{"class":323},"    switch",[217,15251,15252],{"class":319}," week {\n",[217,15254,15255,15257,15259],{"class":219,"line":1678},[217,15256,15117],{"class":323},[217,15258,6833],{"class":237},[217,15260,15145],{"class":319},[217,15262,15263,15265,15267,15269,15272],{"class":219,"line":1684},[217,15264,14968],{"class":319},[217,15266,14261],{"class":223},[217,15268,2473],{"class":319},[217,15270,15271],{"class":227},"\"星期日\"",[217,15273,877],{"class":319},[217,15275,15276,15278,15280],{"class":219,"line":1689},[217,15277,15117],{"class":323},[217,15279,2874],{"class":237},[217,15281,15145],{"class":319},[217,15283,15284,15286,15288,15290,15293],{"class":219,"line":2676},[217,15285,14968],{"class":319},[217,15287,14261],{"class":223},[217,15289,2473],{"class":319},[217,15291,15292],{"class":227},"\"星期一\"",[217,15294,877],{"class":319},[217,15296,15297,15299,15301],{"class":219,"line":2687},[217,15298,15117],{"class":323},[217,15300,8543],{"class":237},[217,15302,15145],{"class":319},[217,15304,15305,15307,15309,15311,15314],{"class":219,"line":2692},[217,15306,14968],{"class":319},[217,15308,14261],{"class":223},[217,15310,2473],{"class":319},[217,15312,15313],{"class":227},"\"星期二\"",[217,15315,877],{"class":319},[217,15317,15318,15320,15323],{"class":219,"line":2987},[217,15319,15117],{"class":323},[217,15321,15322],{"class":237}," 3",[217,15324,15145],{"class":319},[217,15326,15327,15329,15331,15333,15336],{"class":219,"line":2993},[217,15328,14968],{"class":319},[217,15330,14261],{"class":223},[217,15332,2473],{"class":319},[217,15334,15335],{"class":227},"\"星期三\"",[217,15337,877],{"class":319},[217,15339,15340,15342,15345],{"class":219,"line":2998},[217,15341,15117],{"class":323},[217,15343,15344],{"class":237}," 4",[217,15346,15145],{"class":319},[217,15348,15349,15351,15353,15355,15358],{"class":219,"line":3004},[217,15350,14968],{"class":319},[217,15352,14261],{"class":223},[217,15354,2473],{"class":319},[217,15356,15357],{"class":227},"\"星期四\"",[217,15359,877],{"class":319},[217,15361,15362,15364,15366],{"class":219,"line":6078},[217,15363,15117],{"class":323},[217,15365,7904],{"class":237},[217,15367,15145],{"class":319},[217,15369,15370,15372,15374,15376,15379],{"class":219,"line":6089},[217,15371,14968],{"class":319},[217,15373,14261],{"class":223},[217,15375,2473],{"class":319},[217,15377,15378],{"class":227},"\"星期五\"",[217,15380,877],{"class":319},[217,15382,15383,15385,15388],{"class":219,"line":6100},[217,15384,15117],{"class":323},[217,15386,15387],{"class":237}," 6",[217,15389,15145],{"class":319},[217,15391,15392,15394,15396,15398,15401],{"class":219,"line":6105},[217,15393,14968],{"class":319},[217,15395,14261],{"class":223},[217,15397,2473],{"class":319},[217,15399,15400],{"class":227},"\"星期六\"",[217,15402,877],{"class":319},[217,15404,15405],{"class":219,"line":6111},[217,15406,7911],{"class":319},[217,15408,15409],{"class":219,"line":6121},[217,15410,2990],{"class":319},[15,15412,15413],{},[47,15414,9590],{},[208,15416,15418],{"className":210,"code":15417,"language":212,"meta":213,"style":213},"星期二\n",[55,15419,15420],{"__ignoreMap":213},[217,15421,15422],{"class":219,"line":220},[217,15423,15417],{"class":223},[63,15425,15427],{"id":15426},"for-迴圈","for 迴圈",[15,15429,15430],{},[47,15431,15432],{},"基本格式",[208,15434,15436],{"className":13927,"code":15435,"language":13929,"meta":213,"style":213},"for 初始執行指令;布林判斷式;後執行指令 {\n    \u002F\u002F若布林判斷式為 true 則執行程式片段\n}\n",[55,15437,15438,15445,15450],{"__ignoreMap":213},[217,15439,15440,15442],{"class":219,"line":220},[217,15441,2866],{"class":323},[217,15443,15444],{"class":319}," 初始執行指令;布林判斷式;後執行指令 {\n",[217,15446,15447],{"class":219,"line":387},[217,15448,15449],{"class":1521},"    \u002F\u002F若布林判斷式為 true 則執行程式片段\n",[217,15451,15452],{"class":219,"line":410},[217,15453,2990],{"class":319},[15,15455,15456],{},[47,15457,11537],{},[208,15459,15461],{"className":13927,"code":15460,"language":13929,"meta":213,"style":213},"package main\nimport \"fmt\"\nfunc main() {\n    \u002F\u002F for 循環的基本形式\n    for i := 0; i \u003C 5; i++ {\n        fmt.Println(i)\n    }\n}\n",[55,15462,15463,15469,15479,15487,15492,15518,15527,15531],{"__ignoreMap":213},[217,15464,15465,15467],{"class":219,"line":220},[217,15466,13999],{"class":323},[217,15468,14002],{"class":223},[217,15470,15471,15473,15475,15477],{"class":219,"line":387},[217,15472,14007],{"class":323},[217,15474,401],{"class":227},[217,15476,14012],{"class":223},[217,15478,407],{"class":227},[217,15480,15481,15483,15485],{"class":219,"line":410},[217,15482,13936],{"class":323},[217,15484,14021],{"class":223},[217,15486,7923],{"class":319},[217,15488,15489],{"class":219,"line":424},[217,15490,15491],{"class":1521},"    \u002F\u002F for 循環的基本形式\n",[217,15493,15494,15497,15500,15502,15504,15507,15509,15511,15514,15516],{"class":219,"line":441},[217,15495,15496],{"class":323},"    for",[217,15498,15499],{"class":319}," i ",[217,15501,14235],{"class":323},[217,15503,6833],{"class":237},[217,15505,15506],{"class":319},"; i ",[217,15508,7267],{"class":323},[217,15510,7904],{"class":237},[217,15512,15513],{"class":319},"; i",[217,15515,2889],{"class":323},[217,15517,7514],{"class":319},[217,15519,15520,15522,15524],{"class":219,"line":908},[217,15521,14968],{"class":319},[217,15523,14261],{"class":223},[217,15525,15526],{"class":319},"(i)\n",[217,15528,15529],{"class":219,"line":1560},[217,15530,7911],{"class":319},[217,15532,15533],{"class":219,"line":1566},[217,15534,2990],{"class":319},[15,15536,15537],{},"九九乘法",[208,15539,15541],{"className":13927,"code":15540,"language":13929,"meta":213,"style":213},"package main\nimport \"fmt\"\n\nfunc main() {\n    var x int\n    var y int\n    for x = 2; x \u003C= 9; x++ {\n        for y = 1; y \u003C= 9; y++ {\n            var z int = x * y\n            fmt.Printf(\"%d X %d = %d\\n\", x, y, z)\n        }\n        fmt.Println(\"==============\")\n    }\n}\n",[55,15542,15543,15549,15559,15563,15571,15580,15588,15613,15638,15657,15687,15691,15704,15708],{"__ignoreMap":213},[217,15544,15545,15547],{"class":219,"line":220},[217,15546,13999],{"class":323},[217,15548,14002],{"class":223},[217,15550,15551,15553,15555,15557],{"class":219,"line":387},[217,15552,14007],{"class":323},[217,15554,401],{"class":227},[217,15556,14012],{"class":223},[217,15558,407],{"class":227},[217,15560,15561],{"class":219,"line":410},[217,15562,896],{"emptyLinePlaceholder":895},[217,15564,15565,15567,15569],{"class":219,"line":424},[217,15566,13936],{"class":323},[217,15568,14021],{"class":223},[217,15570,7923],{"class":319},[217,15572,15573,15575,15577],{"class":219,"line":441},[217,15574,14457],{"class":323},[217,15576,14312],{"class":319},[217,15578,15579],{"class":323},"int\n",[217,15581,15582,15584,15586],{"class":219,"line":908},[217,15583,14457],{"class":323},[217,15585,14317],{"class":319},[217,15587,15579],{"class":323},[217,15589,15590,15592,15594,15596,15598,15601,15603,15606,15609,15611],{"class":219,"line":1560},[217,15591,15496],{"class":323},[217,15593,14312],{"class":319},[217,15595,854],{"class":323},[217,15597,8543],{"class":237},[217,15599,15600],{"class":319},"; x ",[217,15602,2880],{"class":323},[217,15604,15605],{"class":237}," 9",[217,15607,15608],{"class":319},"; x",[217,15610,2889],{"class":323},[217,15612,7514],{"class":319},[217,15614,15615,15618,15620,15622,15624,15627,15629,15631,15634,15636],{"class":219,"line":1566},[217,15616,15617],{"class":323},"        for",[217,15619,14317],{"class":319},[217,15621,854],{"class":323},[217,15623,2874],{"class":237},[217,15625,15626],{"class":319},"; y ",[217,15628,2880],{"class":323},[217,15630,15605],{"class":237},[217,15632,15633],{"class":319},"; y",[217,15635,2889],{"class":323},[217,15637,7514],{"class":319},[217,15639,15640,15643,15646,15648,15650,15652,15654],{"class":219,"line":1660},[217,15641,15642],{"class":323},"            var",[217,15644,15645],{"class":319}," z ",[217,15647,14303],{"class":323},[217,15649,330],{"class":323},[217,15651,14312],{"class":319},[217,15653,8756],{"class":323},[217,15655,15656],{"class":319}," y\n",[217,15658,15659,15662,15664,15666,15668,15671,15674,15676,15679,15682,15684],{"class":219,"line":1666},[217,15660,15661],{"class":319},"            fmt.",[217,15663,14081],{"class":223},[217,15665,2473],{"class":319},[217,15667,512],{"class":227},[217,15669,15670],{"class":237},"%d",[217,15672,15673],{"class":227}," X ",[217,15675,15670],{"class":237},[217,15677,15678],{"class":227}," = ",[217,15680,15681],{"class":237},"%d\\n",[217,15683,512],{"class":227},[217,15685,15686],{"class":319},", x, y, z)\n",[217,15688,15689],{"class":219,"line":1672},[217,15690,8029],{"class":319},[217,15692,15693,15695,15697,15699,15702],{"class":219,"line":1678},[217,15694,14968],{"class":319},[217,15696,14261],{"class":223},[217,15698,2473],{"class":319},[217,15700,15701],{"class":227},"\"==============\"",[217,15703,877],{"class":319},[217,15705,15706],{"class":219,"line":1684},[217,15707,7911],{"class":319},[217,15709,15710],{"class":219,"line":1689},[217,15711,2990],{"class":319},[15,15713,15714],{},[47,15715,9590],{},[208,15717,15719],{"className":210,"code":15718,"language":212,"meta":213,"style":213},"2 X 1 = 2\n2 X 2 = 4\n2 X 3 = 6\n2 X 4 = 8\n2 X 5 = 10\n2 X 6 = 12\n2 X 7 = 14\n2 X 8 = 16\n2 X 9 = 18\n==============\n3 X 1 = 3\n3 X 2 = 6\n3 X 3 = 9\n3 X 4 = 12\n3 X 5 = 15\n3 X 6 = 18\n3 X 7 = 21\n3 X 8 = 24\n3 X 9 = 27\n==============\n4 X 1 = 4\n4 X 2 = 8\n4 X 3 = 12\n4 X 4 = 16\n4 X 5 = 20\n4 X 6 = 24\n4 X 7 = 28\n4 X 8 = 32\n4 X 9 = 36\n==============\n5 X 1 = 5\n5 X 2 = 10\n5 X 3 = 15\n5 X 4 = 20\n5 X 5 = 25\n5 X 6 = 30\n5 X 7 = 35\n5 X 8 = 40\n5 X 9 = 45\n==============\n6 X 1 = 6\n6 X 2 = 12\n6 X 3 = 18\n6 X 4 = 24\n6 X 5 = 30\n6 X 6 = 36\n6 X 7 = 42\n6 X 8 = 48\n6 X 9 = 54\n==============\n7 X 1 = 7\n7 X 2 = 14\n7 X 3 = 21\n7 X 4 = 28\n7 X 5 = 35\n7 X 6 = 42\n7 X 7 = 49\n7 X 8 = 56\n7 X 9 = 63\n==============\n8 X 1 = 8\n8 X 2 = 16\n8 X 3 = 24\n8 X 4 = 32\n8 X 5 = 40\n8 X 6 = 48\n8 X 7 = 56\n8 X 8 = 64\n8 X 9 = 72\n==============\n9 X 1 = 9\n9 X 2 = 18\n9 X 3 = 27\n9 X 4 = 36\n9 X 5 = 45\n9 X 6 = 54\n9 X 7 = 63\n9 X 8 = 72\n9 X 9 = 81\n==============\n",[55,15720,15721,15735,15748,15761,15774,15787,15800,15814,15828,15841,15846,15858,15870,15883,15895,15908,15920,15933,15946,15959,15963,15975,15987,15999,16011,16024,16036,16049,16062,16075,16079,16091,16103,16115,16127,16140,16153,16166,16179,16192,16196,16209,16221,16233,16245,16257,16269,16282,16295,16308,16312,16324,16336,16348,16360,16372,16384,16397,16410,16423,16427,16440,16452,16464,16476,16488,16500,16512,16525,16538,16542,16555,16567,16579,16591,16603,16615,16627,16639,16652],{"__ignoreMap":213},[217,15722,15723,15725,15728,15730,15732],{"class":219,"line":220},[217,15724,2967],{"class":223},[217,15726,15727],{"class":227}," X",[217,15729,2874],{"class":237},[217,15731,330],{"class":227},[217,15733,15734],{"class":237}," 2\n",[217,15736,15737,15739,15741,15743,15745],{"class":219,"line":387},[217,15738,2967],{"class":223},[217,15740,15727],{"class":227},[217,15742,8543],{"class":237},[217,15744,330],{"class":227},[217,15746,15747],{"class":237}," 4\n",[217,15749,15750,15752,15754,15756,15758],{"class":219,"line":410},[217,15751,2967],{"class":223},[217,15753,15727],{"class":227},[217,15755,15322],{"class":237},[217,15757,330],{"class":227},[217,15759,15760],{"class":237}," 6\n",[217,15762,15763,15765,15767,15769,15771],{"class":219,"line":424},[217,15764,2967],{"class":223},[217,15766,15727],{"class":227},[217,15768,15344],{"class":237},[217,15770,330],{"class":227},[217,15772,15773],{"class":237}," 8\n",[217,15775,15776,15778,15780,15782,15784],{"class":219,"line":441},[217,15777,2967],{"class":223},[217,15779,15727],{"class":227},[217,15781,7904],{"class":237},[217,15783,330],{"class":227},[217,15785,15786],{"class":237}," 10\n",[217,15788,15789,15791,15793,15795,15797],{"class":219,"line":908},[217,15790,2967],{"class":223},[217,15792,15727],{"class":227},[217,15794,15387],{"class":237},[217,15796,330],{"class":227},[217,15798,15799],{"class":237}," 12\n",[217,15801,15802,15804,15806,15809,15811],{"class":219,"line":1560},[217,15803,2967],{"class":223},[217,15805,15727],{"class":227},[217,15807,15808],{"class":237}," 7",[217,15810,330],{"class":227},[217,15812,15813],{"class":237}," 14\n",[217,15815,15816,15818,15820,15823,15825],{"class":219,"line":1566},[217,15817,2967],{"class":223},[217,15819,15727],{"class":227},[217,15821,15822],{"class":237}," 8",[217,15824,330],{"class":227},[217,15826,15827],{"class":237}," 16\n",[217,15829,15830,15832,15834,15836,15838],{"class":219,"line":1660},[217,15831,2967],{"class":223},[217,15833,15727],{"class":227},[217,15835,15605],{"class":237},[217,15837,330],{"class":227},[217,15839,15840],{"class":237}," 18\n",[217,15842,15843],{"class":219,"line":1666},[217,15844,15845],{"class":227},"==============\n",[217,15847,15848,15850,15852,15854,15856],{"class":219,"line":1672},[217,15849,14251],{"class":223},[217,15851,15727],{"class":227},[217,15853,2874],{"class":237},[217,15855,330],{"class":227},[217,15857,4282],{"class":237},[217,15859,15860,15862,15864,15866,15868],{"class":219,"line":1678},[217,15861,14251],{"class":223},[217,15863,15727],{"class":227},[217,15865,8543],{"class":237},[217,15867,330],{"class":227},[217,15869,15760],{"class":237},[217,15871,15872,15874,15876,15878,15880],{"class":219,"line":1684},[217,15873,14251],{"class":223},[217,15875,15727],{"class":227},[217,15877,15322],{"class":237},[217,15879,330],{"class":227},[217,15881,15882],{"class":237}," 9\n",[217,15884,15885,15887,15889,15891,15893],{"class":219,"line":1689},[217,15886,14251],{"class":223},[217,15888,15727],{"class":227},[217,15890,15344],{"class":237},[217,15892,330],{"class":227},[217,15894,15799],{"class":237},[217,15896,15897,15899,15901,15903,15905],{"class":219,"line":2676},[217,15898,14251],{"class":223},[217,15900,15727],{"class":227},[217,15902,7904],{"class":237},[217,15904,330],{"class":227},[217,15906,15907],{"class":237}," 15\n",[217,15909,15910,15912,15914,15916,15918],{"class":219,"line":2687},[217,15911,14251],{"class":223},[217,15913,15727],{"class":227},[217,15915,15387],{"class":237},[217,15917,330],{"class":227},[217,15919,15840],{"class":237},[217,15921,15922,15924,15926,15928,15930],{"class":219,"line":2692},[217,15923,14251],{"class":223},[217,15925,15727],{"class":227},[217,15927,15808],{"class":237},[217,15929,330],{"class":227},[217,15931,15932],{"class":237}," 21\n",[217,15934,15935,15937,15939,15941,15943],{"class":219,"line":2987},[217,15936,14251],{"class":223},[217,15938,15727],{"class":227},[217,15940,15822],{"class":237},[217,15942,330],{"class":227},[217,15944,15945],{"class":237}," 24\n",[217,15947,15948,15950,15952,15954,15956],{"class":219,"line":2993},[217,15949,14251],{"class":223},[217,15951,15727],{"class":227},[217,15953,15605],{"class":237},[217,15955,330],{"class":227},[217,15957,15958],{"class":237}," 27\n",[217,15960,15961],{"class":219,"line":2998},[217,15962,15845],{"class":227},[217,15964,15965,15967,15969,15971,15973],{"class":219,"line":3004},[217,15966,3461],{"class":223},[217,15968,15727],{"class":227},[217,15970,2874],{"class":237},[217,15972,330],{"class":227},[217,15974,15747],{"class":237},[217,15976,15977,15979,15981,15983,15985],{"class":219,"line":6078},[217,15978,3461],{"class":223},[217,15980,15727],{"class":227},[217,15982,8543],{"class":237},[217,15984,330],{"class":227},[217,15986,15773],{"class":237},[217,15988,15989,15991,15993,15995,15997],{"class":219,"line":6089},[217,15990,3461],{"class":223},[217,15992,15727],{"class":227},[217,15994,15322],{"class":237},[217,15996,330],{"class":227},[217,15998,15799],{"class":237},[217,16000,16001,16003,16005,16007,16009],{"class":219,"line":6100},[217,16002,3461],{"class":223},[217,16004,15727],{"class":227},[217,16006,15344],{"class":237},[217,16008,330],{"class":227},[217,16010,15827],{"class":237},[217,16012,16013,16015,16017,16019,16021],{"class":219,"line":6105},[217,16014,3461],{"class":223},[217,16016,15727],{"class":227},[217,16018,7904],{"class":237},[217,16020,330],{"class":227},[217,16022,16023],{"class":237}," 20\n",[217,16025,16026,16028,16030,16032,16034],{"class":219,"line":6111},[217,16027,3461],{"class":223},[217,16029,15727],{"class":227},[217,16031,15387],{"class":237},[217,16033,330],{"class":227},[217,16035,15945],{"class":237},[217,16037,16038,16040,16042,16044,16046],{"class":219,"line":6121},[217,16039,3461],{"class":223},[217,16041,15727],{"class":227},[217,16043,15808],{"class":237},[217,16045,330],{"class":227},[217,16047,16048],{"class":237}," 28\n",[217,16050,16051,16053,16055,16057,16059],{"class":219,"line":6135},[217,16052,3461],{"class":223},[217,16054,15727],{"class":227},[217,16056,15822],{"class":237},[217,16058,330],{"class":227},[217,16060,16061],{"class":237}," 32\n",[217,16063,16064,16066,16068,16070,16072],{"class":219,"line":6140},[217,16065,3461],{"class":223},[217,16067,15727],{"class":227},[217,16069,15605],{"class":237},[217,16071,330],{"class":227},[217,16073,16074],{"class":237}," 36\n",[217,16076,16077],{"class":219,"line":6146},[217,16078,15845],{"class":227},[217,16080,16081,16083,16085,16087,16089],{"class":219,"line":6159},[217,16082,2647],{"class":223},[217,16084,15727],{"class":227},[217,16086,2874],{"class":237},[217,16088,330],{"class":227},[217,16090,4216],{"class":237},[217,16092,16093,16095,16097,16099,16101],{"class":219,"line":6170},[217,16094,2647],{"class":223},[217,16096,15727],{"class":227},[217,16098,8543],{"class":237},[217,16100,330],{"class":227},[217,16102,15786],{"class":237},[217,16104,16105,16107,16109,16111,16113],{"class":219,"line":6181},[217,16106,2647],{"class":223},[217,16108,15727],{"class":227},[217,16110,15322],{"class":237},[217,16112,330],{"class":227},[217,16114,15907],{"class":237},[217,16116,16117,16119,16121,16123,16125],{"class":219,"line":8099},[217,16118,2647],{"class":223},[217,16120,15727],{"class":227},[217,16122,15344],{"class":237},[217,16124,330],{"class":227},[217,16126,16023],{"class":237},[217,16128,16129,16131,16133,16135,16137],{"class":219,"line":8131},[217,16130,2647],{"class":223},[217,16132,15727],{"class":227},[217,16134,7904],{"class":237},[217,16136,330],{"class":227},[217,16138,16139],{"class":237}," 25\n",[217,16141,16142,16144,16146,16148,16150],{"class":219,"line":8142},[217,16143,2647],{"class":223},[217,16145,15727],{"class":227},[217,16147,15387],{"class":237},[217,16149,330],{"class":227},[217,16151,16152],{"class":237}," 30\n",[217,16154,16155,16157,16159,16161,16163],{"class":219,"line":8153},[217,16156,2647],{"class":223},[217,16158,15727],{"class":227},[217,16160,15808],{"class":237},[217,16162,330],{"class":227},[217,16164,16165],{"class":237}," 35\n",[217,16167,16168,16170,16172,16174,16176],{"class":219,"line":8164},[217,16169,2647],{"class":223},[217,16171,15727],{"class":227},[217,16173,15822],{"class":237},[217,16175,330],{"class":227},[217,16177,16178],{"class":237}," 40\n",[217,16180,16181,16183,16185,16187,16189],{"class":219,"line":8175},[217,16182,2647],{"class":223},[217,16184,15727],{"class":227},[217,16186,15605],{"class":237},[217,16188,330],{"class":227},[217,16190,16191],{"class":237}," 45\n",[217,16193,16194],{"class":219,"line":8186},[217,16195,15845],{"class":227},[217,16197,16198,16201,16203,16205,16207],{"class":219,"line":8198},[217,16199,16200],{"class":223},"6",[217,16202,15727],{"class":227},[217,16204,2874],{"class":237},[217,16206,330],{"class":227},[217,16208,15760],{"class":237},[217,16210,16211,16213,16215,16217,16219],{"class":219,"line":8203},[217,16212,16200],{"class":223},[217,16214,15727],{"class":227},[217,16216,8543],{"class":237},[217,16218,330],{"class":227},[217,16220,15799],{"class":237},[217,16222,16223,16225,16227,16229,16231],{"class":219,"line":8208},[217,16224,16200],{"class":223},[217,16226,15727],{"class":227},[217,16228,15322],{"class":237},[217,16230,330],{"class":227},[217,16232,15840],{"class":237},[217,16234,16235,16237,16239,16241,16243],{"class":219,"line":8215},[217,16236,16200],{"class":223},[217,16238,15727],{"class":227},[217,16240,15344],{"class":237},[217,16242,330],{"class":227},[217,16244,15945],{"class":237},[217,16246,16247,16249,16251,16253,16255],{"class":219,"line":8226},[217,16248,16200],{"class":223},[217,16250,15727],{"class":227},[217,16252,7904],{"class":237},[217,16254,330],{"class":227},[217,16256,16152],{"class":237},[217,16258,16259,16261,16263,16265,16267],{"class":219,"line":8251},[217,16260,16200],{"class":223},[217,16262,15727],{"class":227},[217,16264,15387],{"class":237},[217,16266,330],{"class":227},[217,16268,16074],{"class":237},[217,16270,16271,16273,16275,16277,16279],{"class":219,"line":8256},[217,16272,16200],{"class":223},[217,16274,15727],{"class":227},[217,16276,15808],{"class":237},[217,16278,330],{"class":227},[217,16280,16281],{"class":237}," 42\n",[217,16283,16284,16286,16288,16290,16292],{"class":219,"line":8261},[217,16285,16200],{"class":223},[217,16287,15727],{"class":227},[217,16289,15822],{"class":237},[217,16291,330],{"class":227},[217,16293,16294],{"class":237}," 48\n",[217,16296,16297,16299,16301,16303,16305],{"class":219,"line":8268},[217,16298,16200],{"class":223},[217,16300,15727],{"class":227},[217,16302,15605],{"class":237},[217,16304,330],{"class":227},[217,16306,16307],{"class":237}," 54\n",[217,16309,16310],{"class":219,"line":8281},[217,16311,15845],{"class":227},[217,16313,16314,16316,16318,16320,16322],{"class":219,"line":8286},[217,16315,9486],{"class":223},[217,16317,15727],{"class":227},[217,16319,2874],{"class":237},[217,16321,330],{"class":227},[217,16323,4141],{"class":237},[217,16325,16326,16328,16330,16332,16334],{"class":219,"line":8291},[217,16327,9486],{"class":223},[217,16329,15727],{"class":227},[217,16331,8543],{"class":237},[217,16333,330],{"class":227},[217,16335,15813],{"class":237},[217,16337,16338,16340,16342,16344,16346],{"class":219,"line":8296},[217,16339,9486],{"class":223},[217,16341,15727],{"class":227},[217,16343,15322],{"class":237},[217,16345,330],{"class":227},[217,16347,15932],{"class":237},[217,16349,16350,16352,16354,16356,16358],{"class":219,"line":8306},[217,16351,9486],{"class":223},[217,16353,15727],{"class":227},[217,16355,15344],{"class":237},[217,16357,330],{"class":227},[217,16359,16048],{"class":237},[217,16361,16362,16364,16366,16368,16370],{"class":219,"line":8347},[217,16363,9486],{"class":223},[217,16365,15727],{"class":227},[217,16367,7904],{"class":237},[217,16369,330],{"class":227},[217,16371,16165],{"class":237},[217,16373,16374,16376,16378,16380,16382],{"class":219,"line":8358},[217,16375,9486],{"class":223},[217,16377,15727],{"class":227},[217,16379,15387],{"class":237},[217,16381,330],{"class":227},[217,16383,16281],{"class":237},[217,16385,16386,16388,16390,16392,16394],{"class":219,"line":8369},[217,16387,9486],{"class":223},[217,16389,15727],{"class":227},[217,16391,15808],{"class":237},[217,16393,330],{"class":227},[217,16395,16396],{"class":237}," 49\n",[217,16398,16399,16401,16403,16405,16407],{"class":219,"line":8380},[217,16400,9486],{"class":223},[217,16402,15727],{"class":227},[217,16404,15822],{"class":237},[217,16406,330],{"class":227},[217,16408,16409],{"class":237}," 56\n",[217,16411,16412,16414,16416,16418,16420],{"class":219,"line":8391},[217,16413,9486],{"class":223},[217,16415,15727],{"class":227},[217,16417,15605],{"class":237},[217,16419,330],{"class":227},[217,16421,16422],{"class":237}," 63\n",[217,16424,16425],{"class":219,"line":8402},[217,16426,15845],{"class":227},[217,16428,16429,16432,16434,16436,16438],{"class":219,"line":8413},[217,16430,16431],{"class":223},"8",[217,16433,15727],{"class":227},[217,16435,2874],{"class":237},[217,16437,330],{"class":227},[217,16439,15773],{"class":237},[217,16441,16442,16444,16446,16448,16450],{"class":219,"line":8426},[217,16443,16431],{"class":223},[217,16445,15727],{"class":227},[217,16447,8543],{"class":237},[217,16449,330],{"class":227},[217,16451,15827],{"class":237},[217,16453,16454,16456,16458,16460,16462],{"class":219,"line":8431},[217,16455,16431],{"class":223},[217,16457,15727],{"class":227},[217,16459,15322],{"class":237},[217,16461,330],{"class":227},[217,16463,15945],{"class":237},[217,16465,16466,16468,16470,16472,16474],{"class":219,"line":8436},[217,16467,16431],{"class":223},[217,16469,15727],{"class":227},[217,16471,15344],{"class":237},[217,16473,330],{"class":227},[217,16475,16061],{"class":237},[217,16477,16478,16480,16482,16484,16486],{"class":219,"line":8443},[217,16479,16431],{"class":223},[217,16481,15727],{"class":227},[217,16483,7904],{"class":237},[217,16485,330],{"class":227},[217,16487,16178],{"class":237},[217,16489,16490,16492,16494,16496,16498],{"class":219,"line":8454},[217,16491,16431],{"class":223},[217,16493,15727],{"class":227},[217,16495,15387],{"class":237},[217,16497,330],{"class":227},[217,16499,16294],{"class":237},[217,16501,16502,16504,16506,16508,16510],{"class":219,"line":8479},[217,16503,16431],{"class":223},[217,16505,15727],{"class":227},[217,16507,15808],{"class":237},[217,16509,330],{"class":227},[217,16511,16409],{"class":237},[217,16513,16514,16516,16518,16520,16522],{"class":219,"line":8484},[217,16515,16431],{"class":223},[217,16517,15727],{"class":227},[217,16519,15822],{"class":237},[217,16521,330],{"class":227},[217,16523,16524],{"class":237}," 64\n",[217,16526,16527,16529,16531,16533,16535],{"class":219,"line":8489},[217,16528,16431],{"class":223},[217,16530,15727],{"class":227},[217,16532,15605],{"class":237},[217,16534,330],{"class":227},[217,16536,16537],{"class":237}," 72\n",[217,16539,16540],{"class":219,"line":8496},[217,16541,15845],{"class":227},[217,16543,16544,16547,16549,16551,16553],{"class":219,"line":8509},[217,16545,16546],{"class":223},"9",[217,16548,15727],{"class":227},[217,16550,2874],{"class":237},[217,16552,330],{"class":227},[217,16554,15882],{"class":237},[217,16556,16557,16559,16561,16563,16565],{"class":219,"line":8514},[217,16558,16546],{"class":223},[217,16560,15727],{"class":227},[217,16562,8543],{"class":237},[217,16564,330],{"class":227},[217,16566,15840],{"class":237},[217,16568,16569,16571,16573,16575,16577],{"class":219,"line":8519},[217,16570,16546],{"class":223},[217,16572,15727],{"class":227},[217,16574,15322],{"class":237},[217,16576,330],{"class":227},[217,16578,15958],{"class":237},[217,16580,16581,16583,16585,16587,16589],{"class":219,"line":8524},[217,16582,16546],{"class":223},[217,16584,15727],{"class":227},[217,16586,15344],{"class":237},[217,16588,330],{"class":227},[217,16590,16074],{"class":237},[217,16592,16593,16595,16597,16599,16601],{"class":219,"line":8575},[217,16594,16546],{"class":223},[217,16596,15727],{"class":227},[217,16598,7904],{"class":237},[217,16600,330],{"class":227},[217,16602,16191],{"class":237},[217,16604,16605,16607,16609,16611,16613],{"class":219,"line":8588},[217,16606,16546],{"class":223},[217,16608,15727],{"class":227},[217,16610,15387],{"class":237},[217,16612,330],{"class":227},[217,16614,16307],{"class":237},[217,16616,16617,16619,16621,16623,16625],{"class":219,"line":8600},[217,16618,16546],{"class":223},[217,16620,15727],{"class":227},[217,16622,15808],{"class":237},[217,16624,330],{"class":227},[217,16626,16422],{"class":237},[217,16628,16629,16631,16633,16635,16637],{"class":219,"line":8605},[217,16630,16546],{"class":223},[217,16632,15727],{"class":227},[217,16634,15822],{"class":237},[217,16636,330],{"class":227},[217,16638,16537],{"class":237},[217,16640,16641,16643,16645,16647,16649],{"class":219,"line":8616},[217,16642,16546],{"class":223},[217,16644,15727],{"class":227},[217,16646,15605],{"class":237},[217,16648,330],{"class":227},[217,16650,16651],{"class":237}," 81\n",[217,16653,16654],{"class":219,"line":8647},[217,16655,15845],{"class":227},[1103,16657,16658],{"id":16658},"break",[15,16660,16661],{},"用於跳出整個迴圈，結束迴圈的執行",[208,16663,16665],{"className":13927,"code":16664,"language":13929,"meta":213,"style":213},"package main\n\nimport (\n    \"fmt\"\n    \"math\u002Frand\"\n    \"time\"\n)\n\nfunc main() {\n\n    var index int\n\n    for index = 0; index \u003C 10; index++ {\n\n        seed := rand.NewSource(time.Now().UnixNano())\n\n        rNum := rand.New(seed)\n\n        num := rNum.Intn(100)\n\n        if num > 60 {\n            break\n        }\n\n        fmt.Println(index, num)\n    }\n}\n",[55,16666,16667,16673,16677,16683,16691,16700,16708,16712,16716,16724,16728,16737,16741,16765,16769,16796,16800,16815,16819,16838,16842,16855,16860,16864,16868,16877,16881],{"__ignoreMap":213},[217,16668,16669,16671],{"class":219,"line":220},[217,16670,13999],{"class":323},[217,16672,14002],{"class":223},[217,16674,16675],{"class":219,"line":387},[217,16676,896],{"emptyLinePlaceholder":895},[217,16678,16679,16681],{"class":219,"line":410},[217,16680,14007],{"class":323},[217,16682,15180],{"class":319},[217,16684,16685,16687,16689],{"class":219,"line":424},[217,16686,15185],{"class":227},[217,16688,14012],{"class":223},[217,16690,407],{"class":227},[217,16692,16693,16695,16698],{"class":219,"line":441},[217,16694,15185],{"class":227},[217,16696,16697],{"class":223},"math\u002Frand",[217,16699,407],{"class":227},[217,16701,16702,16704,16706],{"class":219,"line":908},[217,16703,15185],{"class":227},[217,16705,15196],{"class":223},[217,16707,407],{"class":227},[217,16709,16710],{"class":219,"line":1560},[217,16711,877],{"class":319},[217,16713,16714],{"class":219,"line":1566},[217,16715,896],{"emptyLinePlaceholder":895},[217,16717,16718,16720,16722],{"class":219,"line":1660},[217,16719,13936],{"class":323},[217,16721,14021],{"class":223},[217,16723,7923],{"class":319},[217,16725,16726],{"class":219,"line":1666},[217,16727,896],{"emptyLinePlaceholder":895},[217,16729,16730,16732,16735],{"class":219,"line":1672},[217,16731,14457],{"class":323},[217,16733,16734],{"class":319}," index ",[217,16736,15579],{"class":323},[217,16738,16739],{"class":219,"line":1678},[217,16740,896],{"emptyLinePlaceholder":895},[217,16742,16743,16745,16747,16749,16751,16754,16756,16758,16761,16763],{"class":219,"line":1684},[217,16744,15496],{"class":323},[217,16746,16734],{"class":319},[217,16748,854],{"class":323},[217,16750,6833],{"class":237},[217,16752,16753],{"class":319},"; index ",[217,16755,7267],{"class":323},[217,16757,6697],{"class":237},[217,16759,16760],{"class":319},"; index",[217,16762,2889],{"class":323},[217,16764,7514],{"class":319},[217,16766,16767],{"class":219,"line":1689},[217,16768,896],{"emptyLinePlaceholder":895},[217,16770,16771,16774,16776,16779,16782,16785,16787,16790,16793],{"class":219,"line":2676},[217,16772,16773],{"class":319},"        seed ",[217,16775,14235],{"class":323},[217,16777,16778],{"class":319}," rand.",[217,16780,16781],{"class":223},"NewSource",[217,16783,16784],{"class":319},"(time.",[217,16786,15227],{"class":223},[217,16788,16789],{"class":319},"().",[217,16791,16792],{"class":223},"UnixNano",[217,16794,16795],{"class":319},"())\n",[217,16797,16798],{"class":219,"line":2687},[217,16799,896],{"emptyLinePlaceholder":895},[217,16801,16802,16805,16807,16809,16812],{"class":219,"line":2692},[217,16803,16804],{"class":319},"        rNum ",[217,16806,14235],{"class":323},[217,16808,16778],{"class":319},[217,16810,16811],{"class":223},"New",[217,16813,16814],{"class":319},"(seed)\n",[217,16816,16817],{"class":219,"line":2987},[217,16818,896],{"emptyLinePlaceholder":895},[217,16820,16821,16824,16826,16829,16832,16834,16836],{"class":219,"line":2993},[217,16822,16823],{"class":319},"        num ",[217,16825,14235],{"class":323},[217,16827,16828],{"class":319}," rNum.",[217,16830,16831],{"class":223},"Intn",[217,16833,2473],{"class":319},[217,16835,2981],{"class":237},[217,16837,877],{"class":319},[217,16839,16840],{"class":219,"line":2998},[217,16841,896],{"emptyLinePlaceholder":895},[217,16843,16844,16846,16849,16851,16853],{"class":219,"line":3004},[217,16845,7987],{"class":323},[217,16847,16848],{"class":319}," num ",[217,16850,567],{"class":323},[217,16852,8556],{"class":237},[217,16854,7514],{"class":319},[217,16856,16857],{"class":219,"line":6078},[217,16858,16859],{"class":323},"            break\n",[217,16861,16862],{"class":219,"line":6089},[217,16863,8029],{"class":319},[217,16865,16866],{"class":219,"line":6100},[217,16867,896],{"emptyLinePlaceholder":895},[217,16869,16870,16872,16874],{"class":219,"line":6105},[217,16871,14968],{"class":319},[217,16873,14261],{"class":223},[217,16875,16876],{"class":319},"(index, num)\n",[217,16878,16879],{"class":219,"line":6111},[217,16880,7911],{"class":319},[217,16882,16883],{"class":219,"line":6121},[217,16884,2990],{"class":319},[15,16886,16887],{},[47,16888,9590],{},[208,16890,16892],{"className":210,"code":16891,"language":212,"meta":213,"style":213},"0 26\n1 19\n2 59\n3 45\n4 14\n5 25\n6 50\n7 14\n",[55,16893,16894,16901,16908,16915,16921,16927,16933,16940],{"__ignoreMap":213},[217,16895,16896,16898],{"class":219,"line":220},[217,16897,2915],{"class":223},[217,16899,16900],{"class":237}," 26\n",[217,16902,16903,16905],{"class":219,"line":387},[217,16904,2481],{"class":223},[217,16906,16907],{"class":237}," 19\n",[217,16909,16910,16912],{"class":219,"line":410},[217,16911,2967],{"class":223},[217,16913,16914],{"class":237}," 59\n",[217,16916,16917,16919],{"class":219,"line":424},[217,16918,14251],{"class":223},[217,16920,16191],{"class":237},[217,16922,16923,16925],{"class":219,"line":441},[217,16924,3461],{"class":223},[217,16926,15813],{"class":237},[217,16928,16929,16931],{"class":219,"line":908},[217,16930,2647],{"class":223},[217,16932,16139],{"class":237},[217,16934,16935,16937],{"class":219,"line":1560},[217,16936,16200],{"class":223},[217,16938,16939],{"class":237}," 50\n",[217,16941,16942,16944],{"class":219,"line":1566},[217,16943,9486],{"class":223},[217,16945,15813],{"class":237},[1103,16947,16948],{"id":16948},"continue",[15,16950,16951],{},"用於跳過當前迴圈的剩餘部分，直接進入下一次迴圈的執行",[208,16953,16955],{"className":13927,"code":16954,"language":13929,"meta":213,"style":213},"package main\n\nimport (\n    \"fmt\"\n    \"math\u002Frand\"\n    \"time\"\n)\n\nconst (\n    RED   = \"\\x1b[31m\"\n    GREEN = \"\\x1b[32m\"\n    RESET = \"\\x1b[0m\"\n)\n\nfunc main() {\n    var index int\n    for index = 0; index \u003C 10; index++ {\n        seed := rand.NewSource(time.Now().UnixNano())\n        rNum := rand.New(seed)\n        num := rNum.Intn(100)\n\n        if num \u003C 60 {\n            fmt.Printf(\"%d 號學生的分數為 %d %s不及格%s\\n\", index, num, RED, RESET)\n            continue\n        }\n\n        fmt.Printf(\"%d 號學生的分數為 %d，%s恭喜級格了%s\\n\", index, num, GREEN, RESET)\n    }\n\n}\n",[55,16956,16957,16963,16967,16973,16981,16989,16997,17001,17005,17011,17027,17041,17055,17059,17063,17071,17079,17101,17121,17133,17149,17153,17165,17196,17201,17205,17209,17240,17244,17248],{"__ignoreMap":213},[217,16958,16959,16961],{"class":219,"line":220},[217,16960,13999],{"class":323},[217,16962,14002],{"class":223},[217,16964,16965],{"class":219,"line":387},[217,16966,896],{"emptyLinePlaceholder":895},[217,16968,16969,16971],{"class":219,"line":410},[217,16970,14007],{"class":323},[217,16972,15180],{"class":319},[217,16974,16975,16977,16979],{"class":219,"line":424},[217,16976,15185],{"class":227},[217,16978,14012],{"class":223},[217,16980,407],{"class":227},[217,16982,16983,16985,16987],{"class":219,"line":441},[217,16984,15185],{"class":227},[217,16986,16697],{"class":223},[217,16988,407],{"class":227},[217,16990,16991,16993,16995],{"class":219,"line":908},[217,16992,15185],{"class":227},[217,16994,15196],{"class":223},[217,16996,407],{"class":227},[217,16998,16999],{"class":219,"line":1560},[217,17000,877],{"class":319},[217,17002,17003],{"class":219,"line":1566},[217,17004,896],{"emptyLinePlaceholder":895},[217,17006,17007,17009],{"class":219,"line":1660},[217,17008,7694],{"class":323},[217,17010,15180],{"class":319},[217,17012,17013,17016,17019,17021,17024],{"class":219,"line":1666},[217,17014,17015],{"class":237},"    RED",[217,17017,17018],{"class":323},"   =",[217,17020,401],{"class":227},[217,17022,17023],{"class":237},"\\x1b",[217,17025,17026],{"class":227},"[31m\"\n",[217,17028,17029,17032,17034,17036,17038],{"class":219,"line":1672},[217,17030,17031],{"class":237},"    GREEN",[217,17033,330],{"class":323},[217,17035,401],{"class":227},[217,17037,17023],{"class":237},[217,17039,17040],{"class":227},"[32m\"\n",[217,17042,17043,17046,17048,17050,17052],{"class":219,"line":1678},[217,17044,17045],{"class":237},"    RESET",[217,17047,330],{"class":323},[217,17049,401],{"class":227},[217,17051,17023],{"class":237},[217,17053,17054],{"class":227},"[0m\"\n",[217,17056,17057],{"class":219,"line":1684},[217,17058,877],{"class":319},[217,17060,17061],{"class":219,"line":1689},[217,17062,896],{"emptyLinePlaceholder":895},[217,17064,17065,17067,17069],{"class":219,"line":2676},[217,17066,13936],{"class":323},[217,17068,14021],{"class":223},[217,17070,7923],{"class":319},[217,17072,17073,17075,17077],{"class":219,"line":2687},[217,17074,14457],{"class":323},[217,17076,16734],{"class":319},[217,17078,15579],{"class":323},[217,17080,17081,17083,17085,17087,17089,17091,17093,17095,17097,17099],{"class":219,"line":2692},[217,17082,15496],{"class":323},[217,17084,16734],{"class":319},[217,17086,854],{"class":323},[217,17088,6833],{"class":237},[217,17090,16753],{"class":319},[217,17092,7267],{"class":323},[217,17094,6697],{"class":237},[217,17096,16760],{"class":319},[217,17098,2889],{"class":323},[217,17100,7514],{"class":319},[217,17102,17103,17105,17107,17109,17111,17113,17115,17117,17119],{"class":219,"line":2987},[217,17104,16773],{"class":319},[217,17106,14235],{"class":323},[217,17108,16778],{"class":319},[217,17110,16781],{"class":223},[217,17112,16784],{"class":319},[217,17114,15227],{"class":223},[217,17116,16789],{"class":319},[217,17118,16792],{"class":223},[217,17120,16795],{"class":319},[217,17122,17123,17125,17127,17129,17131],{"class":219,"line":2993},[217,17124,16804],{"class":319},[217,17126,14235],{"class":323},[217,17128,16778],{"class":319},[217,17130,16811],{"class":223},[217,17132,16814],{"class":319},[217,17134,17135,17137,17139,17141,17143,17145,17147],{"class":219,"line":2998},[217,17136,16823],{"class":319},[217,17138,14235],{"class":323},[217,17140,16828],{"class":319},[217,17142,16831],{"class":223},[217,17144,2473],{"class":319},[217,17146,2981],{"class":237},[217,17148,877],{"class":319},[217,17150,17151],{"class":219,"line":3004},[217,17152,896],{"emptyLinePlaceholder":895},[217,17154,17155,17157,17159,17161,17163],{"class":219,"line":6078},[217,17156,7987],{"class":323},[217,17158,16848],{"class":319},[217,17160,7267],{"class":323},[217,17162,8556],{"class":237},[217,17164,7514],{"class":319},[217,17166,17167,17169,17171,17173,17175,17177,17180,17182,17185,17188,17191,17193],{"class":219,"line":6089},[217,17168,15661],{"class":319},[217,17170,14081],{"class":223},[217,17172,2473],{"class":319},[217,17174,512],{"class":227},[217,17176,15670],{"class":237},[217,17178,17179],{"class":227}," 號學生的分數為 ",[217,17181,15670],{"class":237},[217,17183,17184],{"class":237}," %s",[217,17186,17187],{"class":227},"不及格",[217,17189,17190],{"class":237},"%s\\n",[217,17192,512],{"class":227},[217,17194,17195],{"class":319},", index, num, RED, RESET)\n",[217,17197,17198],{"class":219,"line":6100},[217,17199,17200],{"class":323},"            continue\n",[217,17202,17203],{"class":219,"line":6105},[217,17204,8029],{"class":319},[217,17206,17207],{"class":219,"line":6111},[217,17208,896],{"emptyLinePlaceholder":895},[217,17210,17211,17213,17215,17217,17219,17221,17223,17225,17227,17230,17233,17235,17237],{"class":219,"line":6121},[217,17212,14968],{"class":319},[217,17214,14081],{"class":223},[217,17216,2473],{"class":319},[217,17218,512],{"class":227},[217,17220,15670],{"class":237},[217,17222,17179],{"class":227},[217,17224,15670],{"class":237},[217,17226,9660],{"class":227},[217,17228,17229],{"class":237},"%s",[217,17231,17232],{"class":227},"恭喜級格了",[217,17234,17190],{"class":237},[217,17236,512],{"class":227},[217,17238,17239],{"class":319},", index, num, GREEN, RESET)\n",[217,17241,17242],{"class":219,"line":6135},[217,17243,7911],{"class":319},[217,17245,17246],{"class":219,"line":6140},[217,17247,896],{"emptyLinePlaceholder":895},[217,17249,17250],{"class":219,"line":6146},[217,17251,2990],{"class":319},[15,17253,17254],{},[47,17255,9590],{},[208,17257,17259],{"className":210,"code":17258,"language":212,"meta":213,"style":213},"0 號學生的分數為 38 不及格\n1 號學生的分數為 26 不及格\n2 號學生的分數為 21 不及格\n3 號學生的分數為 37 不及格\n4 號學生的分數為 58 不及格\n5 號學生的分數為 40 不及格\n6 號學生的分數為 44 不及格\n7 號學生的分數為 64，恭喜級格了\n8 號學生的分數為 93，恭喜級格了\n9 號學生的分數為 0 不及格\n",[55,17260,17261,17274,17285,17296,17307,17318,17329,17340,17349,17358],{"__ignoreMap":213},[217,17262,17263,17265,17268,17271],{"class":219,"line":220},[217,17264,2915],{"class":223},[217,17266,17267],{"class":227}," 號學生的分數為",[217,17269,17270],{"class":237}," 38",[217,17272,17273],{"class":227}," 不及格\n",[217,17275,17276,17278,17280,17283],{"class":219,"line":387},[217,17277,2481],{"class":223},[217,17279,17267],{"class":227},[217,17281,17282],{"class":237}," 26",[217,17284,17273],{"class":227},[217,17286,17287,17289,17291,17294],{"class":219,"line":410},[217,17288,2967],{"class":223},[217,17290,17267],{"class":227},[217,17292,17293],{"class":237}," 21",[217,17295,17273],{"class":227},[217,17297,17298,17300,17302,17305],{"class":219,"line":424},[217,17299,14251],{"class":223},[217,17301,17267],{"class":227},[217,17303,17304],{"class":237}," 37",[217,17306,17273],{"class":227},[217,17308,17309,17311,17313,17316],{"class":219,"line":441},[217,17310,3461],{"class":223},[217,17312,17267],{"class":227},[217,17314,17315],{"class":237}," 58",[217,17317,17273],{"class":227},[217,17319,17320,17322,17324,17327],{"class":219,"line":908},[217,17321,2647],{"class":223},[217,17323,17267],{"class":227},[217,17325,17326],{"class":237}," 40",[217,17328,17273],{"class":227},[217,17330,17331,17333,17335,17338],{"class":219,"line":1560},[217,17332,16200],{"class":223},[217,17334,17267],{"class":227},[217,17336,17337],{"class":237}," 44",[217,17339,17273],{"class":227},[217,17341,17342,17344,17346],{"class":219,"line":1566},[217,17343,9486],{"class":223},[217,17345,17267],{"class":227},[217,17347,17348],{"class":227}," 64，恭喜級格了\n",[217,17350,17351,17353,17355],{"class":219,"line":1660},[217,17352,16431],{"class":223},[217,17354,17267],{"class":227},[217,17356,17357],{"class":227}," 93，恭喜級格了\n",[217,17359,17360,17362,17364,17366],{"class":219,"line":1666},[217,17361,16546],{"class":223},[217,17363,17267],{"class":227},[217,17365,6833],{"class":237},[217,17367,17273],{"class":227},[15,17369,17370],{},[47,17371,1857],{},[15,17373,17374,17375,17377,17378,17380],{},"從上面範例結果，可以了解 ",[55,17376,16658],{}," 只是達成條件，就會跳開整個迴圈，而 ",[55,17379,16948],{},"，只會跳過此次迴圈。",[63,17382,17383],{"id":17383},"goto",[15,17385,17386,17388,17389],{},[55,17387,17383],{}," 程式執行時，無條件跳至某行執行，為確保程式邏輯清晰，程式碼易於維護，不建義使用 ",[55,17390,17383],{},[208,17392,17394],{"className":13927,"code":17393,"language":13929,"meta":213,"style":213},"go label\n\nlabel:\n  \u002F\u002F程式片段\n",[55,17395,17396,17403,17407,17412],{"__ignoreMap":213},[217,17397,17398,17400],{"class":219,"line":220},[217,17399,13929],{"class":323},[217,17401,17402],{"class":319}," label\n",[217,17404,17405],{"class":219,"line":387},[217,17406,896],{"emptyLinePlaceholder":895},[217,17408,17409],{"class":219,"line":410},[217,17410,17411],{"class":319},"label:\n",[217,17413,17414],{"class":219,"line":424},[217,17415,17416],{"class":1521},"  \u002F\u002F程式片段\n",[15,17418,17419],{},[47,17420,17421],{},"範例程式",[208,17423,17425],{"className":13927,"code":17424,"language":13929,"meta":213,"style":213},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    i := 0\n    for {\n        i++\n        fmt.Println(i)\n\n        if i >= 10 {\n            goto Here\n        }\n    }\n\nHere:\n    fmt.Println(\"程式結束\")\n}\n",[55,17426,17427,17433,17437,17447,17451,17459,17463,17473,17479,17487,17495,17499,17511,17519,17523,17527,17531,17536,17549],{"__ignoreMap":213},[217,17428,17429,17431],{"class":219,"line":220},[217,17430,13999],{"class":323},[217,17432,14002],{"class":223},[217,17434,17435],{"class":219,"line":387},[217,17436,896],{"emptyLinePlaceholder":895},[217,17438,17439,17441,17443,17445],{"class":219,"line":410},[217,17440,14007],{"class":323},[217,17442,401],{"class":227},[217,17444,14012],{"class":223},[217,17446,407],{"class":227},[217,17448,17449],{"class":219,"line":424},[217,17450,896],{"emptyLinePlaceholder":895},[217,17452,17453,17455,17457],{"class":219,"line":441},[217,17454,13936],{"class":323},[217,17456,14021],{"class":223},[217,17458,7923],{"class":319},[217,17460,17461],{"class":219,"line":908},[217,17462,896],{"emptyLinePlaceholder":895},[217,17464,17465,17468,17470],{"class":219,"line":1560},[217,17466,17467],{"class":319},"    i ",[217,17469,14235],{"class":323},[217,17471,17472],{"class":237}," 0\n",[217,17474,17475,17477],{"class":219,"line":1566},[217,17476,15496],{"class":323},[217,17478,7514],{"class":319},[217,17480,17481,17484],{"class":219,"line":1660},[217,17482,17483],{"class":319},"        i",[217,17485,17486],{"class":323},"++\n",[217,17488,17489,17491,17493],{"class":219,"line":1666},[217,17490,14968],{"class":319},[217,17492,14261],{"class":223},[217,17494,15526],{"class":319},[217,17496,17497],{"class":219,"line":1672},[217,17498,896],{"emptyLinePlaceholder":895},[217,17500,17501,17503,17505,17507,17509],{"class":219,"line":1678},[217,17502,7987],{"class":323},[217,17504,15499],{"class":319},[217,17506,14958],{"class":323},[217,17508,6697],{"class":237},[217,17510,7514],{"class":319},[217,17512,17513,17516],{"class":219,"line":1684},[217,17514,17515],{"class":323},"            goto",[217,17517,17518],{"class":319}," Here\n",[217,17520,17521],{"class":219,"line":1689},[217,17522,8029],{"class":319},[217,17524,17525],{"class":219,"line":2676},[217,17526,7911],{"class":319},[217,17528,17529],{"class":219,"line":2687},[217,17530,896],{"emptyLinePlaceholder":895},[217,17532,17533],{"class":219,"line":2692},[217,17534,17535],{"class":319},"Here:\n",[217,17537,17538,17540,17542,17544,17547],{"class":219,"line":2987},[217,17539,14258],{"class":319},[217,17541,14261],{"class":223},[217,17543,2473],{"class":319},[217,17545,17546],{"class":227},"\"程式結束\"",[217,17548,877],{"class":319},[217,17550,17551],{"class":219,"line":2993},[217,17552,2990],{"class":319},[15,17554,17555],{},[47,17556,9590],{},[208,17558,17560],{"className":210,"code":17559,"language":212,"meta":213,"style":213},"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n和式結束\n",[55,17561,17562,17567,17572,17577,17582,17587,17592,17597,17602,17606,17611],{"__ignoreMap":213},[217,17563,17564],{"class":219,"line":220},[217,17565,17566],{"class":223},"1\n",[217,17568,17569],{"class":219,"line":387},[217,17570,17571],{"class":223},"2\n",[217,17573,17574],{"class":219,"line":410},[217,17575,17576],{"class":223},"3\n",[217,17578,17579],{"class":219,"line":424},[217,17580,17581],{"class":223},"4\n",[217,17583,17584],{"class":219,"line":441},[217,17585,17586],{"class":223},"5\n",[217,17588,17589],{"class":219,"line":908},[217,17590,17591],{"class":223},"6\n",[217,17593,17594],{"class":219,"line":1560},[217,17595,17596],{"class":223},"7\n",[217,17598,17599],{"class":219,"line":1566},[217,17600,17601],{"class":223},"8\n",[217,17603,17604],{"class":219,"line":1660},[217,17605,14333],{"class":223},[217,17607,17608],{"class":219,"line":1666},[217,17609,17610],{"class":223},"10\n",[217,17612,17613],{"class":219,"line":1672},[217,17614,17615],{"class":223},"和式結束\n",[15,17617,17618],{},"以上是 go 語言中，常用的流程控制，若有遺漏或說明錯誤可以在下留言討論。",[1302,17620,17621],{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":213,"searchDepth":387,"depth":387,"links":17623},[17624,17625,17626,17630],{"id":14805,"depth":387,"text":14806},{"id":15093,"depth":387,"text":15093},{"id":15426,"depth":387,"text":15427,"children":17627},[17628,17629],{"id":16658,"depth":410,"text":16658},{"id":16948,"depth":410,"text":16948},{"id":17383,"depth":387,"text":17383},{},"\u002Farticles\u002F2023-03-28-flow-control","2023-03-28 17:34:00",{"title":14796,"description":213},"articles\u002F2023-03-28-flow control","這篇文章，會介紹 Go 語言中，常用的流程控制，包含 if、switch、for 等流程控制",[13929],"PX_VcjowVs0VcmxH_B9vEPuEHEYzfHxwTQKLCqRsmjU",{"id":17640,"title":17641,"body":17642,"category":3902,"description":213,"extension":1324,"image":14785,"meta":18391,"navigation":895,"path":18392,"pubDate":18393,"seo":18394,"status":895,"stem":18395,"summary":18396,"tags":18397,"__hash__":18398},"content\u002Farticles\u002F2023-03-07-go-print.md","《Go 學習筆記4》基本輸入輸出",{"type":8,"value":17643,"toc":18387},[17644,17648,17651,17671,17675,17906,17910,17963,17967,18000,18003,18017,18021,18319,18323,18384],[115,17645,17646],{},[15,17647,13918],{},[63,17649,17650],{"id":17650},"輸出",[28,17652,17653,17659,17665],{},[31,17654,17655,17658],{},[55,17656,17657],{},"print(data, data, data)","：輸出資料但不換行",[31,17660,17661,17664],{},[55,17662,17663],{},"Println(data, data, data)","：輸出資料並換行",[31,17666,17667,17670],{},[55,17668,17669],{},"Printf(\"{format}\", data)","：依照格式輸出內容",[15,17672,17673],{},[47,17674,17421],{},[208,17676,17678],{"className":13927,"code":17677,"language":13929,"meta":213,"style":213},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n  fmt.Print(\"我是一行字串\")\n\n  fmt.Println(\"我會換行\")\n\n  fmt.Println(\"你看見換行了嗎\")\n\n  fmt.Printf(\"這是一個整數： %d\\r\\n\", 5)\n\n  fmt.Printf(\"這是一浮點數： %.2f\\r\\n\", 0.344)\n\n  fmt.Printf(\"這是一個布林值： %t\\r\\n\", true)\n\n  fmt.Printf(\"這是一個字元： %c\\r\\n\", 'j')\n\n  fmt.Printf(\"這是一個字串： %s\\r\\n\", \"Allen\")\n\n}\n",[55,17679,17680,17686,17690,17700,17704,17712,17716,17730,17734,17747,17751,17764,17768,17789,17793,17815,17819,17841,17845,17873,17877,17898,17902],{"__ignoreMap":213},[217,17681,17682,17684],{"class":219,"line":220},[217,17683,13999],{"class":323},[217,17685,14002],{"class":223},[217,17687,17688],{"class":219,"line":387},[217,17689,896],{"emptyLinePlaceholder":895},[217,17691,17692,17694,17696,17698],{"class":219,"line":410},[217,17693,14007],{"class":323},[217,17695,401],{"class":227},[217,17697,14012],{"class":223},[217,17699,407],{"class":227},[217,17701,17702],{"class":219,"line":424},[217,17703,896],{"emptyLinePlaceholder":895},[217,17705,17706,17708,17710],{"class":219,"line":441},[217,17707,13936],{"class":323},[217,17709,14021],{"class":223},[217,17711,7923],{"class":319},[217,17713,17714],{"class":219,"line":908},[217,17715,896],{"emptyLinePlaceholder":895},[217,17717,17718,17721,17723,17725,17728],{"class":219,"line":1560},[217,17719,17720],{"class":319},"  fmt.",[217,17722,14924],{"class":223},[217,17724,2473],{"class":319},[217,17726,17727],{"class":227},"\"我是一行字串\"",[217,17729,877],{"class":319},[217,17731,17732],{"class":219,"line":1566},[217,17733,896],{"emptyLinePlaceholder":895},[217,17735,17736,17738,17740,17742,17745],{"class":219,"line":1660},[217,17737,17720],{"class":319},[217,17739,14261],{"class":223},[217,17741,2473],{"class":319},[217,17743,17744],{"class":227},"\"我會換行\"",[217,17746,877],{"class":319},[217,17748,17749],{"class":219,"line":1666},[217,17750,896],{"emptyLinePlaceholder":895},[217,17752,17753,17755,17757,17759,17762],{"class":219,"line":1672},[217,17754,17720],{"class":319},[217,17756,14261],{"class":223},[217,17758,2473],{"class":319},[217,17760,17761],{"class":227},"\"你看見換行了嗎\"",[217,17763,877],{"class":319},[217,17765,17766],{"class":219,"line":1678},[217,17767,896],{"emptyLinePlaceholder":895},[217,17769,17770,17772,17774,17776,17779,17781,17783,17785,17787],{"class":219,"line":1684},[217,17771,17720],{"class":319},[217,17773,14081],{"class":223},[217,17775,2473],{"class":319},[217,17777,17778],{"class":227},"\"這是一個整數： ",[217,17780,14108],{"class":237},[217,17782,512],{"class":227},[217,17784,2551],{"class":319},[217,17786,2647],{"class":237},[217,17788,877],{"class":319},[217,17790,17791],{"class":219,"line":1689},[217,17792,896],{"emptyLinePlaceholder":895},[217,17794,17795,17797,17799,17801,17804,17806,17808,17810,17813],{"class":219,"line":2676},[217,17796,17720],{"class":319},[217,17798,14081],{"class":223},[217,17800,2473],{"class":319},[217,17802,17803],{"class":227},"\"這是一浮點數： ",[217,17805,14588],{"class":237},[217,17807,512],{"class":227},[217,17809,2551],{"class":319},[217,17811,17812],{"class":237},"0.344",[217,17814,877],{"class":319},[217,17816,17817],{"class":219,"line":2687},[217,17818,896],{"emptyLinePlaceholder":895},[217,17820,17821,17823,17825,17827,17830,17833,17835,17837,17839],{"class":219,"line":2692},[217,17822,17720],{"class":319},[217,17824,14081],{"class":223},[217,17826,2473],{"class":319},[217,17828,17829],{"class":227},"\"這是一個布林值： ",[217,17831,17832],{"class":237},"%t\\r\\n",[217,17834,512],{"class":227},[217,17836,2551],{"class":319},[217,17838,14663],{"class":237},[217,17840,877],{"class":319},[217,17842,17843],{"class":219,"line":2987},[217,17844,896],{"emptyLinePlaceholder":895},[217,17846,17847,17849,17851,17853,17856,17859,17861,17863,17866,17869,17871],{"class":219,"line":2993},[217,17848,17720],{"class":319},[217,17850,14081],{"class":223},[217,17852,2473],{"class":319},[217,17854,17855],{"class":227},"\"這是一個字元： ",[217,17857,17858],{"class":237},"%c\\r\\n",[217,17860,512],{"class":227},[217,17862,2551],{"class":319},[217,17864,17865],{"class":227},"'",[217,17867,17868],{"class":237},"j",[217,17870,17865],{"class":227},[217,17872,877],{"class":319},[217,17874,17875],{"class":219,"line":2998},[217,17876,896],{"emptyLinePlaceholder":895},[217,17878,17879,17881,17883,17885,17888,17890,17892,17894,17896],{"class":219,"line":3004},[217,17880,17720],{"class":319},[217,17882,14081],{"class":223},[217,17884,2473],{"class":319},[217,17886,17887],{"class":227},"\"這是一個字串： ",[217,17889,14089],{"class":237},[217,17891,512],{"class":227},[217,17893,2551],{"class":319},[217,17895,14033],{"class":227},[217,17897,877],{"class":319},[217,17899,17900],{"class":219,"line":6078},[217,17901,896],{"emptyLinePlaceholder":895},[217,17903,17904],{"class":219,"line":6089},[217,17905,2990],{"class":319},[15,17907,17908],{},[47,17909,9590],{},[208,17911,17913],{"className":210,"code":17912,"language":212,"meta":213,"style":213},"我是一行字串我會換行\n你看見換行了嗎\n這是一個整數： 5\n這是一浮點數： 0.34\n這是一個布林值： true\n這是一個字元： j\n這是一個字串： Allen\n",[55,17914,17915,17920,17925,17932,17940,17948,17956],{"__ignoreMap":213},[217,17916,17917],{"class":219,"line":220},[217,17918,17919],{"class":223},"我是一行字串我會換行\n",[217,17921,17922],{"class":219,"line":387},[217,17923,17924],{"class":223},"你看見換行了嗎\n",[217,17926,17927,17930],{"class":219,"line":410},[217,17928,17929],{"class":223},"這是一個整數：",[217,17931,4216],{"class":237},[217,17933,17934,17937],{"class":219,"line":424},[217,17935,17936],{"class":223},"這是一浮點數：",[217,17938,17939],{"class":237}," 0.34\n",[217,17941,17942,17945],{"class":219,"line":441},[217,17943,17944],{"class":223},"這是一個布林值：",[217,17946,17947],{"class":237}," true\n",[217,17949,17950,17953],{"class":219,"line":908},[217,17951,17952],{"class":223},"這是一個字元：",[217,17954,17955],{"class":227}," j\n",[217,17957,17958,17961],{"class":219,"line":1560},[217,17959,17960],{"class":223},"這是一個字串：",[217,17962,14134],{"class":227},[15,17964,17965],{},[47,17966,1857],{},[2109,17968,17969,17975],{},[31,17970,17971,17972,17974],{},"其中浮點數 ",[55,17973,14978],{}," 表示取到小數點第二位",[31,17976,17977,5196,17979,17981,17982],{},[55,17978,14984],{},[55,17980,2707],{}," 都是換行的控制字元\n",[2109,17983,17984,17989],{},[31,17985,17986,17988],{},[55,17987,2707],{},"：在 Unix 系統中，此控制字元，表示換到下一行的開頭，在 Windows 系統中，只會進行換行",[31,17990,17991,17993,17994,17997,17998],{},[55,17992,14984],{},"：在 Windows，",[55,17995,17996],{},"\\r"," 代表 Enter 鍵，所以我們需要換到下一行的開頭時，我們必需用 ",[55,17999,14984],{},[63,18001,18002],{"id":18002},"輸入",[28,18004,18005,18011],{},[31,18006,18007,18010],{},[55,18008,18009],{},"scan(&x)","：會讀取整行輸入，並將輸入內容軟成字串型態",[31,18012,18013,18016],{},[55,18014,18015],{},"scanf(\"%d %.2f\", &x)","：可以指定輸入格式，並可一次輸入多個參數",[15,18018,18019],{},[47,18020,17421],{},[208,18022,18024],{"className":13927,"code":18023,"language":13929,"meta":213,"style":213},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    var name string\n\n    var age int8\n\n    var height float32\n\n    var weight float32\n\n    fmt.Print(\"請輸入您的姓名：\")\n    fmt.Scanln(&name)\n    fmt.Print(\"請輸入你的年紀：\")\n    fmt.Scanf(\"%d\", &age)\n    fmt.Print(\"請輸入你的身高和體重：\")\n    fmt.Scanf(\"%f %f\", &height, &weight)\n\n    age = int8(age)\n    height = float32(height)\n    weight = float32(weight)\n\n    fmt.Println(\"====您輸入的內容如下=====\")\n    fmt.Printf(\"您的大名是： %s \\r\\n您的年齡： %d\\r\\n您的身高： %.2f\\r\\n您的體重：%.2f\\r\\n\", name, age, height, weight)\n\n}\n",[55,18025,18026,18032,18036,18046,18050,18058,18062,18070,18074,18084,18088,18096,18100,18108,18112,18125,18139,18152,18174,18187,18217,18221,18233,18246,18258,18262,18275,18311,18315],{"__ignoreMap":213},[217,18027,18028,18030],{"class":219,"line":220},[217,18029,13999],{"class":323},[217,18031,14002],{"class":223},[217,18033,18034],{"class":219,"line":387},[217,18035,896],{"emptyLinePlaceholder":895},[217,18037,18038,18040,18042,18044],{"class":219,"line":410},[217,18039,14007],{"class":323},[217,18041,401],{"class":227},[217,18043,14012],{"class":223},[217,18045,407],{"class":227},[217,18047,18048],{"class":219,"line":424},[217,18049,896],{"emptyLinePlaceholder":895},[217,18051,18052,18054,18056],{"class":219,"line":441},[217,18053,13936],{"class":323},[217,18055,14021],{"class":223},[217,18057,7923],{"class":319},[217,18059,18060],{"class":219,"line":908},[217,18061,896],{"emptyLinePlaceholder":895},[217,18063,18064,18066,18068],{"class":219,"line":1560},[217,18065,14457],{"class":323},[217,18067,14460],{"class":319},[217,18069,14463],{"class":323},[217,18071,18072],{"class":219,"line":1566},[217,18073,896],{"emptyLinePlaceholder":895},[217,18075,18076,18078,18081],{"class":219,"line":1660},[217,18077,14457],{"class":323},[217,18079,18080],{"class":319}," age ",[217,18082,18083],{"class":323},"int8\n",[217,18085,18086],{"class":219,"line":1666},[217,18087,896],{"emptyLinePlaceholder":895},[217,18089,18090,18092,18094],{"class":219,"line":1672},[217,18091,14457],{"class":323},[217,18093,14480],{"class":319},[217,18095,14483],{"class":323},[217,18097,18098],{"class":219,"line":1678},[217,18099,896],{"emptyLinePlaceholder":895},[217,18101,18102,18104,18106],{"class":219,"line":1684},[217,18103,14457],{"class":323},[217,18105,14490],{"class":319},[217,18107,14483],{"class":323},[217,18109,18110],{"class":219,"line":1689},[217,18111,896],{"emptyLinePlaceholder":895},[217,18113,18114,18116,18118,18120,18123],{"class":219,"line":2676},[217,18115,14258],{"class":319},[217,18117,14924],{"class":223},[217,18119,2473],{"class":319},[217,18121,18122],{"class":227},"\"請輸入您的姓名：\"",[217,18124,877],{"class":319},[217,18126,18127,18129,18132,18134,18136],{"class":219,"line":2687},[217,18128,14258],{"class":319},[217,18130,18131],{"class":223},"Scanln",[217,18133,2473],{"class":319},[217,18135,10648],{"class":323},[217,18137,18138],{"class":319},"name)\n",[217,18140,18141,18143,18145,18147,18150],{"class":219,"line":2692},[217,18142,14258],{"class":319},[217,18144,14924],{"class":223},[217,18146,2473],{"class":319},[217,18148,18149],{"class":227},"\"請輸入你的年紀：\"",[217,18151,877],{"class":319},[217,18153,18154,18156,18159,18161,18163,18165,18167,18169,18171],{"class":219,"line":2987},[217,18155,14258],{"class":319},[217,18157,18158],{"class":223},"Scanf",[217,18160,2473],{"class":319},[217,18162,512],{"class":227},[217,18164,15670],{"class":237},[217,18166,512],{"class":227},[217,18168,2551],{"class":319},[217,18170,10648],{"class":323},[217,18172,18173],{"class":319},"age)\n",[217,18175,18176,18178,18180,18182,18185],{"class":219,"line":2993},[217,18177,14258],{"class":319},[217,18179,14924],{"class":223},[217,18181,2473],{"class":319},[217,18183,18184],{"class":227},"\"請輸入你的身高和體重：\"",[217,18186,877],{"class":319},[217,18188,18189,18191,18193,18195,18197,18200,18203,18205,18207,18209,18212,18214],{"class":219,"line":2998},[217,18190,14258],{"class":319},[217,18192,18158],{"class":223},[217,18194,2473],{"class":319},[217,18196,512],{"class":227},[217,18198,18199],{"class":237},"%f",[217,18201,18202],{"class":237}," %f",[217,18204,512],{"class":227},[217,18206,2551],{"class":319},[217,18208,10648],{"class":323},[217,18210,18211],{"class":319},"height, ",[217,18213,10648],{"class":323},[217,18215,18216],{"class":319},"weight)\n",[217,18218,18219],{"class":219,"line":3004},[217,18220,896],{"emptyLinePlaceholder":895},[217,18222,18223,18226,18228,18230],{"class":219,"line":6078},[217,18224,18225],{"class":319},"    age ",[217,18227,854],{"class":323},[217,18229,14071],{"class":323},[217,18231,18232],{"class":319},"(age)\n",[217,18234,18235,18238,18240,18243],{"class":219,"line":6089},[217,18236,18237],{"class":319},"    height ",[217,18239,854],{"class":323},[217,18241,18242],{"class":323}," float32",[217,18244,18245],{"class":319},"(height)\n",[217,18247,18248,18251,18253,18255],{"class":219,"line":6100},[217,18249,18250],{"class":319},"    weight ",[217,18252,854],{"class":323},[217,18254,18242],{"class":323},[217,18256,18257],{"class":319},"(weight)\n",[217,18259,18260],{"class":219,"line":6105},[217,18261,896],{"emptyLinePlaceholder":895},[217,18263,18264,18266,18268,18270,18273],{"class":219,"line":6111},[217,18265,14258],{"class":319},[217,18267,14261],{"class":223},[217,18269,2473],{"class":319},[217,18271,18272],{"class":227},"\"====您輸入的內容如下=====\"",[217,18274,877],{"class":319},[217,18276,18277,18279,18281,18283,18286,18288,18291,18294,18296,18299,18301,18304,18306,18308],{"class":219,"line":6121},[217,18278,14258],{"class":319},[217,18280,14081],{"class":223},[217,18282,2473],{"class":319},[217,18284,18285],{"class":227},"\"您的大名是： ",[217,18287,17229],{"class":237},[217,18289,18290],{"class":237}," \\r\\n",[217,18292,18293],{"class":227},"您的年齡： ",[217,18295,14108],{"class":237},[217,18297,18298],{"class":227},"您的身高： ",[217,18300,14588],{"class":237},[217,18302,18303],{"class":227},"您的體重：",[217,18305,14588],{"class":237},[217,18307,512],{"class":227},[217,18309,18310],{"class":319},", name, age, height, weight)\n",[217,18312,18313],{"class":219,"line":6135},[217,18314,896],{"emptyLinePlaceholder":895},[217,18316,18317],{"class":219,"line":6140},[217,18318,2990],{"class":319},[15,18320,18321],{},[47,18322,9590],{},[208,18324,18326],{"className":210,"code":18325,"language":212,"meta":213,"style":213},"請輸入您的姓名：Allen\n請輸入你的年紀：25\n請輸入你的身高和體重：175 70 \n====您輸入的內容如下=====\n您的大名是： Allen \n您的年齡： 25\n您的身高： 175.00\n您的體重：70.00\n",[55,18327,18328,18333,18338,18349,18354,18364,18371,18379],{"__ignoreMap":213},[217,18329,18330],{"class":219,"line":220},[217,18331,18332],{"class":223},"請輸入您的姓名：Allen\n",[217,18334,18335],{"class":219,"line":387},[217,18336,18337],{"class":223},"請輸入你的年紀：25\n",[217,18339,18340,18343,18346],{"class":219,"line":410},[217,18341,18342],{"class":223},"請輸入你的身高和體重：175",[217,18344,18345],{"class":237}," 70",[217,18347,18348],{"class":319}," \n",[217,18350,18351],{"class":219,"line":424},[217,18352,18353],{"class":227},"====您輸入的內容如下=====\n",[217,18355,18356,18359,18362],{"class":219,"line":441},[217,18357,18358],{"class":223},"您的大名是：",[217,18360,18361],{"class":227}," Allen",[217,18363,18348],{"class":319},[217,18365,18366,18369],{"class":219,"line":908},[217,18367,18368],{"class":223},"您的年齡：",[217,18370,16139],{"class":237},[217,18372,18373,18376],{"class":219,"line":1560},[217,18374,18375],{"class":223},"您的身高：",[217,18377,18378],{"class":237}," 175.00\n",[217,18380,18381],{"class":219,"line":1566},[217,18382,18383],{"class":223},"您的體重：70.00\n",[1302,18385,18386],{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":387,"depth":387,"links":18388},[18389,18390],{"id":17650,"depth":387,"text":17650},{"id":18002,"depth":387,"text":18002},{},"\u002Farticles\u002F2023-03-07-go-print","2023-03-07 23:26:00",{"title":17641,"description":213},"articles\u002F2023-03-07-go-print","在 Go lang 中，會使用 `fmt` 這個套件，來處理基本的輸入輸出",[13929],"qed74xM3e9OGLUD8A3VRr5d374RcyCdF1WljBm5JUi0",{"id":18400,"title":18401,"body":18402,"category":3902,"description":213,"extension":1324,"image":14785,"meta":18944,"navigation":895,"path":18945,"pubDate":18946,"seo":18947,"status":895,"stem":18948,"summary":18949,"tags":18950,"__hash__":18951},"content\u002Farticles\u002F2023-03-01-go-lang-variable.md","《Go 學習筆記2》 變數型態",{"type":8,"value":18403,"toc":18933},[18404,18408,18411,18420,18464,18469,18501,18504,18518,18522,18580,18583,18723,18726,18738,18741,18748,18751,18759,18780,18783,18791,18794,18802,18911,18915,18930],[115,18405,18406],{},[15,18407,13918],{},[63,18409,18410],{"id":18410},"變數宣告",[15,18412,18413,18414,6932,18417,18419],{},"在 Go lang 變數宣告，可使用 ",[55,18415,18416],{},"var",[55,18418,14235],{}," 兩個關鍵字，進行變數宣告。",[208,18421,18423],{"className":13927,"code":18422,"language":13929,"meta":213,"style":213},"var x int =  10\nvar y float32 = 3.1412\nvar z string = \"Hello World\"\n",[55,18424,18425,18438,18451],{"__ignoreMap":213},[217,18426,18427,18429,18431,18433,18435],{"class":219,"line":220},[217,18428,18416],{"class":323},[217,18430,14312],{"class":319},[217,18432,14303],{"class":323},[217,18434,330],{"class":323},[217,18436,18437],{"class":237},"  10\n",[217,18439,18440,18442,18444,18446,18448],{"class":219,"line":387},[217,18441,18416],{"class":323},[217,18443,14317],{"class":319},[217,18445,14645],{"class":323},[217,18447,330],{"class":323},[217,18449,18450],{"class":237}," 3.1412\n",[217,18452,18453,18455,18457,18459,18461],{"class":219,"line":410},[217,18454,18416],{"class":323},[217,18456,15645],{"class":319},[217,18458,14635],{"class":323},[217,18460,330],{"class":323},[217,18462,18463],{"class":227}," \"Hello World\"\n",[15,18465,6401,18466,18468],{},[55,18467,14235],{}," 符號變數宣告時，可以省略型態，系統會自動推斷變數的型態",[208,18470,18472],{"className":13927,"code":18471,"language":13929,"meta":213,"style":213},"x := 10\ny := 3.1412\nz := \"Hello World\"\n",[55,18473,18474,18483,18492],{"__ignoreMap":213},[217,18475,18476,18479,18481],{"class":219,"line":220},[217,18477,18478],{"class":319},"x ",[217,18480,14235],{"class":323},[217,18482,15786],{"class":237},[217,18484,18485,18488,18490],{"class":219,"line":387},[217,18486,18487],{"class":319},"y ",[217,18489,14235],{"class":323},[217,18491,18450],{"class":237},[217,18493,18494,18497,18499],{"class":219,"line":410},[217,18495,18496],{"class":319},"z ",[217,18498,14235],{"class":323},[217,18500,18463],{"class":227},[15,18502,18503],{},"多變數宣告",[208,18505,18507],{"className":13927,"code":18506,"language":13929,"meta":213,"style":213},"var x, y, z int\n",[55,18508,18509],{"__ignoreMap":213},[217,18510,18511,18513,18516],{"class":219,"line":220},[217,18512,18416],{"class":323},[217,18514,18515],{"class":319}," x, y, z ",[217,18517,15579],{"class":323},[63,18519,18521],{"id":18520},"go-語言的變數型態包括","Go 語言的變數型態包括:",[28,18523,18524,18556,18564,18575],{},[31,18525,18526,18527,2551,18529,2551,18532,2551,18535,2551,18538,2551,18541,2551,18544,2551,18547,2551,18550,2551,18553],{},"整數類型: ",[55,18528,14303],{},[55,18530,18531],{},"int8",[55,18533,18534],{},"int16",[55,18536,18537],{},"int32",[55,18539,18540],{},"int64",[55,18542,18543],{},"uint",[55,18545,18546],{},"uint8",[55,18548,18549],{},"uint16",[55,18551,18552],{},"uint32",[55,18554,18555],{},"uint64",[31,18557,18558,18559,2551,18561],{},"浮點數類型: ",[55,18560,14645],{},[55,18562,18563],{},"float64",[31,18565,18566,18567,2551,18569,2551,18572],{},"字符類型: ",[55,18568,14635],{},[55,18570,18571],{},"rune",[55,18573,18574],{},"byte",[31,18576,18577,18578],{},"布林類型: ",[55,18579,14640],{},[1103,18581,18582],{"id":18582},"整數型態",[2109,18584,18585,18655],{},[31,18586,18587,18589,18590],{},[55,18588,14303],{}," ： 是帶有符號的整數，可表示正數與負數\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",[130,18591,18592,18604],{},[133,18593,18594],{},[136,18595,18596,18598,18601],{},[139,18597,6213],{},[139,18599,18600],{},"大小",[139,18602,18603],{},"範圍",[149,18605,18606,18616,18626,18636,18646],{},[136,18607,18608,18610,18613],{},[154,18609,18531],{},[154,18611,18612],{},"8 bits",[154,18614,18615],{},"-128 ~ 127",[136,18617,18618,18620,18623],{},[154,18619,18534],{},[154,18621,18622],{},"16bits",[154,18624,18625],{},"-2^15 ~ 2^15-1",[136,18627,18628,18630,18633],{},[154,18629,18537],{},[154,18631,18632],{},"32bits",[154,18634,18635],{},"-2^31 ~ 2^31-1",[136,18637,18638,18640,18643],{},[154,18639,18540],{},[154,18641,18642],{},"64bits",[154,18644,18645],{},"-2^63 ~ 2^63-1",[136,18647,18648,18650,18653],{},[154,18649,14303],{},[154,18651,18652],{},"取決於平台",[154,18654,18652],{},[31,18656,18657,18660,18661],{},[55,18658,18659],{},"unit","：是無符號的整數，只能表示正數\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",[130,18662,18663,18673],{},[133,18664,18665],{},[136,18666,18667,18669,18671],{},[139,18668,6213],{},[139,18670,18600],{},[139,18672,18603],{},[149,18674,18675,18685,18695,18705,18715],{},[136,18676,18677,18680,18682],{},[154,18678,18679],{},"unit8",[154,18681,18612],{},[154,18683,18684],{},"0 ~ 255",[136,18686,18687,18690,18692],{},[154,18688,18689],{},"unit16",[154,18691,18622],{},[154,18693,18694],{},"0 ~ 2^16 - 1",[136,18696,18697,18700,18702],{},[154,18698,18699],{},"unit32",[154,18701,18632],{},[154,18703,18704],{},"0 ~ 2^31 -1",[136,18706,18707,18710,18712],{},[154,18708,18709],{},"unit64",[154,18711,18642],{},[154,18713,18714],{},"0~ 2^63 -1",[136,18716,18717,18719,18721],{},[154,18718,18659],{},[154,18720,18652],{},[154,18722,18652],{},[1103,18724,18725],{"id":18725},"浮點數型態",[2109,18727,18728,18733],{},[31,18729,18730,18732],{},[55,18731,14645],{},"：在記憶體佔用 32 位元，並以單精度浮點數格式儲存",[31,18734,18735,18737],{},[55,18736,18563],{},"：在記憶體佔用 64 位元，並以倍精度浮點數格式儲存",[1103,18739,18740],{"id":18740},"字串",[15,18742,18743,18744,18747],{},"在 Go lang 中，可以使用雙引號來宣告如 ",[55,18745,18746],{},"\"Hello World\""," 也可以使用反引號來宣告 `hello World`",[1103,18749,18750],{"id":18750},"字元",[15,18752,18753,18754,6932,18756,18758],{},"在 Go lang 中，以 ",[55,18755,18574],{},[55,18757,18571],{}," 來表示字元的變數型態",[28,18760,18761,18769],{},[31,18762,18763,18765,18766,18768],{},[55,18764,18574],{},"：是 ",[55,18767,18679],{}," 的別名，用來表示一個 8 bits 無符號正整數。它常用來表示 ASCII 碼或 UTF-8 編碼的字元。",[31,18770,18771,18765,18773,18775,18776,18779],{},[55,18772,18571],{},[55,18774,18537],{}," 的別名，用來表示一個 ",[55,18777,18778],{},"Unicode"," 碼點。它常用來表示 UTF-32 編碼的字元。",[1103,18781,18782],{"id":18782},"布林值",[15,18784,18785,18786,5196,18788],{},"Go lang 是以 bool 來宣告，其實為 ",[55,18787,14663],{},[55,18789,18790],{},"false",[63,18792,18793],{"id":18793},"型態轉換",[15,18795,18796,18797,6932,18799,18801],{},"由於 Go lang 是強型別語言，所以它不允許表達式中混合不同型態的變數。例如，我們不同直接將 ",[55,18798,18531],{},[55,18800,14645],{}," 進行相加。要解決此問題，我們必需將變數型態，改成同一種變數型態，才能進行運算。",[208,18803,18805],{"className":13927,"code":18804,"language":13929,"meta":213,"style":213},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    var x int = 10\n    \n    var y float32 = 3.1412\n    \n    var z float32 = float32(x) + y\n    \n    fmt.Println(x, y, z)\n}\n",[55,18806,18807,18813,18817,18827,18831,18839,18843,18855,18859,18871,18875,18894,18898,18907],{"__ignoreMap":213},[217,18808,18809,18811],{"class":219,"line":220},[217,18810,13999],{"class":323},[217,18812,14002],{"class":223},[217,18814,18815],{"class":219,"line":387},[217,18816,896],{"emptyLinePlaceholder":895},[217,18818,18819,18821,18823,18825],{"class":219,"line":410},[217,18820,14007],{"class":323},[217,18822,401],{"class":227},[217,18824,14012],{"class":223},[217,18826,407],{"class":227},[217,18828,18829],{"class":219,"line":424},[217,18830,896],{"emptyLinePlaceholder":895},[217,18832,18833,18835,18837],{"class":219,"line":441},[217,18834,13936],{"class":323},[217,18836,14021],{"class":223},[217,18838,7923],{"class":319},[217,18840,18841],{"class":219,"line":908},[217,18842,896],{"emptyLinePlaceholder":895},[217,18844,18845,18847,18849,18851,18853],{"class":219,"line":1560},[217,18846,14457],{"class":323},[217,18848,14312],{"class":319},[217,18850,14303],{"class":323},[217,18852,330],{"class":323},[217,18854,15786],{"class":237},[217,18856,18857],{"class":219,"line":1566},[217,18858,14506],{"class":319},[217,18860,18861,18863,18865,18867,18869],{"class":219,"line":1660},[217,18862,14457],{"class":323},[217,18864,14317],{"class":319},[217,18866,14645],{"class":323},[217,18868,330],{"class":323},[217,18870,18450],{"class":237},[217,18872,18873],{"class":219,"line":1666},[217,18874,14506],{"class":319},[217,18876,18877,18879,18881,18883,18885,18887,18890,18892],{"class":219,"line":1672},[217,18878,14457],{"class":323},[217,18880,15645],{"class":319},[217,18882,14645],{"class":323},[217,18884,330],{"class":323},[217,18886,18242],{"class":323},[217,18888,18889],{"class":319},"(x) ",[217,18891,8899],{"class":323},[217,18893,15656],{"class":319},[217,18895,18896],{"class":219,"line":1678},[217,18897,14506],{"class":319},[217,18899,18900,18902,18904],{"class":219,"line":1684},[217,18901,14258],{"class":319},[217,18903,14261],{"class":223},[217,18905,18906],{"class":319},"(x, y, z)\n",[217,18908,18909],{"class":219,"line":1689},[217,18910,2990],{"class":319},[15,18912,18913],{},[47,18914,9590],{},[208,18916,18918],{"className":210,"code":18917,"language":212,"meta":213,"style":213},"10 3.1412 13.1412\n",[55,18919,18920],{"__ignoreMap":213},[217,18921,18922,18924,18927],{"class":219,"line":220},[217,18923,2666],{"class":223},[217,18925,18926],{"class":237}," 3.1412",[217,18928,18929],{"class":237}," 13.1412\n",[1302,18931,18932],{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}",{"title":213,"searchDepth":387,"depth":387,"links":18934},[18935,18936,18943],{"id":18410,"depth":387,"text":18410},{"id":18520,"depth":387,"text":18521,"children":18937},[18938,18939,18940,18941,18942],{"id":18582,"depth":410,"text":18582},{"id":18725,"depth":410,"text":18725},{"id":18740,"depth":410,"text":18740},{"id":18750,"depth":410,"text":18750},{"id":18782,"depth":410,"text":18782},{"id":18793,"depth":387,"text":18793},{},"\u002Farticles\u002F2023-03-01-go-lang-variable","2023-03-01 21:09:00",{"title":18401,"description":213},"articles\u002F2023-03-01-go-lang-variable","Go語言變數的使用",[13929],"DB-nKle0k_0j3qTQYeUi6BcZelDX2AsafhQIlZhDKi4",{"id":18953,"title":18954,"body":18955,"category":3902,"description":213,"extension":1324,"image":14785,"meta":19157,"navigation":895,"path":19158,"pubDate":19159,"seo":19160,"status":895,"stem":19161,"summary":19162,"tags":19163,"__hash__":19164},"content\u002Farticles\u002F2023-02-27-hello-world.md","《Go 學習筆記2》不免俗的 Ｈello World",{"type":8,"value":18956,"toc":19149},[18957,18961,18964,18977,18980,18987,19000,19003,19006,19065,19103,19106,19120,19123,19132,19134,19146],[115,18958,18959],{},[15,18960,13918],{},[63,18962,18963],{"id":18963},"建立專案目錄",[208,18965,18967],{"className":210,"code":18966,"language":212,"meta":213,"style":213},"mkdir go-test\n",[55,18968,18969],{"__ignoreMap":213},[217,18970,18971,18974],{"class":219,"line":220},[217,18972,18973],{"class":223},"mkdir",[217,18975,18976],{"class":227}," go-test\n",[63,18978,18979],{"id":18979},"建立程式檔",[15,18981,18982,18983,18986],{},"Go lang 的程式檔，會以 ",[55,18984,18985],{},"*.go"," 為副檔名",[208,18988,18990],{"className":210,"code":18989,"language":212,"meta":213,"style":213},"touch hello.go\n",[55,18991,18992],{"__ignoreMap":213},[217,18993,18994,18997],{"class":219,"line":220},[217,18995,18996],{"class":223},"touch",[217,18998,18999],{"class":227}," hello.go\n",[63,19001,19002],{"id":19002},"編輯程式碼",[15,19004,19005],{},"以文字編輯器或IDE開啟，輸入下列程式碼",[208,19007,19009],{"className":13927,"code":19008,"language":13929,"meta":213,"style":213},"\u002F**\n這是注解\n***\u002F\npackage main\nimport \"fmt\"\nfunc main() {\n    fmt.Println(\"Hello World\")\n}\n",[55,19010,19011,19015,19020,19025,19031,19041,19049,19061],{"__ignoreMap":213},[217,19012,19013],{"class":219,"line":220},[217,19014,12485],{"class":1521},[217,19016,19017],{"class":219,"line":387},[217,19018,19019],{"class":1521},"這是注解\n",[217,19021,19022],{"class":219,"line":410},[217,19023,19024],{"class":1521},"***\u002F\n",[217,19026,19027,19029],{"class":219,"line":424},[217,19028,13999],{"class":323},[217,19030,14002],{"class":223},[217,19032,19033,19035,19037,19039],{"class":219,"line":441},[217,19034,14007],{"class":323},[217,19036,401],{"class":227},[217,19038,14012],{"class":223},[217,19040,407],{"class":227},[217,19042,19043,19045,19047],{"class":219,"line":908},[217,19044,13936],{"class":323},[217,19046,14021],{"class":223},[217,19048,7923],{"class":319},[217,19050,19051,19053,19055,19057,19059],{"class":219,"line":1560},[217,19052,14258],{"class":319},[217,19054,14261],{"class":223},[217,19056,2473],{"class":319},[217,19058,18746],{"class":227},[217,19060,877],{"class":319},[217,19062,19063],{"class":219,"line":1566},[217,19064,2990],{"class":319},[28,19066,19067,19073,19079,19086,19097],{},[31,19068,19069,19072],{},[55,19070,19071],{},"\u002F**\u002F","：為多行註解",[31,19074,19075,19078],{},[55,19076,19077],{},"\u002F\u002F"," ：為單行注解",[31,19080,19081,19082,19085],{},"package：是 Go lang 來定義 namespace 的方式，可以用來避免與第三方套件名稱衝突，若所開發為應用程式，則用 ",[55,19083,19084],{},"main","，若開發的為函式庫，則由開發者自行命名。",[31,19087,19088,19090,19091,19093,19094,19096],{},[55,19089,14007],{}," ：引入函式庫用，包含 Go lang 的標準函式庫或是第三方開發的函式庫，都可以用 ",[55,19092,14007],{}," 引入，而範例中 ",[55,19095,14012],{}," 為 Go lang 的基本輸入輸出的函式庫",[31,19098,19099,19102],{},[55,19100,19101],{},"func main","：為主程式進入點，程式執行時，會先執行該段程式",[63,19104,19105],{"id":19105},"進行編譯",[208,19107,19109],{"className":210,"code":19108,"language":212,"meta":213,"style":213},"go build hello.go\n",[55,19110,19111],{"__ignoreMap":213},[217,19112,19113,19115,19118],{"class":219,"line":220},[217,19114,13929],{"class":223},[217,19116,19117],{"class":227}," build",[217,19119,18999],{"class":227},[63,19121,19122],{"id":19122},"執行程式",[208,19124,19126],{"className":210,"code":19125,"language":212,"meta":213,"style":213},".\u002Fhello\n",[55,19127,19128],{"__ignoreMap":213},[217,19129,19130],{"class":219,"line":220},[217,19131,19125],{"class":223},[63,19133,9590],{"id":9590},[208,19135,19137],{"className":210,"code":19136,"language":212,"meta":213,"style":213},"Hello world\n",[55,19138,19139],{"__ignoreMap":213},[217,19140,19141,19143],{"class":219,"line":220},[217,19142,14131],{"class":223},[217,19144,19145],{"class":227}," world\n",[1302,19147,19148],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":213,"searchDepth":387,"depth":387,"links":19150},[19151,19152,19153,19154,19155,19156],{"id":18963,"depth":387,"text":18963},{"id":18979,"depth":387,"text":18979},{"id":19002,"depth":387,"text":19002},{"id":19105,"depth":387,"text":19105},{"id":19122,"depth":387,"text":19122},{"id":9590,"depth":387,"text":9590},{},"\u002Farticles\u002F2023-02-27-hello-world","2023-02-27 22:28:00",{"title":18954,"description":213},"articles\u002F2023-02-27-hello-world","Go語言一些基本操作",[13929],"AGAAFRb7gZGddzu0isU-2bKBkb4OTw3OC0QkXbImczw",{"id":19166,"title":19167,"body":19168,"category":3902,"description":213,"extension":1324,"image":14785,"meta":19474,"navigation":895,"path":19475,"pubDate":19476,"seo":19477,"status":895,"stem":19478,"summary":19479,"tags":19480,"__hash__":19481},"content\u002Farticles\u002F2023-02-26-go-lang-setup.md","《Go 學習筆記1》開發環境建置",{"type":8,"value":19169,"toc":19466},[19170,19174,19177,19181,19187,19190,19196,19202,19205,19208,19212,19221,19235,19239,19248,19262,19266,19271,19275,19301,19310,19315,19356,19365,19383,19388,19423,19426,19429,19441,19445,19463],[115,19171,19172],{},[15,19173,13918],{},[15,19175,19176],{},"先從安裝開發環境",[63,19178,19180],{"id":19179},"go-語言官網","Go 語言官網",[15,19182,19183],{},[19,19184,19185],{"href":19185,"rel":19186},"https:\u002F\u002Fgo.dev\u002F",[291],[63,19188,19189],{"id":19189},"官網下載頁",[15,19191,19192],{},[19,19193,19194],{"href":19194,"rel":19195},"https:\u002F\u002Fgo.dev\u002Fdl\u002F",[291],[15,19197,19198],{},[930,19199],{"alt":19200,"src":19201},"alt Go語言下載","\u002Farticles\u002F2023-02-26-go-lang-setup\u002FPasted-image-20230124103550.png",[15,19203,19204],{},"基本上 Windows 和 MacOS 只要下載相對應的的版本，然後依安裝精靈，一步一步安裝裝即可。",[15,19206,19207],{},"也可以用指令安裝",[63,19209,19211],{"id":19210},"windows-指令安裝","Windows 指令安裝",[15,19213,19214,19215,19220],{},"在 Windows 環境下，要透過指令安裝，可以用安裝 ",[19,19216,19219],{"href":19217,"rel":19218},"https:\u002F\u002Fchocolatey.org\u002F",[291],"chocolate"," 後，以下面指令安裝",[208,19222,19224],{"className":210,"code":19223,"language":212,"meta":213,"style":213},"choco install golang\n",[55,19225,19226],{"__ignoreMap":213},[217,19227,19228,19230,19232],{"class":219,"line":220},[217,19229,5386],{"class":223},[217,19231,1498],{"class":227},[217,19233,19234],{"class":227}," golang\n",[63,19236,19238],{"id":19237},"macos-指令安裝","MacOS 指令安裝",[15,19240,19241,19242,19247],{},"在 MacOS 環境下，則可透過 ",[19,19243,19246],{"href":19244,"rel":19245},"https:\u002F\u002Fbrew.sh\u002Findex_zh-tw",[291],"Homebrew"," 這個套件管理工具，進行安裝，指令如下：",[208,19249,19251],{"className":210,"code":19250,"language":212,"meta":213,"style":213},"brew install go\n",[55,19252,19253],{"__ignoreMap":213},[217,19254,19255,19257,19259],{"class":219,"line":220},[217,19256,1495],{"class":223},[217,19258,1498],{"class":227},[217,19260,19261],{"class":227}," go\n",[63,19263,19265],{"id":19264},"linux-指令安裝","Linux 指令安裝",[15,19267,19268],{},[47,19269,19270],{},"一般 Linux",[2109,19272,19273],{},[31,19274,11882],{},[208,19276,19278],{"className":210,"code":19277,"language":212,"meta":213,"style":213},"wget https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo\u003C版本號>linux-amd64.tar.gz\n",[55,19279,19280],{"__ignoreMap":213},[217,19281,19282,19285,19288,19290,19293,19296,19298],{"class":219,"line":220},[217,19283,19284],{"class":223},"wget",[217,19286,19287],{"class":227}," https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo",[217,19289,7267],{"class":323},[217,19291,19292],{"class":227},"版本",[217,19294,19295],{"class":319},"號",[217,19297,567],{"class":323},[217,19299,19300],{"class":227},"linux-amd64.tar.gz\n",[28,19302,19303],{},[31,19304,19305,19306,19309],{},"版本號：可至 ",[19,19307,19189],{"href":19194,"rel":19308},[291]," 查詢可安裝的版本號",[2109,19311,19312],{"start":387},[31,19313,19314],{},"解壓縮",[208,19316,19318],{"className":210,"code":19317,"language":212,"meta":213,"style":213},"   sudo tar -xvf go\u003C版本號>linux-amd64.tar.gz\n   sudo mv go \u002Fusr\u002Flocal\n",[55,19319,19320,19344],{"__ignoreMap":213},[217,19321,19322,19325,19328,19331,19334,19336,19338,19340,19342],{"class":219,"line":220},[217,19323,19324],{"class":223},"   sudo",[217,19326,19327],{"class":227}," tar",[217,19329,19330],{"class":237}," -xvf",[217,19332,19333],{"class":227}," go",[217,19335,7267],{"class":323},[217,19337,19292],{"class":227},[217,19339,19295],{"class":319},[217,19341,567],{"class":323},[217,19343,19300],{"class":227},[217,19345,19346,19348,19351,19353],{"class":219,"line":387},[217,19347,19324],{"class":223},[217,19349,19350],{"class":227}," mv",[217,19352,19333],{"class":227},[217,19354,19355],{"class":227}," \u002Fusr\u002Flocal\n",[2109,19357,19358],{"start":410},[31,19359,19360,19361,19364],{},"設定環境變數\n在 ",[55,19362,19363],{},"~\u002F.profile"," 最後一行加上",[208,19366,19368],{"className":210,"code":19367,"language":212,"meta":213,"style":213},"   export PATH=$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[55,19369,19370],{"__ignoreMap":213},[217,19371,19372,19375,19378,19380],{"class":219,"line":220},[217,19373,19374],{"class":323},"   export",[217,19376,19377],{"class":319}," PATH",[217,19379,854],{"class":323},[217,19381,19382],{"class":319},"$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[15,19384,19385],{},[47,19386,19387],{},"Ubuntu 指令安裝",[208,19389,19391],{"className":210,"code":19390,"language":212,"meta":213,"style":213},"sudo add-apt-repository ppa:longsleep\u002Fgolang-backports\nsudo apt update\nsudo apt install golang-go\n",[55,19392,19393,19403,19412],{"__ignoreMap":213},[217,19394,19395,19397,19400],{"class":219,"line":220},[217,19396,1546],{"class":223},[217,19398,19399],{"class":227}," add-apt-repository",[217,19401,19402],{"class":227}," ppa:longsleep\u002Fgolang-backports\n",[217,19404,19405,19407,19409],{"class":219,"line":387},[217,19406,1546],{"class":223},[217,19408,1549],{"class":227},[217,19410,19411],{"class":227}," update\n",[217,19413,19414,19416,19418,19420],{"class":219,"line":410},[217,19415,1546],{"class":223},[217,19417,1549],{"class":227},[217,19419,1498],{"class":227},[217,19421,19422],{"class":227}," golang-go\n",[63,19424,19425],{"id":19425},"安裝環境測試",[15,19427,19428],{},"使用下列指令，即可知道安裝環境是否成功，亦可知曉安裝版本號",[208,19430,19432],{"className":210,"code":19431,"language":212,"meta":213,"style":213},"go version\n",[55,19433,19434],{"__ignoreMap":213},[217,19435,19436,19438],{"class":219,"line":220},[217,19437,13929],{"class":223},[217,19439,19440],{"class":227}," version\n",[15,19442,19443],{},[47,19444,9590],{},[208,19446,19448],{"className":210,"code":19447,"language":212,"meta":213,"style":213},"go version go1.20.1 darwin\u002Farm64\n",[55,19449,19450],{"__ignoreMap":213},[217,19451,19452,19454,19457,19460],{"class":219,"line":220},[217,19453,13929],{"class":223},[217,19455,19456],{"class":227}," version",[217,19458,19459],{"class":227}," go1.20.1",[217,19461,19462],{"class":227}," darwin\u002Farm64\n",[1302,19464,19465],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":213,"searchDepth":387,"depth":387,"links":19467},[19468,19469,19470,19471,19472,19473],{"id":19179,"depth":387,"text":19180},{"id":19189,"depth":387,"text":19189},{"id":19210,"depth":387,"text":19211},{"id":19237,"depth":387,"text":19238},{"id":19264,"depth":387,"text":19265},{"id":19425,"depth":387,"text":19425},{},"\u002Farticles\u002F2023-02-26-go-lang-setup","2023-02-26 22:07:00",{"title":19167,"description":213},"articles\u002F2023-02-26-go-lang-setup","Go語言開發環境建置",[13929],"1MsaGwXGPaKjHByWDr40lLNGtsFtegUMCMt7bttsgQ8",{"id":19483,"title":19484,"body":19485,"category":11793,"description":19852,"extension":1324,"image":19853,"meta":19854,"navigation":895,"path":19855,"pubDate":19856,"seo":19857,"status":895,"stem":19858,"summary":19859,"tags":19860,"__hash__":19862},"content\u002Farticles\u002F2023-01-17-docker-postgresql-import-export.md","Docker 裡的 Postgresql 的匯入與匯出",{"type":8,"value":19486,"toc":19848},[19487,19496,19499,19506,19513,19516,19590,19622,19625,19631,19637,19640,19709,19731,19738,19740,19815,19845],[15,19488,19489,19490,19495],{},"我們可以用 ",[19,19491,19494],{"href":19492,"rel":19493},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fadminer",[291],"Adminer"," 這個資料庫管理工具，來進行匯入匯出，但檔案太大時，用 Adminer 就會顯得力不從心，而我們另外一個選擇，就是透過指令匯入匯出 SQL 檔。",[63,19497,19498],{"id":19498},"匯入",[15,19500,19501,19502,19505],{},"要將 SQL 檔案匯入到 Docker 內的 PostgreSQL 資料庫，您可以使用 ",[55,19503,19504],{},"docker exec","指令來執行 SQL 檔案。首先，確保您已經在 Docker 內運行 PostgreSQL 資料庫，並且已經知道資料庫的容器名稱。",[15,19507,19508,19509,19512],{},"而 Postgresql 要匯入 SQL 檔時，我們會使用 ",[55,19510,19511],{},"psql"," 這個指令",[15,19514,19515],{},"完整指令與參數如下：",[208,19517,19519],{"className":210,"code":19518,"language":212,"meta":213,"style":213},"docker exec -i \u003Ccontainer_name> psql -U \u003Cusername> -d \u003Cdatabase_name> -n \u003Cschema_name> \u003C \u003Csql_file>.sql\n",[55,19520,19521],{"__ignoreMap":213},[217,19522,19523,19525,19528,19530,19532,19535,19537,19539,19542,19545,19547,19550,19552,19554,19556,19558,19561,19563,19565,19567,19569,19572,19574,19576,19578,19580,19583,19585,19587],{"class":219,"line":220},[217,19524,10886],{"class":223},[217,19526,19527],{"class":227}," exec",[217,19529,6530],{"class":237},[217,19531,558],{"class":323},[217,19533,19534],{"class":227},"container_nam",[217,19536,9400],{"class":319},[217,19538,567],{"class":323},[217,19540,19541],{"class":227}," psql",[217,19543,19544],{"class":237}," -U",[217,19546,558],{"class":323},[217,19548,19549],{"class":227},"usernam",[217,19551,9400],{"class":319},[217,19553,567],{"class":323},[217,19555,12067],{"class":237},[217,19557,558],{"class":323},[217,19559,19560],{"class":227},"database_nam",[217,19562,9400],{"class":319},[217,19564,567],{"class":323},[217,19566,9874],{"class":237},[217,19568,558],{"class":323},[217,19570,19571],{"class":227},"schema_nam",[217,19573,9400],{"class":319},[217,19575,567],{"class":323},[217,19577,558],{"class":323},[217,19579,558],{"class":323},[217,19581,19582],{"class":227},"sql_fil",[217,19584,9400],{"class":319},[217,19586,567],{"class":323},[217,19588,19589],{"class":227},".sql\n",[28,19591,19592,19598,19604,19610,19616],{},[31,19593,19594,19597],{},[55,19595,19596],{},"container_name","：PostgreSQL 容器的名稱",[31,19599,19600,19603],{},[55,19601,19602],{},"username","：資料庫中使用的使用者名稱",[31,19605,19606,19609],{},[55,19607,19608],{},"database_name","： 資料庫名稱",[31,19611,19612,19615],{},[55,19613,19614],{},"schema_name","：要匯入 SQL 檔案的 schema 名稱",[31,19617,19618,19621],{},[55,19619,19620],{},"sql_file","：SQL 檔案 路徑",[63,19623,19624],{"id":19624},"匯出",[15,19626,19627,19628,19630],{},"要將 Docker 裡 Postgresql 服務器中的資料匯出時，我們一樣要使用 ",[55,19629,19504],{}," 這個指令，一樣我們先確認 Docker 內的 Postgresql 資料庫是正常運作。",[15,19632,19633,19634,19512],{},"而 Postgresql 要匯出 SQL 檔時，我們會使用 ",[55,19635,19636],{},"pg_dump",[15,19638,19639],{},"完整指令如下：",[208,19641,19643],{"className":210,"code":19642,"language":212,"meta":213,"style":213},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> > \u003Csql_path>.sql\n",[55,19644,19645],{"__ignoreMap":213},[217,19646,19647,19649,19651,19653,19655,19657,19659,19661,19664,19666,19668,19670,19672,19674,19676,19678,19680,19682,19684,19686,19688,19690,19692,19694,19697,19699,19702,19705,19707],{"class":219,"line":220},[217,19648,10886],{"class":223},[217,19650,19527],{"class":227},[217,19652,6530],{"class":237},[217,19654,558],{"class":323},[217,19656,19534],{"class":227},[217,19658,9400],{"class":319},[217,19660,567],{"class":323},[217,19662,19663],{"class":227}," pg_dump",[217,19665,19544],{"class":237},[217,19667,558],{"class":323},[217,19669,19549],{"class":227},[217,19671,9400],{"class":319},[217,19673,567],{"class":323},[217,19675,12067],{"class":237},[217,19677,558],{"class":323},[217,19679,19549],{"class":227},[217,19681,9400],{"class":319},[217,19683,567],{"class":323},[217,19685,9874],{"class":237},[217,19687,558],{"class":323},[217,19689,19571],{"class":227},[217,19691,9400],{"class":319},[217,19693,567],{"class":323},[217,19695,19696],{"class":323}," >",[217,19698,558],{"class":323},[217,19700,19701],{"class":227},"sql_pat",[217,19703,19704],{"class":319},"h",[217,19706,567],{"class":323},[217,19708,19589],{"class":227},[28,19710,19711,19715,19719,19723,19727],{},[31,19712,19713,19597],{},[55,19714,19596],{},[31,19716,19717,19603],{},[55,19718,19602],{},[31,19720,19721,19609],{},[55,19722,19608],{},[31,19724,19725,19615],{},[55,19726,19614],{},[31,19728,19729,19621],{},[55,19730,19620],{},[15,19732,19733,19734,19737],{},"而我們也可以在匯出時，直接匯出 gzip 壓縮檔，只要我們加上 ",[55,19735,19736],{},"pipe line gzip"," 的指令即可",[15,19739,19639],{},[208,19741,19743],{"className":210,"code":19742,"language":212,"meta":213,"style":213},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> | gzip -9 > \u003Czip_path>.sql.gz\n",[55,19744,19745],{"__ignoreMap":213},[217,19746,19747,19749,19751,19753,19755,19757,19759,19761,19763,19765,19767,19769,19771,19773,19775,19777,19779,19781,19783,19785,19787,19789,19791,19793,19795,19798,19801,19803,19805,19808,19810,19812],{"class":219,"line":220},[217,19748,10886],{"class":223},[217,19750,19527],{"class":227},[217,19752,6530],{"class":237},[217,19754,558],{"class":323},[217,19756,19534],{"class":227},[217,19758,9400],{"class":319},[217,19760,567],{"class":323},[217,19762,19663],{"class":227},[217,19764,19544],{"class":237},[217,19766,558],{"class":323},[217,19768,19549],{"class":227},[217,19770,9400],{"class":319},[217,19772,567],{"class":323},[217,19774,12067],{"class":237},[217,19776,558],{"class":323},[217,19778,19549],{"class":227},[217,19780,9400],{"class":319},[217,19782,567],{"class":323},[217,19784,9874],{"class":237},[217,19786,558],{"class":323},[217,19788,19571],{"class":227},[217,19790,9400],{"class":319},[217,19792,567],{"class":323},[217,19794,1772],{"class":323},[217,19796,19797],{"class":223}," gzip",[217,19799,19800],{"class":237}," -9",[217,19802,19696],{"class":323},[217,19804,558],{"class":323},[217,19806,19807],{"class":227},"zip_pat",[217,19809,19704],{"class":319},[217,19811,567],{"class":323},[217,19813,19814],{"class":227},".sql.gz\n",[28,19816,19817,19821,19825,19829,19833,19839],{},[31,19818,19819,19597],{},[55,19820,19596],{},[31,19822,19823,19603],{},[55,19824,19602],{},[31,19826,19827,19609],{},[55,19828,19608],{},[31,19830,19831,19615],{},[55,19832,19614],{},[31,19834,19835,19838],{},[55,19836,19837],{},"zip_path"," ：壓縮檔路徑",[31,19840,19841,19844],{},[55,19842,19843],{},"-9","：為壓縮等級，範圍為 0~9，其中 0 為不壓縮僅打包，9 為最高壓縮等級，這裡也可以不指定壓縮等級，它則會以預設 6 來進行壓縮",[1302,19846,19847],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":387,"depth":387,"links":19849},[19850,19851],{"id":19498,"depth":387,"text":19498},{"id":19624,"depth":387,"text":19624},"我們可以用 Adminer 這個資料庫管理工具，來進行匯入匯出，但檔案太大時，用 Adminer 就會顯得力不從心，而我們另外一個選擇，就是透過指令匯入匯出 SQL 檔。","\u002Fimages\u002Farticles\u002F2023-01-17-docker-postgresql-import-export\u002Fcover.png",{},"\u002Farticles\u002F2023-01-17-docker-postgresql-import-export","2023-01-17 11:12:00",{"title":19484,"description":19852},"articles\u002F2023-01-17-docker-postgresql-import-export","在 Docker 的環境，如何匯入匯出 Postgresql",[19861,10887],"PostgreSQL","jNGUE7713QOJ1uS2wd7Q70oQzHSviRpYIk8u2R8U67Y",{"id":19864,"title":19865,"body":19866,"category":20276,"description":213,"extension":1324,"image":20277,"meta":20278,"navigation":895,"path":20279,"pubDate":20280,"seo":20281,"status":895,"stem":20282,"summary":20283,"tags":20284,"__hash__":20285},"content\u002Farticles\u002F2022-05-28-front-end-tool.md","2022 前端常用的套件與工具",{"type":8,"value":19867,"toc":20265},[19868,19871,19874,19877,19885,19888,19907,19917,19920,20005,20008,20022,20024,20027,20030,20035,20051,20056,20069,20074,20128,20131,20145,20151,20154,20157,20168,20171,20177,20181,20184,20190,20194,20197,20203,20207,20210,20227,20233,20236,20240,20243,20249,20253,20256,20262],[63,19869,19870],{"id":19870},"nvm",[15,19872,19873],{},"NVM 是 Node Version Manager 的縮寫，主要功能就可以快速切換 Node.js 版本。",[15,19875,19876],{},"使用場景：",[2109,19878,19879,19882],{},[31,19880,19881],{},"維護多個不同時期所開發專案",[31,19883,19884],{},"編譯老舊專案",[15,19886,19887],{},"Linux \u002F MacOS 安裝方式",[208,19889,19891],{"className":210,"code":19890,"language":212,"meta":213,"style":213},"curl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh | bash\n",[55,19892,19893],{"__ignoreMap":213},[217,19894,19895,19897,19900,19903,19905],{"class":219,"line":220},[217,19896,1578],{"class":223},[217,19898,19899],{"class":237}," -o-",[217,19901,19902],{"class":227}," https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh",[217,19904,1772],{"class":323},[217,19906,4929],{"class":223},[15,19908,19909,19910,19913,19914],{},"在終端機設定檔 bash 環境下編輯 ",[55,19911,19912],{},"~\u002F.bashrc"," 或 zsh 環境下編輯 ",[55,19915,19916],{},"~\u002F.zshrc",[15,19918,19919],{},"在文件內加入以下設定：",[208,19921,19923],{"className":210,"code":19922,"language":212,"meta":213,"style":213},"export NVM_DIR=\"$([ -z \"${XDG_CONFIG_HOME-}\" ] && printf %s \"${HOME}\u002F.nvm\" || printf %s \"${XDG_CONFIG_HOME}\u002Fnvm\")\"\n[ -s \"$NVM_DIR\u002Fnvm.sh\" ] && \\. \"$NVM_DIR\u002Fnvm.sh\" # This loads nvm\n",[55,19924,19925,19974],{"__ignoreMap":213},[217,19926,19927,19930,19933,19935,19938,19941,19943,19946,19949,19951,19954,19957,19960,19963,19966,19968,19971],{"class":219,"line":220},[217,19928,19929],{"class":323},"export",[217,19931,19932],{"class":319}," NVM_DIR",[217,19934,854],{"class":323},[217,19936,19937],{"class":227},"\"$([ ",[217,19939,19940],{"class":323},"-z",[217,19942,316],{"class":227},[217,19944,19945],{"class":319},"XDG_CONFIG_HOME-",[217,19947,19948],{"class":227},"}\" ] && ",[217,19950,12324],{"class":237},[217,19952,19953],{"class":227}," %s \"${",[217,19955,19956],{"class":319},"HOME",[217,19958,19959],{"class":227},"}\u002F.nvm\" ",[217,19961,19962],{"class":323},"||",[217,19964,19965],{"class":237}," printf",[217,19967,19953],{"class":227},[217,19969,19970],{"class":319},"XDG_CONFIG_HOME",[217,19972,19973],{"class":227},"}\u002Fnvm\")\"\n",[217,19975,19976,19979,19982,19984,19987,19990,19993,19996,19998,20000,20002],{"class":219,"line":387},[217,19977,19978],{"class":319},"[ ",[217,19980,19981],{"class":323},"-s",[217,19983,401],{"class":227},[217,19985,19986],{"class":319},"$NVM_DIR",[217,19988,19989],{"class":227},"\u002Fnvm.sh\"",[217,19991,19992],{"class":319}," ] && ",[217,19994,19995],{"class":223},"\\.",[217,19997,401],{"class":227},[217,19999,19986],{"class":319},[217,20001,19989],{"class":227},[217,20003,20004],{"class":1521}," # This loads nvm\n",[15,20006,20007],{},"然後執行下面指令",[28,20009,20010,20016],{},[31,20011,20012,20013],{},"bash：",[55,20014,20015],{},"source ~\u002F.bashrc",[31,20017,20018,20019],{},"zsh: ",[55,20020,20021],{},"source ~\u002F.zshrc",[63,20023,5508],{"id":5508},[15,20025,20026],{},"是 Facebook 所開發的前端工具，是 Node.js 的套件管理，算是 npm 的替代品，優點是速度較快。",[15,20028,20029],{},"安裝方式：",[15,20031,20032],{},[47,20033,20034],{},"使用 npm 安裝",[208,20036,20038],{"className":210,"code":20037,"language":212,"meta":213,"style":213},"npm install -g yarn\n",[55,20039,20040],{"__ignoreMap":213},[217,20041,20042,20044,20046,20048],{"class":219,"line":220},[217,20043,5423],{"class":223},[217,20045,1498],{"class":227},[217,20047,5428],{"class":237},[217,20049,20050],{"class":227}," yarn\n",[15,20052,20053],{},[47,20054,20055],{},"MacOS安裝",[208,20057,20059],{"className":210,"code":20058,"language":212,"meta":213,"style":213},"brew install yarn\n",[55,20060,20061],{"__ignoreMap":213},[217,20062,20063,20065,20067],{"class":219,"line":220},[217,20064,1495],{"class":223},[217,20066,1498],{"class":227},[217,20068,20050],{"class":227},[15,20070,20071],{},[47,20072,20073],{},"Ubuntu安裝",[208,20075,20077],{"className":210,"code":20076,"language":212,"meta":213,"style":213},"curl -sS https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg | sudo apt-key add -  \n\nsudo apt-get update && sudo apt-get install yarn \n",[55,20078,20079,20103,20107],{"__ignoreMap":213},[217,20080,20081,20083,20086,20089,20091,20094,20097,20099,20101],{"class":219,"line":220},[217,20082,1578],{"class":223},[217,20084,20085],{"class":237}," -sS",[217,20087,20088],{"class":227}," https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg",[217,20090,1772],{"class":323},[217,20092,20093],{"class":223}," sudo",[217,20095,20096],{"class":227}," apt-key",[217,20098,231],{"class":227},[217,20100,6687],{"class":227},[217,20102,4196],{"class":319},[217,20104,20105],{"class":219,"line":387},[217,20106,896],{"emptyLinePlaceholder":895},[217,20108,20109,20111,20114,20117,20120,20122,20124,20126],{"class":219,"line":410},[217,20110,1546],{"class":223},[217,20112,20113],{"class":227}," apt-get",[217,20115,20116],{"class":227}," update",[217,20118,20119],{"class":319}," && ",[217,20121,1546],{"class":223},[217,20123,20113],{"class":227},[217,20125,1498],{"class":227},[217,20127,20050],{"class":227},[63,20129,11816],{"id":20130},"nuxtjs",[15,20132,20133,20134,100,20137,20140,20141,20144],{},"是一個混合式 Vue 框架，支援 ",[47,20135,20136],{},"服務器渲染(SSR)",[47,20138,20139],{},"生成靜態頁面","或是",[47,20142,20143],{},"單頁應用程式(SPA)","，並優化了SEO，也支援 TypeScript。",[15,20146,10814,20147],{},[19,20148,20149],{"href":20149,"rel":20150},"https:\u002F\u002Fnuxtjs.org\u002F",[291],[63,20152,20153],{"id":20153},"tailwindcss",[15,20155,20156],{},"是一個近期相當流行的 Utility Framework，也是我近期最用的 UI 構建工具，其特色包含：",[2109,20158,20159,20162,20165],{},[31,20160,20161],{},"快速上手",[31,20163,20164],{},"快速建置",[31,20166,20167],{},"高度客製化",[15,20169,20170],{},"因為以上特色，真得讓人一用就愛上了。",[15,20172,10814,20173],{},[19,20174,20175],{"href":20175,"rel":20176},"https:\u002F\u002Ftailwindcss.com\u002F",[291],[63,20178,20180],{"id":20179},"bootstrap","Bootstrap",[15,20182,20183],{},"相當知名且老牌的 UI component Framework，可以快速透過各種組件的組合建立 Web App，不過其實近期的專案，我已很少用到 Bootstrap 了。",[15,20185,10814,20186],{},[19,20187,20188],{"href":20188,"rel":20189},"https:\u002F\u002Fgetbootstrap.com\u002F",[291],[63,20191,20193],{"id":20192},"element-ui","element UI",[15,20195,20196],{},"這是我也滿喜歡的一個 UI component Framework，相對於 Bootstrap 它的組件更加豐富，特別適合拿來做管理介面。",[15,20198,10814,20199],{},[19,20200,20201],{"href":20201,"rel":20202},"https:\u002F\u002Felement.eleme.io\u002F",[291],[63,20204,20206],{"id":20205},"momentjs","Moment.js",[15,20208,20209],{},"是一個專門處理日期與時間的Library，功能包含了：",[2109,20211,20212,20215,20218,20221,20224],{},[31,20213,20214],{},"日期時間格式化",[31,20216,20217],{},"日期時間相減運算",[31,20219,20220],{},"相對時間時間",[31,20222,20223],{},"時區轉換",[31,20225,20226],{},"支持多語系",[15,20228,10814,20229],{},[19,20230,20231],{"href":20231,"rel":20232},"https:\u002F\u002Fmomentjs.com\u002F",[291],[15,20234,20235],{},"對於日期時間的處理，Moment.js 幾乎都可以滿足",[63,20237,20239],{"id":20238},"lodash","Lodash",[15,20241,20242],{},"在用 javascript 做資料處理，Lodash 可以幫我們省去很多時間。",[15,20244,10814,20245],{},[19,20246,20247],{"href":20247,"rel":20248},"https:\u002F\u002Flodash.com\u002F",[291],[63,20250,20252],{"id":20251},"apache-echarts","Apache ECharts",[15,20254,20255],{},"這是一個開源的繪圖工具，當做數據分析時，需要圖表統計時，ECharts 是不錯的選擇",[15,20257,10814,20258],{},[19,20259,20260],{"href":20260,"rel":20261},"https:\u002F\u002Fecharts.apache.org\u002F",[291],[1302,20263,20264],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":213,"searchDepth":387,"depth":387,"links":20266},[20267,20268,20269,20270,20271,20272,20273,20274,20275],{"id":19870,"depth":387,"text":19870},{"id":5508,"depth":387,"text":5508},{"id":20130,"depth":387,"text":11816},{"id":20153,"depth":387,"text":20153},{"id":20179,"depth":387,"text":20180},{"id":20192,"depth":387,"text":20193},{"id":20205,"depth":387,"text":20206},{"id":20238,"depth":387,"text":20239},{"id":20251,"depth":387,"text":20252},"frontend","\u002Fimages\u002Farticles\u002F2022-06-03-frontend-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-05-28-front-end-tool","2022-05-28 11:00:00",{"title":19865,"description":213},"articles\u002F2022-05-28-front-end-tool","這裡收集了我開發前端時，常用的套件與工具",[7687,7246,7505],"aULNoAsXNxW4_qR3-D3eYMi5LPuZ1DlIjYcmbq496Kw",{"id":20287,"title":20288,"body":20289,"category":2208,"description":213,"extension":1324,"image":20397,"meta":20398,"navigation":895,"path":20399,"pubDate":20400,"seo":20401,"status":895,"stem":20402,"summary":20403,"tags":20404,"__hash__":20405},"content\u002Farticles\u002F2022-04-27-develop-tool.md","開發環境工具介紹-環境篇",{"type":8,"value":20290,"toc":20388},[20291,20293,20296,20302,20306,20309,20316,20320,20323,20329,20331,20334,20340,20343,20346,20353,20355,20358,20365,20369,20380],[63,20292,10887],{"id":10886},[15,20294,20295],{},"有別於傳統虛擬機以作業系統為中心，Docker 則是以應用程式為中心，在達成虛擬化，並不需要完整載入完整的 Guest OS，而只要啟用應用層級程式及相關函式，因此其優勢，不需完整安裝 Guest OS 節省硬碟資源，另外啟用速度快，也是其最大優勢。",[15,20297,10814,20298],{},[19,20299,20301],{"href":10895,"rel":20300},[291],"Home - Docker",[63,20303,20305],{"id":20304},"laradock","Laradock",[15,20307,20308],{},"這應該在 Docker 上最完整的 PHP 開發環境。支持各版本 PHP 切換，支援主流資料庫，如 MySQL、Postgres、MariaDB及各種常用伺服器服務。",[15,20310,20311,20312],{},"官網： ",[19,20313,20314],{"href":20314,"rel":20315},"https:\u002F\u002Flaradock.io\u002F",[291],[63,20317,20319],{"id":20318},"visual-studio-code","Visual Studio Code",[15,20321,20322],{},"微軟開發的開源文字編器，相當受社群歡迎，支援 Windows、MacOS、Linux 三大主流作業系統。另外有各種插件可使用，功能不輸需要付費的IDE。",[15,20324,10814,20325],{},[19,20326,20328],{"href":10817,"rel":20327},[291],"Visual Studio Code - Code Editing. Redefined",[63,20330,10848],{"id":10847},[15,20332,20333],{},"相當知名的 Rest API 測試工具，支援各種API認證、常用的 http method，及常用 Http 的 Authorizing",[15,20335,10814,20336],{},[19,20337,20339],{"href":10856,"rel":20338},[291],"Postman API Platform | Sign Up for Free",[63,20341,20342],{"id":9907},"Git",[15,20344,20345],{},"是一個免費且開源的版控軟體，是目前最主流的版控軟體，支援MacOS、Ｗindows、Linux多平台",[15,20347,10814,20348],{},[19,20349,20352],{"href":20350,"rel":20351},"https:\u002F\u002Fgit-scm.com\u002F",[291],"Git (git-scm.com)",[63,20354,10861],{"id":10860},[15,20356,20357],{},"Git 知名的原始碼代管服務平台，所發行 Git GUI 免費軟體，目前提供 Windows 和 MacOS，介面相當友善， 對 Git 的功能支援的相當完整，很適合 Git 初心者使用。",[15,20359,10814,20360],{},[19,20361,20364],{"href":20362,"rel":20363},"https:\u002F\u002Fdesktop.github.com\u002F",[291],"GitHub Desktop | Simple collaboration from your desktop",[63,20366,20368],{"id":20367},"zsh-command-line-oh-my-zsh","zsh Command Line + oh my zsh",[15,20370,20371,20372,6932,20374,20376,20377,20379],{},"開發網站時常要用到 Command Line，雖然 ",[55,20373,5263],{},[55,20375,1508],{}," 都支援 ",[55,20378,212],{},"，但更喜歡 zsh + oh my zsh 各種插件，針對 git 優化，指令提醒功能，甚致可以顯示CPU、記憶體使用量等潮到爆的功能，你也可自訂佈景，讓你的 Command Line 呈現簡約風格。",[15,20381,20382,20383],{},"官綱：",[19,20384,20387],{"href":20385,"rel":20386},"https:\u002F\u002Fohmyz.sh\u002F",[291],"Oh My zsh官網",{"title":213,"searchDepth":387,"depth":387,"links":20389},[20390,20391,20392,20393,20394,20395,20396],{"id":10886,"depth":387,"text":10887},{"id":20304,"depth":387,"text":20305},{"id":20318,"depth":387,"text":20319},{"id":10847,"depth":387,"text":10848},{"id":9907,"depth":387,"text":20342},{"id":10860,"depth":387,"text":10861},{"id":20367,"depth":387,"text":20368},"\u002Fimages\u002Farticles\u002F2022-04-27-develop-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-27-develop-tool","2022-04-27 12:00:00",{"title":20288,"description":213},"articles\u002F2022-04-27-develop-tool","記錄自已在網站開發時，常用的工具",[2208],"vI9Ah-vhtRDUUlZPJuEb9VQPYrnvz4BqrjLqFerjxAY",{"id":20407,"title":20408,"body":20409,"category":2208,"description":213,"extension":1324,"image":20765,"meta":20766,"navigation":895,"path":20767,"pubDate":20768,"seo":20769,"status":895,"stem":20770,"summary":20771,"tags":20772,"__hash__":20773},"content\u002Farticles\u002F2022-04-10-mac-os-tool.md","大推！MacOS 上好用軟體集",{"type":8,"value":20410,"toc":20747},[20411,20415,20431,20437,20439,20459,20462,20472,20477,20479,20486,20512,20519,20522,20537,20539,20542,20559,20562,20568,20575,20579,20582,20588,20590,20596,20602,20604,20614,20619,20621,20624,20629,20633,20636,20642,20648,20650,20666,20668,20671,20676,20678,20681,20686,20690,20693,20696,20701,20705,20708,20713,20715,20718,20723,20725,20728,20733,20735,20738,20744],[63,20412,20414],{"id":20413},"homebrew","HomeBrew",[15,20416,20417,20418,20421,20422,20425,20426,20421,20429],{},"MacOS 上的套件管理，類似 ",[47,20419,20420],{},"Ubuntu"," 上的 ",[55,20423,20424],{},"apt"," 或是 ",[47,20427,20428],{},"CentOS",[55,20430,2331],{},[15,20432,10814,20433],{},[19,20434,20435],{"href":20435,"rel":20436},"https:\u002F\u002Fbrew.sh",[291],[15,20438,20029],{},[208,20440,20442],{"className":210,"code":20441,"language":212,"meta":213,"style":213},"\u002Fbin\u002Fbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[55,20443,20444],{"__ignoreMap":213},[217,20445,20446,20448,20450,20452,20454,20456],{"class":219,"line":220},[217,20447,1569],{"class":223},[217,20449,1572],{"class":237},[217,20451,1575],{"class":227},[217,20453,1578],{"class":223},[217,20455,1581],{"class":237},[217,20457,20458],{"class":227}," https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[63,20460,20461],{"id":10821},"iTerm2",[15,20463,20464,20465,20467,20468,20471],{},"雖然MacOS有內建terminal，但 ",[55,20466,20461],{},"更加強大，再加上 ",[55,20469,20470],{},"zsh","，真得是開發者必裝軟體",[15,20473,10814,20474],{},[19,20475,10830],{"href":10830,"rel":20476},[291],[63,20478,11119],{"id":11118},[15,20480,20481,20482,20485],{},"好用且",[47,20483,20484],{},"免費開源","的硬體監測軟體，可即時監測以下硬體資訊",[2109,20487,20488,20491,20494,20497,20500,20503,20506,20509],{},[31,20489,20490],{},"CPU",[31,20492,20493],{},"RAM",[31,20495,20496],{},"GPU",[31,20498,20499],{},"DISK",[31,20501,20502],{},"溫度",[31,20504,20505],{},"網路使用狀況",[31,20507,20508],{},"電池",[31,20510,20511],{},"藍芽",[15,20513,20514,20515],{},"下載位置： ",[19,20516,20517],{"href":20517,"rel":20518},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats\u002Freleases",[291],[15,20520,20521],{},"HomeBrew 安裝",[208,20523,20525],{"className":210,"code":20524,"language":212,"meta":213,"style":213},"brew install --cask stats\n",[55,20526,20527],{"__ignoreMap":213},[217,20528,20529,20531,20533,20535],{"class":219,"line":220},[217,20530,1495],{"class":223},[217,20532,1498],{"class":227},[217,20534,1501],{"class":237},[217,20536,4054],{"class":227},[63,20538,11171],{"id":11170},[15,20540,20541],{},"是 MacOS 上相當好的螢幕截圖，功能如下：",[2109,20543,20544,20547,20550,20553,20556],{},[31,20545,20546],{},"區域截圖",[31,20548,20549],{},"視窗截圖",[31,20551,20552],{},"捲動截圖 (截圖網頁時，超好用 👍)",[31,20554,20555],{},"截圖標示 (可標示矩形、圓形、直線、鉛筆、馬賽克、文字、序號、高亮區塊等)",[31,20557,20558],{},"釘選螢幕 (可在截圖後，將圖片釘在螢幕上)",[15,20560,20561],{},"另外也可付費解鎖更完整的功能",[15,20563,20311,20564],{},[19,20565,20566],{"href":20566,"rel":20567},"http:\u002F\u002Fxnipapp.com\u002F",[291],[15,20569,20570,20571],{},"App Store：",[19,20572,20573],{"href":20573,"rel":20574},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fxnip\u002Fid1221250572?mt=12",[291],[63,20576,20578],{"id":20577},"couleurs","Couleurs",[15,20580,20581],{},"這是一款簡單免費的螢幕選色器，操作上相當直覺。",[15,20583,20311,20584],{},[19,20585,20586],{"href":20586,"rel":20587},"https:\u002F\u002Fcouleursapp.com\u002F",[291],[63,20589,11184],{"id":11183},[15,20591,20592,20593,20595],{},"Apple 觸控板真得很好用，但當你改用滑鼠時，就會讓你感到非常悲劇，那悲催的卡頓感，真得讓人很崩潰，而 ",[47,20594,11184],{}," 就可以改善，滑鼠在MacOS上的使用體驗。",[15,20597,10814,20598],{},[19,20599,20600],{"href":20600,"rel":20601},"https:\u002F\u002Fmos.caldis.me\u002F",[291],[63,20603,4856],{"id":11106},[15,20605,20606,20607,20610,20611,20613],{},"MacOS 在軟體解除安裝，一般是進到 ",[47,20608,20609],{},"應用程式"," 目錄程式中，直接刪除軟體即可，但必竟每個軟體設計都不同，常常刪除不乾淨，而 ",[55,20612,4856],{}," 就可以很好的解決此問題。",[15,20615,10814,20616],{},[19,20617,11114],{"href":11114,"rel":20618},[291],[63,20620,11043],{"id":11042},[15,20622,20623],{},"MacOS上強大好用的影音播放器，支援大部分的影音格式播放，不用在額外安裝各種編碼器，這個播放器一個搞定。",[15,20625,10814,20626],{},[19,20627,11051],{"href":11051,"rel":20628},[291],[63,20630,20632],{"id":20631},"hidden-bar","Hidden Bar",[15,20634,20635],{},"當裝愈來愈多常駐軟體，就會發現上方系統列的ICON愈來愈多，而這個軟體可以暫時隱藏ICON，要用到時可隨時展開",[15,20637,20514,20638],{},[19,20639,20640],{"href":20640,"rel":20641},"https:\u002F\u002Fgithub.com\u002Fdwarvesf\u002Fhidden\u002Freleases",[291],[15,20643,20570,20644],{},[19,20645,20646],{"href":20646,"rel":20647},"https:\u002F\u002Fapps.apple.com\u002Ftw\u002Fapp\u002Fhidden-bar\u002F",[291],[15,20649,20521],{},[208,20651,20653],{"className":210,"code":20652,"language":212,"meta":213,"style":213},"brew install --cask hiddenbar\n",[55,20654,20655],{"__ignoreMap":213},[217,20656,20657,20659,20661,20663],{"class":219,"line":220},[217,20658,1495],{"class":223},[217,20660,1498],{"class":227},[217,20662,1501],{"class":237},[217,20664,20665],{"class":227}," hiddenbar\n",[63,20667,20319],{"id":20318},[15,20669,20670],{},"目前在程式開發上，站長使用的程式碼編輯器，擁有各類插件，可以加快開發速度。",[15,20672,10814,20673],{},[19,20674,10817],{"href":10817,"rel":20675},[291],[63,20677,10874],{"id":10873},[15,20679,20680],{},"雖雖 vscode 很強大，但有時讓人覺得有點肥大，若只是臨時要編輯文字檔，我會用這款輕量編輯器",[15,20682,10814,20683],{},[19,20684,10882],{"href":10882,"rel":20685},[291],[63,20687,20689],{"id":20688},"keka-壓縮軟體","KeKa 壓縮軟體",[15,20691,20692],{},"這是 MacOS 我用過最好用的壓縮軟體，支援多種壓縮格式，密碼保護，分片壓縮等功能，其中最棒是可「排除 MacOS 資源檔」檔的功能。",[15,20694,20695],{},"在以往直接在 MacOS 打包壓縮的檔案，在 Windows 環境下打開，總會多出一些讓使用者迷惑的檔案，而這個功能就會幫忙先排除這檔案。",[15,20697,10814,20698],{},[19,20699,11073],{"href":11073,"rel":20700},[291],[63,20702,20704],{"id":20703},"shottr","Shottr",[15,20706,20707],{},"另一款螢幕截圖軟體，除了一般截圖功能、馬賽克、OCR、釘圖、螢幕選色器 等功能。",[15,20709,10814,20710],{},[19,20711,11166],{"href":11166,"rel":20712},[291],[63,20714,11210],{"id":11209},[15,20716,20717],{},"MacOS 對於外接螢幕，相當不友善，無法用熱健去控制外接螢幕的亮度和音量，而 BetterDisplay 則可以解決這些問題。",[15,20719,10814,20720],{},[19,20721,11218],{"href":11218,"rel":20722},[291],[63,20724,10835],{"id":10834},[15,20726,20727],{},"支援 M1 晶片的虛擬機，除了以接近本機的速度在Apple Silicon上運行ARM64操作系統，在英特爾 Mac 上，x86\u002Fx64 作業系統可以虛擬化。",[15,20729,11378,20730],{},[19,20731,10843],{"href":10843,"rel":20732},[291],[63,20734,11132],{"id":11131},[15,20736,20737],{},"一款能大幅提升你工作效率的 Mac 軟體，可以取代 Spotlight，且功能更加狂大。",[15,20739,11378,20740],{},[19,20741,20742],{"href":20742,"rel":20743},"https:\u002F\u002Fwww.raycast.com\u002F",[291],[1302,20745,20746],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":387,"depth":387,"links":20748},[20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764],{"id":20413,"depth":387,"text":20414},{"id":10821,"depth":387,"text":20461},{"id":11118,"depth":387,"text":11119},{"id":11170,"depth":387,"text":11171},{"id":20577,"depth":387,"text":20578},{"id":11183,"depth":387,"text":11184},{"id":11106,"depth":387,"text":4856},{"id":11042,"depth":387,"text":11043},{"id":20631,"depth":387,"text":20632},{"id":20318,"depth":387,"text":20319},{"id":10873,"depth":387,"text":10874},{"id":20688,"depth":387,"text":20689},{"id":20703,"depth":387,"text":20704},{"id":11209,"depth":387,"text":11210},{"id":10834,"depth":387,"text":10835},{"id":11131,"depth":387,"text":11132},"\u002Fimages\u002Farticles\u002F2022-04-10-mas-os-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-10-mac-os-tool","2022-04-10 12:00:00",{"title":20408,"description":213},"articles\u002F2022-04-10-mac-os-tool","這裡收集了，站長在 MacOS 上常用的軟體",[5263,2208],"LdwPGKbfWnAayVtGNscPJXvm97oroNn4Ipb5HjBSj7E",{"id":20775,"title":20776,"body":20777,"category":3902,"description":213,"extension":1324,"image":21226,"meta":21227,"navigation":895,"path":21228,"pubDate":21229,"seo":21230,"status":895,"stem":21231,"summary":21232,"tags":21233,"__hash__":21234},"content\u002Farticles\u002F2022-03-26-php-zip.md","PHP 產生壓縮檔",{"type":8,"value":20778,"toc":21221},[20779,20782,20790,20796,20822,20825,20830,20891,20897,20900,20914,20919,20936,20939,20947,20952,20969,20971,20984,20989,21006,21008,21022,21027,21044,21046,21054,21059,21076,21078,21086,21091,21108,21110,21124,21129,21145,21148,21152,21202,21206,21219],[63,20780,20781],{"id":20781},"需求",[28,20783,20784,20787],{},[31,20785,20786],{},"php5.2 以上版本",[31,20788,20789],{},"安裝 zip 庫",[15,20791,20792,20793,20795],{},"以 ",[55,20794,20420],{}," 為例：",[208,20797,20799],{"className":210,"code":20798,"language":212,"meta":213,"style":213},"sudo apt update\nsudo apt install -y php7.4-zip\n",[55,20800,20801,20809],{"__ignoreMap":213},[217,20802,20803,20805,20807],{"class":219,"line":220},[217,20804,1546],{"class":223},[217,20806,1549],{"class":227},[217,20808,19411],{"class":227},[217,20810,20811,20813,20815,20817,20819],{"class":219,"line":387},[217,20812,1546],{"class":223},[217,20814,1549],{"class":227},[217,20816,1498],{"class":227},[217,20818,2295],{"class":237},[217,20820,20821],{"class":227}," php7.4-zip\n",[63,20823,20824],{"id":20824},"壓縮範例程式",[15,20826,20827],{},[47,20828,20829],{},"產生壓縮檔",[208,20831,20833],{"className":2457,"code":20832,"language":2404,"meta":213,"style":213},"\u003C?php\n\u002F\u002Fnew ZipArchive 物件\n$zip = new ZipArchive;\n\n$zip->open('new.zip', ZipArchive::CREATE);\n\n",[55,20834,20835,20842,20847,20861,20865],{"__ignoreMap":213},[217,20836,20837,20839],{"class":219,"line":220},[217,20838,2465],{"class":323},[217,20840,20841],{"class":237},"php\n",[217,20843,20844],{"class":219,"line":387},[217,20845,20846],{"class":1521},"\u002F\u002Fnew ZipArchive 物件\n",[217,20848,20849,20852,20854,20856,20859],{"class":219,"line":410},[217,20850,20851],{"class":319},"$zip ",[217,20853,854],{"class":323},[217,20855,2498],{"class":323},[217,20857,20858],{"class":237}," ZipArchive",[217,20860,2712],{"class":319},[217,20862,20863],{"class":219,"line":424},[217,20864,896],{"emptyLinePlaceholder":895},[217,20866,20867,20870,20872,20875,20877,20880,20882,20885,20887,20889],{"class":219,"line":441},[217,20868,20869],{"class":319},"$zip",[217,20871,2540],{"class":323},[217,20873,20874],{"class":223},"open",[217,20876,2473],{"class":319},[217,20878,20879],{"class":227},"'new.zip'",[217,20881,2551],{"class":319},[217,20883,20884],{"class":237},"ZipArchive",[217,20886,12337],{"class":323},[217,20888,11549],{"class":237},[217,20890,2484],{"class":319},[15,20892,247,20893,20896],{},[55,20894,20895],{},"$zip->open()"," 第一參數為要產壓縮檔路徑",[15,20898,20899],{},"第二參數為產生檔案的模式",[2109,20901,20902,20908],{},[31,20903,20904,20907],{},[55,20905,20906],{},"ZipArchive::CREATE","：產生新檔案",[31,20909,20910,20913],{},[55,20911,20912],{},"ZipArchive::OVERWRITE",": 若壓縮檔存在，則覆蓋檔案",[15,20915,20916],{},[47,20917,20918],{},"加入一個空資料夾",[208,20920,20922],{"className":2457,"code":20921,"language":2404,"meta":213,"style":213},"$zip->addEmptyDir($dirname);\n",[55,20923,20924],{"__ignoreMap":213},[217,20925,20926,20928,20930,20933],{"class":219,"line":220},[217,20927,20869],{"class":319},[217,20929,2540],{"class":323},[217,20931,20932],{"class":223},"addEmptyDir",[217,20934,20935],{"class":319},"($dirname);\n",[15,20937,20938],{},"參數說明",[2109,20940,20941],{},[31,20942,20943,20946],{},[55,20944,20945],{},"$dirname"," 資料夾名稱",[15,20948,20949],{},[47,20950,20951],{},"將檔案加入壓縮檔",[208,20953,20955],{"className":2457,"code":20954,"language":2404,"meta":213,"style":213},"$zip->addaddFile($filePath, $newFileName);\n",[55,20956,20957],{"__ignoreMap":213},[217,20958,20959,20961,20963,20966],{"class":219,"line":220},[217,20960,20869],{"class":319},[217,20962,2540],{"class":323},[217,20964,20965],{"class":223},"addaddFile",[217,20967,20968],{"class":319},"($filePath, $newFileName);\n",[15,20970,20938],{},[2109,20972,20973,20978],{},[31,20974,20975,20977],{},[55,20976,2701],{}," 為檔案路徑",[31,20979,20980,20983],{},[55,20981,20982],{},"$newFileName"," 重新命名 (選填)",[15,20985,20986],{},[47,20987,20988],{},"將字串加入文字檔並壓縮",[208,20990,20992],{"className":2457,"code":20991,"language":2404,"meta":213,"style":213},"$zip->addFromString($filename, $content);\n",[55,20993,20994],{"__ignoreMap":213},[217,20995,20996,20998,21000,21003],{"class":219,"line":220},[217,20997,20869],{"class":319},[217,20999,2540],{"class":323},[217,21001,21002],{"class":223},"addFromString",[217,21004,21005],{"class":319},"($filename, $content);\n",[15,21007,20938],{},[2109,21009,21010,21016],{},[31,21011,21012,21015],{},[55,21013,21014],{},"$filename"," 檔案名稱",[31,21017,21018,21021],{},[55,21019,21020],{},"$content"," 文字內容",[15,21023,21024],{},[47,21025,21026],{},"依索引刪除檔案",[208,21028,21030],{"className":2457,"code":21029,"language":2404,"meta":213,"style":213},"$zip->deleteIndex($index);\n",[55,21031,21032],{"__ignoreMap":213},[217,21033,21034,21036,21038,21041],{"class":219,"line":220},[217,21035,20869],{"class":319},[217,21037,2540],{"class":323},[217,21039,21040],{"class":223},"deleteIndex",[217,21042,21043],{"class":319},"($index);\n",[15,21045,20938],{},[2109,21047,21048],{},[31,21049,21050,21053],{},[55,21051,21052],{},"$index"," 刪除索引的檔案",[15,21055,21056],{},[47,21057,21058],{},"依檔名刪除檔案",[208,21060,21062],{"className":2457,"code":21061,"language":2404,"meta":213,"style":213},"$zip->deleteName($name);\n",[55,21063,21064],{"__ignoreMap":213},[217,21065,21066,21068,21070,21073],{"class":219,"line":220},[217,21067,20869],{"class":319},[217,21069,2540],{"class":323},[217,21071,21072],{"class":223},"deleteName",[217,21074,21075],{"class":319},"($name);\n",[15,21077,20938],{},[2109,21079,21080],{},[31,21081,21082,21085],{},[55,21083,21084],{},"$name"," 刪除檔案名稱",[15,21087,21088],{},[47,21089,21090],{},"更改檔名",[208,21092,21094],{"className":2457,"code":21093,"language":2404,"meta":213,"style":213},"$zip->renameName($oldName, $newName);\n",[55,21095,21096],{"__ignoreMap":213},[217,21097,21098,21100,21102,21105],{"class":219,"line":220},[217,21099,20869],{"class":319},[217,21101,2540],{"class":323},[217,21103,21104],{"class":223},"renameName",[217,21106,21107],{"class":319},"($oldName, $newName);\n",[15,21109,20938],{},[2109,21111,21112,21118],{},[31,21113,21114,21117],{},[55,21115,21116],{},"$oldName"," 原本檔名",[31,21119,21120,21123],{},[55,21121,21122],{},"$newName"," 新檔名",[15,21125,21126],{},[47,21127,21128],{},"關閉壓縮檔",[208,21130,21132],{"className":2457,"code":21131,"language":2404,"meta":213,"style":213},"$zip->close();\n",[55,21133,21134],{"__ignoreMap":213},[217,21135,21136,21138,21140,21143],{"class":219,"line":220},[217,21137,20869],{"class":319},[217,21139,2540],{"class":323},[217,21141,21142],{"class":223},"close",[217,21144,2684],{"class":319},[63,21146,21147],{"id":21147},"解壓縮程式",[15,21149,21150],{},[47,21151,17421],{},[208,21153,21155],{"className":2457,"code":21154,"language":2404,"meta":213,"style":213},"$zip = new ZipArchive;\n$zip->open($zipFile);\n$zip->extractTo($filePath);\n$zip->close();\n",[55,21156,21157,21169,21180,21192],{"__ignoreMap":213},[217,21158,21159,21161,21163,21165,21167],{"class":219,"line":220},[217,21160,20851],{"class":319},[217,21162,854],{"class":323},[217,21164,2498],{"class":323},[217,21166,20858],{"class":237},[217,21168,2712],{"class":319},[217,21170,21171,21173,21175,21177],{"class":219,"line":387},[217,21172,20869],{"class":319},[217,21174,2540],{"class":323},[217,21176,20874],{"class":223},[217,21178,21179],{"class":319},"($zipFile);\n",[217,21181,21182,21184,21186,21189],{"class":219,"line":410},[217,21183,20869],{"class":319},[217,21185,2540],{"class":323},[217,21187,21188],{"class":223},"extractTo",[217,21190,21191],{"class":319},"($filePath);\n",[217,21193,21194,21196,21198,21200],{"class":219,"line":424},[217,21195,20869],{"class":319},[217,21197,2540],{"class":323},[217,21199,21142],{"class":223},[217,21201,2684],{"class":319},[15,21203,21204],{},[47,21205,20938],{},[2109,21207,21208,21214],{},[31,21209,21210,21213],{},[55,21211,21212],{},"$zipFile"," 壓縮檔位置",[31,21215,21216,21218],{},[55,21217,2701],{}," 解壓縮檔路徑",[1302,21220,10570],{},{"title":213,"searchDepth":387,"depth":387,"links":21222},[21223,21224,21225],{"id":20781,"depth":387,"text":20781},{"id":20824,"depth":387,"text":20824},{"id":21147,"depth":387,"text":21147},"\u002Fimages\u002Farticles\u002F2022-03-26-php-zip\u002Fcover.png",{},"\u002Farticles\u002F2022-03-26-php-zip","2022-03-26 11:00:00",{"title":20776,"description":213},"articles\u002F2022-03-26-php-zip","在某些需求，如要讓使用者下載多個檔案時，我們可以打包成一個檔案供用戶下載，或是檔案太大，可以壓縮檔案已減少頻寛。",[2404],"axPiVBtvCJExqY5-9kjtwpxNVXxvivHDhw3IsOl0YXs",[21236],{"title":6,"pubDate":1328,"path":1327,"summary":1331,"tags":21237,"image":1325,"category":1322},[1333,1334,1335,1336,1337],1788701507635]