[{"data":1,"prerenderedAt":20071},["ShallowReactive",2],{"search":3,"page-\u002Farticles\u002F2022-04-27-develop-tool":19984,"\u002Farticles\u002F2022-04-27-develop-tool-surround":20068},[4,935,2647,2729,3321,3567,4001,5207,5622,5806,8550,9348,9535,10225,10549,10601,10999,12565,12655,13542,16387,17147,17700,17913,18230,18611,19035,19155,19523],{"id":5,"title":6,"body":7,"category":919,"description":920,"extension":921,"image":922,"meta":923,"navigation":226,"path":924,"pubDate":925,"seo":926,"status":226,"stem":927,"summary":928,"tags":929,"__hash__":934},"content\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr.md","AI Agent 時代終端機新選擇：ghostty+herdr",{"type":8,"value":9,"toc":897},"minimark",[10,14,32,43,48,51,79,82,85,89,94,97,100,154,158,163,192,196,199,279,296,299,309,389,391,395,399,406,409,412,448,452,473,476,490,493,534,537,540,547,607,609,613,617,620,626,634,637,641,669,673,709,713,716,766,770,773,803,806,808,811,821,824,850,853,855,858,893],[11,12,6],"h1",{"id":13},"ai-agent-時代終端機新選擇ghosttyherdr",[15,16,17,18,22,23,26,27,31],"p",{},"在這個大 AI 時代，使用 AI Agent 進行 ",[19,20,21],"code",{},"Vibe Coding"," 已成為工作日常， 而目前各家大廠或開源專案都有提供 ",[19,24,25],{},"CLI"," 工作環境，所以終端機效能變得更重要，這也是我選擇 ",[28,29,30],"strong",{},"ghostty"," 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。",[15,33,34,35,38,39,42],{},"而 ",[28,36,37],{},"Herdr"," 更是管理各個 AI Agent CLI 目前最佳解決方案，獨特的 UI 介面可以方便管理工作區、分頁和 Agents，更可以對各 Agents 執行狀態一目了然，更可以透過 ",[19,40,41],{},"skills"," 讓不同 agent 相互協作。",[44,45,47],"h2",{"id":46},"為什麼終端機需要重新思考","為什麼終端機需要重新思考？",[15,49,50],{},"傳統的終端機模擬器在 AI Agent 時代面臨了新的挑戰：",[52,53,54,61,67,73],"ul",{},[55,56,57,60],"li",{},[28,58,59],{},"多代理並行","：一個專案可能同時運行 Claude Code、Codex、OpenCode 等多個代理，傳統終端難以統合管理",[55,62,63,66],{},[28,64,65],{},"效能瓶頸","：AI 代理產出大量輸出，CPU 渲染的終端機容易出現卡頓",[55,68,69,72],{},[28,70,71],{},"狀態可見性","：哪個代理正在執行？哪個被阻擋？哪個已完成？傳統終端缺乏即時狀態呈現",[55,74,75,78],{},[28,76,77],{},"會話持久性","：關閉筆記型電腦後，代理進程隨之消失，無法斷續工作",[15,80,81],{},"Ghostty 和 Herdr 分別針對這些痛點提供了解決方案。",[83,84],"hr",{},[44,86,88],{"id":87},"ghosttygpu-加速的下一代終端機","Ghostty：GPU 加速的下一代終端機",[90,91,93],"h3",{"id":92},"什麼是-ghostty","什麼是 Ghostty？",[15,95,96],{},"Ghostty 是由 HashiCorp 創辦人 Mitchell Hashimoto 開發的跨平台終端模擬器，使用 Zig 語言構建，並以 GPU 加速渲染為核心特色。2024 年底正式發布 1.0 穩定版（至 2026 年已推進至 1.3+）後，迅速成為開發者社群中最受矚目的終端選擇。",[90,98,99],{"id":99},"核心特色",[52,101,102,108,114,120,142,148],{},[55,103,104,107],{},[28,105,106],{},"GPU 加速渲染","：透過 OpenGL（Linux）與 Metal（macOS）實現硬體加速，維持約 60fps 的流暢渲染，遠勝 CPU 渲染的傳統終端",[55,109,110,113],{},[28,111,112],{},"原生 UI 體驗","：在 macOS 上呈現原生應用外觀，在 Linux 上完美融入 GTK\u002FQt 環境",[55,115,116,119],{},[28,117,118],{},"多視窗、分頁、分割畫面","：內建完整的視窗管理功能，無需依賴 tmux",[55,121,122,125,126,129,130,133,134,137,138,141],{},[28,123,124],{},"即時熱重載配置","：修改 ",[19,127,128],{},"~\u002F.config\u002Fghostty\u002Fconfig.ghostty","（1.2.3 前為 ",[19,131,132],{},"config","，仍相容）後按 ",[19,135,136],{},"cmd+shift+,","（macOS）\u002F ",[19,139,140],{},"ctrl+shift+,","（Linux）即可熱重載，無需重啟",[55,143,144,147],{},[28,145,146],{},"連字字體與 Nerd Fonts","：原生支援開發者最愛的程式字體",[55,149,150,153],{},[28,151,152],{},"智慧搜尋","：1.3.0 版本新增 scrollback search 與原生捲動條",[90,155,157],{"id":156},"安裝-ghostty","安裝 Ghostty",[159,160,162],"h4",{"id":161},"macos","macOS",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-bash shiki shiki-themes github-light github-dark github-dark","brew install --cask ghostty\n","bash","",[19,171,172],{"__ignoreMap":169},[173,174,177,181,185,189],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"shcOC","brew",[173,182,184],{"class":183},"sfrk1"," install",[173,186,188],{"class":187},"suiK_"," --cask",[173,190,191],{"class":183}," ghostty\n",[159,193,195],{"id":194},"linux","Linux",[15,197,198],{},"Ghostty 官方僅直接發布 macOS 二進制檔，Linux 請透過發行版套件或社群建置安裝：",[164,200,202],{"className":166,"code":201,"language":168,"meta":169,"style":169},"# 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",[19,203,204,210,221,228,234,247,252,258],{"__ignoreMap":169},[173,205,206],{"class":175,"line":176},[173,207,209],{"class":208},"sCsY4","# Arch Linux\n",[173,211,213,216,219],{"class":175,"line":212},2,[173,214,215],{"class":179},"pacman",[173,217,218],{"class":187}," -S",[173,220,191],{"class":183},[173,222,224],{"class":175,"line":223},3,[173,225,227],{"emptyLinePlaceholder":226},true,"\n",[173,229,231],{"class":175,"line":230},4,[173,232,233],{"class":208},"# Ubuntu 26.04+\n",[173,235,237,240,243,245],{"class":175,"line":236},5,[173,238,239],{"class":179},"sudo",[173,241,242],{"class":183}," apt",[173,244,184],{"class":183},[173,246,191],{"class":183},[173,248,250],{"class":175,"line":249},6,[173,251,227],{"emptyLinePlaceholder":226},[173,253,255],{"class":175,"line":254},7,[173,256,257],{"class":208},"# Debian \u002F 舊版 Ubuntu（社群 .deb）\n",[173,259,261,264,267,270,273,276],{"class":175,"line":260},8,[173,262,263],{"class":179},"\u002Fbin\u002Fbash",[173,265,266],{"class":187}," -c",[173,268,269],{"class":183}," \"$(",[173,271,272],{"class":179},"curl",[173,274,275],{"class":187}," -fsSL",[173,277,278],{"class":183}," https:\u002F\u002Fraw.githubusercontent.com\u002Fmkasberg\u002Fghostty-ubuntu\u002FHEAD\u002Finstall.sh)\"\n",[15,280,281,282,289,290,295],{},"其他發行版請參考 ",[283,284,288],"a",{"href":285,"rel":286},"https:\u002F\u002Fghostty.org\u002Fdocs\u002Finstall\u002Fbinary",[287],"nofollow","Ghostty 安裝文件","或從 ",[283,291,294],{"href":292,"rel":293},"https:\u002F\u002Fgithub.com\u002Fghostty-org\u002Fghostty",[287],"Ghostty GitHub"," 自行編譯。",[90,297,298],{"id":298},"基本配置",[15,300,301,302,304,305,308],{},"Ghostty 的配置文件位於 ",[19,303,128],{},"（相容舊路徑 ",[19,306,307],{},"~\u002F.config\u002Fghostty\u002Fconfig",")",[164,310,314],{"className":311,"code":312,"language":313,"meta":169,"style":169},"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",[19,315,316,321,325,330,335,340,344,349,354,360,366,372,378,383],{"__ignoreMap":169},[173,317,318],{"class":175,"line":176},[173,319,320],{},"# ~\u002F.config\u002Fghostty\u002Fconfig.ghostty\n",[173,322,323],{"class":175,"line":212},[173,324,227],{"emptyLinePlaceholder":226},[173,326,327],{"class":175,"line":223},[173,328,329],{},"font-family = JetBrains Mono\n",[173,331,332],{"class":175,"line":230},[173,333,334],{},"font-size = 24\n",[173,336,337],{"class":175,"line":236},[173,338,339],{},"font-feature = calt\n",[173,341,342],{"class":175,"line":249},[173,343,227],{"emptyLinePlaceholder":226},[173,345,346],{"class":175,"line":254},[173,347,348],{},"# 佈景樣式\n",[173,350,351],{"class":175,"line":260},[173,352,353],{},"theme = dark:Catppuccin Mocha,light:Espresso Libre\n",[173,355,357],{"class":175,"line":356},9,[173,358,359],{},"background-opacity = 0.80\n",[173,361,363],{"class":175,"line":362},10,[173,364,365],{},"background-blur-radius = 30\n",[173,367,369],{"class":175,"line":368},11,[173,370,371],{},"window-padding-x = 8\n",[173,373,375],{"class":175,"line":374},12,[173,376,377],{},"window-padding-y = 8\n",[173,379,381],{"class":175,"line":380},13,[173,382,227],{"emptyLinePlaceholder":226},[173,384,386],{"class":175,"line":385},14,[173,387,388],{},"confirm-close-surface = false\n",[83,390],{},[44,392,394],{"id":393},"herdr終端原生-ai-代理多工器","Herdr：終端原生 AI 代理多工器",[90,396,398],{"id":397},"什麼是-herdr","什麼是 Herdr？",[15,400,401,402,405],{},"Herdr 是一個用 Rust 編寫、基於 Ratatui TUI 庫建構的終端原生 AI 代理多工器。與 tmux 類似，它提供會話持久化與分割畫面管理，但額外增加了 ",[28,403,404],{},"AI 代理狀態感知","——能自動偵測每個分割畫面中運行的 AI 代理，並在側邊欄顯示其狀態。",[15,407,408],{},"Herdr 的口號是「one terminal for the whole herd」——一個終端機統管所有 AI 代理。",[90,410,99],{"id":411},"核心特色-1",[52,413,414,420,426,432,442],{},[55,415,416,419],{},[28,417,418],{},"代理狀態自動追蹤","：側邊欄即時顯示每個代理的狀態——🔴 blocked、🟡 working、🔵 done、🟢 idle，無需手動配置",[55,421,422,425],{},[28,423,424],{},"真實 PTY 分割畫面","：每個代理運行在獨立的真實終端分割畫面中，完整支援全螢幕 TUI 介面（如 Claude Code、Codex 的互動模式）",[55,427,428,431],{},[28,429,430],{},"會話持久化","：斷開連線後代理繼續運行，重新連線即可恢復，關閉筆電也不會丟失進程",[55,433,434,437,438,441],{},[28,435,436],{},"Socket API 自動化","：提供 Unix Socket JSON API（詳見 ",[19,439,440],{},"herdr --help"," 與 Socket API 文件，以當前版本為準），代理本身也可以操控 Herdr",[55,443,444,447],{},[28,445,446],{},"多代理整合","：支援 Claude Code、Codex、Pi、OpenCode、Cursor 等 15+ 種 AI 編程代理",[90,449,451],{"id":450},"安裝-herdr","安裝 Herdr",[164,453,455],{"className":166,"code":454,"language":168,"meta":169,"style":169},"curl -fsSL https:\u002F\u002Fherdr.dev\u002Finstall.sh | sh\n",[19,456,457],{"__ignoreMap":169},[173,458,459,461,463,466,470],{"class":175,"line":176},[173,460,272],{"class":179},[173,462,275],{"class":187},[173,464,465],{"class":183}," https:\u002F\u002Fherdr.dev\u002Finstall.sh",[173,467,469],{"class":468},"so5gQ"," |",[173,471,472],{"class":179}," sh\n",[15,474,475],{},"或使用 Homebrew：",[164,477,479],{"className":166,"code":478,"language":168,"meta":169,"style":169},"brew install herdr\n",[19,480,481],{"__ignoreMap":169},[173,482,483,485,487],{"class":175,"line":176},[173,484,180],{"class":179},[173,486,184],{"class":183},[173,488,489],{"class":183}," herdr\n",[90,491,492],{"id":492},"快速開始",[164,494,496],{"className":166,"code":495,"language":168,"meta":169,"style":169},"# 啟動 Herdr\nherdr\n\n# 建立工作空間（以專案為單位）\nherdr workspace create --label my-project\n",[19,497,498,503,508,512,517],{"__ignoreMap":169},[173,499,500],{"class":175,"line":176},[173,501,502],{"class":208},"# 啟動 Herdr\n",[173,504,505],{"class":175,"line":212},[173,506,507],{"class":179},"herdr\n",[173,509,510],{"class":175,"line":223},[173,511,227],{"emptyLinePlaceholder":226},[173,513,514],{"class":175,"line":230},[173,515,516],{"class":208},"# 建立工作空間（以專案為單位）\n",[173,518,519,522,525,528,531],{"class":175,"line":236},[173,520,521],{"class":179},"herdr",[173,523,524],{"class":183}," workspace",[173,526,527],{"class":183}," create",[173,529,530],{"class":187}," --label",[173,532,533],{"class":183}," my-project\n",[90,535,536],{"id":536},"工作空間與分割畫面架構",[15,538,539],{},"Herdr 的架構：",[15,541,542],{},[543,544],"img",{"alt":545,"src":546},"Herdr UI","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fherdr-ui.png",[548,549,550,563],"table",{},[551,552,553],"thead",{},[554,555,556,560],"tr",{},[557,558,559],"th",{},"層級",[557,561,562],{},"說明",[564,565,566,577,587,597],"tbody",{},[554,567,568,574],{},[569,570,571],"td",{},[28,572,573],{},"Workspace",[569,575,576],{},"以 Git 儲存庫或 worktree 為單位，對應一個專案",[554,578,579,584],{},[569,580,581],{},[28,582,583],{},"Tab",[569,585,586],{},"每個工作空間可包含多個標籤頁",[554,588,589,594],{},[569,590,591],{},[28,592,593],{},"Pane",[569,595,596],{},"每個標籤頁可分割為多個真實 PTY 分割畫面，每個運行一個代理",[554,598,599,604],{},[569,600,601],{},[28,602,603],{},"Agent",[569,605,606],{},"自動化與觀測層，能識別並追蹤代理人的執行狀態",[83,608],{},[44,610,612],{"id":611},"ghostty-herdr終極-ai-agent-開發組合","ghostty + herdr：終極 AI Agent 開發組合",[90,614,616],{"id":615},"為什麼這組合特別","為什麼這組合特別？",[15,618,619],{},"Ghostty 與 Herdr 的結合，形成了一套完整的 AI Agent 開發環境：",[621,622,623],"blockquote",{},[15,624,625],{},"Herdr 為通用終端多工器，可運行於 iTerm2、Kitty、WezTerm 等任意終端；與 Ghostty 搭配時能額外發揮 GPU 加速與原生 UI 的最佳體驗，兩者並非強綁定。",[164,627,632],{"className":628,"code":630,"language":631},[629],"language-text","┌─────────────────────────────────────────────┐\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","text",[19,633,630],{"__ignoreMap":169},[90,635,636],{"id":636},"實際工作流程",[159,638,640],{"id":639},"_1-啟動環境","1. 啟動環境",[164,642,644],{"className":166,"code":643,"language":168,"meta":169,"style":169},"# 啟動 Ghostty\nghostty\n\n# 在 Ghostty 中啟動 Herdr\nherdr\n",[19,645,646,651,656,660,665],{"__ignoreMap":169},[173,647,648],{"class":175,"line":176},[173,649,650],{"class":208},"# 啟動 Ghostty\n",[173,652,653],{"class":175,"line":212},[173,654,655],{"class":179},"ghostty\n",[173,657,658],{"class":175,"line":223},[173,659,227],{"emptyLinePlaceholder":226},[173,661,662],{"class":175,"line":230},[173,663,664],{"class":208},"# 在 Ghostty 中啟動 Herdr\n",[173,666,667],{"class":175,"line":236},[173,668,507],{"class":179},[159,670,672],{"id":671},"_2-規劃工作空間","2. 規劃工作空間",[164,674,676],{"className":166,"code":675,"language":168,"meta":169,"style":169},"# 為每個專案建立工作空間\nherdr workspace create --label backend-api\nherdr workspace create --label frontend-app\n",[19,677,678,683,696],{"__ignoreMap":169},[173,679,680],{"class":175,"line":176},[173,681,682],{"class":208},"# 為每個專案建立工作空間\n",[173,684,685,687,689,691,693],{"class":175,"line":212},[173,686,521],{"class":179},[173,688,524],{"class":183},[173,690,527],{"class":183},[173,692,530],{"class":187},[173,694,695],{"class":183}," backend-api\n",[173,697,698,700,702,704,706],{"class":175,"line":223},[173,699,521],{"class":179},[173,701,524],{"class":183},[173,703,527],{"class":183},[173,705,530],{"class":187},[173,707,708],{"class":183}," frontend-app\n",[159,710,712],{"id":711},"_3-pane-分配代理","3. PANE 分配代理",[15,714,715],{},"每個分割畫面運行一個專門的 AI 代理：",[548,717,718,731],{},[551,719,720],{},[554,721,722,725,728],{},[557,723,724],{},"分割畫面",[557,726,727],{},"代理",[557,729,730],{},"任務",[564,732,733,744,755],{},[554,734,735,738,741],{},[569,736,737],{},"左上",[569,739,740],{},"Claude Code",[569,742,743],{},"後端 API 開發",[554,745,746,749,752],{},[569,747,748],{},"右上",[569,750,751],{},"OpenCode",[569,753,754],{},"前端組件開發",[554,756,757,760,763],{},[569,758,759],{},"下方",[569,761,762],{},"Codex",[569,764,765],{},"測試與除錯",[159,767,769],{"id":768},"_4-agents-監控與調度","4. AGENTS 監控與調度",[15,771,772],{},"透過 Herdr 側邊欄一目了然：",[52,774,775,782,789,796],{},[55,776,777,778,781],{},"🟢 ",[28,779,780],{},"idle","：等待指令",[55,783,784,785,788],{},"🟡 ",[28,786,787],{},"working","：正在執行任務",[55,790,791,792,795],{},"🔴 ",[28,793,794],{},"blocked","：需要人工介入",[55,797,798,799,802],{},"🔵 ",[28,800,801],{},"done","：任務完成",[15,804,805],{},"當某個代理被阻擋時，直接點擊對應分割畫面即可介入處理。",[83,807],{},[44,809,810],{"id":810},"總結",[15,812,813,814,817,818,820],{},"在 AI Agent 時代，終端機不再只是執行指令的工具，而是 AI 代理協作的操盤中心。",[28,815,816],{},"Ghostty"," 以 GPU 加速與原生 UI 提供了流暢的終端體驗，",[28,819,37],{}," 則為終端帶來了專業級的 AI 代理多工管理能力。",[15,822,823],{},"這組合的核心優勢在於：",[825,826,827,833,839,844],"ol",{},[55,828,829,832],{},[28,830,831],{},"真正的終端原生","：不依賴 GUI 或雲端服務，純粹在終端機中完成一切",[55,834,835,838],{},[28,836,837],{},"代理狀態可見性","：側邊欄即時顯示所有代理的狀態，無需切換画面",[55,840,841,843],{},[28,842,430],{},"：斷線重連，長時間任務不再擔心",[55,845,846,849],{},[28,847,848],{},"高度可程式化","：Socket API 讓代理之間可以互相操控，實現真正的 AgentOps",[15,851,852],{},"如果你正在尋找一個強大的 AI Agent 開發環境，Ghostty + Herdr 的組合值得立即嘗試。兩者皆為開源專案，安裝簡單，卻能帶來生產力的巨大提升。",[83,854],{},[44,856,857],{"id":857},"相關資源",[52,859,860,867,872,879,886],{},[55,861,862],{},[283,863,866],{"href":864,"rel":865},"https:\u002F\u002Fghostty.org",[287],"Ghostty 官方網站",[55,868,869],{},[283,870,294],{"href":292,"rel":871},[287],[55,873,874],{},[283,875,878],{"href":876,"rel":877},"https:\u002F\u002Fherdr.dev",[287],"Herdr 官方網站",[55,880,881],{},[283,882,885],{"href":883,"rel":884},"https:\u002F\u002Fgithub.com\u002Fherdrdev\u002Fherdr",[287],"Herdr GitHub",[55,887,888],{},[283,889,892],{"href":890,"rel":891},"https:\u002F\u002Fherdr.dev\u002Fdocs\u002F",[287],"Herdr 文件",[894,895,896],"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 .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":169,"searchDepth":212,"depth":212,"links":898},[899,900,906,913,917,918],{"id":46,"depth":212,"text":47},{"id":87,"depth":212,"text":88,"children":901},[902,903,904,905],{"id":92,"depth":223,"text":93},{"id":99,"depth":223,"text":99},{"id":156,"depth":223,"text":157},{"id":298,"depth":223,"text":298},{"id":393,"depth":212,"text":394,"children":907},[908,909,910,911,912],{"id":397,"depth":223,"text":398},{"id":411,"depth":223,"text":99},{"id":450,"depth":223,"text":451},{"id":492,"depth":223,"text":492},{"id":536,"depth":223,"text":536},{"id":611,"depth":212,"text":612,"children":914},[915,916],{"id":615,"depth":223,"text":616},{"id":636,"depth":223,"text":636},{"id":810,"depth":212,"text":810},{"id":857,"depth":212,"text":857},"ai","在這個大 AI 時代，使用 AI Agent 進行 Vibe Coding 已成為工作日常， 而目前各家大廠或開源專案都有提供 CLI 工作環境，所以終端機效能變得更重要，這也是我選擇 ghostty 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。","md","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fcover.png",{},"\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr","2026-09-01 12:00:00",{"title":6,"description":920},"articles\u002F2026-09-01-ai-agent-ghostty-herdr","在 AI Agent 時代，終端機不僅是開發工具，更是 AI 代理的操盤中心。Ghostty 以 GPU 加速與原生 UI 重新定義終端體驗，Herdr 則為終端帶來 AI 代理多工管理能力。本文將帶你了解這組強大組合如何打造新一代 AI 開發環境。",[930,931,932,933],"AI","開發工具","開源","software","RKLoV9NXyu51ay6Nvvbikch7fnhZR3L93WDtxZvWUt4",{"id":936,"title":937,"body":938,"category":2635,"description":169,"extension":921,"image":2636,"meta":2637,"navigation":226,"path":2638,"pubDate":2639,"seo":2640,"status":226,"stem":2641,"summary":2642,"tags":2643,"__hash__":2646},"content\u002Farticles\u002F2026-08-23-php-xlswriter.md","PHP 高效處理 XLSX 檔案：xlswriter 安裝與實戰教學",{"type":8,"value":939,"toc":2618},[940,943,950,964,967,971,985,991,994,998,1001,1083,1087,1102,1109,1118,1121,1141,1144,1162,1174,1178,1181,1443,1449,1453,1460,1744,1751,1763,1767,1770,1878,1881,2025,2028,2070,2074,2077,2087,2260,2263,2289,2292,2295,2445,2448,2455,2582,2585,2602,2615],[44,941,942],{"id":942},"簡介",[15,944,945,946,949],{},"系統匯出報表時，資料量一大，常常會遇到記憶體不足或等待時間太久的問題。",[19,947,948],{},"PhpSpreadsheet"," 功能完整，但它以純 PHP 建立整份活頁簿物件；若要處理數十萬筆以上資料，記憶體成本會很高。",[15,951,952,959,960,963],{},[283,953,956],{"href":954,"rel":955},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter",[287],[19,957,958],{},"xlswriter"," 是以 C 實作的 PHP 擴充套件，底層使用 ",[19,961,962],{},"libxlsxwriter","，專門處理 Excel 2007 以上的 XLSX 格式。除了文字與數字，也支援公式、圖片、圖表、合併儲存格、自動篩選與樣式等功能。",[15,965,966],{},"官方的百萬列基準測試顯示，xlswriter 在速度與記憶體使用上都很適合大量資料匯出。不過實際結果仍會依照硬體、資料欄位數、字串長度與樣式複雜度而改變，建議以自己的正式環境測試為準。",[44,968,970],{"id":969},"xlswriter-適合哪些情境","xlswriter 適合哪些情境？",[52,972,973,976,979,982],{},[55,974,975],{},"後台需要匯出大量訂單、會員或交易明細。",[55,977,978],{},"需要逐列讀取大型 XLSX，避免一次載入所有資料。",[55,980,981],{},"要產生具備公式、格式、篩選或多工作表的 Excel 報表。",[55,983,984],{},"伺服器的 PHP 記憶體限制較嚴格。",[15,986,987,988,990],{},"若只要處理少量資料，或部署環境無法安裝 PHP 擴充套件，使用 Composer 安裝的 ",[19,989,948],{}," 仍會較方便；但大量資料匯出時，xlswriter 的固定記憶體模式更合適。",[44,992,993],{"id":993},"安裝",[90,995,997],{"id":996},"安裝-zlib-相依套件","安裝 zlib 相依套件",[15,999,1000],{},"xlswriter 編譯時需要 zlib 的開發檔案。先依作業系統安裝：",[164,1002,1004],{"className":166,"code":1003,"language":168,"meta":169,"style":169},"# 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",[19,1005,1006,1011,1024,1028,1033,1044,1048,1053,1065,1069,1074],{"__ignoreMap":169},[173,1007,1008],{"class":175,"line":176},[173,1009,1010],{"class":208},"# Debian \u002F Ubuntu\n",[173,1012,1013,1016,1018,1021],{"class":175,"line":212},[173,1014,1015],{"class":179},"apt-get",[173,1017,184],{"class":183},[173,1019,1020],{"class":187}," -y",[173,1022,1023],{"class":183}," zlib1g-dev\n",[173,1025,1026],{"class":175,"line":223},[173,1027,227],{"emptyLinePlaceholder":226},[173,1029,1030],{"class":175,"line":230},[173,1031,1032],{"class":208},"# Alpine\n",[173,1034,1035,1038,1041],{"class":175,"line":236},[173,1036,1037],{"class":179},"apk",[173,1039,1040],{"class":183}," add",[173,1042,1043],{"class":183}," zlib-dev\n",[173,1045,1046],{"class":175,"line":249},[173,1047,227],{"emptyLinePlaceholder":226},[173,1049,1050],{"class":175,"line":254},[173,1051,1052],{"class":208},"# RHEL \u002F CentOS \u002F Fedora\n",[173,1054,1055,1058,1060,1062],{"class":175,"line":260},[173,1056,1057],{"class":179},"yum",[173,1059,184],{"class":183},[173,1061,1020],{"class":187},[173,1063,1064],{"class":183}," zlib-devel\n",[173,1066,1067],{"class":175,"line":356},[173,1068,227],{"emptyLinePlaceholder":226},[173,1070,1071],{"class":175,"line":362},[173,1072,1073],{"class":208},"# macOS\n",[173,1075,1076,1078,1080],{"class":175,"line":368},[173,1077,180],{"class":179},[173,1079,184],{"class":183},[173,1081,1082],{"class":183}," zlib\n",[90,1084,1086],{"id":1085},"使用-pecl-安裝","使用 PECL 安裝",[164,1088,1090],{"className":166,"code":1089,"language":168,"meta":169,"style":169},"pecl install xlswriter\n",[19,1091,1092],{"__ignoreMap":169},[173,1093,1094,1097,1099],{"class":175,"line":176},[173,1095,1096],{"class":179},"pecl",[173,1098,184],{"class":183},[173,1100,1101],{"class":183}," xlswriter\n",[15,1103,1104,1105,1108],{},"安裝過程中若需要讀取 XLSX，請在提示時啟用 reader。完成後在 ",[19,1106,1107],{},"php.ini"," 加入：",[164,1110,1112],{"className":311,"code":1111,"language":313,"meta":169,"style":169},"extension=xlswriter.so\n",[19,1113,1114],{"__ignoreMap":169},[173,1115,1116],{"class":175,"line":176},[173,1117,1111],{},[15,1119,1120],{},"最後確認擴充套件已被載入：",[164,1122,1124],{"className":166,"code":1123,"language":168,"meta":169,"style":169},"php -m | grep xlswriter\n",[19,1125,1126],{"__ignoreMap":169},[173,1127,1128,1131,1134,1136,1139],{"class":175,"line":176},[173,1129,1130],{"class":179},"php",[173,1132,1133],{"class":187}," -m",[173,1135,469],{"class":468},[173,1137,1138],{"class":179}," grep",[173,1140,1101],{"class":183},[15,1142,1143],{},"也可以使用 PIE 安裝：",[164,1145,1147],{"className":166,"code":1146,"language":168,"meta":169,"style":169},"pie install --auto-install-build-tools viest\u002Fxlswriter\n",[19,1148,1149],{"__ignoreMap":169},[173,1150,1151,1154,1156,1159],{"class":175,"line":176},[173,1152,1153],{"class":179},"pie",[173,1155,184],{"class":183},[173,1157,1158],{"class":187}," --auto-install-build-tools",[173,1160,1161],{"class":183}," viest\u002Fxlswriter\n",[15,1163,1164,1165,1170,1171,1173],{},"Windows 使用者可從 ",[283,1166,1169],{"href":1167,"rel":1168},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter\u002Freleases",[287],"GitHub Releases"," 下載符合 PHP 版本、執行緒安全設定與架構的 DLL，再於 ",[19,1172,1107],{}," 啟用。",[44,1175,1177],{"id":1176},"建立第一份-xlsx-報表","建立第一份 XLSX 報表",[15,1179,1180],{},"以下範例建立一張「銷售報表」工作表，先寫入欄位標題，再加入資料。",[164,1182,1185],{"className":1183,"code":1184,"language":1130,"meta":169,"style":169},"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",[19,1186,1187,1213,1217,1233,1247,1252,1256,1286,1313,1322,1342,1360,1379,1398,1403,1414,1419],{"__ignoreMap":169},[173,1188,1189,1192,1194,1197,1201,1204,1207,1210],{"class":175,"line":176},[173,1190,1191],{"class":468},"\u003C?",[173,1193,1130],{"class":187},[173,1195,1196],{"class":468}," declare",[173,1198,1200],{"class":1199},"slsVL","(",[173,1202,1203],{"class":187},"strict_types",[173,1205,1206],{"class":468},"=",[173,1208,1209],{"class":187},"1",[173,1211,1212],{"class":1199},");\n",[173,1214,1215],{"class":175,"line":212},[173,1216,227],{"emptyLinePlaceholder":226},[173,1218,1219,1222,1224,1227,1230],{"class":175,"line":223},[173,1220,1221],{"class":1199},"$excel ",[173,1223,1206],{"class":468},[173,1225,1226],{"class":468}," new",[173,1228,1229],{"class":187}," \\Vtiful\\Kernel\\Excel",[173,1231,1232],{"class":1199},"([\n",[173,1234,1235,1238,1241,1244],{"class":175,"line":230},[173,1236,1237],{"class":183},"    'path'",[173,1239,1240],{"class":468}," =>",[173,1242,1243],{"class":183}," '.\u002Ftmp'",[173,1245,1246],{"class":1199},",\n",[173,1248,1249],{"class":175,"line":236},[173,1250,1251],{"class":1199},"]);\n",[173,1253,1254],{"class":175,"line":249},[173,1255,227],{"emptyLinePlaceholder":226},[173,1257,1258,1261,1263,1266,1269,1272,1274,1277,1280,1283],{"class":175,"line":254},[173,1259,1260],{"class":1199},"$filePath ",[173,1262,1206],{"class":468},[173,1264,1265],{"class":1199}," $excel",[173,1267,1268],{"class":468},"->",[173,1270,1271],{"class":179},"fileName",[173,1273,1200],{"class":1199},[173,1275,1276],{"class":183},"'sales-report.xlsx'",[173,1278,1279],{"class":1199},", ",[173,1281,1282],{"class":183},"'銷售報表'",[173,1284,1285],{"class":1199},")\n",[173,1287,1288,1291,1294,1297,1300,1302,1305,1307,1310],{"class":175,"line":260},[173,1289,1290],{"class":468},"    ->",[173,1292,1293],{"class":179},"header",[173,1295,1296],{"class":1199},"([",[173,1298,1299],{"class":183},"'品項'",[173,1301,1279],{"class":1199},[173,1303,1304],{"class":183},"'金額'",[173,1306,1279],{"class":1199},[173,1308,1309],{"class":183},"'數量'",[173,1311,1312],{"class":1199},"])\n",[173,1314,1315,1317,1320],{"class":175,"line":356},[173,1316,1290],{"class":468},[173,1318,1319],{"class":179},"data",[173,1321,1232],{"class":1199},[173,1323,1324,1327,1330,1332,1335,1337,1339],{"class":175,"line":362},[173,1325,1326],{"class":1199},"        [",[173,1328,1329],{"class":183},"'租金'",[173,1331,1279],{"class":1199},[173,1333,1334],{"class":187},"10000",[173,1336,1279],{"class":1199},[173,1338,1209],{"class":187},[173,1340,1341],{"class":1199},"],\n",[173,1343,1344,1346,1349,1351,1354,1356,1358],{"class":175,"line":368},[173,1345,1326],{"class":1199},[173,1347,1348],{"class":183},"'水電'",[173,1350,1279],{"class":1199},[173,1352,1353],{"class":187},"2500",[173,1355,1279],{"class":1199},[173,1357,1209],{"class":187},[173,1359,1341],{"class":1199},[173,1361,1362,1364,1367,1369,1372,1374,1377],{"class":175,"line":374},[173,1363,1326],{"class":1199},[173,1365,1366],{"class":183},"'辦公用品'",[173,1368,1279],{"class":1199},[173,1370,1371],{"class":187},"3000",[173,1373,1279],{"class":1199},[173,1375,1376],{"class":187},"5",[173,1378,1341],{"class":1199},[173,1380,1381,1383,1386,1388,1391,1393,1396],{"class":175,"line":380},[173,1382,1326],{"class":1199},[173,1384,1385],{"class":183},"'交通費'",[173,1387,1279],{"class":1199},[173,1389,1390],{"class":187},"1200",[173,1392,1279],{"class":1199},[173,1394,1395],{"class":187},"10",[173,1397,1341],{"class":1199},[173,1399,1400],{"class":175,"line":385},[173,1401,1402],{"class":1199},"    ])\n",[173,1404,1406,1408,1411],{"class":175,"line":1405},15,[173,1407,1290],{"class":468},[173,1409,1410],{"class":179},"output",[173,1412,1413],{"class":1199},"();\n",[173,1415,1417],{"class":175,"line":1416},16,[173,1418,227],{"emptyLinePlaceholder":226},[173,1420,1422,1425,1428,1431,1434,1437,1440],{"class":175,"line":1421},17,[173,1423,1424],{"class":187},"echo",[173,1426,1427],{"class":183}," \"檔案已儲存至：{",[173,1429,1430],{"class":1199},"$filePath",[173,1432,1433],{"class":183},"}",[173,1435,1436],{"class":187},"\\n",[173,1438,1439],{"class":183},"\"",[173,1441,1442],{"class":1199},";\n",[15,1444,1445,1448],{},[19,1446,1447],{},"path"," 是輸出目錄；Web 專案通常可先輸出至暫存目錄，再透過框架的下載回應將檔案交給使用者。請勿直接把使用者輸入當成檔名或路徑，以免產生路徑穿越風險。",[44,1450,1452],{"id":1451},"大量資料匯出固定記憶體模式","大量資料匯出：固定記憶體模式",[15,1454,1455,1456,1459],{},"大量報表最值得使用的是 ",[19,1457,1458],{},"constMemory()","。這個模式會逐列處理資料，記憶體不會隨著工作表資料量持續增加。",[164,1461,1463],{"className":1183,"code":1462,"language":1130,"meta":169,"style":169},"\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",[19,1464,1465,1483,1487,1499,1509,1513,1517,1522,1548,1552,1557,1583,1587,1592,1623,1649,1680,1716,1722,1727,1733],{"__ignoreMap":169},[173,1466,1467,1469,1471,1473,1475,1477,1479,1481],{"class":175,"line":176},[173,1468,1191],{"class":468},[173,1470,1130],{"class":187},[173,1472,1196],{"class":468},[173,1474,1200],{"class":1199},[173,1476,1203],{"class":187},[173,1478,1206],{"class":468},[173,1480,1209],{"class":187},[173,1482,1212],{"class":1199},[173,1484,1485],{"class":175,"line":212},[173,1486,227],{"emptyLinePlaceholder":226},[173,1488,1489,1491,1493,1495,1497],{"class":175,"line":223},[173,1490,1221],{"class":1199},[173,1492,1206],{"class":468},[173,1494,1226],{"class":468},[173,1496,1229],{"class":187},[173,1498,1232],{"class":1199},[173,1500,1501,1503,1505,1507],{"class":175,"line":230},[173,1502,1237],{"class":183},[173,1504,1240],{"class":468},[173,1506,1243],{"class":183},[173,1508,1246],{"class":1199},[173,1510,1511],{"class":175,"line":236},[173,1512,1251],{"class":1199},[173,1514,1515],{"class":175,"line":249},[173,1516,227],{"emptyLinePlaceholder":226},[173,1518,1519],{"class":175,"line":254},[173,1520,1521],{"class":208},"\u002F\u002F 開啟固定記憶體模式 (參數：檔名, 工作表名稱)\n",[173,1523,1524,1527,1529,1531,1533,1536,1538,1541,1543,1546],{"class":175,"line":260},[173,1525,1526],{"class":1199},"$file ",[173,1528,1206],{"class":468},[173,1530,1265],{"class":1199},[173,1532,1268],{"class":468},[173,1534,1535],{"class":179},"constMemory",[173,1537,1200],{"class":1199},[173,1539,1540],{"class":183},"'large_data.xlsx'",[173,1542,1279],{"class":1199},[173,1544,1545],{"class":183},"'Sheet1'",[173,1547,1212],{"class":1199},[173,1549,1550],{"class":175,"line":356},[173,1551,227],{"emptyLinePlaceholder":226},[173,1553,1554],{"class":175,"line":362},[173,1555,1556],{"class":208},"\u002F\u002F 寫入表頭\n",[173,1558,1559,1562,1564,1566,1568,1571,1573,1576,1578,1581],{"class":175,"line":368},[173,1560,1561],{"class":1199},"$file",[173,1563,1268],{"class":468},[173,1565,1293],{"class":179},[173,1567,1296],{"class":1199},[173,1569,1570],{"class":183},"'ID'",[173,1572,1279],{"class":1199},[173,1574,1575],{"class":183},"'姓名'",[173,1577,1279],{"class":1199},[173,1579,1580],{"class":183},"'數值'",[173,1582,1251],{"class":1199},[173,1584,1585],{"class":175,"line":374},[173,1586,227],{"emptyLinePlaceholder":226},[173,1588,1589],{"class":175,"line":380},[173,1590,1591],{"class":208},"\u002F\u002F 迴圈逐行寫入大批量數據\n",[173,1593,1594,1597,1600,1602,1605,1608,1611,1614,1617,1620],{"class":175,"line":385},[173,1595,1596],{"class":468},"for",[173,1598,1599],{"class":1199}," ($i ",[173,1601,1206],{"class":468},[173,1603,1604],{"class":187}," 1",[173,1606,1607],{"class":1199},"; $i ",[173,1609,1610],{"class":468},"\u003C=",[173,1612,1613],{"class":187}," 1000000",[173,1615,1616],{"class":1199},"; $i",[173,1618,1619],{"class":468},"++",[173,1621,1622],{"class":1199},") {\n",[173,1624,1625,1628,1630,1633,1636,1639,1641,1643,1646],{"class":175,"line":1405},[173,1626,1627],{"class":1199},"    $file",[173,1629,1268],{"class":468},[173,1631,1632],{"class":179},"insertText",[173,1634,1635],{"class":1199},"($i ",[173,1637,1638],{"class":468},"-",[173,1640,1604],{"class":187},[173,1642,1279],{"class":1199},[173,1644,1645],{"class":187},"0",[173,1647,1648],{"class":1199},", $i);\n",[173,1650,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1672,1675,1678],{"class":175,"line":1416},[173,1652,1627],{"class":1199},[173,1654,1268],{"class":468},[173,1656,1632],{"class":179},[173,1658,1635],{"class":1199},[173,1660,1638],{"class":468},[173,1662,1604],{"class":187},[173,1664,1279],{"class":1199},[173,1666,1209],{"class":187},[173,1668,1279],{"class":1199},[173,1670,1671],{"class":183},"\"使用者 {",[173,1673,1674],{"class":1199},"$i",[173,1676,1677],{"class":183},"}\"",[173,1679,1212],{"class":1199},[173,1681,1682,1684,1686,1688,1690,1692,1694,1696,1699,1701,1704,1706,1708,1710,1713],{"class":175,"line":1421},[173,1683,1627],{"class":1199},[173,1685,1268],{"class":468},[173,1687,1632],{"class":179},[173,1689,1635],{"class":1199},[173,1691,1638],{"class":468},[173,1693,1604],{"class":187},[173,1695,1279],{"class":1199},[173,1697,1698],{"class":187},"2",[173,1700,1279],{"class":1199},[173,1702,1703],{"class":187},"rand",[173,1705,1200],{"class":1199},[173,1707,1209],{"class":187},[173,1709,1279],{"class":1199},[173,1711,1712],{"class":187},"100",[173,1714,1715],{"class":1199},"));\n",[173,1717,1719],{"class":175,"line":1718},18,[173,1720,1721],{"class":1199},"}\n",[173,1723,1725],{"class":175,"line":1724},19,[173,1726,227],{"emptyLinePlaceholder":226},[173,1728,1730],{"class":175,"line":1729},20,[173,1731,1732],{"class":208},"\u002F\u002F 輸出儲存檔案\n",[173,1734,1736,1738,1740,1742],{"class":175,"line":1735},21,[173,1737,1561],{"class":1199},[173,1739,1268],{"class":468},[173,1741,1410],{"class":179},[173,1743,1413],{"class":1199},[15,1745,1746,1747,1750],{},"固定記憶體模式的取捨是：資料寫入後不能回頭修改已寫入的儲存格。因此欄位順序、樣式與計算方式要先規劃好；若報表需要任意回寫或重複調整，則使用一般 ",[19,1748,1749],{},"fileName()"," 模式。",[621,1752,1753],{},[15,1754,1755,1758,1759,1762],{},[19,1756,1757],{},"fetchReportRows()"," 代表可逐筆或分批取得資料的 Generator。例如資料庫查詢應避免一次 ",[19,1760,1761],{},"fetchAll()","，才能真正降低整體記憶體用量。",[44,1764,1766],{"id":1765},"讀取-xlsx-檔案","讀取 XLSX 檔案",[15,1768,1769],{},"小型檔案可直接取得工作表全部資料：",[164,1771,1773],{"className":1183,"code":1772,"language":1130,"meta":169,"style":169},"\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",[19,1774,1775,1793,1797,1809,1819,1823,1827,1847,1857,1866,1870],{"__ignoreMap":169},[173,1776,1777,1779,1781,1783,1785,1787,1789,1791],{"class":175,"line":176},[173,1778,1191],{"class":468},[173,1780,1130],{"class":187},[173,1782,1196],{"class":468},[173,1784,1200],{"class":1199},[173,1786,1203],{"class":187},[173,1788,1206],{"class":468},[173,1790,1209],{"class":187},[173,1792,1212],{"class":1199},[173,1794,1795],{"class":175,"line":212},[173,1796,227],{"emptyLinePlaceholder":226},[173,1798,1799,1801,1803,1805,1807],{"class":175,"line":223},[173,1800,1221],{"class":1199},[173,1802,1206],{"class":468},[173,1804,1226],{"class":468},[173,1806,1229],{"class":187},[173,1808,1232],{"class":1199},[173,1810,1811,1813,1815,1817],{"class":175,"line":230},[173,1812,1237],{"class":183},[173,1814,1240],{"class":468},[173,1816,1243],{"class":183},[173,1818,1246],{"class":1199},[173,1820,1821],{"class":175,"line":236},[173,1822,1251],{"class":1199},[173,1824,1825],{"class":175,"line":249},[173,1826,227],{"emptyLinePlaceholder":226},[173,1828,1829,1832,1834,1836,1838,1841,1843,1845],{"class":175,"line":254},[173,1830,1831],{"class":1199},"$data ",[173,1833,1206],{"class":468},[173,1835,1265],{"class":1199},[173,1837,1268],{"class":468},[173,1839,1840],{"class":179},"openFile",[173,1842,1200],{"class":1199},[173,1844,1276],{"class":183},[173,1846,1285],{"class":1199},[173,1848,1849,1851,1854],{"class":175,"line":260},[173,1850,1290],{"class":468},[173,1852,1853],{"class":179},"openSheet",[173,1855,1856],{"class":1199},"()\n",[173,1858,1859,1861,1864],{"class":175,"line":356},[173,1860,1290],{"class":468},[173,1862,1863],{"class":179},"getSheetData",[173,1865,1413],{"class":1199},[173,1867,1868],{"class":175,"line":362},[173,1869,227],{"emptyLinePlaceholder":226},[173,1871,1872,1875],{"class":175,"line":368},[173,1873,1874],{"class":187},"print_r",[173,1876,1877],{"class":1199},"($data);\n",[15,1879,1880],{},"如果上傳檔案可能很大，改用游標逐列讀取。這樣可以一筆一筆驗證與寫入資料庫，不必將整個檔案放進記憶體。",[164,1882,1884],{"className":1183,"code":1883,"language":1130,"meta":169,"style":169},"\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",[19,1885,1886,1904,1908,1920,1930,1934,1938,1953,1961,1978,1982,2002,2012,2016,2021],{"__ignoreMap":169},[173,1887,1888,1890,1892,1894,1896,1898,1900,1902],{"class":175,"line":176},[173,1889,1191],{"class":468},[173,1891,1130],{"class":187},[173,1893,1196],{"class":468},[173,1895,1200],{"class":1199},[173,1897,1203],{"class":187},[173,1899,1206],{"class":468},[173,1901,1209],{"class":187},[173,1903,1212],{"class":1199},[173,1905,1906],{"class":175,"line":212},[173,1907,227],{"emptyLinePlaceholder":226},[173,1909,1910,1912,1914,1916,1918],{"class":175,"line":223},[173,1911,1221],{"class":1199},[173,1913,1206],{"class":468},[173,1915,1226],{"class":468},[173,1917,1229],{"class":187},[173,1919,1232],{"class":1199},[173,1921,1922,1924,1926,1928],{"class":175,"line":230},[173,1923,1237],{"class":183},[173,1925,1240],{"class":468},[173,1927,1243],{"class":183},[173,1929,1246],{"class":1199},[173,1931,1932],{"class":175,"line":236},[173,1933,1251],{"class":1199},[173,1935,1936],{"class":175,"line":249},[173,1937,227],{"emptyLinePlaceholder":226},[173,1939,1940,1943,1945,1947,1949,1951],{"class":175,"line":254},[173,1941,1942],{"class":1199},"$excel",[173,1944,1268],{"class":468},[173,1946,1840],{"class":179},[173,1948,1200],{"class":1199},[173,1950,1540],{"class":183},[173,1952,1285],{"class":1199},[173,1954,1955,1957,1959],{"class":175,"line":260},[173,1956,1290],{"class":468},[173,1958,1853],{"class":179},[173,1960,1856],{"class":1199},[173,1962,1963,1965,1968,1970,1972,1975],{"class":175,"line":356},[173,1964,1290],{"class":468},[173,1966,1967],{"class":179},"setSkipRows",[173,1969,1200],{"class":1199},[173,1971,1209],{"class":187},[173,1973,1974],{"class":1199},"); ",[173,1976,1977],{"class":208},"\u002F\u002F 略過標題列\n",[173,1979,1980],{"class":175,"line":362},[173,1981,227],{"emptyLinePlaceholder":226},[173,1983,1984,1987,1990,1992,1994,1996,1999],{"class":175,"line":368},[173,1985,1986],{"class":468},"while",[173,1988,1989],{"class":1199}," ($row ",[173,1991,1206],{"class":468},[173,1993,1265],{"class":1199},[173,1995,1268],{"class":468},[173,1997,1998],{"class":179},"nextRow",[173,2000,2001],{"class":1199},"()) {\n",[173,2003,2004,2007,2009],{"class":175,"line":374},[173,2005,2006],{"class":1199},"    [$id, $name, $amount] ",[173,2008,1206],{"class":468},[173,2010,2011],{"class":1199}," $row;\n",[173,2013,2014],{"class":175,"line":380},[173,2015,227],{"emptyLinePlaceholder":226},[173,2017,2018],{"class":175,"line":385},[173,2019,2020],{"class":208},"    \u002F\u002F 在此驗證資料並分批寫入資料庫\n",[173,2022,2023],{"class":175,"line":1405},[173,2024,1721],{"class":1199},[15,2026,2027],{},"若檔案有多張工作表，可先取得清單：",[164,2029,2031],{"className":1183,"code":2030,"language":1130,"meta":169,"style":169},"$sheetList = $excel->openFile('sales-report.xlsx')->sheetList();\n\nprint_r($sheetList);\n",[19,2032,2033,2059,2063],{"__ignoreMap":169},[173,2034,2035,2038,2040,2042,2044,2046,2048,2050,2052,2054,2057],{"class":175,"line":176},[173,2036,2037],{"class":1199},"$sheetList ",[173,2039,1206],{"class":468},[173,2041,1265],{"class":1199},[173,2043,1268],{"class":468},[173,2045,1840],{"class":179},[173,2047,1200],{"class":1199},[173,2049,1276],{"class":183},[173,2051,308],{"class":1199},[173,2053,1268],{"class":468},[173,2055,2056],{"class":179},"sheetList",[173,2058,1413],{"class":1199},[173,2060,2061],{"class":175,"line":212},[173,2062,227],{"emptyLinePlaceholder":226},[173,2064,2065,2067],{"class":175,"line":223},[173,2066,1874],{"class":187},[173,2068,2069],{"class":1199},"($sheetList);\n",[44,2071,2073],{"id":2072},"常用-excel-功能","常用 Excel 功能",[90,2075,2076],{"id":2076},"加入公式與數字格式",[15,2078,2079,2082,2083,2086],{},[19,2080,2081],{},"insertFormula()"," 可寫入 Excel 公式；數字格式可交給 ",[19,2084,2085],{},"insertText()"," 的最後一個參數處理。",[164,2088,2090],{"className":1183,"code":2089,"language":1130,"meta":169,"style":169},"$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",[19,2091,2092,2111,2127,2131,2141,2154,2166,2178,2182,2204,2226,2252],{"__ignoreMap":169},[173,2093,2094,2096,2098,2100,2102,2104,2106,2109],{"class":175,"line":176},[173,2095,1526],{"class":1199},[173,2097,1206],{"class":468},[173,2099,1265],{"class":1199},[173,2101,1268],{"class":468},[173,2103,1271],{"class":179},[173,2105,1200],{"class":1199},[173,2107,2108],{"class":183},"'expense-report.xlsx'",[173,2110,1285],{"class":1199},[173,2112,2113,2115,2117,2119,2121,2123,2125],{"class":175,"line":212},[173,2114,1290],{"class":468},[173,2116,1293],{"class":179},[173,2118,1296],{"class":1199},[173,2120,1299],{"class":183},[173,2122,1279],{"class":1199},[173,2124,1304],{"class":183},[173,2126,1251],{"class":1199},[173,2128,2129],{"class":175,"line":223},[173,2130,227],{"emptyLinePlaceholder":226},[173,2132,2133,2135,2137,2139],{"class":175,"line":230},[173,2134,1561],{"class":1199},[173,2136,1268],{"class":468},[173,2138,1319],{"class":179},[173,2140,1232],{"class":1199},[173,2142,2143,2146,2148,2150,2152],{"class":175,"line":236},[173,2144,2145],{"class":1199},"    [",[173,2147,1329],{"class":183},[173,2149,1279],{"class":1199},[173,2151,1334],{"class":187},[173,2153,1341],{"class":1199},[173,2155,2156,2158,2160,2162,2164],{"class":175,"line":249},[173,2157,2145],{"class":1199},[173,2159,1348],{"class":183},[173,2161,1279],{"class":1199},[173,2163,1353],{"class":187},[173,2165,1341],{"class":1199},[173,2167,2168,2170,2172,2174,2176],{"class":175,"line":254},[173,2169,2145],{"class":1199},[173,2171,1366],{"class":183},[173,2173,1279],{"class":1199},[173,2175,1371],{"class":187},[173,2177,1341],{"class":1199},[173,2179,2180],{"class":175,"line":260},[173,2181,1312],{"class":1199},[173,2183,2184,2186,2188,2190,2193,2195,2197,2199,2202],{"class":175,"line":356},[173,2185,1290],{"class":468},[173,2187,1632],{"class":179},[173,2189,1200],{"class":1199},[173,2191,2192],{"class":187},"4",[173,2194,1279],{"class":1199},[173,2196,1645],{"class":187},[173,2198,1279],{"class":1199},[173,2200,2201],{"class":183},"'總計'",[173,2203,1285],{"class":1199},[173,2205,2206,2208,2211,2213,2215,2217,2219,2221,2224],{"class":175,"line":362},[173,2207,1290],{"class":468},[173,2209,2210],{"class":179},"insertFormula",[173,2212,1200],{"class":1199},[173,2214,2192],{"class":187},[173,2216,1279],{"class":1199},[173,2218,1209],{"class":187},[173,2220,1279],{"class":1199},[173,2222,2223],{"class":183},"'=SUM(B2:B4)'",[173,2225,1285],{"class":1199},[173,2227,2228,2230,2232,2234,2236,2238,2240,2242,2245,2247,2250],{"class":175,"line":368},[173,2229,1290],{"class":468},[173,2231,1632],{"class":179},[173,2233,1200],{"class":1199},[173,2235,1376],{"class":187},[173,2237,1279],{"class":1199},[173,2239,1209],{"class":187},[173,2241,1279],{"class":1199},[173,2243,2244],{"class":187},"1234567.89",[173,2246,1279],{"class":1199},[173,2248,2249],{"class":183},"'#,##0.00'",[173,2251,1285],{"class":1199},[173,2253,2254,2256,2258],{"class":175,"line":374},[173,2255,1290],{"class":468},[173,2257,1410],{"class":179},[173,2259,1413],{"class":1199},[15,2261,2262],{},"常用格式包括：",[52,2264,2265,2271,2277,2283],{},[55,2266,2267,2270],{},[19,2268,2269],{},"#,##0","：千分位整數",[55,2272,2273,2276],{},[19,2274,2275],{},"#,##0.00","：千分位與兩位小數",[55,2278,2279,2282],{},[19,2280,2281],{},"0.00%","：百分比",[55,2284,2285,2288],{},[19,2286,2287],{},"yyyy-mm-dd","：日期",[90,2290,2291],{"id":2291},"凍結標題列與自動篩選",[15,2293,2294],{},"這兩個功能很適合明細型報表，使用者捲動資料時仍可看見欄位名稱，也能直接在 Excel 篩選。",[164,2296,2298],{"className":1183,"code":2297,"language":1130,"meta":169,"style":169},"$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",[19,2299,2300,2315,2337,2345,2364,2383,2402,2406,2423,2437],{"__ignoreMap":169},[173,2301,2302,2304,2306,2308,2310,2313],{"class":175,"line":176},[173,2303,1942],{"class":1199},[173,2305,1268],{"class":468},[173,2307,1271],{"class":179},[173,2309,1200],{"class":1199},[173,2311,2312],{"class":183},"'employee-report.xlsx'",[173,2314,1285],{"class":1199},[173,2316,2317,2319,2321,2323,2325,2327,2330,2332,2335],{"class":175,"line":212},[173,2318,1290],{"class":468},[173,2320,1293],{"class":179},[173,2322,1296],{"class":1199},[173,2324,1575],{"class":183},[173,2326,1279],{"class":1199},[173,2328,2329],{"class":183},"'部門'",[173,2331,1279],{"class":1199},[173,2333,2334],{"class":183},"'薪資'",[173,2336,1312],{"class":1199},[173,2338,2339,2341,2343],{"class":175,"line":223},[173,2340,1290],{"class":468},[173,2342,1319],{"class":179},[173,2344,1232],{"class":1199},[173,2346,2347,2349,2352,2354,2357,2359,2362],{"class":175,"line":230},[173,2348,1326],{"class":1199},[173,2350,2351],{"class":183},"'王小明'",[173,2353,1279],{"class":1199},[173,2355,2356],{"class":183},"'工程部'",[173,2358,1279],{"class":1199},[173,2360,2361],{"class":187},"60000",[173,2363,1341],{"class":1199},[173,2365,2366,2368,2371,2373,2376,2378,2381],{"class":175,"line":236},[173,2367,1326],{"class":1199},[173,2369,2370],{"class":183},"'李小華'",[173,2372,1279],{"class":1199},[173,2374,2375],{"class":183},"'行銷部'",[173,2377,1279],{"class":1199},[173,2379,2380],{"class":187},"55000",[173,2382,1341],{"class":1199},[173,2384,2385,2387,2390,2392,2395,2397,2400],{"class":175,"line":249},[173,2386,1326],{"class":1199},[173,2388,2389],{"class":183},"'陳美玲'",[173,2391,1279],{"class":1199},[173,2393,2394],{"class":183},"'人資部'",[173,2396,1279],{"class":1199},[173,2398,2399],{"class":187},"58000",[173,2401,1341],{"class":1199},[173,2403,2404],{"class":175,"line":254},[173,2405,1402],{"class":1199},[173,2407,2408,2410,2413,2415,2417,2419,2421],{"class":175,"line":260},[173,2409,1290],{"class":468},[173,2411,2412],{"class":179},"freezePanes",[173,2414,1200],{"class":1199},[173,2416,1209],{"class":187},[173,2418,1279],{"class":1199},[173,2420,1645],{"class":187},[173,2422,1285],{"class":1199},[173,2424,2425,2427,2430,2432,2435],{"class":175,"line":356},[173,2426,1290],{"class":468},[173,2428,2429],{"class":179},"autoFilter",[173,2431,1200],{"class":1199},[173,2433,2434],{"class":183},"'A1:C4'",[173,2436,1285],{"class":1199},[173,2438,2439,2441,2443],{"class":175,"line":362},[173,2440,1290],{"class":468},[173,2442,1410],{"class":179},[173,2444,1413],{"class":1199},[90,2446,2447],{"id":2447},"多個工作表",[15,2449,2450,2451,2454],{},"一份檔案需要不同分類資料時，可使用 ",[19,2452,2453],{},"addSheet()"," 新增工作表。",[164,2456,2458],{"className":1183,"code":2457,"language":1130,"meta":169,"style":169},"$file = $excel->fileName('monthly-report.xlsx', '一月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 50000]]);\n\n$file->addSheet('二月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 62000]])\n    ->output();\n",[19,2459,2460,2484,2500,2520,2524,2540,2556,2574],{"__ignoreMap":169},[173,2461,2462,2464,2466,2468,2470,2472,2474,2477,2479,2482],{"class":175,"line":176},[173,2463,1526],{"class":1199},[173,2465,1206],{"class":468},[173,2467,1265],{"class":1199},[173,2469,1268],{"class":468},[173,2471,1271],{"class":179},[173,2473,1200],{"class":1199},[173,2475,2476],{"class":183},"'monthly-report.xlsx'",[173,2478,1279],{"class":1199},[173,2480,2481],{"class":183},"'一月'",[173,2483,1285],{"class":1199},[173,2485,2486,2488,2490,2492,2494,2496,2498],{"class":175,"line":212},[173,2487,1290],{"class":468},[173,2489,1293],{"class":179},[173,2491,1296],{"class":1199},[173,2493,1299],{"class":183},[173,2495,1279],{"class":1199},[173,2497,1304],{"class":183},[173,2499,1312],{"class":1199},[173,2501,2502,2504,2506,2509,2512,2514,2517],{"class":175,"line":223},[173,2503,1290],{"class":468},[173,2505,1319],{"class":179},[173,2507,2508],{"class":1199},"([[",[173,2510,2511],{"class":183},"'服務收入'",[173,2513,1279],{"class":1199},[173,2515,2516],{"class":187},"50000",[173,2518,2519],{"class":1199},"]]);\n",[173,2521,2522],{"class":175,"line":230},[173,2523,227],{"emptyLinePlaceholder":226},[173,2525,2526,2528,2530,2533,2535,2538],{"class":175,"line":236},[173,2527,1561],{"class":1199},[173,2529,1268],{"class":468},[173,2531,2532],{"class":179},"addSheet",[173,2534,1200],{"class":1199},[173,2536,2537],{"class":183},"'二月'",[173,2539,1285],{"class":1199},[173,2541,2542,2544,2546,2548,2550,2552,2554],{"class":175,"line":249},[173,2543,1290],{"class":468},[173,2545,1293],{"class":179},[173,2547,1296],{"class":1199},[173,2549,1299],{"class":183},[173,2551,1279],{"class":1199},[173,2553,1304],{"class":183},[173,2555,1312],{"class":1199},[173,2557,2558,2560,2562,2564,2566,2568,2571],{"class":175,"line":254},[173,2559,1290],{"class":468},[173,2561,1319],{"class":179},[173,2563,2508],{"class":1199},[173,2565,2511],{"class":183},[173,2567,1279],{"class":1199},[173,2569,2570],{"class":187},"62000",[173,2572,2573],{"class":1199},"]])\n",[173,2575,2576,2578,2580],{"class":175,"line":260},[173,2577,1290],{"class":468},[173,2579,1410],{"class":179},[173,2581,1413],{"class":1199},[44,2583,2584],{"id":2584},"結論",[15,2586,2587,2588,2590,2591,2594,2595,2598,2599,2601],{},"xlswriter 很適合 PHP 專案中「大量資料匯出、低記憶體讀取」的需求。一般報表可從 ",[19,2589,1749],{},"、",[19,2592,2593],{},"header()"," 與 ",[19,2596,2597],{},"data()"," 開始；資料量上來後，再改用 ",[19,2600,1458],{}," 配合逐筆或分批資料來源。",[15,2603,2604,2605,2594,2610,2614],{},"更多樣式、圖片、圖表、條件格式與資料驗證的使用方式，可參考 ",[283,2606,2609],{"href":2607,"rel":2608},"https:\u002F\u002Fxlswriter-docs.viest.me\u002F",[287],"xlswriter 官方文件",[283,2611,2613],{"href":954,"rel":2612},[287],"GitHub 專案說明","。",[894,2616,2617],{},"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":169,"searchDepth":212,"depth":212,"links":2619},[2620,2621,2622,2626,2627,2628,2629,2634],{"id":942,"depth":212,"text":942},{"id":969,"depth":212,"text":970},{"id":993,"depth":212,"text":993,"children":2623},[2624,2625],{"id":996,"depth":223,"text":997},{"id":1085,"depth":223,"text":1086},{"id":1176,"depth":212,"text":1177},{"id":1451,"depth":212,"text":1452},{"id":1765,"depth":212,"text":1766},{"id":2072,"depth":212,"text":2073,"children":2630},[2631,2632,2633],{"id":2076,"depth":223,"text":2076},{"id":2291,"depth":223,"text":2291},{"id":2447,"depth":223,"text":2447},{"id":2584,"depth":212,"text":2584},"program","\u002Fimages\u002Farticles\u002F2026-08-23-php-xlswriter\u002Fcover.png",{},"\u002Farticles\u002F2026-08-23-php-xlswriter","2026-08-23 16:34:00",{"title":937,"description":169},"articles\u002F2026-08-23-php-xlswriter","當 PHP 需要匯出或讀取大量 Excel 資料時，xlswriter 能以 C 擴充套件提供低記憶體、高效率的 XLSX 處理方式。本文整理安裝流程、基本讀寫與大檔案實務。",[1130,2644,2645],"xlsx","excel","PjuYpKGMlBP6OKKk89MouFpPRrxi7MEm_mATwpAnBr0",{"id":2648,"title":2649,"body":2650,"category":2718,"description":2719,"extension":921,"image":2720,"meta":2721,"navigation":226,"path":2722,"pubDate":2723,"seo":2724,"status":226,"stem":2725,"summary":2726,"tags":2727,"__hash__":2728},"content\u002Farticles\u002F2026-08-16-2026-new-theme.md","2026 新版型",{"type":8,"value":2651,"toc":2716},[2652,2655,2675,2693,2696,2707],[11,2653,2654],{"id":2654},"更新內容",[15,2656,2657,2658,2661,2662,2664,2665,2668,2669,2671,2672,2674],{},"這幾年 AI 能力飛越式進步，而 ",[19,2659,2660],{},"vibe coding"," 更是成熱門話題，自己的工作，也開始導入 ",[19,2663,2660],{}," ，最近心血來潮，想著自己的部落格的技術堆疊，也許久沒有更新了，還停留在 2022 年的 ",[19,2666,2667],{},"nuxt.js"," 2 建構，而如今 ",[19,2670,2667],{}," 已然更新至第 4 版了，所以不如用 ",[19,2673,2660],{}," 來重建自己的部落格。",[15,2676,2677,2678,2681,2682,2684,2685,2688,2689,2692],{},"這次主要使用 ",[19,2679,2680],{},"opencode"," 來進行開發，使用了 ",[19,2683,2667],{}," 4、",[19,2686,2687],{},"nuxt\u002Fcontent"," v3 和 ",[19,2690,2691],{},"nuxt\u002Fui"," 等套件來建立這個部落格。",[11,2694,2695],{"id":2695},"感想",[15,2697,2677,2698,2700,2701,2703,2704,2706],{},[19,2699,2660],{}," 旳方式進行開發，整個開發體驗想當不錯，或許開發部落格網站，對於 AI 模型的要求並不高，只用了 ",[19,2702,2680],{}," 官方提供的免費模型，就完成了大部份的功能，也且開發時間，記得舊部格程式前後，也差不多也花了一個多月的空閒時間手刻，不過這次用 ",[19,2705,2660],{}," 整體花的時間，約十多天的天數，就完成大部份的功能。",[15,2708,2709,2710,2712,2713,2715],{},"看來 ",[19,2711,2660],{}," 也成為未來開發系統的主流，後續我也會分享自己 ",[19,2714,2660],{}," 的經驗。",{"title":169,"searchDepth":212,"depth":212,"links":2717},[],"站務","這幾年 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":2649,"description":2719},"articles\u002F2026-08-16-2026-new-theme","部落格從 2022 年的 Nuxt 2 升級至 Nuxt 4 與 Nuxt Content v3，全程以 vibe coding 進行，使用 opencode 與免費模型完成大部分功能，開發時間從一個多月縮短至十多天，記錄這次難得的重建體驗。",[2718],"kfi3xMmARhktM-Gn0dE78ZILmke6mSELMjRhOJ857nE",{"id":2730,"title":2731,"body":2732,"category":919,"description":169,"extension":921,"image":3312,"meta":3313,"navigation":226,"path":3314,"pubDate":3315,"seo":3316,"status":226,"stem":3317,"summary":3318,"tags":3319,"__hash__":3320},"content\u002Farticles\u002F2026-06-29-opencode-state.md","使用 OpenCode stats 指令掌握 AI 開發成本：完整參數與實戰範例",{"type":8,"value":2733,"toc":3290},[2734,2742,2745,2759,2765,2767,2773,2776,2788,2791,2793,2796,2801,2816,2819,2841,2844,2846,2852,2858,2875,2878,2894,2896,2902,2908,2950,2953,2961,2963,2969,2975,3016,3019,3027,3029,3035,3041,3063,3066,3087,3094,3096,3099,3102,3106,3109,3134,3137,3148,3151,3153,3157,3160,3179,3182,3190,3193,3195,3199,3202,3222,3225,3233,3236,3244,3246,3250,3256,3270,3281,3287],[44,2735,2737,2738,2741],{"id":2736},"為什麼要看-opencode-stats","為什麼要看 ",[19,2739,2740],{},"opencode stats","？",[15,2743,2744],{},"當我們開始大量使用 AI 做開發（Code Review、產生程式碼、寫文件、跑資料分析…），往往會有幾個共同的疑問：",[52,2746,2747,2750,2753,2756],{},[55,2748,2749],{},"最近到底用了多少 Token？",[55,2751,2752],{},"哪些模型最燒錢？",[55,2754,2755],{},"哪些工具（像 bash、webfetch 這類）被呼叫得最頻繁？",[55,2757,2758],{},"某個專案是不是特別花錢？",[15,2760,2761,2762,2764],{},"如果手上沒有清楚的統計數據，很難優化「模型選擇」與「使用習慣」。這時候，OpenCode 的 ",[19,2763,2740],{}," 就派上用場了。",[83,2766],{},[44,2768,2770,2772],{"id":2769},"opencode-stats-基本用法",[19,2771,2740],{}," 基本用法",[15,2774,2775],{},"最基本的指令非常單純：",[164,2777,2779],{"className":166,"code":2778,"language":168,"meta":169,"style":169},"opencode stats  \n",[19,2780,2781],{"__ignoreMap":169},[173,2782,2783,2785],{"class":175,"line":176},[173,2784,2680],{"class":179},[173,2786,2787],{"class":183}," stats\n",[15,2789,2790],{},"不帶任何參數時，它會顯示「所有時間、所有專案」的整體 Token 用量與費用統計，適合當作一個總體健康檢查（Health Check）：最近 AI 用得多不多、成本有沒有暴衝。",[83,2792],{},[44,2794,2795],{"id":2795},"常用參數與行為說明",[15,2797,2798,2800],{},[19,2799,2740],{}," 支援一組 flags，可以自由組合：",[164,2802,2804],{"className":166,"code":2803,"language":168,"meta":169,"style":169},"opencode stats [flags]  \n",[19,2805,2806],{"__ignoreMap":169},[173,2807,2808,2810,2813],{"class":175,"line":176},[173,2809,2680],{"class":179},[173,2811,2812],{"class":183}," stats",[173,2814,2815],{"class":1199}," [flags]\n",[15,2817,2818],{},"常用的有這幾個：",[52,2820,2821,2826,2831,2836],{},[55,2822,2823],{},[19,2824,2825],{},"--days N",[55,2827,2828],{},[19,2829,2830],{},"--tools [N]",[55,2832,2833],{},[19,2834,2835],{},"--models [N]",[55,2837,2838],{},[19,2839,2840],{},"--project P",[15,2842,2843],{},"下面逐一說明它們的用途與使用情境。",[83,2845],{},[90,2847,2849,2851],{"id":2848},"days-n限制查詢時間範圍",[19,2850,2825],{},"：限制查詢時間範圍",[15,2853,2854,2857],{},[19,2855,2856],{},"--days"," 用來控制「要看最近幾天」的用量。例如，只想看最近一週：",[164,2859,2861],{"className":166,"code":2860,"language":168,"meta":169,"style":169},"opencode stats --days 7  \n",[19,2862,2863],{"__ignoreMap":169},[173,2864,2865,2867,2869,2872],{"class":175,"line":176},[173,2866,2680],{"class":179},[173,2868,2812],{"class":183},[173,2870,2871],{"class":187}," --days",[173,2873,2874],{"class":187}," 7\n",[15,2876,2877],{},"這在兩種情境特別好用：",[825,2879,2880,2887],{},[55,2881,2882,2883,2886],{},"每月或每週例行檢查：例如每到月底看一次 ",[19,2884,2885],{},"--days 30","，檢查這個月 AI 成本。",[55,2888,2889,2890,2893],{},"某次實驗或專案密集期：例如你在最近兩週大量嘗試新模型，就可以用 ",[19,2891,2892],{},"--days 14"," 來看這段期間的影響。",[83,2895],{},[90,2897,2899,2901],{"id":2898},"tools-n觀察工具使用熱度",[19,2900,2830],{},"：觀察工具使用熱度",[15,2903,2904,2907],{},[19,2905,2906],{},"--tools"," 會列出各個工具（例如 bash、webfetch…）的使用統計。若不帶數字，會顯示全部工具；帶數字則只顯示前 N 名。你可以：",[164,2909,2911],{"className":166,"code":2910,"language":168,"meta":169,"style":169},"# 顯示所有工具用量  \nopencode stats --tools  \n\n# 只顯示使用量前 5 名的工具  \nopencode stats --tools 5  \n",[19,2912,2913,2918,2930,2934,2939],{"__ignoreMap":169},[173,2914,2915],{"class":175,"line":176},[173,2916,2917],{"class":208},"# 顯示所有工具用量  \n",[173,2919,2920,2922,2924,2927],{"class":175,"line":212},[173,2921,2680],{"class":179},[173,2923,2812],{"class":183},[173,2925,2926],{"class":187}," --tools",[173,2928,2929],{"class":1199},"  \n",[173,2931,2932],{"class":175,"line":223},[173,2933,227],{"emptyLinePlaceholder":226},[173,2935,2936],{"class":175,"line":230},[173,2937,2938],{"class":208},"# 只顯示使用量前 5 名的工具  \n",[173,2940,2941,2943,2945,2947],{"class":175,"line":236},[173,2942,2680],{"class":179},[173,2944,2812],{"class":183},[173,2946,2926],{"class":187},[173,2948,2949],{"class":187}," 5\n",[15,2951,2952],{},"這有幾個實際用途：",[52,2954,2955,2958],{},[55,2956,2957],{},"了解「AI 在幫你做什麼」：是更多在跑 shell 指令、還是瘋狂打 API？",[55,2959,2960],{},"找出可能的最佳化點：某個工具用量特別高，可能代表流程可以再調整，或有機會改成一次性的腳本／排程。",[83,2962],{},[90,2964,2966,2968],{"id":2965},"models-n檢視模型用量與費用明細",[19,2967,2835],{},"：檢視模型用量與費用明細",[15,2970,2971,2974],{},[19,2972,2973],{},"--models"," 則是針對各個模型（provider\u002Fmodel，例如某家雲廠商的特定模型）的 Token 與費用明細。若不帶數字，會列出所有模型明細；帶數字則只顯示前 N 名。你可以：",[164,2976,2978],{"className":166,"code":2977,"language":168,"meta":169,"style":169},"# 顯示所有模型詳細用量  \nopencode stats --models  \n\n# 只顯示用量前 3 名的模型  \nopencode stats --models 3  \n",[19,2979,2980,2985,2996,3000,3005],{"__ignoreMap":169},[173,2981,2982],{"class":175,"line":176},[173,2983,2984],{"class":208},"# 顯示所有模型詳細用量  \n",[173,2986,2987,2989,2991,2994],{"class":175,"line":212},[173,2988,2680],{"class":179},[173,2990,2812],{"class":183},[173,2992,2993],{"class":187}," --models",[173,2995,2929],{"class":1199},[173,2997,2998],{"class":175,"line":223},[173,2999,227],{"emptyLinePlaceholder":226},[173,3001,3002],{"class":175,"line":230},[173,3003,3004],{"class":208},"# 只顯示用量前 3 名的模型  \n",[173,3006,3007,3009,3011,3013],{"class":175,"line":236},[173,3008,2680],{"class":179},[173,3010,2812],{"class":183},[173,3012,2993],{"class":187},[173,3014,3015],{"class":187}," 3\n",[15,3017,3018],{},"這對於成本控管特別關鍵：",[52,3020,3021,3024],{},[55,3022,3023],{},"找出哪幾個模型是主力：你日常最常依賴哪些模型。",[55,3025,3026],{},"監控高單價模型：如果某些高價模型意外成為 Top 3，就需要檢查是否有誤用或參數設計不佳的地方。",[83,3028],{},[90,3030,3032,3034],{"id":3031},"project-p聚焦在特定專案",[19,3033,2840],{},"：聚焦在特定專案",[15,3036,3037,3040],{},[19,3038,3039],{},"--project"," 用來對某個專案做切片統計：",[164,3042,3044],{"className":166,"code":3043,"language":168,"meta":169,"style":169},"# 只看名為 \"project-name\" 的專案  \nopencode stats --project project-name  \n",[19,3045,3046,3051],{"__ignoreMap":169},[173,3047,3048],{"class":175,"line":176},[173,3049,3050],{"class":208},"# 只看名為 \"project-name\" 的專案  \n",[173,3052,3053,3055,3057,3060],{"class":175,"line":212},[173,3054,2680],{"class":179},[173,3056,2812],{"class":183},[173,3058,3059],{"class":187}," --project",[173,3061,3062],{"class":183}," project-name\n",[15,3064,3065],{},"如果你已經在專案資料夾裡，還可以傳入空字串表示「當前專案」：",[164,3067,3069],{"className":166,"code":3068,"language":168,"meta":169,"style":169},"# 只看目前所在資料夾這個專案的統計  \nopencode stats --project \"\"  \n",[19,3070,3071,3076],{"__ignoreMap":169},[173,3072,3073],{"class":175,"line":176},[173,3074,3075],{"class":208},"# 只看目前所在資料夾這個專案的統計  \n",[173,3077,3078,3080,3082,3084],{"class":175,"line":212},[173,3079,2680],{"class":179},[173,3081,2812],{"class":183},[173,3083,3059],{"class":187},[173,3085,3086],{"class":183}," \"\"\n",[15,3088,3089,3090,3093],{},"這在你只想分析單一 repo 時特別好用。請注意，若你並不在專案資料夾裡，",[19,3091,3092],{},"--project \"\""," 可能不會取得預期結果。",[83,3095],{},[44,3097,3098],{"id":3098},"實戰組合範例",[15,3100,3101],{},"前面介紹完各個參數，我習慣在實作時搭配成幾個常用的查詢模板。",[90,3103,3105],{"id":3104},"_1-最近-30-天目前專案的模型-top-5","1. 最近 30 天、目前專案的模型 Top 5",[15,3107,3108],{},"當你在某個專案上大量使用 AI 之後，很適合來一個月度回顧：",[164,3110,3112],{"className":166,"code":3111,"language":168,"meta":169,"style":169},"opencode stats --days 30 --project \"\" --models 5  \n",[19,3113,3114],{"__ignoreMap":169},[173,3115,3116,3118,3120,3122,3125,3127,3130,3132],{"class":175,"line":176},[173,3117,2680],{"class":179},[173,3119,2812],{"class":183},[173,3121,2871],{"class":187},[173,3123,3124],{"class":187}," 30",[173,3126,3059],{"class":187},[173,3128,3129],{"class":183}," \"\"",[173,3131,2993],{"class":187},[173,3133,2949],{"class":187},[15,3135,3136],{},"這條指令會告訴你：",[52,3138,3139,3142,3145],{},[55,3140,3141],{},"最近 30 天，這個專案用了哪些模型？",[55,3143,3144],{},"哪些模型是前五名？用量大概占比多少？",[55,3146,3147],{},"有沒有哪個模型使用量超出你原先的預期？",[15,3149,3150],{},"如果你發現某個昂貴的模型排進 Top 5，而且還不是關鍵需求，就可以考慮換成 CP 值更高的選擇。",[83,3152],{},[90,3154,3156],{"id":3155},"_2-最近-14-天全工作區工具使用總覽","2. 最近 14 天、全工作區工具使用總覽",[15,3158,3159],{},"如果你想從「工作型態」的角度切入，而不是模型角度，可以這樣看工具用量：",[164,3161,3163],{"className":166,"code":3162,"language":168,"meta":169,"style":169},"opencode stats --days 14 --tools  \n",[19,3164,3165],{"__ignoreMap":169},[173,3166,3167,3169,3171,3173,3176],{"class":175,"line":176},[173,3168,2680],{"class":179},[173,3170,2812],{"class":183},[173,3172,2871],{"class":187},[173,3174,3175],{"class":187}," 14",[173,3177,3178],{"class":187}," --tools\n",[15,3180,3181],{},"透過這個視角，你可以觀察：",[52,3183,3184,3187],{},[55,3185,3186],{},"AI 比較常幫你做 I\u002FO（例如 webfetch），還是純文字推理？",[55,3188,3189],{},"是否大量使用某些 Shell 工具（例如 bash），代表你已經開始把 DevOps 類型的任務交給 AI？",[15,3191,3192],{},"這有助於你調整自己的工作習慣，例如將重複性的 CLI 操作逐步交給 AI 自動化。",[83,3194],{},[90,3196,3198],{"id":3197},"_3-單一專案的完整成本分析模型-工具","3. 單一專案的完整成本分析（模型 + 工具）",[15,3200,3201],{},"當你想為某個專案做一次「完整的 AI 成本盤點」時，可以把模型與工具一起開：",[164,3203,3205],{"className":166,"code":3204,"language":168,"meta":169,"style":169},"opencode stats --project project-name --models --tools  \n",[19,3206,3207],{"__ignoreMap":169},[173,3208,3209,3211,3213,3215,3218,3220],{"class":175,"line":176},[173,3210,2680],{"class":179},[173,3212,2812],{"class":183},[173,3214,3059],{"class":187},[173,3216,3217],{"class":183}," project-name",[173,3219,2993],{"class":187},[173,3221,3178],{"class":187},[15,3223,3224],{},"用這種方式，你可以同時看到：",[52,3226,3227,3230],{},[55,3228,3229],{},"這個專案用了哪些模型、各自的 Token 與費用。",[55,3231,3232],{},"AI 在這個專案裡最常被拿來搭配哪些工具。",[15,3234,3235],{},"從這些數據出發，你可以進一步調整：",[52,3237,3238,3241],{},[55,3239,3240],{},"Default 模型（讓 Plan \u002F Build 走更便宜或更強大的路線）。",[55,3242,3243],{},"工作流程設計（例如是否將某些重度工具操作改成批次執行，而不是在對話中頻繁觸發）。",[83,3245],{},[44,3247,3249],{"id":3248},"結語用數據讓-ai-助手更划算","結語：用數據讓 AI 助手更「划算」",[15,3251,3252,3253,3255],{},"引入 AI 助手到日常開發流程，不只是為了「變快」或「變輕鬆」，更重要的是能長期、可持續地使用。",[19,3254,2740],{}," 提供的，就是一個將「感覺」轉成「數字」的入口。",[15,3257,3258,3259,3261,3262,3264,3265,2594,3267,3269],{},"透過 ",[19,3260,2856],{}," 控制時間範圍、",[19,3263,3039],{}," 聚焦特定專案，再搭配 ",[19,3266,2973],{},[19,3268,2906],{}," 做細部分析，你可以：",[52,3271,3272,3275,3278],{},[55,3273,3274],{},"找出真正的主力模型與工具。",[55,3276,3277],{},"及早發現成本異常的使用模式。",[55,3279,3280],{},"有依據地調整預設模型與工作流程設計。",[15,3282,3283,3284,3286],{},"如果你已經習慣用 OpenCode 協助開發，建議把幾條常用的 ",[19,3285,2740],{}," 查詢，加到自己的工作流程（甚至包成 script 或 alias），讓「看 AI 成本」和「看 CI\u002FCD 狀態」、「看監控儀表板」一樣自然，成為開發日常的一部分。",[894,3288,3289],{},"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":169,"searchDepth":212,"depth":212,"links":3291},[3292,3294,3296,3306,3311],{"id":2736,"depth":212,"text":3293},"為什麼要看 opencode stats？",{"id":2769,"depth":212,"text":3295},"opencode stats 基本用法",{"id":2795,"depth":212,"text":2795,"children":3297},[3298,3300,3302,3304],{"id":2848,"depth":223,"text":3299},"--days N：限制查詢時間範圍",{"id":2898,"depth":223,"text":3301},"--tools [N]：觀察工具使用熱度",{"id":2965,"depth":223,"text":3303},"--models [N]：檢視模型用量與費用明細",{"id":3031,"depth":223,"text":3305},"--project P：聚焦在特定專案",{"id":3098,"depth":212,"text":3098,"children":3307},[3308,3309,3310],{"id":3104,"depth":223,"text":3105},{"id":3155,"depth":223,"text":3156},{"id":3197,"depth":223,"text":3198},{"id":3248,"depth":212,"text":3249},"\u002Fimages\u002Farticles\u002F2026-06-29-opencode-state\u002Fcover.png",{},"\u002Farticles\u002F2026-06-29-opencode-state","2026-06-29 15:02:00",{"title":2731,"description":169},"articles\u002F2026-06-29-opencode-state","當 AI 助手真正進入開發流程後，**量化模型與工具的使用情況、掌握實際成本**就變得非常重要 OpenCode 提供的 `opencode stats` 指令，可以幫你快速統計各模型、各工具、各專案的 Token 用量與花費。從「感覺好像很常用」進化到「有數字、有依據」的資源管理。本文整理 `opencode stats` 的常見參數與組合用法，並分享幾個實務上常用的查詢範例。",[930,2680,932,931],"yQw3h2bKYW2VAUAF2zAXSLe_JOHylI9yq7K7oL9oWVM",{"id":3322,"title":3323,"body":3324,"category":919,"description":169,"extension":921,"image":3558,"meta":3559,"navigation":226,"path":3560,"pubDate":3561,"seo":3562,"status":226,"stem":3563,"summary":3564,"tags":3565,"__hash__":3566},"content\u002Farticles\u002F2026-05-15-opencode-context7-mcp.md","告別 AI 幻覺！用 Context7 MCP 讓 Opencode 即時讀取最新官方文件",{"type":8,"value":3325,"toc":3551},[3326,3330,3339,3342,3346,3349,3381,3385,3392,3395,3409,3428,3434,3437,3521,3524,3537,3543,3545,3548],[44,3327,3329],{"id":3328},"何為-mcp","何為  MCP",[15,3331,3332,3333,3338],{},"全名為 Model Context Protocol（模型上下文協定），它是一種讓 AI 可以「連接外部工具、資料、服務」的標準協定。由 ",[283,3334,3337],{"href":3335,"rel":3336},"https:\u002F\u002Fwww.anthropic.com?utm_source=chatgpt.com",[287],"Anthropic"," 在 2024 年提出。",[15,3340,3341],{},"簡單的說讓AI模型與外部工具互通的協定， 摡念就像是不同設備間，可以用 USB 這個通訊協定來互傳資料",[44,3343,3345],{"id":3344},"mcp-可以做什麼","MCP 可以做什麼？",[15,3347,3348],{},"它能讓AI模型做以下事情，甚致更多，只要應用服務商提供 MCP 接口，就可以讓 AI 模型操作各種服務",[52,3350,3351,3354,3357,3360,3363,3366,3369,3372,3375,3378],{},[55,3352,3353],{},"讀檔案",[55,3355,3356],{},"查資料庫",[55,3358,3359],{},"操作 GitHub",[55,3361,3362],{},"控制 Docker",[55,3364,3365],{},"查官方文件",[55,3367,3368],{},"執行 Shell",[55,3370,3371],{},"發 Slack",[55,3373,3374],{},"查 Notion",[55,3376,3377],{},"存取 PostgreSQL",[55,3379,3380],{},"操作 Browser",[44,3382,3384],{"id":3383},"何謂-context7","何謂 Context7",[15,3386,3387,3388,3391],{},"Context7 是 MCP 中很出名的應用服務，它可以讓 AI 模型在 coding 時，可以即時讀取",[28,3389,3390],{},"最新版本的官方文件","，讓 AI 模型在進行回答或 Vibe Coding 時，可以即時查詢官方文件，來回答問題，而非僅靠訓練記憶，更可大幅減少 AI 幻覺。",[15,3393,3394],{},"如可在opencode 中設定 Context7 MCP",[825,3396,3397,3406],{},[55,3398,3399,3400,3405],{},"在 ",[283,3401,3404],{"href":3402,"rel":3403},"https:\u002F\u002Fcontext7.com\u002F",[287],"Context 7 官網"," 註冊帳號",[55,3407,3408],{},"在命令列執行以下指令：",[164,3410,3412],{"className":166,"code":3411,"language":168,"meta":169,"style":169},"npx ctx7 setup --opencode\n",[19,3413,3414],{"__ignoreMap":169},[173,3415,3416,3419,3422,3425],{"class":175,"line":176},[173,3417,3418],{"class":179},"npx",[173,3420,3421],{"class":183}," ctx7",[173,3423,3424],{"class":183}," setup",[173,3426,3427],{"class":187}," --opencode\n",[15,3429,3430,3431],{},"此指令將會幫你取得 Context7 API key，建議先入 ",[283,3432,3404],{"href":3402,"rel":3433},[287],[15,3435,3436],{},"安裝成功會出現以下訊息：",[164,3438,3440],{"className":166,"code":3439,"language":168,"meta":169,"style":169},"✔ 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",[19,3441,3442,3455,3459,3464,3487,3492,3502,3507,3516],{"__ignoreMap":169},[173,3443,3444,3447,3450,3452],{"class":175,"line":176},[173,3445,3446],{"class":179},"✔",[173,3448,3449],{"class":183}," Context7",[173,3451,3424],{"class":183},[173,3453,3454],{"class":183}," complete\n",[173,3456,3457],{"class":175,"line":212},[173,3458,227],{"emptyLinePlaceholder":226},[173,3460,3461],{"class":175,"line":223},[173,3462,3463],{"class":179},"  OpenCode\n",[173,3465,3466,3469,3472,3475,3478,3481,3484],{"class":175,"line":230},[173,3467,3468],{"class":179},"    +",[173,3470,3471],{"class":183}," MCP",[173,3473,3474],{"class":183}," server",[173,3476,3477],{"class":183}," configured",[173,3479,3480],{"class":183}," with",[173,3482,3483],{"class":183}," API",[173,3485,3486],{"class":183}," Key\n",[173,3488,3489],{"class":175,"line":236},[173,3490,3491],{"class":179},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002Fopencode.json\n",[173,3493,3494,3496,3499],{"class":175,"line":249},[173,3495,3468],{"class":179},[173,3497,3498],{"class":183}," Rule",[173,3500,3501],{"class":183}," installed\n",[173,3503,3504],{"class":175,"line":254},[173,3505,3506],{"class":179},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002FAGENTS.md\n",[173,3508,3509,3511,3514],{"class":175,"line":260},[173,3510,3468],{"class":179},[173,3512,3513],{"class":183}," Skill",[173,3515,3501],{"class":183},[173,3517,3518],{"class":175,"line":356},[173,3519,3520],{"class":179},"      \u002FUsers\u002Fuser\u002F.agents\u002Fskills\u002Fcontext7-mcp\u002FSKILL.md\n",[44,3522,3523],{"id":3523},"驗證安裝",[15,3525,3399,3526,3528,3529,3532,3533,3536],{},[19,3527,2680],{}," 命令列中，輪入 ",[19,3530,3531],{},"\u002Fmcps"," 在列表中看見 ",[19,3534,3535],{},"context7 connected"," 資訊表示安裝成功",[15,3538,3539],{},[543,3540],{"alt":3541,"src":3542},"Opencode MCP List","\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fopencode-mcp.png",[44,3544,2584],{"id":2584},[15,3546,3547],{},"MCP 協定的出現讓 AI 從單純的「知識庫」轉變為能操作工具的「代理人」。而 Context7 則解決了 AI 最令人頭痛的「過時資訊」問題。將其設定在 Opencode 中後，AI 能夠在即時對接官方文件的基礎上進行編碼，讓開發體驗更加流暢且可靠。",[894,3549,3550],{},"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":169,"searchDepth":212,"depth":212,"links":3552},[3553,3554,3555,3556,3557],{"id":3328,"depth":212,"text":3329},{"id":3344,"depth":212,"text":3345},{"id":3383,"depth":212,"text":3384},{"id":3523,"depth":212,"text":3523},{"id":2584,"depth":212,"text":2584},"\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fcover.png",{},"\u002Farticles\u002F2026-05-15-opencode-context7-mcp","2026-05-15 14:44:00",{"title":3323,"description":169},"articles\u002F2026-05-15-opencode-context7-mcp","Context7 這款 MCP 應用，它能讓 Opencode 在編碼時即時讀取最新版本的官方文件，而非僅依賴過時的訓練記憶，從而大幅減少 AI 幻覺並提升回答的準確性。",[930,2680,932,931],"MD4aLm9bpk4W1cPswPYYPpPu2SWjkYB6cY0MKJo50aY",{"id":3568,"title":3569,"body":3570,"category":933,"description":169,"extension":921,"image":3990,"meta":3991,"navigation":226,"path":3992,"pubDate":3993,"seo":3994,"status":226,"stem":3995,"summary":3996,"tags":3997,"__hash__":4000},"content\u002Farticles\u002F2026-02-27-mole-tutorial.md","Mole 使用教學：macOS 深度清理與優化神器",{"type":8,"value":3571,"toc":3967},[3572,3576,3600,3603,3613,3615,3619,3622,3626,3640,3643,3646,3665,3672,3674,3677,3684,3687,3705,3741,3748,3754,3766,3769,3776,3782,3790,3802,3809,3812,3829,3841,3848,3851,3869,3881,3888,3904,3916,3918,3921,3955,3957,3959,3962,3964],[44,3573,3575],{"id":3574},"什麼是-mole","什麼是 Mole？",[15,3577,3578,3583,3584,3587,3588,3591,3592,3595,3596,3599],{},[283,3579,3582],{"href":3580,"rel":3581},"https:\u002F\u002Fgithub.com\u002Ftw93\u002FMole",[287],"Mole"," 是一個為 macOS 設計的開源全能工具箱。它的目標是取代多個付費或分散的工具，將 ",[28,3585,3586],{},"CleanMyMac","（清理）、",[28,3589,3590],{},"AppCleaner","（解除安裝）、",[28,3593,3594],{},"DaisyDisk","（磁碟分析）以及 ",[28,3597,3598],{},"iStat Menus","（實時監控）的核心功能整合進一個單一的二進位檔案中。",[15,3601,3602],{},"Mole 採用終端機介面（TUI），操作流暢且反應迅速，非常適合喜愛簡潔、高效工作的開發者與進階使用者。",[15,3604,3605,3608,3609],{},[28,3606,3607],{},"專案網址","：",[283,3610,3612],{"href":3580,"rel":3611},[287],"tw93\u002FMole",[83,3614],{},[44,3616,3618],{"id":3617},"安裝-mole","安裝 Mole",[15,3620,3621],{},"安裝 Mole 極其簡單，你可以選擇透過 Homebrew（推薦）或是官方腳本。",[90,3623,3625],{"id":3624},"使用-homebrew","使用 Homebrew",[164,3627,3629],{"className":166,"code":3628,"language":168,"meta":169,"style":169},"brew install mole\n",[19,3630,3631],{"__ignoreMap":169},[173,3632,3633,3635,3637],{"class":175,"line":176},[173,3634,180],{"class":179},[173,3636,184],{"class":183},[173,3638,3639],{"class":183}," mole\n",[90,3641,3642],{"id":3642},"使用官方腳本",[15,3644,3645],{},"如果你沒有安裝 Homebrew，也可以直接執行安裝腳本：",[164,3647,3649],{"className":166,"code":3648,"language":168,"meta":169,"style":169},"curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh | bash\n",[19,3650,3651],{"__ignoreMap":169},[173,3652,3653,3655,3657,3660,3662],{"class":175,"line":176},[173,3654,272],{"class":179},[173,3656,275],{"class":187},[173,3658,3659],{"class":183}," https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh",[173,3661,469],{"class":468},[173,3663,3664],{"class":179}," bash\n",[15,3666,3667,3668,3671],{},"安裝完成後，在終端機輸入 ",[19,3669,3670],{},"mo"," 即可啟動互動式選單，或直接加上子命令執行特定功能。",[83,3673],{},[44,3675,3676],{"id":3676},"核心功能詳解",[90,3678,3680,3681,308],{"id":3679},"_1-深度系統清理-mo-clean","1. 深度系統清理 (",[19,3682,3683],{},"mo clean",[15,3685,3686],{},"這是 Mole 最常用的功能。它會掃描系統中的各種快取、日誌與垃圾檔案，並提供視覺化的清理建議。",[52,3688,3689,3695],{},[55,3690,3691,3694],{},[28,3692,3693],{},"掃描範疇","：應用程式快取、瀏覽器快取（Chrome, Safari, Firefox）、開發者工具（Xcode, Node.js）、系統日誌、垃圾桶等。",[55,3696,3697,3700,3701,3704],{},[28,3698,3699],{},"預覽模式","：建議先執行 ",[19,3702,3703],{},"mo clean --dry-run"," 來查看預計清理的內容與風險等級。",[164,3706,3708],{"className":166,"code":3707,"language":168,"meta":169,"style":169},"# 執行深度清理\nmo clean\n\n# 僅查看預覽，不實際刪除\nmo clean --dry-run\n",[19,3709,3710,3715,3722,3726,3731],{"__ignoreMap":169},[173,3711,3712],{"class":175,"line":176},[173,3713,3714],{"class":208},"# 執行深度清理\n",[173,3716,3717,3719],{"class":175,"line":212},[173,3718,3670],{"class":179},[173,3720,3721],{"class":183}," clean\n",[173,3723,3724],{"class":175,"line":223},[173,3725,227],{"emptyLinePlaceholder":226},[173,3727,3728],{"class":175,"line":230},[173,3729,3730],{"class":208},"# 僅查看預覽，不實際刪除\n",[173,3732,3733,3735,3738],{"class":175,"line":236},[173,3734,3670],{"class":179},[173,3736,3737],{"class":183}," clean",[173,3739,3740],{"class":187}," --dry-run\n",[90,3742,3744,3745,308],{"id":3743},"_2-智慧解除安裝-mo-uninstall","2. 智慧解除安裝 (",[19,3746,3747],{},"mo uninstall",[15,3749,3750,3751,3753],{},"普通的刪除應用程式往往會留下許多「殘骸」。",[19,3752,3747],{}," 會搜尋並清理所有相關的偏好設定、支援檔案、Launch Agents 以及隱藏的殘留物。",[164,3755,3757],{"className":166,"code":3756,"language":168,"meta":169,"style":169},"mo uninstall\n",[19,3758,3759],{"__ignoreMap":169},[173,3760,3761,3763],{"class":175,"line":176},[173,3762,3670],{"class":179},[173,3764,3765],{"class":183}," uninstall\n",[15,3767,3768],{},"執行後會彈出清單，讓你選擇想要徹底移除的應用程式。",[90,3770,3772,3773,308],{"id":3771},"_3-系統優化-mo-optimize","3. 系統優化 (",[19,3774,3775],{},"mo optimize",[15,3777,3778,3779,3781],{},"當你感覺電腦變慢或網路異常時，",[19,3780,3775],{}," 可以幫助你快速重整系統狀態。",[52,3783,3784],{},[55,3785,3786,3789],{},[28,3787,3788],{},"功能包括","：重建系統資料庫、重置網路服務、重啟 Finder 與 Dock、清理診斷紀錄、重建 Spotlight 索引等。",[164,3791,3793],{"className":166,"code":3792,"language":168,"meta":169,"style":169},"mo optimize\n",[19,3794,3795],{"__ignoreMap":169},[173,3796,3797,3799],{"class":175,"line":176},[173,3798,3670],{"class":179},[173,3800,3801],{"class":183}," optimize\n",[90,3803,3805,3806,308],{"id":3804},"_4-磁碟空間分析-mo-analyze","4. 磁碟空間分析 (",[19,3807,3808],{},"mo analyze",[15,3810,3811],{},"類似於 DaisyDisk，這個功能會以視覺化條狀圖顯示各個目錄的空間佔用情況，並讓你輕鬆找出隱藏的大檔案。",[52,3813,3814,3820],{},[55,3815,3816,3819],{},[28,3817,3818],{},"導覽方式","：支援方向鍵與 Vim 鍵位（h\u002Fj\u002Fk\u002Fl）。",[55,3821,3822,3825,3826,2614],{},[28,3823,3824],{},"外部磁碟","：預設跳過外部磁碟以加快速度，若要分析外接硬碟可指定路徑：",[19,3827,3828],{},"mo analyze \u002FVolumes",[164,3830,3832],{"className":166,"code":3831,"language":168,"meta":169,"style":169},"mo analyze\n",[19,3833,3834],{"__ignoreMap":169},[173,3835,3836,3838],{"class":175,"line":176},[173,3837,3670],{"class":179},[173,3839,3840],{"class":183}," analyze\n",[90,3842,3844,3845,308],{"id":3843},"_5-實時系統狀態-mo-status","5. 實時系統狀態 (",[19,3846,3847],{},"mo status",[15,3849,3850],{},"這是一個精美的實時儀表板，提供 CPU、GPU、記憶體、磁碟 I\u002FO、網路流量以及硬體健康度（如電池循環、溫度、風扇轉速）的完整資訊。",[52,3852,3853,3859],{},[55,3854,3855,3858],{},[28,3856,3857],{},"Health Score","：根據系統壓力自動計算的健康分數。",[55,3860,3861,3864,3865,3868],{},[28,3862,3863],{},"小彩蛋","：在狀態頁面按下 ",[19,3866,3867],{},"k"," 可以召喚「太空貓」陪你工作。",[164,3870,3872],{"className":166,"code":3871,"language":168,"meta":169,"style":169},"mo status\n",[19,3873,3874],{"__ignoreMap":169},[173,3875,3876,3878],{"class":175,"line":176},[173,3877,3670],{"class":179},[173,3879,3880],{"class":183}," status\n",[90,3882,3884,3885,308],{"id":3883},"_6-專案快取清理-mo-purge","6. 專案快取清理 (",[19,3886,3887],{},"mo purge",[15,3889,3890,3891,2590,3894,2590,3897,3900,3901,3903],{},"對於開發者來說，硬碟空間常被無數專案的 ",[19,3892,3893],{},"node_modules",[19,3895,3896],{},"target",[19,3898,3899],{},"build"," 等資料夾吞噬。",[19,3902,3887],{}," 能自動找出並清理這些舊專案的構建產物。",[164,3905,3907],{"className":166,"code":3906,"language":168,"meta":169,"style":169},"mo purge\n",[19,3908,3909],{"__ignoreMap":169},[173,3910,3911,3913],{"class":175,"line":176},[173,3912,3670],{"class":179},[173,3914,3915],{"class":183}," purge\n",[83,3917],{},[44,3919,3920],{"id":3920},"使用技巧與安全性",[52,3922,3923,3935,3945],{},[55,3924,3925,3928,3929,3931,3932,3934],{},[28,3926,3927],{},"安全第一","：Mole 刪除的檔案通常是永久性的。請務必仔細檢查清理清單，特別是在執行 ",[19,3930,3683],{}," 或 ",[19,3933,3887],{}," 時。",[55,3936,3937,3940,3941,3944],{},[28,3938,3939],{},"白名單功能","：如果你希望保護特定的快取不被清理，可以使用 ",[19,3942,3943],{},"mo clean --whitelist"," 進行設定。",[55,3946,3947,3950,3951,3954],{},[28,3948,3949],{},"日誌追蹤","：所有的檔案操作都會記錄在 ",[19,3952,3953],{},"~\u002F.config\u002Fmole\u002Foperations.log","，方便事後追蹤。",[83,3956],{},[44,3958,810],{"id":810},[15,3960,3961],{},"Mole 不僅是一個清理工具，更是一個讓 Mac 保持最佳狀態的隨身護理師。它開源、輕量且極致快速的原生體驗，使其成為 macOS 平台上非常具有競爭力的開源方案。如果你還在為磁碟空間不足或系統卡頓煩惱，不妨現在就安裝 Mole 體驗一下！",[83,3963],{},[894,3965,3966],{},"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":169,"searchDepth":212,"depth":212,"links":3968},[3969,3970,3974,3988,3989],{"id":3574,"depth":212,"text":3575},{"id":3617,"depth":212,"text":3618,"children":3971},[3972,3973],{"id":3624,"depth":223,"text":3625},{"id":3642,"depth":223,"text":3642},{"id":3676,"depth":212,"text":3676,"children":3975},[3976,3978,3980,3982,3984,3986],{"id":3679,"depth":223,"text":3977},"1. 深度系統清理 (mo clean)",{"id":3743,"depth":223,"text":3979},"2. 智慧解除安裝 (mo uninstall)",{"id":3771,"depth":223,"text":3981},"3. 系統優化 (mo optimize)",{"id":3804,"depth":223,"text":3983},"4. 磁碟空間分析 (mo analyze)",{"id":3843,"depth":223,"text":3985},"5. 實時系統狀態 (mo status)",{"id":3883,"depth":223,"text":3987},"6. 專案快取清理 (mo purge)",{"id":3920,"depth":212,"text":3920},{"id":810,"depth":212,"text":810},"\u002Fimages\u002Farticles\u002F2026-02-27-mole-tutorial\u002Fcover.png",{},"\u002Farticles\u002F2026-02-27-mole-tutorial","2026-02-27 14:15:00",{"title":3569,"description":169},"articles\u002F2026-02-27-mole-tutorial","Mole 是一個開源的全能 macOS 優化工具，結合了 CleanMyMac、AppCleaner、DaisyDisk 和 iStat Menus 的核心功能。本文將帶你一步步掌握 Mole 的各項強大功能，讓你的 Mac 恢復往日的流暢與潔淨。",[3998,3999,932],"MacOS","系統優化","mziUNXsCHKI6FoJ52Gvu-RdbPJ5he5GSmjS74gVH9ME",{"id":4002,"title":4003,"body":4004,"category":919,"description":169,"extension":921,"image":5198,"meta":5199,"navigation":226,"path":5200,"pubDate":5201,"seo":5202,"status":226,"stem":5203,"summary":5204,"tags":5205,"__hash__":5206},"content\u002Farticles\u002F2026-02-24-opencode.md","OpenCode 完全指南：開源 AI 程式碼助手讓開發效率飆升",{"type":8,"value":4005,"toc":5160},[4006,4010,4013,4017,4049,4051,4055,4058,4062,4065,4083,4086,4100,4104,4107,4167,4170,4251,4253,4257,4260,4264,4267,4291,4295,4298,4300,4303,4306,4324,4327,4336,4343,4345,4349,4352,4359,4365,4368,4371,4374,4391,4394,4397,4403,4406,4413,4419,4422,4424,4428,4431,4435,4442,4628,4632,4635,4928,4932,4941,4998,5002,5009,5023,5079,5082,5084,5087,5090,5093,5096,5099,5102,5105,5108,5111,5115,5118,5122,5125,5127,5130,5133,5135,5138,5144,5146,5148,5151,5157],[44,4007,4009],{"id":4008},"什麼是-opencode","什麼是 OpenCode？",[15,4011,4012],{},"OpenCode 是一個開源的 AI 程式碼助手，致力於讓開發者能夠在終端機、IDE 或桌面環境中更高效地撰寫程式碼。由 Anomaly 團隊開發，目前在 GitHub 上已累積超過 10 萬顆星標，擁有超過 700 位貢獻者，每月服務超過 250 萬名開發者。",[90,4014,4016],{"id":4015},"opencode-的核心特點","OpenCode 的核心特點",[52,4018,4019,4025,4031,4037,4043],{},[55,4020,4021,4024],{},[28,4022,4023],{},"LSP 自動啟用","：自動載入正確的 LSP（Language Server Protocol）服務",[55,4026,4027,4030],{},[28,4028,4029],{},"多工作階段","：可同時在同一專案上啟動多個代理程式",[55,4032,4033,4036],{},[28,4034,4035],{},"分享連結","：可分享工作階段連結供他人參考或除錯",[55,4038,4039,4042],{},[28,4040,4041],{},"廣泛模型支援","：支援 75 種以上的 LLM 提供者，包括 Claude、GPT、Gemini 等",[55,4044,4045,4048],{},[28,4046,4047],{},"隱私優先","：不儲存任何程式碼或上下文資料，確保隱私安全",[83,4050],{},[44,4052,4054],{"id":4053},"安裝-opencode","安裝 OpenCode",[15,4056,4057],{},"OpenCode 支援多種安裝方式，以下是各平台的安裝方法：",[90,4059,4061],{"id":4060},"linux-和-macos","Linux 和 macOS",[15,4063,4064],{},"使用官方安裝腳本是最簡單的方式：",[164,4066,4068],{"className":166,"code":4067,"language":168,"meta":169,"style":169},"curl -fsSL https:\u002F\u002Fopencode.ai\u002Finstall | bash\n",[19,4069,4070],{"__ignoreMap":169},[173,4071,4072,4074,4076,4079,4081],{"class":175,"line":176},[173,4073,272],{"class":179},[173,4075,275],{"class":187},[173,4077,4078],{"class":183}," https:\u002F\u002Fopencode.ai\u002Finstall",[173,4080,469],{"class":468},[173,4082,3664],{"class":179},[15,4084,4085],{},"或者使用 Homebrew：",[164,4087,4089],{"className":166,"code":4088,"language":168,"meta":169,"style":169},"brew install anomalyco\u002Ftap\u002Fopencode\n",[19,4090,4091],{"__ignoreMap":169},[173,4092,4093,4095,4097],{"class":175,"line":176},[173,4094,180],{"class":179},[173,4096,184],{"class":183},[173,4098,4099],{"class":183}," anomalyco\u002Ftap\u002Fopencode\n",[90,4101,4103],{"id":4102},"windows","Windows",[15,4105,4106],{},"在 Windows 上建議使用 WSL（Windows Subsystem for Linux）以獲得最佳體驗：",[164,4108,4110],{"className":166,"code":4109,"language":168,"meta":169,"style":169},"# 使用 Chocolatey\nchoco install opencode\n\n# 使用 Scoop\nscoop install opencode\n\n# 使用 NPM\nnpm install -g opencode-ai\n",[19,4111,4112,4117,4127,4131,4136,4145,4149,4154],{"__ignoreMap":169},[173,4113,4114],{"class":175,"line":176},[173,4115,4116],{"class":208},"# 使用 Chocolatey\n",[173,4118,4119,4122,4124],{"class":175,"line":212},[173,4120,4121],{"class":179},"choco",[173,4123,184],{"class":183},[173,4125,4126],{"class":183}," opencode\n",[173,4128,4129],{"class":175,"line":223},[173,4130,227],{"emptyLinePlaceholder":226},[173,4132,4133],{"class":175,"line":230},[173,4134,4135],{"class":208},"# 使用 Scoop\n",[173,4137,4138,4141,4143],{"class":175,"line":236},[173,4139,4140],{"class":179},"scoop",[173,4142,184],{"class":183},[173,4144,4126],{"class":183},[173,4146,4147],{"class":175,"line":249},[173,4148,227],{"emptyLinePlaceholder":226},[173,4150,4151],{"class":175,"line":254},[173,4152,4153],{"class":208},"# 使用 NPM\n",[173,4155,4156,4159,4161,4164],{"class":175,"line":260},[173,4157,4158],{"class":179},"npm",[173,4160,184],{"class":183},[173,4162,4163],{"class":187}," -g",[173,4165,4166],{"class":183}," opencode-ai\n",[90,4168,4169],{"id":4169},"使用套件管理器",[164,4171,4173],{"className":166,"code":4172,"language":168,"meta":169,"style":169},"# 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",[19,4174,4175,4180,4190,4194,4199,4210,4214,4219,4230,4234,4239],{"__ignoreMap":169},[173,4176,4177],{"class":175,"line":176},[173,4178,4179],{"class":208},"# Node.js (npm)\n",[173,4181,4182,4184,4186,4188],{"class":175,"line":212},[173,4183,4158],{"class":179},[173,4185,184],{"class":183},[173,4187,4163],{"class":187},[173,4189,4166],{"class":183},[173,4191,4192],{"class":175,"line":223},[173,4193,227],{"emptyLinePlaceholder":226},[173,4195,4196],{"class":175,"line":230},[173,4197,4198],{"class":208},"# Bun\n",[173,4200,4201,4204,4206,4208],{"class":175,"line":236},[173,4202,4203],{"class":179},"bun",[173,4205,184],{"class":183},[173,4207,4163],{"class":187},[173,4209,4166],{"class":183},[173,4211,4212],{"class":175,"line":249},[173,4213,227],{"emptyLinePlaceholder":226},[173,4215,4216],{"class":175,"line":254},[173,4217,4218],{"class":208},"# pnpm\n",[173,4220,4221,4224,4226,4228],{"class":175,"line":260},[173,4222,4223],{"class":179},"pnpm",[173,4225,184],{"class":183},[173,4227,4163],{"class":187},[173,4229,4166],{"class":183},[173,4231,4232],{"class":175,"line":356},[173,4233,227],{"emptyLinePlaceholder":226},[173,4235,4236],{"class":175,"line":362},[173,4237,4238],{"class":208},"# Yarn\n",[173,4240,4241,4244,4247,4249],{"class":175,"line":368},[173,4242,4243],{"class":179},"yarn",[173,4245,4246],{"class":183}," global",[173,4248,1040],{"class":183},[173,4250,4166],{"class":183},[83,4252],{},[44,4254,4256],{"id":4255},"配置-opencode","配置 OpenCode",[15,4258,4259],{},"安裝完成後，需要配置 LLM 提供者才能開始使用。",[90,4261,4263],{"id":4262},"連接-opencode-zen推薦","連接 OpenCode Zen（推薦）",[15,4265,4266],{},"OpenCode Zen 是經過團隊測試和驗證的優化模型集合，無需擔心模型品質不一致的問題。",[825,4268,4269,4276,4285,4288],{},[55,4270,4271,4272,4275],{},"在終端機中輸入 ",[19,4273,4274],{},"\u002Fconnect"," 命令",[55,4277,4278,4279,4284],{},"選擇 opencode 並前往 ",[283,4280,4283],{"href":4281,"rel":4282},"https:\u002F\u002Fopencode.ai\u002Fauth",[287],"opencode.ai\u002Fauth"," 進行驗證",[55,4286,4287],{},"登入後新增付款資訊並複製 API 金鑰",[55,4289,4290],{},"將 API 金鑰貼上即可完成配置",[90,4292,4294],{"id":4293},"其他-llm-提供者","其他 LLM 提供者",[15,4296,4297],{},"如果你想使用其他 LLM 提供者（如 Claude、GPT、Gemini 等），也可以手動配置各提供者的 API 金鑰。",[83,4299],{},[44,4301,4302],{"id":4302},"初始化專案",[15,4304,4305],{},"配置完成後，即可開始使用 OpenCode：",[164,4307,4309],{"className":166,"code":4308,"language":168,"meta":169,"style":169},"cd \u002Fpath\u002Fto\u002Fyour\u002Fproject\nopencode\n",[19,4310,4311,4319],{"__ignoreMap":169},[173,4312,4313,4316],{"class":175,"line":176},[173,4314,4315],{"class":187},"cd",[173,4317,4318],{"class":183}," \u002Fpath\u002Fto\u002Fyour\u002Fproject\n",[173,4320,4321],{"class":175,"line":212},[173,4322,4323],{"class":179},"opencode\n",[15,4325,4326],{},"初始化專案：",[164,4328,4330],{"className":166,"code":4329,"language":168,"meta":169,"style":169},"\u002Finit\n",[19,4331,4332],{"__ignoreMap":169},[173,4333,4334],{"class":175,"line":176},[173,4335,4329],{"class":179},[15,4337,4338,4339,4342],{},"這會讓 OpenCode 分析你的專案並在專案根目錄建立 ",[19,4340,4341],{},"AGENTS.md"," 檔案。建議將此檔案提交至 Git，這能幫助 OpenCode 理解專案結構和編碼規範。",[83,4344],{},[44,4346,4348],{"id":4347},"opencode-實際應用","OpenCode 實際應用",[90,4350,4351],{"id":4351},"提問與解答",[15,4353,4354,4355,4358],{},"你可以讓 OpenCode 幫你解釋程式碼。使用 ",[19,4356,4357],{},"@"," 鍵可模糊搜尋專案中的檔案：",[164,4360,4363],{"className":4361,"code":4362,"language":631},[629],"How is authentication handled in @packages\u002Ffunctions\u002Fsrc\u002Fapi\u002Findex.ts\n",[19,4364,4362],{"__ignoreMap":169},[15,4366,4367],{},"這對於了解他人撰寫的程式碼特別有幫助。",[90,4369,4370],{"id":4370},"新增功能",[15,4372,4373],{},"OpenCode 的「規劃模式」是其強大功能之一。在這個模式下，OpenCode 不會直接修改程式碼，而是會提出實作計畫供你審視。",[825,4375,4376,4382,4385,4388],{},[55,4377,4378,4379,4381],{},"按下 ",[28,4380,583],{}," 鍵切換到規劃模式（畫面右下角會顯示指示器）",[55,4383,4384],{},"描述你想要的功能",[55,4386,4387],{},"檢視計畫並提供回饋或補充細節",[55,4389,4390],{},"確認計畫後，再切換回「建置模式」讓 OpenCode 執行修改",[90,4392,4393],{"id":4393},"程式碼修改",[15,4395,4396],{},"對於較簡單的修改，你可以直接要求 OpenCode 進行修改：",[164,4398,4401],{"className":4399,"code":4400,"language":631},[629],"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",[19,4402,4400],{"__ignoreMap":169},[90,4404,4405],{"id":4405},"復原變更",[15,4407,4408,4409,4412],{},"如果修改結果不滿意，可以使用 ",[19,4410,4411],{},"\u002Fundo"," 命令復原：",[164,4414,4417],{"className":4415,"code":4416,"language":631},[629],"\u002Fundo\n",[19,4418,4416],{"__ignoreMap":169},[15,4420,4421],{},"OpenCode 會恢復變更並顯示你原本的訊息，讓你可以調整提示後再試一次。",[83,4423],{},[44,4425,4427],{"id":4426},"opencode-常用指令","OpenCode 常用指令",[15,4429,4430],{},"OpenCode 提供了豐富的指令來提升開發效率。這些指令可分為 TUI 指令和 CLI 指令兩種類型。",[90,4432,4434],{"id":4433},"tui-指令","TUI 指令",[15,4436,4437,4438,4441],{},"在 OpenCode 終端機介面中，輸入 ",[19,4439,4440],{},"\u002F"," 後跟指令名稱即可執行。以下是常用的 TUI 指令：",[548,4443,4444,4453],{},[551,4445,4446],{},[554,4447,4448,4451],{},[557,4449,4450],{},"指令",[557,4452,562],{},[564,4454,4455,4468,4481,4490,4500,4510,4520,4536,4546,4556,4565,4578,4588,4598,4608,4618],{},[554,4456,4457,4462],{},[569,4458,4459],{},[19,4460,4461],{},"\u002Finit",[569,4463,4464,4465,4467],{},"建立或更新 ",[19,4466,4341],{}," 檔案，分析專案結構並建立開發規範文件",[554,4469,4470,4475],{},[569,4471,4472],{},[19,4473,4474],{},"\u002Fnew",[569,4476,4477,4478],{},"開始新的工作階段，別名：",[19,4479,4480],{},"\u002Fclear",[554,4482,4483,4487],{},[569,4484,4485],{},[19,4486,4411],{},[569,4488,4489],{},"復原對話中的最後一條訊息，包括所有檔案變更",[554,4491,4492,4497],{},[569,4493,4494],{},[19,4495,4496],{},"\u002Fredo",[569,4498,4499],{},"重做之前復原的訊息",[554,4501,4502,4507],{},[569,4503,4504],{},[19,4505,4506],{},"\u002Fshare",[569,4508,4509],{},"分享當前工作階段，建立可分享的連結",[554,4511,4512,4517],{},[569,4513,4514],{},[19,4515,4516],{},"\u002Funshare",[569,4518,4519],{},"取消分享當前工作階段",[554,4521,4522,4527],{},[569,4523,4524],{},[19,4525,4526],{},"\u002Fsessions",[569,4528,4529,4530,2590,4533],{},"列出工作階段並在工作階段之間切換，別名：",[19,4531,4532],{},"\u002Fresume",[19,4534,4535],{},"\u002Fcontinue",[554,4537,4538,4543],{},[569,4539,4540],{},[19,4541,4542],{},"\u002Fmodels",[569,4544,4545],{},"列出所有可用的模型",[554,4547,4548,4553],{},[569,4549,4550],{},[19,4551,4552],{},"\u002Fthemes",[569,4554,4555],{},"列出可用的主題",[554,4557,4558,4562],{},[569,4559,4560],{},[19,4561,4274],{},[569,4563,4564],{},"將 LLM 提供者新增到 OpenCode",[554,4566,4567,4572],{},[569,4568,4569],{},[19,4570,4571],{},"\u002Fcompact",[569,4573,4574,4575],{},"壓縮當前工作階段，別名：",[19,4576,4577],{},"\u002Fsummarize",[554,4579,4580,4585],{},[569,4581,4582],{},[19,4583,4584],{},"\u002Fdetails",[569,4586,4587],{},"切換工具執行詳情的顯示",[554,4589,4590,4595],{},[569,4591,4592],{},[19,4593,4594],{},"\u002Feditor",[569,4596,4597],{},"開啟外部編輯器來撰寫訊息",[554,4599,4600,4605],{},[569,4601,4602],{},[19,4603,4604],{},"\u002Fexport",[569,4606,4607],{},"將當前對話匯出為 Markdown",[554,4609,4610,4615],{},[569,4611,4612],{},[19,4613,4614],{},"\u002Fthinking",[569,4616,4617],{},"切換思考\u002F推理區塊的可見性",[554,4619,4620,4625],{},[569,4621,4622],{},[19,4623,4624],{},"\u002Fhelp",[569,4626,4627],{},"顯示說明對話框",[90,4629,4631],{"id":4630},"cli-指令","CLI 指令",[15,4633,4634],{},"除了 TUI 指令，OpenCode 還提供強大的命令列工具。以下是常用的 CLI 指令：",[164,4636,4638],{"className":166,"code":4637,"language":168,"meta":169,"style":169},"# 啟動 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",[19,4639,4640,4645,4652,4662,4672,4676,4681,4691,4703,4715,4719,4724,4736,4748,4752,4757,4769,4780,4792,4796,4801,4813,4824,4835,4840,4846,4856,4870,4875,4881,4895,4906,4917],{"__ignoreMap":169},[173,4641,4642],{"class":175,"line":176},[173,4643,4644],{"class":208},"# 啟動 OpenCode\n",[173,4646,4647,4649],{"class":175,"line":212},[173,4648,2680],{"class":179},[173,4650,4651],{"class":208},"                          # 啟動 TUI\n",[173,4653,4654,4656,4659],{"class":175,"line":223},[173,4655,2680],{"class":179},[173,4657,4658],{"class":183}," \u002Fpath\u002Fto\u002Fproject",[173,4660,4661],{"class":208},"         # 指定專案目錄啟動\n",[173,4663,4664,4666,4669],{"class":175,"line":230},[173,4665,2680],{"class":179},[173,4667,4668],{"class":187}," --continue",[173,4670,4671],{"class":208},"               # 繼續上一個工作階段\n",[173,4673,4674],{"class":175,"line":236},[173,4675,227],{"emptyLinePlaceholder":226},[173,4677,4678],{"class":175,"line":249},[173,4679,4680],{"class":208},"# 模型管理\n",[173,4682,4683,4685,4688],{"class":175,"line":254},[173,4684,2680],{"class":179},[173,4686,4687],{"class":183}," models",[173,4689,4690],{"class":208},"                   # 列出所有可用模型\n",[173,4692,4693,4695,4697,4700],{"class":175,"line":260},[173,4694,2680],{"class":179},[173,4696,4687],{"class":183},[173,4698,4699],{"class":183}," anthropic",[173,4701,4702],{"class":208},"         # 列出特定提供者的模型\n",[173,4704,4705,4707,4709,4712],{"class":175,"line":356},[173,4706,2680],{"class":179},[173,4708,4687],{"class":183},[173,4710,4711],{"class":187}," --refresh",[173,4713,4714],{"class":208},"         # 重新整理模型快取\n",[173,4716,4717],{"class":175,"line":362},[173,4718,227],{"emptyLinePlaceholder":226},[173,4720,4721],{"class":175,"line":368},[173,4722,4723],{"class":208},"# 代理管理\n",[173,4725,4726,4728,4731,4733],{"class":175,"line":374},[173,4727,2680],{"class":179},[173,4729,4730],{"class":183}," agent",[173,4732,527],{"class":183},[173,4734,4735],{"class":208},"             # 建立新代理\n",[173,4737,4738,4740,4742,4745],{"class":175,"line":380},[173,4739,2680],{"class":179},[173,4741,4730],{"class":183},[173,4743,4744],{"class":183}," list",[173,4746,4747],{"class":208},"               # 列出所有代理\n",[173,4749,4750],{"class":175,"line":385},[173,4751,227],{"emptyLinePlaceholder":226},[173,4753,4754],{"class":175,"line":1405},[173,4755,4756],{"class":208},"# MCP 伺服器管理\n",[173,4758,4759,4761,4764,4766],{"class":175,"line":1416},[173,4760,2680],{"class":179},[173,4762,4763],{"class":183}," mcp",[173,4765,1040],{"class":183},[173,4767,4768],{"class":208},"                  # 新增 MCP 伺服器\n",[173,4770,4771,4773,4775,4777],{"class":175,"line":1421},[173,4772,2680],{"class":179},[173,4774,4763],{"class":183},[173,4776,4744],{"class":183},[173,4778,4779],{"class":208},"                 # 列出所有 MCP 伺服器\n",[173,4781,4782,4784,4786,4789],{"class":175,"line":1718},[173,4783,2680],{"class":179},[173,4785,4763],{"class":183},[173,4787,4788],{"class":183}," auth",[173,4790,4791],{"class":208},"                 # 對 MCP 伺服器進行認證\n",[173,4793,4794],{"class":175,"line":1724},[173,4795,227],{"emptyLinePlaceholder":226},[173,4797,4798],{"class":175,"line":1729},[173,4799,4800],{"class":208},"# 工作階段管理\n",[173,4802,4803,4805,4808,4810],{"class":175,"line":1735},[173,4804,2680],{"class":179},[173,4806,4807],{"class":183}," session",[173,4809,4744],{"class":183},[173,4811,4812],{"class":208},"             # 列出所有工作階段\n",[173,4814,4816,4818,4821],{"class":175,"line":4815},22,[173,4817,2680],{"class":179},[173,4819,4820],{"class":183}," export",[173,4822,4823],{"class":208},"                   # 匯出工作階段資料\n",[173,4825,4827,4829,4832],{"class":175,"line":4826},23,[173,4828,2680],{"class":179},[173,4830,4831],{"class":183}," import",[173,4833,4834],{"class":208},"                   # 匯入工作階段資料\n",[173,4836,4838],{"class":175,"line":4837},24,[173,4839,227],{"emptyLinePlaceholder":226},[173,4841,4843],{"class":175,"line":4842},25,[173,4844,4845],{"class":208},"# 統計資訊\n",[173,4847,4849,4851,4853],{"class":175,"line":4848},26,[173,4850,2680],{"class":179},[173,4852,2812],{"class":183},[173,4854,4855],{"class":208},"                    # 顯示 Token 用量和費用統計\n",[173,4857,4859,4861,4863,4865,4867],{"class":175,"line":4858},27,[173,4860,2680],{"class":179},[173,4862,2812],{"class":183},[173,4864,2871],{"class":187},[173,4866,3124],{"class":187},[173,4868,4869],{"class":208},"          # 顯示最近 30 天的統計\n",[173,4871,4873],{"class":175,"line":4872},28,[173,4874,227],{"emptyLinePlaceholder":226},[173,4876,4878],{"class":175,"line":4877},29,[173,4879,4880],{"class":208},"# 其他實用指令\n",[173,4882,4884,4886,4889,4892],{"class":175,"line":4883},30,[173,4885,2680],{"class":179},[173,4887,4888],{"class":183}," run",[173,4890,4891],{"class":183}," \"提示詞\"",[173,4893,4894],{"class":208},"             # 非互動模式執行\n",[173,4896,4898,4900,4903],{"class":175,"line":4897},31,[173,4899,2680],{"class":179},[173,4901,4902],{"class":183}," serve",[173,4904,4905],{"class":208},"                    # 啟動 API 伺服器\n",[173,4907,4909,4911,4914],{"class":175,"line":4908},32,[173,4910,2680],{"class":179},[173,4912,4913],{"class":183}," web",[173,4915,4916],{"class":208},"                      # 啟動 Web 介面\n",[173,4918,4920,4922,4925],{"class":175,"line":4919},33,[173,4921,2680],{"class":179},[173,4923,4924],{"class":183}," upgrade",[173,4926,4927],{"class":208},"                  # 更新 OpenCode\n",[90,4929,4931],{"id":4930},"代理agents","代理（Agents）",[15,4933,4934,4935,4937,4938,4940],{},"OpenCode 內建了多種代理類型，可透過 ",[28,4936,583],{}," 鍵切換或使用 ",[19,4939,4357],{}," 提及呼叫：",[548,4942,4943,4954],{},[551,4944,4945],{},[554,4946,4947,4949,4952],{},[557,4948,727],{},[557,4950,4951],{},"類型",[557,4953,562],{},[564,4955,4956,4967,4977,4988],{},[554,4957,4958,4961,4964],{},[569,4959,4960],{},"Build",[569,4962,4963],{},"主代理",[569,4965,4966],{},"預設代理，啟用所有工具",[554,4968,4969,4972,4974],{},[569,4970,4971],{},"Plan",[569,4973,4963],{},[569,4975,4976],{},"規劃和分析代理，無法修改檔案",[554,4978,4979,4982,4985],{},[569,4980,4981],{},"General",[569,4983,4984],{},"子代理",[569,4986,4987],{},"通用研究代理，完整工具存取",[554,4989,4990,4993,4995],{},[569,4991,4992],{},"Explore",[569,4994,4984],{},[569,4996,4997],{},"快速唯讀代理，用於探索程式碼庫",[90,4999,5001],{"id":5000},"技能skills","技能（Skills）",[15,5003,5004,5005,5008],{},"技能是可重複使用的行為定義，透過 ",[19,5006,5007],{},"SKILL.md"," 檔案設定。技能檔案放置位置：",[52,5010,5011,5017],{},[55,5012,5013,5014],{},"專案：",[19,5015,5016],{},".opencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[55,5018,5019,5020],{},"全域：",[19,5021,5022],{},"~\u002F.config\u002Fopencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[164,5024,5028],{"className":5025,"code":5026,"language":5027,"meta":169,"style":169},"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",[19,5029,5030,5035,5040,5045,5049,5054,5059,5064,5069,5074],{"__ignoreMap":169},[173,5031,5032],{"class":175,"line":176},[173,5033,5034],{},"---\n",[173,5036,5037],{"class":175,"line":212},[173,5038,5039],{},"name: git-release\n",[173,5041,5042],{"class":175,"line":223},[173,5043,5044],{},"description: Create consistent releases and changelogs\n",[173,5046,5047],{"class":175,"line":230},[173,5048,5034],{},[173,5050,5051],{"class":175,"line":236},[173,5052,5053],{},"## What I do\n",[173,5055,5056],{"class":175,"line":249},[173,5057,5058],{},"- Draft release notes from merged PRs\n",[173,5060,5061],{"class":175,"line":254},[173,5062,5063],{},"- Propose a version bump\n",[173,5065,5066],{"class":175,"line":260},[173,5067,5068],{},"- Provide a copy-pasteable git command\n",[173,5070,5071],{"class":175,"line":356},[173,5072,5073],{},"## When to use me\n",[173,5075,5076],{"class":175,"line":362},[173,5077,5078],{},"Use this when you are preparing a tagged release.\n",[15,5080,5081],{},"透過靈活運用這些指令和快捷鍵，可以大幅提升使用 OpenCode 的開發效率。",[83,5083],{},[44,5085,5086],{"id":5086},"進階功能",[90,5088,5089],{"id":5089},"主題自訂",[15,5091,5092],{},"OpenCode 支援多種主題，你可以根據喜好進行設定。",[90,5094,5095],{"id":5095},"快捷鍵自訂",[15,5097,5098],{},"自訂鍵位綁定以符合個人工作流程。",[90,5100,5101],{"id":5101},"程式碼格式化",[15,5103,5104],{},"配置程式碼格式化工具，確保程式碼風格一致。",[90,5106,5107],{"id":5107},"自訂命令",[15,5109,5110],{},"建立重複使用的自訂命令，提高工作效率。",[90,5112,5114],{"id":5113},"整合-github-copilot","整合 GitHub Copilot",[15,5116,5117],{},"登入 GitHub 即可使用現有的 Copilot 帳戶。",[90,5119,5121],{"id":5120},"整合-ide","整合 IDE",[15,5123,5124],{},"OpenCode 提供 IDE 擴充功能，讓你可在喜愛的編輯器中使用。",[83,5126],{},[44,5128,5129],{"id":5129},"圖片支援",[15,5131,5132],{},"OpenCode 支援圖片分析功能。你可以將圖片拖曳到終端機中，OpenCode 會掃描圖片並將其加入提示中。這對於設計 UI 時參考範例圖片特別有用。",[83,5134],{},[44,5136,5137],{"id":5137},"分享功能",[15,5139,5140,5141,5143],{},"使用 ",[19,5142,4506],{}," 命令可建立當前對話的分享連結，讓團隊成員能夠參考你的工作階段或協助除錯。",[83,5145],{},[44,5147,810],{"id":810},[15,5149,5150],{},"OpenCode 作為一個開源的 AI 程式碼助手，提供了豐富的功能來提升開發效率。從自動化的 LSP 支援到多模型整合，再到強大的規劃和復原機制，OpenCode 為開發者提供了一個靈活且強大的 AI 輔助工具。",[15,5152,5153,5154,5156],{},"對於團隊開發而言，將 ",[19,5155,4341],{}," 提交至版本控制系統，能確保所有成員都能獲得一致的 AI 輔助體驗。而其隱私優先的設計理念，更讓企業和重視資料安全的開發者能夠放心使用。",[894,5158,5159],{},"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":169,"searchDepth":212,"depth":212,"links":5161},[5162,5165,5170,5174,5175,5181,5187,5195,5196,5197],{"id":4008,"depth":212,"text":4009,"children":5163},[5164],{"id":4015,"depth":223,"text":4016},{"id":4053,"depth":212,"text":4054,"children":5166},[5167,5168,5169],{"id":4060,"depth":223,"text":4061},{"id":4102,"depth":223,"text":4103},{"id":4169,"depth":223,"text":4169},{"id":4255,"depth":212,"text":4256,"children":5171},[5172,5173],{"id":4262,"depth":223,"text":4263},{"id":4293,"depth":223,"text":4294},{"id":4302,"depth":212,"text":4302},{"id":4347,"depth":212,"text":4348,"children":5176},[5177,5178,5179,5180],{"id":4351,"depth":223,"text":4351},{"id":4370,"depth":223,"text":4370},{"id":4393,"depth":223,"text":4393},{"id":4405,"depth":223,"text":4405},{"id":4426,"depth":212,"text":4427,"children":5182},[5183,5184,5185,5186],{"id":4433,"depth":223,"text":4434},{"id":4630,"depth":223,"text":4631},{"id":4930,"depth":223,"text":4931},{"id":5000,"depth":223,"text":5001},{"id":5086,"depth":212,"text":5086,"children":5188},[5189,5190,5191,5192,5193,5194],{"id":5089,"depth":223,"text":5089},{"id":5095,"depth":223,"text":5095},{"id":5101,"depth":223,"text":5101},{"id":5107,"depth":223,"text":5107},{"id":5113,"depth":223,"text":5114},{"id":5120,"depth":223,"text":5121},{"id":5129,"depth":212,"text":5129},{"id":5137,"depth":212,"text":5137},{"id":810,"depth":212,"text":810},"\u002Fimages\u002Farticles\u002F2026-02-24-opencode\u002Fcover.png",{},"\u002Farticles\u002F2026-02-24-opencode","2026-02-24 12:00:00",{"title":4003,"description":169},"articles\u002F2026-02-24-opencode","OpenCode 是一個開源的 AI 程式碼助手，支援終端機、桌面應用程式和 IDE 擴充功能。本文將帶你深入了解 OpenCode 的安裝、配置和各項強大功能，讓你體驗 AI 輔助開發的便利性。",[2680,930,931,932],"hCbyfY05rfnLeV9qp9nMDhmuIDOO6nXzSa_pGswgHzA",{"id":5208,"title":5209,"body":5210,"category":933,"description":169,"extension":921,"image":5612,"meta":5613,"navigation":226,"path":5614,"pubDate":5615,"seo":5616,"status":226,"stem":5617,"summary":5618,"tags":5619,"__hash__":5621},"content\u002Farticles\u002F2025-11-16-ffmpeg-getting-started.md","FFmpeg 新手入門：從安裝到常用指令實戰",{"type":8,"value":5211,"toc":5604},[5212,5214,5217,5219,5222,5236,5239,5252,5255,5258,5276,5279,5307,5321,5324,5340,5343,5359,5362,5387,5406,5409,5412,5445,5469,5472,5475,5512,5532,5535,5585,5590,5592,5601],[44,5213,942],{"id":942},[15,5215,5216],{},"FFmpeg 是一套以命令列為主的開源多媒體處理工具，支援幾乎所有常見的音訊與影像格式（編碼\u002F封裝）。\n對開發者、系統工程師與內容創作者而言，FFmpeg 是自動化轉檔、批次處理、串流轉封裝與影音後製流程中不可或缺的工具。\n本文以實務為導向，示範安裝步驟與常用命令（轉檔、壓縮、截圖、合併、裁切等），並說明常見選項與應用場景，協助你快速在專案或腳本中整合 FFmpeg。",[44,5218,993],{"id":993},[15,5220,5221],{},"一、在 MacOS 安裝 ffmpeg",[164,5223,5225],{"className":166,"code":5224,"language":168,"meta":169,"style":169},"brew install ffmpeg\n",[19,5226,5227],{"__ignoreMap":169},[173,5228,5229,5231,5233],{"class":175,"line":176},[173,5230,180],{"class":179},[173,5232,184],{"class":183},[173,5234,5235],{"class":183}," ffmpeg\n",[15,5237,5238],{},"二、在終端機輸入以下指令，可取得 ffmpeg 版本號和相關設定資訊",[164,5240,5242],{"className":166,"code":5241,"language":168,"meta":169,"style":169},"ffmpeg -version\n",[19,5243,5244],{"__ignoreMap":169},[173,5245,5246,5249],{"class":175,"line":176},[173,5247,5248],{"class":179},"ffmpeg",[173,5250,5251],{"class":187}," -version\n",[44,5253,5254],{"id":5254},"轉檔",[15,5256,5257],{},"一、基本轉檔",[164,5259,5261],{"className":166,"code":5260,"language":168,"meta":169,"style":169},"ffmpeg -i input.mov output.mp4\n",[19,5262,5263],{"__ignoreMap":169},[173,5264,5265,5267,5270,5273],{"class":175,"line":176},[173,5266,5248],{"class":179},[173,5268,5269],{"class":187}," -i",[173,5271,5272],{"class":183}," input.mov",[173,5274,5275],{"class":183}," output.mp4\n",[15,5277,5278],{},"二、更換影片和音訊的編碼",[164,5280,5282],{"className":166,"code":5281,"language":168,"meta":169,"style":169},"ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4\n",[19,5283,5284],{"__ignoreMap":169},[173,5285,5286,5288,5290,5293,5296,5299,5302,5305],{"class":175,"line":176},[173,5287,5248],{"class":179},[173,5289,5269],{"class":187},[173,5291,5292],{"class":183}," input.mp4",[173,5294,5295],{"class":187}," -c:v",[173,5297,5298],{"class":183}," libx264",[173,5300,5301],{"class":187}," -c:a",[173,5303,5304],{"class":183}," aac",[173,5306,5275],{"class":183},[52,5308,5309,5315],{},[55,5310,5311,5314],{},[19,5312,5313],{},"-c:v libx264","：指定使用 H.264 編碼器進行影片編碼。",[55,5316,5317,5320],{},[19,5318,5319],{},"-c:a aac","： 指定使用 AAC 編碼器進行音頻編碼。",[15,5322,5323],{},"三、影片轉成序列圖片檔",[164,5325,5327],{"className":166,"code":5326,"language":168,"meta":169,"style":169},"ffmpeg -i input.mp4 video\u002Foutput_%04d.png\n",[19,5328,5329],{"__ignoreMap":169},[173,5330,5331,5333,5335,5337],{"class":175,"line":176},[173,5332,5248],{"class":179},[173,5334,5269],{"class":187},[173,5336,5292],{"class":183},[173,5338,5339],{"class":183}," video\u002Foutput_%04d.png\n",[15,5341,5342],{},"四、影片轉成音訊檔",[164,5344,5346],{"className":166,"code":5345,"language":168,"meta":169,"style":169},"ffmpeg -i input.mp4 music\u002Foutput.mp3\n",[19,5347,5348],{"__ignoreMap":169},[173,5349,5350,5352,5354,5356],{"class":175,"line":176},[173,5351,5248],{"class":179},[173,5353,5269],{"class":187},[173,5355,5292],{"class":183},[173,5357,5358],{"class":183}," music\u002Foutput.mp3\n",[15,5360,5361],{},"五、序列圖片轉成影片檔",[164,5363,5365],{"className":166,"code":5364,"language":168,"meta":169,"style":169},"ffmpeg -framerate 30 -i video\u002Foutput_%04d.png -c:v libx264 output.mp4\n",[19,5366,5367],{"__ignoreMap":169},[173,5368,5369,5371,5374,5376,5378,5381,5383,5385],{"class":175,"line":176},[173,5370,5248],{"class":179},[173,5372,5373],{"class":187}," -framerate",[173,5375,3124],{"class":187},[173,5377,5269],{"class":187},[173,5379,5380],{"class":183}," video\u002Foutput_%04d.png",[173,5382,5295],{"class":187},[173,5384,5298],{"class":183},[173,5386,5275],{"class":183},[52,5388,5389,5395,5401],{},[55,5390,5391,5394],{},[19,5392,5393],{},"framerate","：影格率（fps）",[55,5396,5397,5400],{},[19,5398,5399],{},"-i","：輸入",[55,5402,5403,5405],{},[19,5404,5313],{},"：使用 H264 編碼",[44,5407,5408],{"id":5408},"剪裁",[15,5410,5411],{},"一、時間裁切（截取片段）",[164,5413,5415],{"className":166,"code":5414,"language":168,"meta":169,"style":169},"ffmpeg -ss - -i input.mp4 -t 10 -c copy output_trim.mp4\n",[19,5416,5417],{"__ignoreMap":169},[173,5418,5419,5421,5424,5427,5429,5431,5434,5437,5439,5442],{"class":175,"line":176},[173,5420,5248],{"class":179},[173,5422,5423],{"class":187}," -ss",[173,5425,5426],{"class":183}," -",[173,5428,5269],{"class":187},[173,5430,5292],{"class":183},[173,5432,5433],{"class":187}," -t",[173,5435,5436],{"class":187}," 10",[173,5438,266],{"class":187},[173,5440,5441],{"class":183}," copy",[173,5443,5444],{"class":183}," output_trim.mp4\n",[52,5446,5447,5453,5457,5463],{},[55,5448,5449,5452],{},[19,5450,5451],{},"-ss","： 開始時間",[55,5454,5455,5400],{},[19,5456,5399],{},[55,5458,5459,5462],{},[19,5460,5461],{},"-t","：截取時間(秒)",[55,5464,5465,5468],{},[19,5466,5467],{},"-c copy","：不進行重新編碼-",[44,5470,5471],{"id":5471},"合併",[15,5473,5474],{},"一、合併影片檔和聲音檔",[164,5476,5478],{"className":166,"code":5477,"language":168,"meta":169,"style":169},"ffmpeg -i input.mp4 -i audio.wav -c:v copy -c:a aac -b:a 192k -shortest output.mp4\n",[19,5479,5480],{"__ignoreMap":169},[173,5481,5482,5484,5486,5488,5490,5493,5495,5497,5499,5501,5504,5507,5510],{"class":175,"line":176},[173,5483,5248],{"class":179},[173,5485,5269],{"class":187},[173,5487,5292],{"class":183},[173,5489,5269],{"class":187},[173,5491,5492],{"class":183}," audio.wav",[173,5494,5295],{"class":187},[173,5496,5441],{"class":183},[173,5498,5301],{"class":187},[173,5500,5304],{"class":183},[173,5502,5503],{"class":187}," -b:a",[173,5505,5506],{"class":183}," 192k",[173,5508,5509],{"class":187}," -shortest",[173,5511,5275],{"class":183},[52,5513,5514,5520,5526],{},[55,5515,5516,5519],{},[19,5517,5518],{},"-c:v copy","：複製原影片，不重新編碼（保留畫質、速度快）",[55,5521,5522,5525],{},[19,5523,5524],{},"-c:a aac -b:a 192k","： 把音訊編成 AAC，192 kbps 常見且相容性好。",[55,5527,5528,5531],{},[19,5529,5530],{},"-shortest","：以較短的軌為準，避免多出黑畫面或靜音尾巴",[15,5533,5534],{},"二、合併圖片",[52,5536,5537,5549],{},[55,5538,5539,5540,5543],{},"建立影像清單 ",[19,5541,5542],{},"filelist.txt",[164,5544,5547],{"className":5545,"code":5546,"language":631,"meta":169},[629],"file 'part1.mp4'\nfile 'part2.mp4'\nfile 'part3.mp4'\n",[19,5548,5546],{"__ignoreMap":169},[55,5550,5551,5552],{},"串連輸出",[164,5553,5555],{"className":166,"code":5554,"language":168,"meta":169,"style":169},"ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_concat.mp4\n",[19,5556,5557],{"__ignoreMap":169},[173,5558,5559,5561,5564,5567,5570,5573,5575,5578,5580,5582],{"class":175,"line":176},[173,5560,5248],{"class":179},[173,5562,5563],{"class":187}," -f",[173,5565,5566],{"class":183}," concat",[173,5568,5569],{"class":187}," -safe",[173,5571,5572],{"class":187}," 0",[173,5574,5269],{"class":187},[173,5576,5577],{"class":183}," filelist.txt",[173,5579,266],{"class":187},[173,5581,5441],{"class":183},[173,5583,5584],{"class":183}," output_concat.mp4\n",[15,5586,5587],{},[28,5588,5589],{},"注意：所有影片片段編碼參數需相同，否則會有導致音畫不同步，或是合併失敗",[44,5591,2584],{"id":2584},[15,5593,5594,5595,5600],{},"總結來說，FFmpeg 是一個功能強大的影音處理工具，只是功能對一般人來說複雜，而本文整理常用的使用情境，期望讓使用快速上手，若要更詳細的功能使用，可以參考",[283,5596,5599],{"href":5597,"rel":5598},"https:\u002F\u002Fffmpeg.org\u002Fffmpeg.html",[287],"官方文件","，希望這份指南能幫助你更好地利用 FFmpeg，打造更完美的影音作品！",[894,5602,5603],{},"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":169,"searchDepth":212,"depth":212,"links":5605},[5606,5607,5608,5609,5610,5611],{"id":942,"depth":212,"text":942},{"id":993,"depth":212,"text":993},{"id":5254,"depth":212,"text":5254},{"id":5408,"depth":212,"text":5408},{"id":5471,"depth":212,"text":5471},{"id":2584,"depth":212,"text":2584},"\u002Fimages\u002Farticles\u002F2025-11-16-ffmpeg-getting-started\u002Fcover.png",{},"\u002Farticles\u002F2025-11-16-ffmpeg-getting-started","2025-11-16 16:54:00",{"title":5209,"description":169},"articles\u002F2025-11-16-ffmpeg-getting-started","FFmpeg 是一個跨平台的開源多媒體工具組，用來處理音樂與影片。",[5620,933,932],"video","ZdvGeair61zT3Br9J0Csx2v78hP1q2MfzpRednjS9zw",{"id":5623,"title":5624,"body":5625,"category":919,"description":169,"extension":921,"image":5796,"meta":5797,"navigation":226,"path":5798,"pubDate":5799,"seo":5800,"status":226,"stem":5801,"summary":5802,"tags":5803,"__hash__":5805},"content\u002Farticles\u002F2025-08-05-ai-upscayl.md","告別模糊！用 Upscayl 輕鬆放大照片，讓細節更清晰",{"type":8,"value":5626,"toc":5788},[5627,5631,5634,5637,5692,5695,5701,5704,5710,5761,5764,5778,5780,5783],[44,5628,5630],{"id":5629},"什麼是-upscayl","什麼是 Upscayl？",[15,5632,5633],{},"Upscayl 是一款免費、開源的圖像放大（upscaling）工具，利用 AI（人工智慧）技術，尤其是 圖像超解析度（Super-Resolution）模型，將低解析度的圖片放大為高解析度，同時盡可能保留或重建細節，讓圖片變得更清晰、更銳利。",[44,5635,5636],{"id":5636},"主要特色",[52,5638,5639,5661,5674,5680,5686],{},[55,5640,5641,5644,5645,2590,5648,2590,5651,2590,5654,2590,5657,5660],{},[28,5642,5643],{},"多個AI模型可選擇","： ",[19,5646,5647],{},"Upscayl",[19,5649,5650],{},"Upscayl lite",[19,5652,5653],{},"Remacri",[19,5655,5656],{},"Ultramax",[19,5658,5659],{},"Ultrasharp"," 等可以選擇",[55,5662,5663,5666,5667,2590,5669,5671,5672],{},[28,5664,5665],{},"跨平台","：支援 ",[19,5668,4103],{},[19,5670,195],{}," 和 ",[19,5673,3998],{},[55,5675,5676,5679],{},[28,5677,5678],{},"開援授權","：採用 MIT 授權",[55,5681,5682,5685],{},[28,5683,5684],{},"支援批次處理","：可以處理多張圖片",[55,5687,5688,5691],{},[28,5689,5690],{},"操作簡單","：使用介面非常友善，新手小白輕易上手",[44,5693,5694],{"id":5694},"下載網址",[15,5696,5697],{},[283,5698,5699],{"href":5699,"rel":5700},"https:\u002F\u002Fupscayl.github.io\u002F",[287],[44,5702,5703],{"id":5703},"操作介紹",[15,5705,5706],{},[543,5707],{"alt":5708,"src":5709},"操作介面","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-01.png",[825,5711,5712,5718,5724,5733,5739,5745,5751],{},[55,5713,5714,5717],{},[28,5715,5716],{},"選擇批次處理","：可選擇單張圖片放大，或批次放大",[55,5719,5720,5723],{},[28,5721,5722],{},"選舉圖片","：若單張放大時，則選擇圖片，若選擇批次放大，則選擇目錄",[55,5725,5726,5729,5730],{},[28,5727,5728],{},"選擇放大模型","：可以依自已需求，選擇放大模型 ",[543,5731],{"alt":5728,"src":5732},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-02.png",[55,5734,5735,5738],{},[28,5736,5737],{},"雙次放大","：進行兩次放大",[55,5740,5741,5744],{},[28,5742,5743],{},"放大比例","：可選擇放大倍率",[55,5746,5747,5750],{},[28,5748,5749],{},"選擇輸出位置","：可選擇輸出目錄",[55,5752,5753,5756,5757],{},[28,5754,5755],{},"開始處理","：開始放大 ",[543,5758],{"alt":5759,"src":5760},"放大後可瀏覽結果","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-03.png",[44,5762,5763],{"id":5763},"使用情境",[52,5765,5766,5769,5772,5775],{},[55,5767,5768],{},"放大老照片或低清圖片",[55,5770,5771],{},"為插圖、漫畫、像素風圖片增強清晰度",[55,5773,5774],{},"為網路下載的壓縮圖片進行畫質修復",[55,5776,5777],{},"用於 2D 遊戲素材的升級",[44,5779,2584],{"id":2584},[15,5781,5782],{},"Upscayl 是一款結合人工智慧與開源精神的圖像放大工具，讓使用者即使沒有專業技術背景，也能輕鬆將模糊、低解析度的圖片轉換為更清晰、可用的高解析版本。無論是修復舊照片、強化插圖，還是優化網路圖片，Upscayl 都提供了一種快速且免費的解決方案，是創作者與設計師不可或缺的好幫手。",[15,5784,5785],{},[28,5786,5787],{},"注意！Upscayl 提供部份模型是無法使用於商用",{"title":169,"searchDepth":212,"depth":212,"links":5789},[5790,5791,5792,5793,5794,5795],{"id":5629,"depth":212,"text":5630},{"id":5636,"depth":212,"text":5636},{"id":5694,"depth":212,"text":5694},{"id":5703,"depth":212,"text":5703},{"id":5763,"depth":212,"text":5763},{"id":2584,"depth":212,"text":2584},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002Fcover.png",{},"\u002Farticles\u002F2025-08-05-ai-upscayl","2025-08-05 20:38:00",{"title":5624,"description":169},"articles\u002F2025-08-05-ai-upscayl","Upscayl 是一個基於開源人工智慧的免費圖片放大軟體，可以有效地提升低解析度的圖片品質。它支援 Linux、Windows 和 macOS 平台，並能將照片放大到超越原始畫質的程度。",[930,5804,933,932],"圖片處理","tRflg5x3IYHijIQy2fPVyq0DlJreuDRMFZP2NyCvLa0",{"id":5807,"title":5808,"body":5809,"category":919,"description":8540,"extension":921,"image":8541,"meta":8542,"navigation":226,"path":8543,"pubDate":8544,"seo":8545,"status":226,"stem":8546,"summary":8547,"tags":8548,"__hash__":8549},"content\u002Farticles\u002F2025-07-12-gemini-cli.md","Gemini CLI 教學：善用 AI 提升你的終端機開發效率",{"type":8,"value":5810,"toc":8527},[5811,5815,5829,5833,5836,5840,5878,5882,5886,5933,5937,5940,5945,5951,5957,5963,5969,5978,5981,6236,6241,6418,6423,8312,8315,8322,8328,8333,8339,8363,8369,8375,8379,8387,8393,8397,8409,8494,8500,8502,8505,8508,8524],[11,5812,5814],{"id":5813},"gemini-cli-教學將-gemini-的強大-ai-能力帶入你的終端機","Gemini CLI 教學：將 Gemini 的強大 AI 能力帶入你的終端機",[15,5816,5817,5818,5821,5822,5824,5825,5828],{},"Google 發最新的 AI 開發工具 ",[19,5819,5820],{},"Gemini CLI","，可以對標 Anthropic 的 ",[19,5823,740],{}," 和 OpenAI 的 ",[19,5826,5827],{},"Codex CLI","等 AI 開發工具，也讓使得 AI開發工具的竸爭進入白熱化。",[44,5830,5832],{"id":5831},"gemini-cli-是什麼","Gemini CLI 是什麼？",[15,5834,5835],{},"Gemini CLI 是一個開源的 AI 代理（AI Agent），它將 Google 的 Gemini 模型（特別是 Gemini 2.5 Pro）的能力直接整合到你的終端機環境中。這意味著你可以在不離開終端機的情況下，利用 AI 來協助你完成各種開發工作。",[90,5837,5839],{"id":5838},"主要特色與優勢","主要特色與優勢：",[52,5841,5842,5848,5854,5860,5866,5872],{},[55,5843,5844,5847],{},[28,5845,5846],{},"無縫整合 Gemini 模型："," 直接在終端機中使用 Gemini 2.5 Pro 的強大功能，包括其高達 100 萬詞元的長脈絡（context window）。",[55,5849,5850,5853],{},[28,5851,5852],{},"開源且高度擴充："," 採用 Apache 2.0 授權，原始碼公開透明，並支援 Model Context Protocol (MCP) 等擴充功能，讓你可以自訂和擴展其能力。",[55,5855,5856,5859],{},[28,5857,5858],{},"多功能性："," 不僅限於程式碼生成，還能協助檔案操作、指令執行、動態故障排除、內容生成、問題解決、深入研究和任務管理。",[55,5861,5862,5865],{},[28,5863,5864],{},"個人開發者免費額度："," 使用個人 Google 帳戶即可免費使用 Gemini CLI，提供業界領先的免費使用額度（每分鐘 60 次，每日最多 1,000 次模型執行）。",[55,5867,5868,5871],{},[28,5869,5870],{},"AI-First Coding 概念："," 鼓勵開發者以 AI 為優先，將 AI 視為協作夥伴，透過清晰的提示詞引導 AI 完成任務，並審核其產出。",[55,5873,5874,5877],{},[28,5875,5876],{},"與 Gemini Code Assist 整合："," 與 Google 的 AI 程式碼編寫輔助工具 Gemini Code Assist 採用相同核心技術，提供更一致的 AI 開發體驗。",[44,5879,5881],{"id":5880},"開始使用-gemini-cli","開始使用 Gemini CLI",[90,5883,5885],{"id":5884},"安裝步驟","安裝步驟：",[825,5887,5888,5901,5923],{},[55,5889,5890,5893,5894,5897,5898,2614],{},[28,5891,5892],{},"安裝 Node.js："," 確保你的系統已安裝 Node.js 版本 ",[19,5895,5896],{},"18"," 或以上，建議使用版本 ",[19,5899,5900],{},"20",[55,5902,5903,5906,5907],{},[28,5904,5905],{},"安裝 Gemini CLI："," 在終端機中執行以下指令進行全域安裝：\n",[164,5908,5910],{"className":166,"code":5909,"language":168,"meta":169,"style":169},"npm install -g @google\u002Fgemini-cli\n",[19,5911,5912],{"__ignoreMap":169},[173,5913,5914,5916,5918,5920],{"class":175,"line":176},[173,5915,4158],{"class":179},[173,5917,184],{"class":183},[173,5919,4163],{"class":187},[173,5921,5922],{"class":183}," @google\u002Fgemini-cli\n",[55,5924,5925,5928,5929,5932],{},[28,5926,5927],{},"初步設定："," 執行 ",[19,5930,5931],{},"gemini"," 指令，依照提示完成初步設定，例如選擇你偏好的 Theme 和進行身份驗證（通常是登入你的 Google 帳戶）。",[90,5934,5936],{"id":5935},"快速入門","快速入門：",[15,5938,5939],{},"讓我們透過一個簡單的範例來體驗 Gemini CLI 的強大之處。假設我們想生成一個計算費式數列的 Python 程式碼，並將其儲存並執行。",[15,5941,5942],{},[28,5943,5944],{},"Prompt：",[164,5946,5949],{"className":5947,"code":5948,"language":631},[629],"使用html5開發一個飛機射擊遊戲，需有計分系統，每擊敗普通怪物得5分，擊敗Boss級怪物得100分，專案目錄：`~\u002Fwww\u002FAircraft-shooting`\n",[19,5950,5948],{"__ignoreMap":169},[15,5952,5953,5954,5956],{},"在執行過程中，",[19,5955,5820],{}," 會使用詢問互動方式，來協助使用者完成專案",[15,5958,5959,5960,5962],{},"建立檔案產與寫入檔案時，",[19,5961,5820],{}," 會讓使用者確認",[15,5964,5965],{},[543,5966],{"alt":5967,"src":5968},"Gemini CLI詢問使用者是否建立檔案","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-01.png",[15,5970,5971,5972,5974,5975,5977],{},"確認後 ",[19,5973,5820],{}," 會開始建立相關程式，以此為例，",[19,5976,5820],{}," 建了以下程式",[15,5979,5980],{},"1 index.html",[164,5982,5986],{"className":5983,"code":5984,"language":5985,"meta":169,"style":169},"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",[19,5987,5988,6003,6020,6029,6047,6071,6085,6110,6119,6128,6140,6178,6199,6220,6228],{"__ignoreMap":169},[173,5989,5990,5993,5997,6000],{"class":175,"line":176},[173,5991,5992],{"class":1199},"\u003C!",[173,5994,5996],{"class":5995},"sByVh","DOCTYPE",[173,5998,5999],{"class":179}," html",[173,6001,6002],{"class":1199},">\n",[173,6004,6005,6008,6010,6013,6015,6018],{"class":175,"line":212},[173,6006,6007],{"class":1199},"\u003C",[173,6009,5985],{"class":5995},[173,6011,6012],{"class":179}," lang",[173,6014,1206],{"class":1199},[173,6016,6017],{"class":183},"\"en\"",[173,6019,6002],{"class":1199},[173,6021,6022,6024,6027],{"class":175,"line":223},[173,6023,6007],{"class":1199},[173,6025,6026],{"class":5995},"head",[173,6028,6002],{"class":1199},[173,6030,6031,6034,6037,6040,6042,6045],{"class":175,"line":230},[173,6032,6033],{"class":1199},"    \u003C",[173,6035,6036],{"class":5995},"meta",[173,6038,6039],{"class":179}," charset",[173,6041,1206],{"class":1199},[173,6043,6044],{"class":183},"\"UTF-8\"",[173,6046,6002],{"class":1199},[173,6048,6049,6051,6053,6056,6058,6061,6064,6066,6069],{"class":175,"line":236},[173,6050,6033],{"class":1199},[173,6052,6036],{"class":5995},[173,6054,6055],{"class":179}," name",[173,6057,1206],{"class":1199},[173,6059,6060],{"class":183},"\"viewport\"",[173,6062,6063],{"class":179}," content",[173,6065,1206],{"class":1199},[173,6067,6068],{"class":183},"\"width=device-width, initial-scale=1.0\"",[173,6070,6002],{"class":1199},[173,6072,6073,6075,6078,6081,6083],{"class":175,"line":249},[173,6074,6033],{"class":1199},[173,6076,6077],{"class":5995},"title",[173,6079,6080],{"class":1199},">Aircraft Shooting Game\u003C\u002F",[173,6082,6077],{"class":5995},[173,6084,6002],{"class":1199},[173,6086,6087,6089,6092,6095,6097,6100,6103,6105,6108],{"class":175,"line":254},[173,6088,6033],{"class":1199},[173,6090,6091],{"class":5995},"link",[173,6093,6094],{"class":179}," rel",[173,6096,1206],{"class":1199},[173,6098,6099],{"class":183},"\"stylesheet\"",[173,6101,6102],{"class":179}," href",[173,6104,1206],{"class":1199},[173,6106,6107],{"class":183},"\"style.css\"",[173,6109,6002],{"class":1199},[173,6111,6112,6115,6117],{"class":175,"line":260},[173,6113,6114],{"class":1199},"\u003C\u002F",[173,6116,6026],{"class":5995},[173,6118,6002],{"class":1199},[173,6120,6121,6123,6126],{"class":175,"line":356},[173,6122,6007],{"class":1199},[173,6124,6125],{"class":5995},"body",[173,6127,6002],{"class":1199},[173,6129,6130,6132,6134,6136,6138],{"class":175,"line":362},[173,6131,6033],{"class":1199},[173,6133,11],{"class":5995},[173,6135,6080],{"class":1199},[173,6137,11],{"class":5995},[173,6139,6002],{"class":1199},[173,6141,6142,6144,6147,6150,6152,6155,6158,6160,6163,6166,6168,6171,6174,6176],{"class":175,"line":368},[173,6143,6033],{"class":1199},[173,6145,6146],{"class":5995},"canvas",[173,6148,6149],{"class":179}," id",[173,6151,1206],{"class":1199},[173,6153,6154],{"class":183},"\"gameCanvas\"",[173,6156,6157],{"class":179}," width",[173,6159,1206],{"class":1199},[173,6161,6162],{"class":183},"\"800\"",[173,6164,6165],{"class":179}," height",[173,6167,1206],{"class":1199},[173,6169,6170],{"class":183},"\"600\"",[173,6172,6173],{"class":1199},">\u003C\u002F",[173,6175,6146],{"class":5995},[173,6177,6002],{"class":1199},[173,6179,6180,6182,6185,6187,6189,6192,6195,6197],{"class":175,"line":374},[173,6181,6033],{"class":1199},[173,6183,6184],{"class":5995},"div",[173,6186,6149],{"class":179},[173,6188,1206],{"class":1199},[173,6190,6191],{"class":183},"\"score\"",[173,6193,6194],{"class":1199},">Score: 0\u003C\u002F",[173,6196,6184],{"class":5995},[173,6198,6002],{"class":1199},[173,6200,6201,6203,6206,6209,6211,6214,6216,6218],{"class":175,"line":380},[173,6202,6033],{"class":1199},[173,6204,6205],{"class":5995},"script",[173,6207,6208],{"class":179}," src",[173,6210,1206],{"class":1199},[173,6212,6213],{"class":183},"\"game.js\"",[173,6215,6173],{"class":1199},[173,6217,6205],{"class":5995},[173,6219,6002],{"class":1199},[173,6221,6222,6224,6226],{"class":175,"line":385},[173,6223,6114],{"class":1199},[173,6225,6125],{"class":5995},[173,6227,6002],{"class":1199},[173,6229,6230,6232,6234],{"class":175,"line":1405},[173,6231,6114],{"class":1199},[173,6233,5985],{"class":5995},[173,6235,6002],{"class":1199},[825,6237,6238],{"start":212},[55,6239,6240],{},"style.css",[164,6242,6246],{"className":6243,"code":6244,"language":6245,"meta":169,"style":169},"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",[19,6247,6248,6255,6268,6280,6292,6304,6315,6327,6331,6335,6341,6361,6372,6376,6380,6387,6400,6414],{"__ignoreMap":169},[173,6249,6250,6252],{"class":175,"line":176},[173,6251,6125],{"class":5995},[173,6253,6254],{"class":1199}," {\n",[173,6256,6257,6260,6263,6266],{"class":175,"line":212},[173,6258,6259],{"class":187},"    font-family",[173,6261,6262],{"class":1199},": ",[173,6264,6265],{"class":187},"sans-serif",[173,6267,1442],{"class":1199},[173,6269,6270,6273,6275,6278],{"class":175,"line":223},[173,6271,6272],{"class":187},"    display",[173,6274,6262],{"class":1199},[173,6276,6277],{"class":187},"flex",[173,6279,1442],{"class":1199},[173,6281,6282,6285,6287,6290],{"class":175,"line":230},[173,6283,6284],{"class":187},"    flex-direction",[173,6286,6262],{"class":1199},[173,6288,6289],{"class":187},"column",[173,6291,1442],{"class":1199},[173,6293,6294,6297,6299,6302],{"class":175,"line":236},[173,6295,6296],{"class":187},"    align-items",[173,6298,6262],{"class":1199},[173,6300,6301],{"class":187},"center",[173,6303,1442],{"class":1199},[173,6305,6306,6309,6311,6313],{"class":175,"line":249},[173,6307,6308],{"class":187},"    margin",[173,6310,6262],{"class":1199},[173,6312,1645],{"class":187},[173,6314,1442],{"class":1199},[173,6316,6317,6320,6322,6325],{"class":175,"line":254},[173,6318,6319],{"class":187},"    background-color",[173,6321,6262],{"class":1199},[173,6323,6324],{"class":187},"#f0f0f0",[173,6326,1442],{"class":1199},[173,6328,6329],{"class":175,"line":260},[173,6330,1721],{"class":1199},[173,6332,6333],{"class":175,"line":356},[173,6334,227],{"emptyLinePlaceholder":226},[173,6336,6337,6339],{"class":175,"line":362},[173,6338,6146],{"class":5995},[173,6340,6254],{"class":1199},[173,6342,6343,6346,6348,6350,6353,6356,6359],{"class":175,"line":368},[173,6344,6345],{"class":187},"    border",[173,6347,6262],{"class":1199},[173,6349,1209],{"class":187},[173,6351,6352],{"class":468},"px",[173,6354,6355],{"class":187}," solid",[173,6357,6358],{"class":187}," black",[173,6360,1442],{"class":1199},[173,6362,6363,6365,6367,6370],{"class":175,"line":374},[173,6364,6319],{"class":187},[173,6366,6262],{"class":1199},[173,6368,6369],{"class":187},"#fff",[173,6371,1442],{"class":1199},[173,6373,6374],{"class":175,"line":380},[173,6375,1721],{"class":1199},[173,6377,6378],{"class":175,"line":385},[173,6379,227],{"emptyLinePlaceholder":226},[173,6381,6382,6385],{"class":175,"line":1405},[173,6383,6384],{"class":179},"#score",[173,6386,6254],{"class":1199},[173,6388,6389,6392,6394,6396,6398],{"class":175,"line":1416},[173,6390,6391],{"class":187},"    margin-top",[173,6393,6262],{"class":1199},[173,6395,1395],{"class":187},[173,6397,6352],{"class":468},[173,6399,1442],{"class":1199},[173,6401,6402,6405,6407,6410,6412],{"class":175,"line":1421},[173,6403,6404],{"class":187},"    font-size",[173,6406,6262],{"class":1199},[173,6408,6409],{"class":187},"24",[173,6411,6352],{"class":468},[173,6413,1442],{"class":1199},[173,6415,6416],{"class":175,"line":1718},[173,6417,1721],{"class":1199},[825,6419,6420],{"start":223},[55,6421,6422],{},"game.js",[164,6424,6428],{"className":6425,"code":6426,"language":6427,"meta":169,"style":169},"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",[19,6429,6430,6454,6476,6496,6500,6514,6526,6530,6540,6573,6586,6598,6610,6622,6634,6648,6653,6657,6665,6678,6709,6713,6717,6724,6752,6767,6772,6801,6814,6818,6822,6826,6830,6839,6871,6882,6893,6904,6915,6926,6938,6943,6948,6955,6966,6991,6996,7001,7008,7021,7026,7031,7036,7046,7087,7098,7109,7120,7131,7142,7153,7166,7171,7176,7183,7194,7219,7224,7229,7236,7249,7254,7259,7264,7315,7328,7340,7345,7356,7387,7412,7433,7457,7480,7507,7522,7541,7546,7551,7566,7577,7596,7601,7606,7625,7648,7665,7683,7698,7703,7708,7718,7738,7743,7754,7764,7769,7797,7807,7816,7821,7835,7851,7856,7861,7885,7900,7914,7929,7948,7954,7960,7966,7971,7992,8002,8011,8016,8029,8043,8048,8053,8065,8078,8089,8094,8099,8104,8113,8118,8123,8149,8162,8179,8231,8236,8242,8247,8269,8280,8285,8290,8304],{"__ignoreMap":169},[173,6431,6432,6435,6438,6441,6444,6447,6449,6452],{"class":175,"line":176},[173,6433,6434],{"class":468},"const",[173,6436,6437],{"class":187}," canvas",[173,6439,6440],{"class":468}," =",[173,6442,6443],{"class":1199}," document.",[173,6445,6446],{"class":179},"getElementById",[173,6448,1200],{"class":1199},[173,6450,6451],{"class":183},"'gameCanvas'",[173,6453,1212],{"class":1199},[173,6455,6456,6458,6461,6463,6466,6469,6471,6474],{"class":175,"line":212},[173,6457,6434],{"class":468},[173,6459,6460],{"class":187}," ctx",[173,6462,6440],{"class":468},[173,6464,6465],{"class":1199}," canvas.",[173,6467,6468],{"class":179},"getContext",[173,6470,1200],{"class":1199},[173,6472,6473],{"class":183},"'2d'",[173,6475,1212],{"class":1199},[173,6477,6478,6480,6483,6485,6487,6489,6491,6494],{"class":175,"line":223},[173,6479,6434],{"class":468},[173,6481,6482],{"class":187}," scoreElement",[173,6484,6440],{"class":468},[173,6486,6443],{"class":1199},[173,6488,6446],{"class":179},[173,6490,1200],{"class":1199},[173,6492,6493],{"class":183},"'score'",[173,6495,1212],{"class":1199},[173,6497,6498],{"class":175,"line":230},[173,6499,227],{"emptyLinePlaceholder":226},[173,6501,6502,6505,6508,6510,6512],{"class":175,"line":236},[173,6503,6504],{"class":468},"let",[173,6506,6507],{"class":1199}," score ",[173,6509,1206],{"class":468},[173,6511,5572],{"class":187},[173,6513,1442],{"class":1199},[173,6515,6516,6518,6521,6523],{"class":175,"line":249},[173,6517,6504],{"class":468},[173,6519,6520],{"class":1199}," keys ",[173,6522,1206],{"class":468},[173,6524,6525],{"class":1199}," {};\n",[173,6527,6528],{"class":175,"line":254},[173,6529,227],{"emptyLinePlaceholder":226},[173,6531,6532,6535,6538],{"class":175,"line":260},[173,6533,6534],{"class":468},"class",[173,6536,6537],{"class":179}," Player",[173,6539,6254],{"class":1199},[173,6541,6542,6545,6547,6551,6553,6556,6558,6561,6563,6566,6568,6571],{"class":175,"line":356},[173,6543,6544],{"class":468},"    constructor",[173,6546,1200],{"class":1199},[173,6548,6550],{"class":6549},"sQHwn","x",[173,6552,1279],{"class":1199},[173,6554,6555],{"class":6549},"y",[173,6557,1279],{"class":1199},[173,6559,6560],{"class":6549},"width",[173,6562,1279],{"class":1199},[173,6564,6565],{"class":6549},"height",[173,6567,1279],{"class":1199},[173,6569,6570],{"class":6549},"color",[173,6572,1622],{"class":1199},[173,6574,6575,6578,6581,6583],{"class":175,"line":362},[173,6576,6577],{"class":187},"        this",[173,6579,6580],{"class":1199},".x ",[173,6582,1206],{"class":468},[173,6584,6585],{"class":1199}," x;\n",[173,6587,6588,6590,6593,6595],{"class":175,"line":368},[173,6589,6577],{"class":187},[173,6591,6592],{"class":1199},".y ",[173,6594,1206],{"class":468},[173,6596,6597],{"class":1199}," y;\n",[173,6599,6600,6602,6605,6607],{"class":175,"line":374},[173,6601,6577],{"class":187},[173,6603,6604],{"class":1199},".width ",[173,6606,1206],{"class":468},[173,6608,6609],{"class":1199}," width;\n",[173,6611,6612,6614,6617,6619],{"class":175,"line":380},[173,6613,6577],{"class":187},[173,6615,6616],{"class":1199},".height ",[173,6618,1206],{"class":468},[173,6620,6621],{"class":1199}," height;\n",[173,6623,6624,6626,6629,6631],{"class":175,"line":385},[173,6625,6577],{"class":187},[173,6627,6628],{"class":1199},".color ",[173,6630,1206],{"class":468},[173,6632,6633],{"class":1199}," color;\n",[173,6635,6636,6638,6641,6643,6646],{"class":175,"line":1405},[173,6637,6577],{"class":187},[173,6639,6640],{"class":1199},".speed ",[173,6642,1206],{"class":468},[173,6644,6645],{"class":187}," 5",[173,6647,1442],{"class":1199},[173,6649,6650],{"class":175,"line":1416},[173,6651,6652],{"class":1199},"    }\n",[173,6654,6655],{"class":175,"line":1421},[173,6656,227],{"emptyLinePlaceholder":226},[173,6658,6659,6662],{"class":175,"line":1718},[173,6660,6661],{"class":179},"    draw",[173,6663,6664],{"class":1199},"() {\n",[173,6666,6667,6670,6672,6675],{"class":175,"line":1724},[173,6668,6669],{"class":1199},"        ctx.fillStyle ",[173,6671,1206],{"class":468},[173,6673,6674],{"class":187}," this",[173,6676,6677],{"class":1199},".color;\n",[173,6679,6680,6683,6686,6688,6691,6694,6696,6699,6701,6704,6706],{"class":175,"line":1729},[173,6681,6682],{"class":1199},"        ctx.",[173,6684,6685],{"class":179},"fillRect",[173,6687,1200],{"class":1199},[173,6689,6690],{"class":187},"this",[173,6692,6693],{"class":1199},".x, ",[173,6695,6690],{"class":187},[173,6697,6698],{"class":1199},".y, ",[173,6700,6690],{"class":187},[173,6702,6703],{"class":1199},".width, ",[173,6705,6690],{"class":187},[173,6707,6708],{"class":1199},".height);\n",[173,6710,6711],{"class":175,"line":1735},[173,6712,6652],{"class":1199},[173,6714,6715],{"class":175,"line":4815},[173,6716,227],{"emptyLinePlaceholder":226},[173,6718,6719,6722],{"class":175,"line":4826},[173,6720,6721],{"class":179},"    update",[173,6723,6664],{"class":1199},[173,6725,6726,6729,6732,6735,6738,6741,6743,6745,6748,6750],{"class":175,"line":4837},[173,6727,6728],{"class":468},"        if",[173,6730,6731],{"class":1199}," (keys[",[173,6733,6734],{"class":183},"'ArrowLeft'",[173,6736,6737],{"class":1199},"] ",[173,6739,6740],{"class":468},"&&",[173,6742,6674],{"class":187},[173,6744,6580],{"class":1199},[173,6746,6747],{"class":468},">",[173,6749,5572],{"class":187},[173,6751,1622],{"class":1199},[173,6753,6754,6757,6759,6762,6764],{"class":175,"line":4842},[173,6755,6756],{"class":187},"            this",[173,6758,6580],{"class":1199},[173,6760,6761],{"class":468},"-=",[173,6763,6674],{"class":187},[173,6765,6766],{"class":1199},".speed;\n",[173,6768,6769],{"class":175,"line":4848},[173,6770,6771],{"class":1199},"        }\n",[173,6773,6774,6776,6778,6781,6783,6785,6787,6789,6791,6794,6796,6798],{"class":175,"line":4858},[173,6775,6728],{"class":468},[173,6777,6731],{"class":1199},[173,6779,6780],{"class":183},"'ArrowRight'",[173,6782,6737],{"class":1199},[173,6784,6740],{"class":468},[173,6786,6674],{"class":187},[173,6788,6580],{"class":1199},[173,6790,6007],{"class":468},[173,6792,6793],{"class":1199}," canvas.width ",[173,6795,1638],{"class":468},[173,6797,6674],{"class":187},[173,6799,6800],{"class":1199},".width) {\n",[173,6802,6803,6805,6807,6810,6812],{"class":175,"line":4872},[173,6804,6756],{"class":187},[173,6806,6580],{"class":1199},[173,6808,6809],{"class":468},"+=",[173,6811,6674],{"class":187},[173,6813,6766],{"class":1199},[173,6815,6816],{"class":175,"line":4877},[173,6817,6771],{"class":1199},[173,6819,6820],{"class":175,"line":4883},[173,6821,6652],{"class":1199},[173,6823,6824],{"class":175,"line":4897},[173,6825,1721],{"class":1199},[173,6827,6828],{"class":175,"line":4908},[173,6829,227],{"emptyLinePlaceholder":226},[173,6831,6832,6834,6837],{"class":175,"line":4919},[173,6833,6534],{"class":468},[173,6835,6836],{"class":179}," Bullet",[173,6838,6254],{"class":1199},[173,6840,6842,6844,6846,6848,6850,6852,6854,6856,6858,6860,6862,6864,6866,6869],{"class":175,"line":6841},34,[173,6843,6544],{"class":468},[173,6845,1200],{"class":1199},[173,6847,6550],{"class":6549},[173,6849,1279],{"class":1199},[173,6851,6555],{"class":6549},[173,6853,1279],{"class":1199},[173,6855,6560],{"class":6549},[173,6857,1279],{"class":1199},[173,6859,6565],{"class":6549},[173,6861,1279],{"class":1199},[173,6863,6570],{"class":6549},[173,6865,1279],{"class":1199},[173,6867,6868],{"class":6549},"speed",[173,6870,1622],{"class":1199},[173,6872,6874,6876,6878,6880],{"class":175,"line":6873},35,[173,6875,6577],{"class":187},[173,6877,6580],{"class":1199},[173,6879,1206],{"class":468},[173,6881,6585],{"class":1199},[173,6883,6885,6887,6889,6891],{"class":175,"line":6884},36,[173,6886,6577],{"class":187},[173,6888,6592],{"class":1199},[173,6890,1206],{"class":468},[173,6892,6597],{"class":1199},[173,6894,6896,6898,6900,6902],{"class":175,"line":6895},37,[173,6897,6577],{"class":187},[173,6899,6604],{"class":1199},[173,6901,1206],{"class":468},[173,6903,6609],{"class":1199},[173,6905,6907,6909,6911,6913],{"class":175,"line":6906},38,[173,6908,6577],{"class":187},[173,6910,6616],{"class":1199},[173,6912,1206],{"class":468},[173,6914,6621],{"class":1199},[173,6916,6918,6920,6922,6924],{"class":175,"line":6917},39,[173,6919,6577],{"class":187},[173,6921,6628],{"class":1199},[173,6923,1206],{"class":468},[173,6925,6633],{"class":1199},[173,6927,6929,6931,6933,6935],{"class":175,"line":6928},40,[173,6930,6577],{"class":187},[173,6932,6640],{"class":1199},[173,6934,1206],{"class":468},[173,6936,6937],{"class":1199}," speed;\n",[173,6939,6941],{"class":175,"line":6940},41,[173,6942,6652],{"class":1199},[173,6944,6946],{"class":175,"line":6945},42,[173,6947,227],{"emptyLinePlaceholder":226},[173,6949,6951,6953],{"class":175,"line":6950},43,[173,6952,6661],{"class":179},[173,6954,6664],{"class":1199},[173,6956,6958,6960,6962,6964],{"class":175,"line":6957},44,[173,6959,6669],{"class":1199},[173,6961,1206],{"class":468},[173,6963,6674],{"class":187},[173,6965,6677],{"class":1199},[173,6967,6969,6971,6973,6975,6977,6979,6981,6983,6985,6987,6989],{"class":175,"line":6968},45,[173,6970,6682],{"class":1199},[173,6972,6685],{"class":179},[173,6974,1200],{"class":1199},[173,6976,6690],{"class":187},[173,6978,6693],{"class":1199},[173,6980,6690],{"class":187},[173,6982,6698],{"class":1199},[173,6984,6690],{"class":187},[173,6986,6703],{"class":1199},[173,6988,6690],{"class":187},[173,6990,6708],{"class":1199},[173,6992,6994],{"class":175,"line":6993},46,[173,6995,6652],{"class":1199},[173,6997,6999],{"class":175,"line":6998},47,[173,7000,227],{"emptyLinePlaceholder":226},[173,7002,7004,7006],{"class":175,"line":7003},48,[173,7005,6721],{"class":179},[173,7007,6664],{"class":1199},[173,7009,7011,7013,7015,7017,7019],{"class":175,"line":7010},49,[173,7012,6577],{"class":187},[173,7014,6592],{"class":1199},[173,7016,6761],{"class":468},[173,7018,6674],{"class":187},[173,7020,6766],{"class":1199},[173,7022,7024],{"class":175,"line":7023},50,[173,7025,6652],{"class":1199},[173,7027,7029],{"class":175,"line":7028},51,[173,7030,1721],{"class":1199},[173,7032,7034],{"class":175,"line":7033},52,[173,7035,227],{"emptyLinePlaceholder":226},[173,7037,7039,7041,7044],{"class":175,"line":7038},53,[173,7040,6534],{"class":468},[173,7042,7043],{"class":179}," Enemy",[173,7045,6254],{"class":1199},[173,7047,7049,7051,7053,7055,7057,7059,7061,7063,7065,7067,7069,7071,7073,7075,7077,7080,7082,7085],{"class":175,"line":7048},54,[173,7050,6544],{"class":468},[173,7052,1200],{"class":1199},[173,7054,6550],{"class":6549},[173,7056,1279],{"class":1199},[173,7058,6555],{"class":6549},[173,7060,1279],{"class":1199},[173,7062,6560],{"class":6549},[173,7064,1279],{"class":1199},[173,7066,6565],{"class":6549},[173,7068,1279],{"class":1199},[173,7070,6570],{"class":6549},[173,7072,1279],{"class":1199},[173,7074,6868],{"class":6549},[173,7076,1279],{"class":1199},[173,7078,7079],{"class":6549},"isBoss",[173,7081,6440],{"class":468},[173,7083,7084],{"class":187}," false",[173,7086,1622],{"class":1199},[173,7088,7090,7092,7094,7096],{"class":175,"line":7089},55,[173,7091,6577],{"class":187},[173,7093,6580],{"class":1199},[173,7095,1206],{"class":468},[173,7097,6585],{"class":1199},[173,7099,7101,7103,7105,7107],{"class":175,"line":7100},56,[173,7102,6577],{"class":187},[173,7104,6592],{"class":1199},[173,7106,1206],{"class":468},[173,7108,6597],{"class":1199},[173,7110,7112,7114,7116,7118],{"class":175,"line":7111},57,[173,7113,6577],{"class":187},[173,7115,6604],{"class":1199},[173,7117,1206],{"class":468},[173,7119,6609],{"class":1199},[173,7121,7123,7125,7127,7129],{"class":175,"line":7122},58,[173,7124,6577],{"class":187},[173,7126,6616],{"class":1199},[173,7128,1206],{"class":468},[173,7130,6621],{"class":1199},[173,7132,7134,7136,7138,7140],{"class":175,"line":7133},59,[173,7135,6577],{"class":187},[173,7137,6628],{"class":1199},[173,7139,1206],{"class":468},[173,7141,6633],{"class":1199},[173,7143,7145,7147,7149,7151],{"class":175,"line":7144},60,[173,7146,6577],{"class":187},[173,7148,6640],{"class":1199},[173,7150,1206],{"class":468},[173,7152,6937],{"class":1199},[173,7154,7156,7158,7161,7163],{"class":175,"line":7155},61,[173,7157,6577],{"class":187},[173,7159,7160],{"class":1199},".isBoss ",[173,7162,1206],{"class":468},[173,7164,7165],{"class":1199}," isBoss;\n",[173,7167,7169],{"class":175,"line":7168},62,[173,7170,6652],{"class":1199},[173,7172,7174],{"class":175,"line":7173},63,[173,7175,227],{"emptyLinePlaceholder":226},[173,7177,7179,7181],{"class":175,"line":7178},64,[173,7180,6661],{"class":179},[173,7182,6664],{"class":1199},[173,7184,7186,7188,7190,7192],{"class":175,"line":7185},65,[173,7187,6669],{"class":1199},[173,7189,1206],{"class":468},[173,7191,6674],{"class":187},[173,7193,6677],{"class":1199},[173,7195,7197,7199,7201,7203,7205,7207,7209,7211,7213,7215,7217],{"class":175,"line":7196},66,[173,7198,6682],{"class":1199},[173,7200,6685],{"class":179},[173,7202,1200],{"class":1199},[173,7204,6690],{"class":187},[173,7206,6693],{"class":1199},[173,7208,6690],{"class":187},[173,7210,6698],{"class":1199},[173,7212,6690],{"class":187},[173,7214,6703],{"class":1199},[173,7216,6690],{"class":187},[173,7218,6708],{"class":1199},[173,7220,7222],{"class":175,"line":7221},67,[173,7223,6652],{"class":1199},[173,7225,7227],{"class":175,"line":7226},68,[173,7228,227],{"emptyLinePlaceholder":226},[173,7230,7232,7234],{"class":175,"line":7231},69,[173,7233,6721],{"class":179},[173,7235,6664],{"class":1199},[173,7237,7239,7241,7243,7245,7247],{"class":175,"line":7238},70,[173,7240,6577],{"class":187},[173,7242,6592],{"class":1199},[173,7244,6809],{"class":468},[173,7246,6674],{"class":187},[173,7248,6766],{"class":1199},[173,7250,7252],{"class":175,"line":7251},71,[173,7253,6652],{"class":1199},[173,7255,7257],{"class":175,"line":7256},72,[173,7258,1721],{"class":1199},[173,7260,7262],{"class":175,"line":7261},73,[173,7263,227],{"emptyLinePlaceholder":226},[173,7265,7267,7269,7272,7274,7276,7278,7281,7283,7286,7288,7291,7294,7296,7299,7301,7304,7306,7308,7310,7313],{"class":175,"line":7266},74,[173,7268,6434],{"class":468},[173,7270,7271],{"class":187}," player",[173,7273,6440],{"class":468},[173,7275,1226],{"class":468},[173,7277,6537],{"class":179},[173,7279,7280],{"class":1199},"(canvas.width ",[173,7282,4440],{"class":468},[173,7284,7285],{"class":187}," 2",[173,7287,5426],{"class":468},[173,7289,7290],{"class":187}," 25",[173,7292,7293],{"class":1199},", canvas.height ",[173,7295,1638],{"class":468},[173,7297,7298],{"class":187}," 60",[173,7300,1279],{"class":1199},[173,7302,7303],{"class":187},"50",[173,7305,1279],{"class":1199},[173,7307,7303],{"class":187},[173,7309,1279],{"class":1199},[173,7311,7312],{"class":183},"'blue'",[173,7314,1212],{"class":1199},[173,7316,7318,7320,7323,7325],{"class":175,"line":7317},75,[173,7319,6434],{"class":468},[173,7321,7322],{"class":187}," bullets",[173,7324,6440],{"class":468},[173,7326,7327],{"class":1199}," [];\n",[173,7329,7331,7333,7336,7338],{"class":175,"line":7330},76,[173,7332,6434],{"class":468},[173,7334,7335],{"class":187}," enemies",[173,7337,6440],{"class":468},[173,7339,7327],{"class":1199},[173,7341,7343],{"class":175,"line":7342},77,[173,7344,227],{"emptyLinePlaceholder":226},[173,7346,7348,7351,7354],{"class":175,"line":7347},78,[173,7349,7350],{"class":468},"function",[173,7352,7353],{"class":179}," spawnEnemy",[173,7355,6664],{"class":1199},[173,7357,7359,7362,7365,7367,7370,7373,7376,7378,7381,7384],{"class":175,"line":7358},79,[173,7360,7361],{"class":468},"    const",[173,7363,7364],{"class":187}," isBoss",[173,7366,6440],{"class":468},[173,7368,7369],{"class":1199}," Math.",[173,7371,7372],{"class":179},"random",[173,7374,7375],{"class":1199},"() ",[173,7377,6007],{"class":468},[173,7379,7380],{"class":187}," 0.1",[173,7382,7383],{"class":1199},"; ",[173,7385,7386],{"class":208},"\u002F\u002F 10% chance of being a boss\n",[173,7388,7390,7392,7394,7396,7399,7402,7405,7408,7410],{"class":175,"line":7389},80,[173,7391,7361],{"class":468},[173,7393,6157],{"class":187},[173,7395,6440],{"class":468},[173,7397,7398],{"class":1199}," isBoss ",[173,7400,7401],{"class":468},"?",[173,7403,7404],{"class":187}," 100",[173,7406,7407],{"class":468}," :",[173,7409,3124],{"class":187},[173,7411,1442],{"class":1199},[173,7413,7415,7417,7419,7421,7423,7425,7427,7429,7431],{"class":175,"line":7414},81,[173,7416,7361],{"class":468},[173,7418,6165],{"class":187},[173,7420,6440],{"class":468},[173,7422,7398],{"class":1199},[173,7424,7401],{"class":468},[173,7426,7404],{"class":187},[173,7428,7407],{"class":468},[173,7430,3124],{"class":187},[173,7432,1442],{"class":1199},[173,7434,7436,7438,7441,7443,7445,7447,7450,7452,7455],{"class":175,"line":7435},82,[173,7437,7361],{"class":468},[173,7439,7440],{"class":187}," color",[173,7442,6440],{"class":468},[173,7444,7398],{"class":1199},[173,7446,7401],{"class":468},[173,7448,7449],{"class":183}," 'red'",[173,7451,7407],{"class":468},[173,7453,7454],{"class":183}," 'green'",[173,7456,1442],{"class":1199},[173,7458,7460,7462,7465,7467,7469,7471,7473,7475,7478],{"class":175,"line":7459},83,[173,7461,7361],{"class":468},[173,7463,7464],{"class":187}," speed",[173,7466,6440],{"class":468},[173,7468,7398],{"class":1199},[173,7470,7401],{"class":468},[173,7472,1604],{"class":187},[173,7474,7407],{"class":468},[173,7476,7477],{"class":187}," 0.5",[173,7479,1442],{"class":1199},[173,7481,7483,7485,7488,7490,7492,7494,7496,7499,7502,7504],{"class":175,"line":7482},84,[173,7484,7361],{"class":468},[173,7486,7487],{"class":187}," x",[173,7489,6440],{"class":468},[173,7491,7369],{"class":1199},[173,7493,7372],{"class":179},[173,7495,7375],{"class":1199},[173,7497,7498],{"class":468},"*",[173,7500,7501],{"class":1199}," (canvas.width ",[173,7503,1638],{"class":468},[173,7505,7506],{"class":1199}," width);\n",[173,7508,7510,7512,7515,7517,7519],{"class":175,"line":7509},85,[173,7511,7361],{"class":468},[173,7513,7514],{"class":187}," y",[173,7516,6440],{"class":468},[173,7518,5426],{"class":468},[173,7520,7521],{"class":1199},"height;\n",[173,7523,7525,7528,7531,7533,7536,7538],{"class":175,"line":7524},86,[173,7526,7527],{"class":1199},"    enemies.",[173,7529,7530],{"class":179},"push",[173,7532,1200],{"class":1199},[173,7534,7535],{"class":468},"new",[173,7537,7043],{"class":179},[173,7539,7540],{"class":1199},"(x, y, width, height, color, speed, isBoss));\n",[173,7542,7544],{"class":175,"line":7543},87,[173,7545,1721],{"class":1199},[173,7547,7549],{"class":175,"line":7548},88,[173,7550,227],{"emptyLinePlaceholder":226},[173,7552,7554,7556,7559,7561,7564],{"class":175,"line":7553},89,[173,7555,7350],{"class":468},[173,7557,7558],{"class":179}," updateScore",[173,7560,1200],{"class":1199},[173,7562,7563],{"class":6549},"points",[173,7565,1622],{"class":1199},[173,7567,7569,7572,7574],{"class":175,"line":7568},90,[173,7570,7571],{"class":1199},"    score ",[173,7573,6809],{"class":468},[173,7575,7576],{"class":1199}," points;\n",[173,7578,7580,7583,7585,7588,7591,7594],{"class":175,"line":7579},91,[173,7581,7582],{"class":1199},"    scoreElement.textContent ",[173,7584,1206],{"class":468},[173,7586,7587],{"class":183}," `Score: ${",[173,7589,7590],{"class":1199},"score",[173,7592,7593],{"class":183},"}`",[173,7595,1442],{"class":1199},[173,7597,7599],{"class":175,"line":7598},92,[173,7600,1721],{"class":1199},[173,7602,7604],{"class":175,"line":7603},93,[173,7605,227],{"emptyLinePlaceholder":226},[173,7607,7609,7611,7614,7616,7618,7620,7623],{"class":175,"line":7608},94,[173,7610,7350],{"class":468},[173,7612,7613],{"class":179}," collision",[173,7615,1200],{"class":1199},[173,7617,283],{"class":6549},[173,7619,1279],{"class":1199},[173,7621,7622],{"class":6549},"b",[173,7624,1622],{"class":1199},[173,7626,7628,7631,7634,7636,7639,7642,7645],{"class":175,"line":7627},95,[173,7629,7630],{"class":468},"    return",[173,7632,7633],{"class":1199}," a.x ",[173,7635,6007],{"class":468},[173,7637,7638],{"class":1199}," b.x ",[173,7640,7641],{"class":468},"+",[173,7643,7644],{"class":1199}," b.width ",[173,7646,7647],{"class":468},"&&\n",[173,7649,7651,7654,7656,7659,7661,7663],{"class":175,"line":7650},96,[173,7652,7653],{"class":1199},"           a.x ",[173,7655,7641],{"class":468},[173,7657,7658],{"class":1199}," a.width ",[173,7660,6747],{"class":468},[173,7662,7638],{"class":1199},[173,7664,7647],{"class":468},[173,7666,7668,7671,7673,7676,7678,7681],{"class":175,"line":7667},97,[173,7669,7670],{"class":1199},"           a.y ",[173,7672,6007],{"class":468},[173,7674,7675],{"class":1199}," b.y ",[173,7677,7641],{"class":468},[173,7679,7680],{"class":1199}," b.height ",[173,7682,7647],{"class":468},[173,7684,7686,7688,7690,7693,7695],{"class":175,"line":7685},98,[173,7687,7670],{"class":1199},[173,7689,7641],{"class":468},[173,7691,7692],{"class":1199}," a.height ",[173,7694,6747],{"class":468},[173,7696,7697],{"class":1199}," b.y;\n",[173,7699,7701],{"class":175,"line":7700},99,[173,7702,1721],{"class":1199},[173,7704,7706],{"class":175,"line":7705},100,[173,7707,227],{"emptyLinePlaceholder":226},[173,7709,7711,7713,7716],{"class":175,"line":7710},101,[173,7712,7350],{"class":468},[173,7714,7715],{"class":179}," gameLoop",[173,7717,6664],{"class":1199},[173,7719,7721,7724,7727,7729,7731,7733,7735],{"class":175,"line":7720},102,[173,7722,7723],{"class":1199},"    ctx.",[173,7725,7726],{"class":179},"clearRect",[173,7728,1200],{"class":1199},[173,7730,1645],{"class":187},[173,7732,1279],{"class":1199},[173,7734,1645],{"class":187},[173,7736,7737],{"class":1199},", canvas.width, canvas.height);\n",[173,7739,7741],{"class":175,"line":7740},103,[173,7742,227],{"emptyLinePlaceholder":226},[173,7744,7746,7749,7752],{"class":175,"line":7745},104,[173,7747,7748],{"class":1199},"    player.",[173,7750,7751],{"class":179},"update",[173,7753,1413],{"class":1199},[173,7755,7757,7759,7762],{"class":175,"line":7756},105,[173,7758,7748],{"class":1199},[173,7760,7761],{"class":179},"draw",[173,7763,1413],{"class":1199},[173,7765,7767],{"class":175,"line":7766},106,[173,7768,227],{"emptyLinePlaceholder":226},[173,7770,7772,7775,7778,7781,7784,7786,7789,7792,7795],{"class":175,"line":7771},107,[173,7773,7774],{"class":1199},"    bullets.",[173,7776,7777],{"class":179},"forEach",[173,7779,7780],{"class":1199},"((",[173,7782,7783],{"class":6549},"bullet",[173,7785,1279],{"class":1199},[173,7787,7788],{"class":6549},"bulletIndex",[173,7790,7791],{"class":1199},") ",[173,7793,7794],{"class":468},"=>",[173,7796,6254],{"class":1199},[173,7798,7800,7803,7805],{"class":175,"line":7799},108,[173,7801,7802],{"class":1199},"        bullet.",[173,7804,7751],{"class":179},[173,7806,1413],{"class":1199},[173,7808,7810,7812,7814],{"class":175,"line":7809},109,[173,7811,7802],{"class":1199},[173,7813,7761],{"class":179},[173,7815,1413],{"class":1199},[173,7817,7819],{"class":175,"line":7818},110,[173,7820,227],{"emptyLinePlaceholder":226},[173,7822,7824,7826,7829,7831,7833],{"class":175,"line":7823},111,[173,7825,6728],{"class":468},[173,7827,7828],{"class":1199}," (bullet.y ",[173,7830,6007],{"class":468},[173,7832,5572],{"class":187},[173,7834,1622],{"class":1199},[173,7836,7838,7841,7844,7847,7849],{"class":175,"line":7837},112,[173,7839,7840],{"class":1199},"            bullets.",[173,7842,7843],{"class":179},"splice",[173,7845,7846],{"class":1199},"(bulletIndex, ",[173,7848,1209],{"class":187},[173,7850,1212],{"class":1199},[173,7852,7854],{"class":175,"line":7853},113,[173,7855,6771],{"class":1199},[173,7857,7859],{"class":175,"line":7858},114,[173,7860,227],{"emptyLinePlaceholder":226},[173,7862,7864,7867,7869,7871,7874,7876,7879,7881,7883],{"class":175,"line":7863},115,[173,7865,7866],{"class":1199},"        enemies.",[173,7868,7777],{"class":179},[173,7870,7780],{"class":1199},[173,7872,7873],{"class":6549},"enemy",[173,7875,1279],{"class":1199},[173,7877,7878],{"class":6549},"enemyIndex",[173,7880,7791],{"class":1199},[173,7882,7794],{"class":468},[173,7884,6254],{"class":1199},[173,7886,7888,7891,7894,7897],{"class":175,"line":7887},116,[173,7889,7890],{"class":468},"            if",[173,7892,7893],{"class":1199}," (",[173,7895,7896],{"class":179},"collision",[173,7898,7899],{"class":1199},"(bullet, enemy)) {\n",[173,7901,7903,7906,7908,7910,7912],{"class":175,"line":7902},117,[173,7904,7905],{"class":1199},"                bullets.",[173,7907,7843],{"class":179},[173,7909,7846],{"class":1199},[173,7911,1209],{"class":187},[173,7913,1212],{"class":1199},[173,7915,7917,7920,7922,7925,7927],{"class":175,"line":7916},118,[173,7918,7919],{"class":1199},"                enemies.",[173,7921,7843],{"class":179},[173,7923,7924],{"class":1199},"(enemyIndex, ",[173,7926,1209],{"class":187},[173,7928,1212],{"class":1199},[173,7930,7932,7935,7938,7940,7942,7944,7946],{"class":175,"line":7931},119,[173,7933,7934],{"class":179},"                updateScore",[173,7936,7937],{"class":1199},"(enemy.isBoss ",[173,7939,7401],{"class":468},[173,7941,7404],{"class":187},[173,7943,7407],{"class":468},[173,7945,6645],{"class":187},[173,7947,1212],{"class":1199},[173,7949,7951],{"class":175,"line":7950},120,[173,7952,7953],{"class":1199},"            }\n",[173,7955,7957],{"class":175,"line":7956},121,[173,7958,7959],{"class":1199},"        });\n",[173,7961,7963],{"class":175,"line":7962},122,[173,7964,7965],{"class":1199},"    });\n",[173,7967,7969],{"class":175,"line":7968},123,[173,7970,227],{"emptyLinePlaceholder":226},[173,7972,7974,7976,7978,7980,7982,7984,7986,7988,7990],{"class":175,"line":7973},124,[173,7975,7527],{"class":1199},[173,7977,7777],{"class":179},[173,7979,7780],{"class":1199},[173,7981,7873],{"class":6549},[173,7983,1279],{"class":1199},[173,7985,7878],{"class":6549},[173,7987,7791],{"class":1199},[173,7989,7794],{"class":468},[173,7991,6254],{"class":1199},[173,7993,7995,7998,8000],{"class":175,"line":7994},125,[173,7996,7997],{"class":1199},"        enemy.",[173,7999,7751],{"class":179},[173,8001,1413],{"class":1199},[173,8003,8005,8007,8009],{"class":175,"line":8004},126,[173,8006,7997],{"class":1199},[173,8008,7761],{"class":179},[173,8010,1413],{"class":1199},[173,8012,8014],{"class":175,"line":8013},127,[173,8015,227],{"emptyLinePlaceholder":226},[173,8017,8019,8021,8024,8026],{"class":175,"line":8018},128,[173,8020,6728],{"class":468},[173,8022,8023],{"class":1199}," (enemy.y ",[173,8025,6747],{"class":468},[173,8027,8028],{"class":1199}," canvas.height) {\n",[173,8030,8032,8035,8037,8039,8041],{"class":175,"line":8031},129,[173,8033,8034],{"class":1199},"            enemies.",[173,8036,7843],{"class":179},[173,8038,7924],{"class":1199},[173,8040,1209],{"class":187},[173,8042,1212],{"class":1199},[173,8044,8046],{"class":175,"line":8045},130,[173,8047,6771],{"class":1199},[173,8049,8051],{"class":175,"line":8050},131,[173,8052,227],{"emptyLinePlaceholder":226},[173,8054,8056,8058,8060,8062],{"class":175,"line":8055},132,[173,8057,6728],{"class":468},[173,8059,7893],{"class":1199},[173,8061,7896],{"class":179},[173,8063,8064],{"class":1199},"(player, enemy)) {\n",[173,8066,8068,8071,8073,8076],{"class":175,"line":8067},133,[173,8069,8070],{"class":179},"            alert",[173,8072,1200],{"class":1199},[173,8074,8075],{"class":183},"'Game Over!'",[173,8077,1212],{"class":1199},[173,8079,8081,8084,8087],{"class":175,"line":8080},134,[173,8082,8083],{"class":1199},"            document.location.",[173,8085,8086],{"class":179},"reload",[173,8088,1413],{"class":1199},[173,8090,8092],{"class":175,"line":8091},135,[173,8093,6771],{"class":1199},[173,8095,8097],{"class":175,"line":8096},136,[173,8098,7965],{"class":1199},[173,8100,8102],{"class":175,"line":8101},137,[173,8103,227],{"emptyLinePlaceholder":226},[173,8105,8107,8110],{"class":175,"line":8106},138,[173,8108,8109],{"class":179},"    requestAnimationFrame",[173,8111,8112],{"class":1199},"(gameLoop);\n",[173,8114,8116],{"class":175,"line":8115},139,[173,8117,1721],{"class":1199},[173,8119,8121],{"class":175,"line":8120},140,[173,8122,227],{"emptyLinePlaceholder":226},[173,8124,8126,8129,8132,8134,8137,8140,8143,8145,8147],{"class":175,"line":8125},141,[173,8127,8128],{"class":1199},"window.",[173,8130,8131],{"class":179},"addEventListener",[173,8133,1200],{"class":1199},[173,8135,8136],{"class":183},"'keydown'",[173,8138,8139],{"class":1199},", (",[173,8141,8142],{"class":6549},"e",[173,8144,7791],{"class":1199},[173,8146,7794],{"class":468},[173,8148,6254],{"class":1199},[173,8150,8152,8155,8157,8160],{"class":175,"line":8151},142,[173,8153,8154],{"class":1199},"    keys[e.key] ",[173,8156,1206],{"class":468},[173,8158,8159],{"class":187}," true",[173,8161,1442],{"class":1199},[173,8163,8165,8168,8171,8174,8177],{"class":175,"line":8164},143,[173,8166,8167],{"class":468},"    if",[173,8169,8170],{"class":1199}," (e.key ",[173,8172,8173],{"class":468},"===",[173,8175,8176],{"class":183}," ' '",[173,8178,1622],{"class":1199},[173,8180,8182,8185,8187,8189,8191,8193,8196,8198,8201,8203,8205,8207,8210,8213,8215,8217,8219,8221,8224,8226,8229],{"class":175,"line":8181},144,[173,8183,8184],{"class":1199},"        bullets.",[173,8186,7530],{"class":179},[173,8188,1200],{"class":1199},[173,8190,7535],{"class":468},[173,8192,6836],{"class":179},[173,8194,8195],{"class":1199},"(player.x ",[173,8197,7641],{"class":468},[173,8199,8200],{"class":1199}," player.width ",[173,8202,4440],{"class":468},[173,8204,7285],{"class":187},[173,8206,5426],{"class":468},[173,8208,8209],{"class":187}," 2.5",[173,8211,8212],{"class":1199},", player.y, ",[173,8214,1376],{"class":187},[173,8216,1279],{"class":1199},[173,8218,1395],{"class":187},[173,8220,1279],{"class":1199},[173,8222,8223],{"class":183},"'black'",[173,8225,1279],{"class":1199},[173,8227,8228],{"class":187},"7",[173,8230,1715],{"class":1199},[173,8232,8234],{"class":175,"line":8233},145,[173,8235,6652],{"class":1199},[173,8237,8239],{"class":175,"line":8238},146,[173,8240,8241],{"class":1199},"});\n",[173,8243,8245],{"class":175,"line":8244},147,[173,8246,227],{"emptyLinePlaceholder":226},[173,8248,8250,8252,8254,8256,8259,8261,8263,8265,8267],{"class":175,"line":8249},148,[173,8251,8128],{"class":1199},[173,8253,8131],{"class":179},[173,8255,1200],{"class":1199},[173,8257,8258],{"class":183},"'keyup'",[173,8260,8139],{"class":1199},[173,8262,8142],{"class":6549},[173,8264,7791],{"class":1199},[173,8266,7794],{"class":468},[173,8268,6254],{"class":1199},[173,8270,8272,8274,8276,8278],{"class":175,"line":8271},149,[173,8273,8154],{"class":1199},[173,8275,1206],{"class":468},[173,8277,7084],{"class":187},[173,8279,1442],{"class":1199},[173,8281,8283],{"class":175,"line":8282},150,[173,8284,8241],{"class":1199},[173,8286,8288],{"class":175,"line":8287},151,[173,8289,227],{"emptyLinePlaceholder":226},[173,8291,8293,8296,8299,8302],{"class":175,"line":8292},152,[173,8294,8295],{"class":179},"setInterval",[173,8297,8298],{"class":1199},"(spawnEnemy, ",[173,8300,8301],{"class":187},"2000",[173,8303,1212],{"class":1199},[173,8305,8307,8310],{"class":175,"line":8306},153,[173,8308,8309],{"class":179},"gameLoop",[173,8311,1413],{"class":1199},[15,8313,8314],{},"4 遊戲玩法",[15,8316,8317,8318,8321],{},"遊戲建立完成，",[19,8319,8320],{},"Gemnini CLI"," 也會提示遊戲玩法",[15,8323,8324],{},[543,8325],{"alt":8326,"src":8327},"Gemini CLI遊戲玩法","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-03.png",[825,8329,8330],{"start":236},[55,8331,8332],{},"執行結果",[15,8334,8335],{},[543,8336],{"alt":8337,"src":8338},"Gemini CLI執行結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-04.png",[825,8340,8341,8360],{"start":249},[55,8342,8343,8344,8347,8348,8350,8351],{},"更改風格",[8345,8346],"br",{},"如果你覺得畫面太陽春，你他可以請 ",[19,8349,5820],{}," 幫你優化",[164,8352,8354],{"className":166,"code":8353,"language":168,"meta":169,"style":169},"請將遊戲畫面風格換成2000年街機風格\n",[19,8355,8356],{"__ignoreMap":169},[173,8357,8358],{"class":175,"line":176},[173,8359,8353],{"class":179},[55,8361,8362],{},"修改過後的結果",[15,8364,8365],{},[543,8366],{"alt":8367,"src":8368},"Gemini CLI修改過後的結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-05.png",[15,8370,8371,8372,8374],{},"以上是 ",[19,8373,8320],{}," 簡易使用範例",[90,8376,8378],{"id":8377},"gemini-cli-的相關指令","Gemini CLI 的相關指令",[15,8380,8381,8383,8384,8386],{},[19,8382,8320],{}," 內建了一個常用指令，詳細可用 ",[19,8385,4624],{}," 進行指令查詢",[15,8388,8389],{},[543,8390],{"alt":8391,"src":8392},"Gemini CLi help","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-help.png",[90,8394,8396],{"id":8395},"記憶功態-memory","記憶功態 (Memory)",[15,8398,8399,8400,8402,8403,8405,8406,8408],{},"若你要處理比較複雜的問題，由於 LLM 對於長文處理，有時會有失憶的問題，或當我們重啟 ",[19,8401,5820],{},"，",[19,8404,5820],{}," 忘記之前互動的要求，因此 ",[19,8407,5820],{}," 有了記憶功能，而使用方式如下：",[52,8410,8411,8454,8475],{},[55,8412,8413,8414,8417,8418,8421,8422,8439,8441,8442,8444,8445,8447,8448,8450,8451,8453],{},"以",[19,8415,8416],{},"markdown","格式，建立 ",[19,8419,8420],{},"GEMINI.md","，你可以將之記錄",[52,8423,8424,8427,8430,8433,8436],{},[55,8425,8426],{},"環境設定",[55,8428,8429],{},"工作需求",[55,8431,8432],{},"工作項目",[55,8434,8435],{},"使用相關 MCP 指令",[55,8437,8438],{},"程式碼風格",[8345,8440],{},"當你在某個目錄下啟動 ",[19,8443,5820],{}," 代理模式時，它會分層搜尋 ",[19,8446,8420],{}," 檔案：從當前工作目錄開始，向上搜尋到專案根目錄，甚至到你的主目錄。它也會搜尋子目錄中的 ",[19,8449,8420],{}," 檔案。所有找到的 ",[19,8452,8420],{}," 檔案的內容會被合併，作為「指令上下文」提供給 Gemini 模型。",[55,8455,8456,8457,3399,8459,8461,8462],{},"更新記憶內容",[8345,8458],{},[19,8460,5820],{}," 下達指令：",[164,8463,8465],{"className":166,"code":8464,"language":168,"meta":169,"style":169},"\u002Fmemory refresh\n",[19,8466,8467],{"__ignoreMap":169},[173,8468,8469,8472],{"class":175,"line":176},[173,8470,8471],{"class":179},"\u002Fmemory",[173,8473,8474],{"class":183}," refresh\n",[55,8476,8477,8478,3399,8480,8461,8482],{},"顯示記憶內容：",[8345,8479],{},[19,8481,5820],{},[164,8483,8485],{"className":166,"code":8484,"language":168,"meta":169,"style":169},"\u002Fmemory show\n",[19,8486,8487],{"__ignoreMap":169},[173,8488,8489,8491],{"class":175,"line":176},[173,8490,8471],{"class":179},[173,8492,8493],{"class":183}," show\n",[15,8495,8496,8497,8499],{},"如此 ",[19,8498,5820],{}," 在執行專案開發時，更能依據我的需求，完成我們的任務。",[44,8501,2584],{"id":2584},[15,8503,8504],{},"Gemini CLI 是一個功能強大且易於使用的工具，它將先進的 AI 能力帶入了開發者最熟悉的終端機環境。透過清晰的提示詞和適當的審核，你可以大幅提升開發效率，加速專案進程。立即安裝 Gemini CLI，體驗用AI開發的魅力吧，而目前提供的免費額度可以完成一些簡單的小專案，若要完成更大的專案，當然就需要考慮付費。",[44,8506,8507],{"id":8507},"相關網站",[52,8509,8510,8517],{},[55,8511,8512,8513],{},"Gemini CLI Github: ",[283,8514,8515],{"href":8515,"rel":8516},"https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli",[287],[55,8518,8519,8520],{},"Google 官方部落格資訊: ",[283,8521,8522],{"href":8522,"rel":8523},"https:\u002F\u002Fblog.google\u002Fintl\u002Fzh-tw\u002Fproducts\u002Fcloud\u002Fgemini-cli-your-open-source-ai-agent\u002F",[287],[894,8525,8526],{},"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":169,"searchDepth":212,"depth":212,"links":8528},[8529,8532,8538,8539],{"id":5831,"depth":212,"text":5832,"children":8530},[8531],{"id":5838,"depth":223,"text":5839},{"id":5880,"depth":212,"text":5881,"children":8533},[8534,8535,8536,8537],{"id":5884,"depth":223,"text":5885},{"id":5935,"depth":223,"text":5936},{"id":8377,"depth":223,"text":8378},{"id":8395,"depth":223,"text":8396},{"id":2584,"depth":212,"text":2584},{"id":8507,"depth":212,"text":8507},"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":5808,"description":8540},"articles\u002F2025-07-12-gemini-cli","本文將帶你了解 Gemini CLI，一個能將 Gemini 強大 AI 能力整合至終端機的開源工具。學習如何安裝、使用 Gemini CLI 進行程式碼生成、任務自動化，並體驗 AI-First Coding 的開發模式。",[930,931,932],"06YY6CfnzHfs2KDK962SeuY3nvJMZ0lWwdR0AfkGsr8",{"id":8551,"title":8552,"body":8553,"category":919,"description":169,"extension":921,"image":9339,"meta":9340,"navigation":226,"path":9341,"pubDate":9342,"seo":9343,"status":226,"stem":9344,"summary":9345,"tags":9346,"__hash__":9347},"content\u002Farticles\u002F2025-03-17-open-manus.md","使用 OpenManus 在本地端玩轉 AI Agent",{"type":8,"value":8554,"toc":9315},[8555,8557,8560,8563,8587,8589,8595,8599,8603,8637,8641,8664,8667,8685,8689,8693,8712,8715,8733,8736,8776,8779,8797,8800,8803,8819,8822,9182,9194,9205,9208,9219,9232,9235,9238,9251,9254,9290,9293,9296,9303,9305,9312],[44,8556,942],{"id":942},[15,8558,8559],{},"OpenManus 是一個開源的通用型 AI Agent，是 Manus 的替代方案，無需等待昂貴的激活碼即可使用。以下是 OpenManus 的使用教學，希望能幫助你快速上手：",[44,8561,8562],{"id":8562},"環境需求",[52,8564,8565,8577],{},[55,8566,8567,3608,8570,8572,8573,8572,8575],{},[28,8568,8569],{},"作業系統",[19,8571,195],{}," \u002F ",[19,8574,4103],{},[19,8576,3998],{},[55,8578,8579,8582,8583,8586],{},[28,8580,8581],{},"Python","：版本 ",[19,8584,8585],{},"3.10"," 以上",[44,8588,3607],{"id":3607},[15,8590,8591],{},[283,8592,8593],{"href":8593,"rel":8594},"https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus",[287],[44,8596,8598],{"id":8597},"使用-conda-安裝","使用 Conda 安裝",[90,8600,8602],{"id":8601},"建立新的-conda-環境","建立新的 Conda 環境",[164,8604,8606],{"className":166,"code":8605,"language":168,"meta":169,"style":169},"conda create -n open_manus python=3.12\nconda activate open_manus\n",[19,8607,8608,8627],{"__ignoreMap":169},[173,8609,8610,8613,8615,8618,8621,8624],{"class":175,"line":176},[173,8611,8612],{"class":179},"conda",[173,8614,527],{"class":183},[173,8616,8617],{"class":187}," -n",[173,8619,8620],{"class":183}," open_manus",[173,8622,8623],{"class":183}," python=",[173,8625,8626],{"class":187},"3.12\n",[173,8628,8629,8631,8634],{"class":175,"line":212},[173,8630,8612],{"class":179},[173,8632,8633],{"class":183}," activate",[173,8635,8636],{"class":183}," open_manus\n",[90,8638,8640],{"id":8639},"clone-儲存庫","Clone 儲存庫",[164,8642,8644],{"className":166,"code":8643,"language":168,"meta":169,"style":169},"git clone https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\ncd OpenManus\n",[19,8645,8646,8657],{"__ignoreMap":169},[173,8647,8648,8651,8654],{"class":175,"line":176},[173,8649,8650],{"class":179},"git",[173,8652,8653],{"class":183}," clone",[173,8655,8656],{"class":183}," https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\n",[173,8658,8659,8661],{"class":175,"line":212},[173,8660,4315],{"class":187},[173,8662,8663],{"class":183}," OpenManus\n",[90,8665,8666],{"id":8666},"安裝相依套件",[164,8668,8670],{"className":166,"code":8669,"language":168,"meta":169,"style":169},"pip install -r requirements.txt\n",[19,8671,8672],{"__ignoreMap":169},[173,8673,8674,8677,8679,8682],{"class":175,"line":176},[173,8675,8676],{"class":179},"pip",[173,8678,184],{"class":183},[173,8680,8681],{"class":187}," -r",[173,8683,8684],{"class":183}," requirements.txt\n",[44,8686,8688],{"id":8687},"使用-uv-安裝","使用 uv 安裝",[90,8690,8692],{"id":8691},"安裝-uv-環境","安裝 uv 環境",[164,8694,8696],{"className":166,"code":8695,"language":168,"meta":169,"style":169},"curl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n",[19,8697,8698],{"__ignoreMap":169},[173,8699,8700,8702,8705,8708,8710],{"class":175,"line":176},[173,8701,272],{"class":179},[173,8703,8704],{"class":187}," -LsSf",[173,8706,8707],{"class":183}," https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh",[173,8709,469],{"class":468},[173,8711,472],{"class":179},[90,8713,8640],{"id":8714},"clone-儲存庫-1",[164,8716,8717],{"className":166,"code":8643,"language":168,"meta":169,"style":169},[19,8718,8719,8727],{"__ignoreMap":169},[173,8720,8721,8723,8725],{"class":175,"line":176},[173,8722,8650],{"class":179},[173,8724,8653],{"class":183},[173,8726,8656],{"class":183},[173,8728,8729,8731],{"class":175,"line":212},[173,8730,4315],{"class":187},[173,8732,8663],{"class":183},[90,8734,8735],{"id":8735},"建立新的虛擬環境並啟動它",[164,8737,8739],{"className":166,"code":8738,"language":168,"meta":169,"style":169},"uv venv --python 3.12\nsource .venv\u002Fbin\u002Factivate  # On Unix\u002FmacOS\n# Or on Windows:\n# .venv\\Scripts\\activate\n",[19,8740,8741,8755,8766,8771],{"__ignoreMap":169},[173,8742,8743,8746,8749,8752],{"class":175,"line":176},[173,8744,8745],{"class":179},"uv",[173,8747,8748],{"class":183}," venv",[173,8750,8751],{"class":187}," --python",[173,8753,8754],{"class":187}," 3.12\n",[173,8756,8757,8760,8763],{"class":175,"line":212},[173,8758,8759],{"class":187},"source",[173,8761,8762],{"class":183}," .venv\u002Fbin\u002Factivate",[173,8764,8765],{"class":208},"  # On Unix\u002FmacOS\n",[173,8767,8768],{"class":175,"line":223},[173,8769,8770],{"class":208},"# Or on Windows:\n",[173,8772,8773],{"class":175,"line":230},[173,8774,8775],{"class":208},"# .venv\\Scripts\\activate\n",[90,8777,8666],{"id":8778},"安裝相依套件-1",[164,8780,8782],{"className":166,"code":8781,"language":168,"meta":169,"style":169},"uv pip install -r requirements.txt\n",[19,8783,8784],{"__ignoreMap":169},[173,8785,8786,8788,8791,8793,8795],{"class":175,"line":176},[173,8787,8745],{"class":179},[173,8789,8790],{"class":183}," pip",[173,8792,184],{"class":183},[173,8794,8681],{"class":187},[173,8796,8684],{"class":183},[44,8798,8799],{"id":8799},"設定",[90,8801,8802],{"id":8802},"建立設定檔",[164,8804,8806],{"className":166,"code":8805,"language":168,"meta":169,"style":169},"cp config\u002Fconfig.example.toml config\u002Fconfig.toml\n",[19,8807,8808],{"__ignoreMap":169},[173,8809,8810,8813,8816],{"class":175,"line":176},[173,8811,8812],{"class":179},"cp",[173,8814,8815],{"class":183}," config\u002Fconfig.example.toml",[173,8817,8818],{"class":183}," config\u002Fconfig.toml\n",[90,8820,8821],{"id":8821},"編輯設定檔",[164,8823,8825],{"className":166,"code":8824,"language":168,"meta":169,"style":169},"# [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",[19,8826,8827,8832,8837,8842,8847,8852,8857,8862,8867,8871,8879,8889,8899,8909,8919,8929,8939,8943,8948,8953,8958,8963,8968,8973,8978,8982,8990,8999,9009,9018,9027,9036,9045,9049,9054,9059,9064,9069,9074,9079,9084,9089,9094,9099,9104,9109,9114,9119,9124,9128,9133,9138,9143,9148,9153,9157,9162,9167,9172],{"__ignoreMap":169},[173,8828,8829],{"class":175,"line":176},[173,8830,8831],{"class":208},"# [llm] #AZURE OPENAI:\n",[173,8833,8834],{"class":175,"line":212},[173,8835,8836],{"class":208},"# api_type= 'azure'\n",[173,8838,8839],{"class":175,"line":223},[173,8840,8841],{"class":208},"# model = \"YOUR_MODEL_NAME\" #\"gpt-4o-mini\"\n",[173,8843,8844],{"class":175,"line":230},[173,8845,8846],{"class":208},"# base_url = \"{YOUR_AZURE_ENDPOINT.rstrip('\u002F')}\u002Fopenai\u002Fdeployments\u002F{AZURE_DEPOLYMENT_ID}\"\n",[173,8848,8849],{"class":175,"line":236},[173,8850,8851],{"class":208},"# api_key = \"AZURE API KEY\"\n",[173,8853,8854],{"class":175,"line":249},[173,8855,8856],{"class":208},"# max_tokens = 8096\n",[173,8858,8859],{"class":175,"line":254},[173,8860,8861],{"class":208},"# temperature = 0.0\n",[173,8863,8864],{"class":175,"line":260},[173,8865,8866],{"class":208},"# api_version=\"AZURE API VERSION\" #\"2024-08-01-preview\"\n",[173,8868,8869],{"class":175,"line":356},[173,8870,227],{"emptyLinePlaceholder":226},[173,8872,8873,8876],{"class":175,"line":362},[173,8874,8875],{"class":1199}," [llm] ",[173,8877,8878],{"class":208},"#OLLAMA:\n",[173,8880,8881,8884,8886],{"class":175,"line":368},[173,8882,8883],{"class":179}," api_type",[173,8885,6440],{"class":183},[173,8887,8888],{"class":183}," 'ollama'\n",[173,8890,8891,8894,8896],{"class":175,"line":374},[173,8892,8893],{"class":179}," model",[173,8895,6440],{"class":183},[173,8897,8898],{"class":183}," \"llama3\"\n",[173,8900,8901,8904,8906],{"class":175,"line":380},[173,8902,8903],{"class":179}," base_url",[173,8905,6440],{"class":183},[173,8907,8908],{"class":183}," \"http:\u002F\u002F127.0.0.1:11434\u002Fv1\"\n",[173,8910,8911,8914,8916],{"class":175,"line":385},[173,8912,8913],{"class":179}," api_key",[173,8915,6440],{"class":183},[173,8917,8918],{"class":183}," \"ollama\"\n",[173,8920,8921,8924,8926],{"class":175,"line":1405},[173,8922,8923],{"class":179}," max_tokens",[173,8925,6440],{"class":183},[173,8927,8928],{"class":187}," 4096\n",[173,8930,8931,8934,8936],{"class":175,"line":1416},[173,8932,8933],{"class":179}," temperature",[173,8935,6440],{"class":183},[173,8937,8938],{"class":187}," 0.0\n",[173,8940,8941],{"class":175,"line":1421},[173,8942,227],{"emptyLinePlaceholder":226},[173,8944,8945],{"class":175,"line":1718},[173,8946,8947],{"class":208},"# Optional configuration for specific LLM models\n",[173,8949,8950],{"class":175,"line":1724},[173,8951,8952],{"class":208},"#[llm.vision]\n",[173,8954,8955],{"class":175,"line":1729},[173,8956,8957],{"class":208},"# model = \"claude-3-7-sonnet\"    # The vision model to use\n",[173,8959,8960],{"class":175,"line":1735},[173,8961,8962],{"class":208},"# base_url = \"https:\u002F\u002Fapi.openai.com\u002Fv1\"    # API endpoint URL for vision model\n",[173,8964,8965],{"class":175,"line":4815},[173,8966,8967],{"class":208},"# api_key = \"sk-...\"    # Your API key for vision model\n",[173,8969,8970],{"class":175,"line":4826},[173,8971,8972],{"class":208},"# max_tokens = 8192     # Maximum number of tokens in the response\n",[173,8974,8975],{"class":175,"line":4837},[173,8976,8977],{"class":208},"# temperature = 0.0     # Controls randomness for vision model\n",[173,8979,8980],{"class":175,"line":4842},[173,8981,227],{"emptyLinePlaceholder":226},[173,8983,8984,8987],{"class":175,"line":4848},[173,8985,8986],{"class":1199},"[llm.vision] ",[173,8988,8989],{"class":208},"#OLLAMA VISION:\n",[173,8991,8992,8995,8997],{"class":175,"line":4858},[173,8993,8994],{"class":179},"api_type",[173,8996,6440],{"class":183},[173,8998,8888],{"class":183},[173,9000,9001,9004,9006],{"class":175,"line":4872},[173,9002,9003],{"class":179},"model",[173,9005,6440],{"class":183},[173,9007,9008],{"class":183}," \"llama3.2-vision:latest\"\n",[173,9010,9011,9014,9016],{"class":175,"line":4877},[173,9012,9013],{"class":179},"base_url",[173,9015,6440],{"class":183},[173,9017,8908],{"class":183},[173,9019,9020,9023,9025],{"class":175,"line":4883},[173,9021,9022],{"class":179},"api_key",[173,9024,6440],{"class":183},[173,9026,8918],{"class":183},[173,9028,9029,9032,9034],{"class":175,"line":4897},[173,9030,9031],{"class":179},"max_tokens",[173,9033,6440],{"class":183},[173,9035,8928],{"class":187},[173,9037,9038,9041,9043],{"class":175,"line":4908},[173,9039,9040],{"class":179},"temperature",[173,9042,6440],{"class":183},[173,9044,8938],{"class":187},[173,9046,9047],{"class":175,"line":4919},[173,9048,227],{"emptyLinePlaceholder":226},[173,9050,9051],{"class":175,"line":6841},[173,9052,9053],{"class":208},"# Optional configuration for specific browser configuration\n",[173,9055,9056],{"class":175,"line":6873},[173,9057,9058],{"class":208},"# [browser]\n",[173,9060,9061],{"class":175,"line":6884},[173,9062,9063],{"class":208},"# Whether to run browser in headless mode (default: false)\n",[173,9065,9066],{"class":175,"line":6895},[173,9067,9068],{"class":208},"#headless = false\n",[173,9070,9071],{"class":175,"line":6906},[173,9072,9073],{"class":208},"# Disable browser security features (default: true)\n",[173,9075,9076],{"class":175,"line":6917},[173,9077,9078],{"class":208},"#disable_security = true\n",[173,9080,9081],{"class":175,"line":6928},[173,9082,9083],{"class":208},"# Extra arguments to pass to the browser\n",[173,9085,9086],{"class":175,"line":6940},[173,9087,9088],{"class":208},"#extra_chromium_args = []\n",[173,9090,9091],{"class":175,"line":6945},[173,9092,9093],{"class":208},"# Path to a Chrome instance to use to connect to your normal browser\n",[173,9095,9096],{"class":175,"line":6950},[173,9097,9098],{"class":208},"# e.g. '\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome'\n",[173,9100,9101],{"class":175,"line":6957},[173,9102,9103],{"class":208},"#chrome_instance_path = \"\"\n",[173,9105,9106],{"class":175,"line":6968},[173,9107,9108],{"class":208},"# Connect to a browser instance via WebSocket\n",[173,9110,9111],{"class":175,"line":6993},[173,9112,9113],{"class":208},"#wss_url = \"\"\n",[173,9115,9116],{"class":175,"line":6998},[173,9117,9118],{"class":208},"# Connect to a browser instance via CDP\n",[173,9120,9121],{"class":175,"line":7003},[173,9122,9123],{"class":208},"#cdp_url = \"\"\n",[173,9125,9126],{"class":175,"line":7010},[173,9127,227],{"emptyLinePlaceholder":226},[173,9129,9130],{"class":175,"line":7023},[173,9131,9132],{"class":208},"# Optional configuration, Proxy settings for the browser\n",[173,9134,9135],{"class":175,"line":7028},[173,9136,9137],{"class":208},"# [browser.proxy]\n",[173,9139,9140],{"class":175,"line":7033},[173,9141,9142],{"class":208},"# server = \"http:\u002F\u002Fproxy-server:port\"\n",[173,9144,9145],{"class":175,"line":7038},[173,9146,9147],{"class":208},"# username = \"proxy-username\"\n",[173,9149,9150],{"class":175,"line":7048},[173,9151,9152],{"class":208},"# password = \"proxy-password\"\n",[173,9154,9155],{"class":175,"line":7089},[173,9156,227],{"emptyLinePlaceholder":226},[173,9158,9159],{"class":175,"line":7100},[173,9160,9161],{"class":208},"# Optional configuration, Search settings.\n",[173,9163,9164],{"class":175,"line":7111},[173,9165,9166],{"class":208},"# [search]\n",[173,9168,9169],{"class":175,"line":7122},[173,9170,9171],{"class":208},"# Search engine for agent to use. Default is \"Google\", can be set to \"Baidu\" or \"DuckDuckGo\".\n",[173,9173,9174,9177,9179],{"class":175,"line":7133},[173,9175,9176],{"class":179},"engine",[173,9178,6440],{"class":183},[173,9180,9181],{"class":183}," \"Google\"\n",[15,9183,9184,9185,9188,9189],{},"其中 ",[19,9186,9187],{},"[llm]"," 的 ollama model 並非所有 model 著支援，目前只支援 ",[283,9190,9193],{"href":9191,"rel":9192},"https:\u002F\u002Follama.com\u002Fsearch?c=tools",[287],"ollama tool 模型",[15,9195,34,9196,9199,9200],{},[19,9197,9198],{},"[llm.vision]"," 的 ollama model 則必需支援",[283,9201,9204],{"href":9202,"rel":9203},"https:\u002F\u002Follama.com\u002Fsearch?c=vision",[287],"視覺的模型",[44,9206,9207],{"id":9207},"瀏覽器安裝",[15,9209,9210,9211,9214,9215,9218],{},"在使用 ",[19,9212,9213],{},"OpenManus"," 時，有時需要使用網路爬蟲時，會要求你安裝 ",[19,9216,9217],{},"Chromium"," 瀏覽器，你可以事先透過下列指令進行安裝",[164,9220,9222],{"className":166,"code":9221,"language":168,"meta":169,"style":169},"playwright install\n",[19,9223,9224],{"__ignoreMap":169},[173,9225,9226,9229],{"class":175,"line":176},[173,9227,9228],{"class":179},"playwright",[173,9230,9231],{"class":183}," install\n",[44,9233,9234],{"id":9234},"啟用服務",[15,9236,9237],{},"上面安裝完成後，就可以啟用服務",[164,9239,9241],{"className":166,"code":9240,"language":168,"meta":169,"style":169},"python main.py\n",[19,9242,9243],{"__ignoreMap":169},[173,9244,9245,9248],{"class":175,"line":176},[173,9246,9247],{"class":179},"python",[173,9249,9250],{"class":183}," main.py\n",[44,9252,9253],{"id":9253},"啟用服務的畫面",[164,9255,9257],{"className":166,"code":9256,"language":168,"meta":169,"style":169},"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",[19,9258,9259,9267,9279],{"__ignoreMap":169},[173,9260,9261,9264],{"class":175,"line":176},[173,9262,9263],{"class":179},"INFO",[173,9265,9266],{"class":1199},"     [browser_use] BrowserUse logging setup complete with level info\n",[173,9268,9269,9271,9274,9276],{"class":175,"line":212},[173,9270,9263],{"class":179},[173,9272,9273],{"class":1199},"     [root] Anonymized telemetry enabled. See https:\u002F\u002Fdocs.browser-use.com\u002Fdevelopment\u002Ftelemetry ",[173,9275,1596],{"class":468},[173,9277,9278],{"class":1199}," more information.\n",[173,9280,9281,9284,9287],{"class":175,"line":223},[173,9282,9283],{"class":179},"Enter",[173,9285,9286],{"class":183}," your",[173,9288,9289],{"class":183}," prompt:\n",[15,9291,9292],{},"在終端機輸入你的需求提示詞",[15,9294,9295],{},"如：請從網路上搜尋 近期熱門的 LLM 大語言模型的介紹，並以繁體中文整理成一篇文章，以 markdown 格式輸出 \"LLM_大語言模型介紹.md\"",[15,9297,9298,9299,9302],{},"執行結果會儲存在 ",[19,9300,9301],{},"OpenManus\u002Fworkspace"," 資料夾",[44,9304,2584],{"id":2584},[15,9306,9307,9308,9311],{},"總而言之，OpenManus 提供了一個無需等待邀請碼、即可在本地端體驗 AI Agent 功能的開源方案。透過搭配 Ollama，使用者可以輕鬆地利用各種大型語言模型和視覺模型，執行從網路資訊蒐集到文章撰寫等多種任務。儘管目前 Ollama 對於 ",[19,9309,9310],{},"tool"," 模型和視覺模型的支援仍在發展中，OpenManus 仍然為對 AI Agent 技術感興趣的使用者提供了一個方便且彈性的實驗平台。隨著專案的持續發展和更多模型的支援，OpenManus 有望成為本地端 AI 應用的重要工具之一。",[894,9313,9314],{},"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":169,"searchDepth":212,"depth":212,"links":9316},[9317,9318,9319,9320,9325,9331,9335,9336,9337,9338],{"id":942,"depth":212,"text":942},{"id":8562,"depth":212,"text":8562},{"id":3607,"depth":212,"text":3607},{"id":8597,"depth":212,"text":8598,"children":9321},[9322,9323,9324],{"id":8601,"depth":223,"text":8602},{"id":8639,"depth":223,"text":8640},{"id":8666,"depth":223,"text":8666},{"id":8687,"depth":212,"text":8688,"children":9326},[9327,9328,9329,9330],{"id":8691,"depth":223,"text":8692},{"id":8714,"depth":223,"text":8640},{"id":8735,"depth":223,"text":8735},{"id":8778,"depth":223,"text":8666},{"id":8799,"depth":212,"text":8799,"children":9332},[9333,9334],{"id":8802,"depth":223,"text":8802},{"id":8821,"depth":223,"text":8821},{"id":9207,"depth":212,"text":9207},{"id":9234,"depth":212,"text":9234},{"id":9253,"depth":212,"text":9253},{"id":2584,"depth":212,"text":2584},"\u002Fimages\u002Farticles\u002F2025-03-17-open-manus\u002Fcover.png",{},"\u002Farticles\u002F2025-03-17-open-manus","2025-03-17 14:38:00",{"title":8552,"description":169},"articles\u002F2025-03-17-open-manus","最近的 Manus 爆紅的 AI 工具，但需要邀請碼，而 OpenManus 則是開源版，且可以在本地配合 ollama 使用",[930],"3Et6YOZPsuqir3pZgApsjYIZn_5nPPKlO4oaWvr2Sj0",{"id":9349,"title":9350,"body":9351,"category":9525,"description":169,"extension":921,"image":9526,"meta":9527,"navigation":226,"path":9528,"pubDate":9529,"seo":9530,"status":226,"stem":9531,"summary":9532,"tags":9533,"__hash__":9534},"content\u002Farticles\u002F2025-02-05-linux-nohup.md","nohup 指令：讓程式在登出後繼續執行的秘訣",{"type":8,"value":9352,"toc":9517},[9353,9360,9365,9368,9380,9394,9397,9407,9434,9448,9452,9458,9485,9503,9505,9508,9514],[44,9354,9356,9357,2741],{"id":9355},"什麼是-nohup","什麼是 ",[19,9358,9359],{},"nohup",[15,9361,9362,9364],{},[19,9363,9359],{}," 是Linux系統中的一個命令，用於讓指定的程式在用戶登出或終端機連接斷開後繼續執行。它會忽略SIGHUP（掛起）信號，使程序能夠在背景下不受干擾地運行。",[44,9366,9367],{"id":9367},"基本語法",[164,9369,9371],{"className":166,"code":9370,"language":168,"meta":169,"style":169},"nohup [指令] &\n",[19,9372,9373],{"__ignoreMap":169},[173,9374,9375,9377],{"class":175,"line":176},[173,9376,9359],{"class":179},[173,9378,9379],{"class":1199}," [指令] &\n",[52,9381,9382,9388],{},[55,9383,9384,9387],{},[19,9385,9386],{},"[指令]","：您希望在背景執行的命令。",[55,9389,9390,9393],{},[19,9391,9392],{},"&","：表示將命令放在後台執行",[44,9395,9396],{"id":9396},"使用範例",[15,9398,9399,9400,9403,9404,9406],{},"假設我們有一個簡單的Python腳本 ",[19,9401,9402],{},"my_script.py","，它會運行一個耗時的計算任務。我們可以使用 ",[19,9405,9359],{}," 命令來確保該任務即使在登出後仍能繼續執行：",[164,9408,9410],{"className":166,"code":9409,"language":168,"meta":169,"style":169},"nohup python my_script.py >> output.log 2>&1 &\n",[19,9411,9412],{"__ignoreMap":169},[173,9413,9414,9416,9419,9422,9425,9428,9431],{"class":175,"line":176},[173,9415,9359],{"class":179},[173,9417,9418],{"class":183}," python",[173,9420,9421],{"class":183}," my_script.py",[173,9423,9424],{"class":468}," >>",[173,9426,9427],{"class":183}," output.log",[173,9429,9430],{"class":468}," 2>&1",[173,9432,9433],{"class":1199}," &\n",[52,9435,9436,9442],{},[55,9437,9438,9441],{},[19,9439,9440],{},">>"," output.log：將標準輸出重定向到output.log文件。",[55,9443,9444,9447],{},[19,9445,9446],{},"2>&1","：將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[44,9449,9451],{"id":9450},"過濾-nohup-ignoring-input-訊息","過濾 nohup: ignoring input 訊息",[15,9453,9454,9455,9457],{},"當你使用 ",[19,9456,9359],{}," 執行命令時，它會輸出 nohup: ignoring input，這是因為 nohup 預設會忽略標準輸入 (stdin)，以確保命令不會因等待輸入而中斷。這條訊息通常會寫入 nohup.out 或你指定的 log 檔案。如果你不想讓這行訊息出現在 log 檔案中，可以使用以下方法：",[164,9459,9461],{"className":166,"code":9460,"language":168,"meta":169,"style":169},"nohup python my_script.py >> output.log 2>&1 \u003C \u002Fdev\u002Fnull &\n",[19,9462,9463],{"__ignoreMap":169},[173,9464,9465,9467,9469,9471,9473,9475,9477,9480,9483],{"class":175,"line":176},[173,9466,9359],{"class":179},[173,9468,9418],{"class":183},[173,9470,9421],{"class":183},[173,9472,9424],{"class":468},[173,9474,9427],{"class":183},[173,9476,9430],{"class":468},[173,9478,9479],{"class":468}," \u003C",[173,9481,9482],{"class":183}," \u002Fdev\u002Fnull",[173,9484,9433],{"class":1199},[52,9486,9487,9492,9497],{},[55,9488,9489,9491],{},[19,9490,9440],{}," 將標準輸出導向 output.log",[55,9493,9494,9496],{},[19,9495,9446],{}," 將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[55,9498,9499,9502],{},[19,9500,9501],{},"\u003C \u002Fdev\u002Fnull"," 讓標準輸入 (stdin) 來自空設備，避免 nohup 顯示 ignoring input",[44,9504,2584],{"id":2584},[15,9506,9507],{},"掌握nohup指令對Linux使用者來說是非常有用的，特別是在需要長時間運行的任務中。利用這個簡單但強大的工具，您可以讓程序在后台無受干擾地執行，從而提高工作效率。",[15,9509,9510,9511,9513],{},"透過本文介紹的範例和技巧，相信您已經能夠自如地使用 ",[19,9512,9359],{}," 指令來管理您的Linux系統上的背景任務了！",[894,9515,9516],{},"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":169,"searchDepth":212,"depth":212,"links":9518},[9519,9521,9522,9523,9524],{"id":9355,"depth":212,"text":9520},"什麼是 nohup？",{"id":9367,"depth":212,"text":9367},{"id":9396,"depth":212,"text":9396},{"id":9450,"depth":212,"text":9451},{"id":2584,"depth":212,"text":2584},"dev_ops","\u002Fimages\u002Farticles\u002F2025-02-05-linux-nohup\u002Fcover.png",{},"\u002Farticles\u002F2025-02-05-linux-nohup","2025-02-05 14:30:00",{"title":9350,"description":169},"articles\u002F2025-02-05-linux-nohup","在Linux環境下進行長時間運行的任務時，我們常常希望即使用戶登出終端機或連線中斷，任務也能繼續執行。nohup指令正是為此而生！本文將介紹如何使用nohup來執行背景任務，並重定向其輸出，確保您的程序在離線後仍能順利運行。",[9525,195],"CwukBZ_XTh1QBVKDTwDEghU7F3HeG06Wv0jF4kxOzVI",{"id":9536,"title":9537,"body":9538,"category":933,"description":9542,"extension":921,"image":10216,"meta":10217,"navigation":226,"path":10218,"pubDate":10219,"seo":10220,"status":226,"stem":10221,"summary":10222,"tags":10223,"__hash__":10224},"content\u002Farticles\u002F2025-01-24-mac-os-app.md","MacOS：2025 我推的 Mac 好用 App",{"type":8,"value":9539,"toc":10156},[9540,9543,9545,9550,9554,9557,9564,9568,9571,9577,9581,9584,9590,9594,9597,9603,9607,9610,9616,9620,9623,9629,9633,9636,9642,9646,9649,9655,9659,9662,9668,9672,9675,9681,9685,9688,9694,9698,9701,9707,9710,9716,9720,9723,9729,9733,9736,9742,9746,9749,9755,9758,9764,9768,9771,9777,9780,9785,9789,9792,9798,9802,9807,9811,9814,9820,9823,9828,9832,9835,9841,9844,9849,9852,9855,9861,9865,9868,9874,9878,9881,9887,9891,9894,9900,9904,9907,9913,9917,9920,9926,9930,9933,9939,9943,9946,9952,9956,9959,9965,9969,9972,9978,9985,9989,9992,9998,10001,10006,10010,10013,10019,10022,10025,10031,10035,10038,10044,10048,10051,10057,10061,10064,10070,10074,10079,10082,10095,10101,10105,10108,10114,10118,10121,10128,10132,10135,10138,10144,10147,10150],[15,9541,9542],{},"農曆年假期將近，想要重新安裝我使用 MacOS ，在這邊整理一下目前自已常用的 Mac App。",[44,9544,931],{"id":931},[15,9546,9547],{},[543,9548],{"alt":931,"src":9549},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fdev-tool.png",[90,9551,9553],{"id":9552},"vscode","VSCode",[15,9555,9556],{},"一款輕量級但功能強大的源代碼編輯器，支援多種編程語言，並具有豐富的擴展生態系統。",[15,9558,9559,9560],{},"官網：",[283,9561,9562],{"href":9562,"rel":9563},"https:\u002F\u002Fcode.visualstudio.com\u002F",[287],[90,9565,9567],{"id":9566},"iterm2","Iterm2",[15,9569,9570],{},"一款功能強大的終端模擬器，提供分屏、標籤頁、熱鍵等多種功能，適合開發者使用。",[15,9572,9559,9573],{},[283,9574,9575],{"href":9575,"rel":9576},"https:\u002F\u002Fiterm2.com\u002F",[287],[90,9578,9580],{"id":9579},"utm","UTM",[15,9582,9583],{},"一款虛擬機應用程式，允許用戶在 macOS 上運行其他操作系統，如 Windows 和 Linux。",[15,9585,9559,9586],{},[283,9587,9588],{"href":9588,"rel":9589},"https:\u002F\u002Fmac.getutm.app\u002F",[287],[90,9591,9593],{"id":9592},"postman","Postman",[15,9595,9596],{},"API 開發和測試工具，方便發送 HTTP 請求、檢視回應。",[15,9598,9559,9599],{},[283,9600,9601],{"href":9601,"rel":9602},"https:\u002F\u002Fwww.postman.com\u002F",[287],[90,9604,9606],{"id":9605},"github-desktop","GitHub Desktop",[15,9608,9609],{},"GitHub 官方推出的桌面應用，提供圖形化界面，方便用戶管理 GitHub 上的代碼庫。",[15,9611,9559,9612],{},[283,9613,9614],{"href":9614,"rel":9615},"https:\u002F\u002Fgithub.com\u002Fapps\u002Fdesktop",[287],[90,9617,9619],{"id":9618},"textmate","TextMate",[15,9621,9622],{},"一款功能強大的文本編輯器，支援多種編程語言，具有語法高亮、代碼折疊等功能。",[15,9624,9559,9625],{},[283,9626,9627],{"href":9627,"rel":9628},"https:\u002F\u002Fmacromates.com\u002F",[287],[90,9630,9632],{"id":9631},"docker","Docker",[15,9634,9635],{},"一個開源的容器化平台，允許開發者打包應用及其依賴，實現跨平台運行。",[15,9637,9559,9638],{},[283,9639,9640],{"href":9640,"rel":9641},"https:\u002F\u002Fwww.docker.com\u002F",[287],[90,9643,9645],{"id":9644},"orbstack","Orbstack",[15,9647,9648],{},"一款輕量級的虛擬化工具，專為 macOS 設計，簡化容器和虛擬機的管理。",[15,9650,9559,9651],{},[283,9652,9653],{"href":9653,"rel":9654},"https:\u002F\u002Forbstack.dev\u002F",[287],[90,9656,9658],{"id":9657},"devtoys","DevToys",[15,9660,9661],{},"提供許多開發者常用的小工具，例如 JSON 格式化、編碼轉換等",[15,9663,9559,9664],{},[283,9665,9666],{"href":9666,"rel":9667},"https:\u002F\u002Fdevtoys.app\u002F",[287],[90,9669,9671],{"id":9670},"dbeaver","DBeaver",[15,9673,9674],{},"通用資料庫管理工具，支援多種資料庫系統，包含 MySQL、SQLite、PostgreSQL、MongoDB 等。",[15,9676,9559,9677],{},[283,9678,9679],{"href":9679,"rel":9680},"https:\u002F\u002Fdbeaver.io\u002F",[287],[90,9682,9684],{"id":9683},"pgadmin4","PgAdmin4",[15,9686,9687],{},"PostgreSQL 資料庫的管理工具。",[15,9689,9559,9690],{},[283,9691,9692],{"href":9692,"rel":9693},"https:\u002F\u002Fwww.pgadmin.org\u002F",[287],[90,9695,9697],{"id":9696},"frame0","Frame0",[15,9699,9700],{},"可以快速建置手繪風格 UI Prototype 的工具。",[15,9702,9559,9703],{},[283,9704,9705],{"href":9705,"rel":9706},"https:\u002F\u002Fframe0.app",[287],[44,9708,9709],{"id":9709},"網路工具",[15,9711,9712],{},[543,9713],{"alt":9714,"src":9715},"瀏覽器","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fbrowser.png",[90,9717,9719],{"id":9718},"arc-browser","Arc Browser",[15,9721,9722],{},"rc 瀏覽器由 The Browser Company 開發，旨在重新定義網頁瀏覽體驗。它基於 Chromium 引擎，並使用 Swift 編寫，支援 Chrome 擴充功能，預設搜尋引擎為 Google。",[15,9724,9559,9725],{},[283,9726,9727],{"href":9727,"rel":9728},"https:\u002F\u002Farc.net\u002F",[287],[90,9730,9732],{"id":9731},"firefox","Firefox",[15,9734,9735],{},"Mozilla Firefox（簡稱 Firefox）是一款由 Mozilla 基金會及其子公司 Mozilla 公司開發的自由且開源的網頁瀏覽器。自 2004 年 11 月 9 日首次發布以來，Firefox 一直致力於提供快速、安全且注重隱私的瀏覽體驗",[15,9737,9559,9738],{},[283,9739,9740],{"href":9740,"rel":9741},"https:\u002F\u002Fwww.mozilla.org\u002Fzh-TW\u002Ffirefox\u002Fnew\u002F",[287],[90,9743,9745],{"id":9744},"neat-download-manager","Neat Download Manager",[15,9747,9748],{},"Neat Download Manager 是一款免費且輕量級的下載管理器，適用於 Windows 和 macOS 平台。\n該軟體支援多執行緒下載，能有效提升下載速度，並提供續傳、暫停等功能，方便管理下載任務。",[15,9750,9559,9751],{},[283,9752,9753],{"href":9753,"rel":9754},"https:\u002F\u002Fwww.neatdownloadmanager.com\u002Findex.php\u002Fen\u002F",[287],[44,9756,9757],{"id":9757},"筆記軟體",[15,9759,9760],{},[543,9761],{"alt":9762,"src":9763},"筆記","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FNotebook.png",[90,9765,9767],{"id":9766},"obsidian","Obsidian",[15,9769,9770],{},"Obsidian 是一款免費且開源的筆記軟體，支援 Markdown 語法，所有筆記以 .md 檔案形式儲存在指定的資料夾中，方便使用者將檔案匯入其他軟體。",[15,9772,9559,9773],{},[283,9774,9775],{"href":9775,"rel":9776},"https:\u002F\u002Fobsidian.md\u002F",[287],[44,9778,9779],{"id":9779},"媒體播放器",[15,9781,9782],{},[543,9783],{"alt":9779,"src":9784},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fmedia-player.png",[90,9786,9788],{"id":9787},"iina","IINA",[15,9790,9791],{},"IINA 是一款專為 macOS 設計的免費開源多媒體播放器，基於 mpv 引擎，使用 Swift 編寫，旨在提供現代化且直覺的使用體驗。",[15,9793,9559,9794],{},[283,9795,9796],{"href":9796,"rel":9797},"https:\u002F\u002Fiina.io\u002F",[287],[44,9799,9801],{"id":9800},"壓縮解壓","壓縮\u002F解壓",[15,9803,9804],{},[543,9805],{"alt":9801,"src":9806},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fzip.png",[90,9808,9810],{"id":9809},"keka","Keka",[15,9812,9813],{},"Keka 是一款專為 macOS 設計的免費開源壓縮與解壓縮軟體，支援多種壓縮格式，包括 7Z、ZIP、TAR、GZIP、BZIP2、XZ、LZIP、DMG、ISO、BROTLI、ZSTD、LRZIP、WIM 等。",[15,9815,9559,9816],{},[283,9817,9818],{"href":9818,"rel":9819},"https:\u002F\u002Fwww.keka.io\u002F",[287],[44,9821,9822],{"id":9822},"密碼管理",[15,9824,9825],{},[543,9826],{"alt":9822,"src":9827},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpassword.png",[90,9829,9831],{"id":9830},"keepassxc","KeePassXC",[15,9833,9834],{},"KeePassXC 是一款免費且開源的密碼管理器，旨在安全地存儲和管理您的敏感資訊。它基於 KeePassX，並使用 Qt5 庫構建，支援 Windows、macOS 和 Linux 等多個平台。",[15,9836,9559,9837],{},[283,9838,9839],{"href":9839,"rel":9840},"https:\u002F\u002Fkeepassxc.org\u002F",[287],[44,9842,9843],{"id":9843},"系統管理",[15,9845,9846],{},[543,9847],{"alt":9843,"src":9848},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fsystem.png",[90,9850,3590],{"id":9851},"appcleaner",[15,9853,9854],{},"AppCleaner 是一款免費且開源的 macOS 應用程式卸載工具，旨在徹底移除應用程式及其相關檔案，避免遺留不必要的設定或暫存檔案。",[15,9856,9559,9857],{},[283,9858,9859],{"href":9859,"rel":9860},"https:\u002F\u002Ffreemacsoft.net\u002Fappcleaner\u002F",[287],[90,9862,9864],{"id":9863},"stats","Stats",[15,9866,9867],{},"Stats 是一個免費的 macOS 應用程式，可以顯示系統資源使用情況，包括 CPU、記憶體和磁盤空間。它也提供了一些有用的工具來管理這些資源。",[15,9869,9559,9870],{},[283,9871,9872],{"href":9872,"rel":9873},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats",[287],[90,9875,9877],{"id":9876},"raycast","Raycast",[15,9879,9880],{},"Raycast 是一個 macOS 的應用程式，可以幫助你快速找到和操作文件和資料夾。它還提供了許多其他有用的功能，如搜索、排序和分類。",[15,9882,9559,9883],{},[283,9884,9885],{"href":9885,"rel":9886},"https:\u002F\u002Fraycast.app\u002F",[287],[90,9888,9890],{"id":9889},"aidente","AIDente",[15,9892,9893],{},"調整 MacBook 電池充電上限的工具，以延長電池壽命。",[15,9895,9559,9896],{},[283,9897,9898],{"href":9898,"rel":9899},"https:\u002F\u002Fapphousekitchen.com",[287],[90,9901,9903],{"id":9902},"shotter","Shotter",[15,9905,9906],{},"功能強大的螢幕截圖工具，支援滾動截圖、圖片編輯等",[15,9908,9559,9909],{},[283,9910,9911],{"href":9911,"rel":9912},"https:\u002F\u002Fshottr.cc\u002F",[287],[90,9914,9916],{"id":9915},"xnip","Xnip",[15,9918,9919],{},"另一款好用的截圖工具，提供多種截圖模式和編輯功能。",[15,9921,9559,9922],{},[283,9923,9924],{"href":9924,"rel":9925},"https:\u002F\u002Fxnipapp.com\u002F",[287],[90,9927,9929],{"id":9928},"mos","Mos",[15,9931,9932],{},"平滑滑鼠滾動的工具，提升使用體驗。",[15,9934,9559,9935],{},[283,9936,9937],{"href":9937,"rel":9938},"https:\u002F\u002Fmos.caldis.me",[287],[90,9940,9942],{"id":9941},"prettyclean","PrettyClean",[15,9944,9945],{},"清理系統垃圾檔案的工具",[15,9947,9559,9948],{},[283,9949,9950],{"href":9950,"rel":9951},"https:\u002F\u002Fwww.prettyclean.cc\u002Fen",[287],[90,9953,9955],{"id":9954},"betterdisplay","BetterDisplay",[15,9957,9958],{},"調整螢幕解析度、亮度、對比度等設定的工具",[15,9960,9559,9961],{},[283,9962,9963],{"href":9963,"rel":9964},"https:\u002F\u002Fgithub.com\u002Fwaydabber\u002FBetterDisplay",[287],[90,9966,9968],{"id":9967},"ntfstool","NTFSTool",[15,9970,9971],{},"在 macOS 上讀寫 NTFS 格式硬碟的工具",[15,9973,9559,9974],{},[283,9975,9976],{"href":9976,"rel":9977},"https:\u002F\u002Fntfstool.com",[287],[15,9979,9980,9981],{},"GitHub：",[283,9982,9983],{"href":9983,"rel":9984},"https:\u002F\u002Fgithub.com\u002Fntfstool\u002Fntfstool",[287],[90,9986,9988],{"id":9987},"landrop","LANDrop",[15,9990,9991],{},"在區域網路內傳輸檔案的工具，支援多種平台，包含 macOS、Windows、 Linux、Android 和 iOS。",[15,9993,9559,9994],{},[283,9995,9996],{"href":9996,"rel":9997},"https:\u002F\u002Flandrop.app",[287],[44,9999,10000],{"id":10000},"圖像處理",[15,10002,10003],{},[543,10004],{"alt":10000,"src":10005},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpicture.png",[90,10007,10009],{"id":10008},"inkscape","Inkscape",[15,10011,10012],{},"開源的向量圖形編輯器，類似 Adobe Illustrator。",[15,10014,9559,10015],{},[283,10016,10017],{"href":10017,"rel":10018},"https:\u002F\u002Finkscape.org\u002F",[287],[90,10020,10021],{"id":10021},"krita",[15,10023,10024],{},"開源的繪圖軟體，適合數位繪畫和插圖創作，支援 PNG、JPEG 和 TIFF 等格式。",[15,10026,9559,10027],{},[283,10028,10029],{"href":10029,"rel":10030},"https:\u002F\u002Fkrita.org\u002Fzh-tw\u002F",[287],[90,10032,10034],{"id":10033},"photoscape-x","Photoscape X",[15,10036,10037],{},"免費的圖片編輯軟體，提供多種編輯工具和特效。",[15,10039,9559,10040],{},[283,10041,10042],{"href":10042,"rel":10043},"http:\u002F\u002Fx.photoscape.org",[287],[90,10045,10047],{"id":10046},"picture-view","Picture View",[15,10049,10050],{},"Picture View - 是一款輕巧快速的 macOS 圖片瀏覽應用程式。體積小巧，方便快速的檢視圖片，不產生緩存，適合作為預設看圖應用。多種看圖模式，操作方便快捷，支援查看EXIF訊息，支援防止系統休眠",[15,10052,9559,10053],{},[283,10054,10055],{"href":10055,"rel":10056},"https:\u002F\u002Fwl879.github.io\u002Fapps\u002Fpicview\u002Findex.html",[287],[90,10058,10060],{"id":10059},"itsycal","Itsycal",[15,10062,10063],{},"在選單列顯示小巧的日曆",[15,10065,9559,10066],{},[283,10067,10068],{"href":10068,"rel":10069},"https:\u002F\u002Fwww.mowglii.com\u002Fitsycal\u002F",[287],[44,10071,10073],{"id":10072},"ai工具","AI工具",[15,10075,10076],{},[543,10077],{"alt":10073,"src":10078},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FAI.png",[90,10080,10081],{"id":10081},"ollama",[15,10083,10084,10085,2590,10088,2590,10091,10094],{},"在本地運行大型語言模型的工具，常見的開源模型如 ",[19,10086,10087],{},"LLama3",[19,10089,10090],{},"Phi4",[19,10092,10093],{},"gemma2","等。",[15,10096,9559,10097],{},[283,10098,10099],{"href":10099,"rel":10100},"https:\u002F\u002Follama.ai\u002F",[287],[90,10102,10104],{"id":10103},"chatbox-ai","Chatbox AI",[15,10106,10107],{},"Chatbox 是一款免費且開源的跨平台 AI 客戶端應用和智能助手，支援多種先進的 AI 模型和 API，旨在提升用戶的工作與學習效率。",[15,10109,9559,10110],{},[283,10111,10112],{"href":10112,"rel":10113},"https:\u002F\u002Fchatboxai.app\u002Fzh-TW",[287],[90,10115,10117],{"id":10116},"open-webui","Open WebUI",[15,10119,10120],{},"Open WebUI 是一款免費且開源的自託管 Web 使用者介面，旨在為大型語言模型（LLM）提供直觀且功能豐富的操作平台",[15,10122,10123,10124],{},"網址：",[283,10125,10126],{"href":10126,"rel":10127},"https:\u002F\u002Fopenwebui.com\u002F",[287],[90,10129,10131],{"id":10130},"pinokio","Pinokio",[15,10133,10134],{},"Pinokio 是一款免費且開源的 AI 應用管理工具，旨在簡化各種 AI 應用和模型的安裝與管理過程。",[15,10136,10137],{},"透過 Pinokio，用戶無需進行繁瑣的環境配置或使用終端命令，即可一鍵安裝和運行多種 AI 工具，如大型語言模型（LLM）、AI 繪畫、AI 語音、AI 視頻以及 AI 音樂等。",[15,10139,10123,10140],{},[283,10141,10142],{"href":10142,"rel":10143},"https:\u002F\u002Fpinokio.computer\u002F",[287],[90,10145,5647],{"id":10146},"upscayl",[15,10148,10149],{},"使用 AI 技術將圖像轉換為更清晰的版本，並添加更多的细節。Upscayl 是一個非常有用的工具，特別適合需要高質量圖像的人像。",[15,10151,9559,10152],{},[283,10153,10154],{"href":10154,"rel":10155},"https:\u002F\u002Fupscayl.org\u002F",[287],{"title":169,"searchDepth":212,"depth":212,"links":10157},[10158,10172,10177,10180,10183,10186,10189,10202,10209],{"id":931,"depth":212,"text":931,"children":10159},[10160,10161,10162,10163,10164,10165,10166,10167,10168,10169,10170,10171],{"id":9552,"depth":223,"text":9553},{"id":9566,"depth":223,"text":9567},{"id":9579,"depth":223,"text":9580},{"id":9592,"depth":223,"text":9593},{"id":9605,"depth":223,"text":9606},{"id":9618,"depth":223,"text":9619},{"id":9631,"depth":223,"text":9632},{"id":9644,"depth":223,"text":9645},{"id":9657,"depth":223,"text":9658},{"id":9670,"depth":223,"text":9671},{"id":9683,"depth":223,"text":9684},{"id":9696,"depth":223,"text":9697},{"id":9709,"depth":212,"text":9709,"children":10173},[10174,10175,10176],{"id":9718,"depth":223,"text":9719},{"id":9731,"depth":223,"text":9732},{"id":9744,"depth":223,"text":9745},{"id":9757,"depth":212,"text":9757,"children":10178},[10179],{"id":9766,"depth":223,"text":9767},{"id":9779,"depth":212,"text":9779,"children":10181},[10182],{"id":9787,"depth":223,"text":9788},{"id":9800,"depth":212,"text":9801,"children":10184},[10185],{"id":9809,"depth":223,"text":9810},{"id":9822,"depth":212,"text":9822,"children":10187},[10188],{"id":9830,"depth":223,"text":9831},{"id":9843,"depth":212,"text":9843,"children":10190},[10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201],{"id":9851,"depth":223,"text":3590},{"id":9863,"depth":223,"text":9864},{"id":9876,"depth":223,"text":9877},{"id":9889,"depth":223,"text":9890},{"id":9902,"depth":223,"text":9903},{"id":9915,"depth":223,"text":9916},{"id":9928,"depth":223,"text":9929},{"id":9941,"depth":223,"text":9942},{"id":9954,"depth":223,"text":9955},{"id":9967,"depth":223,"text":9968},{"id":9987,"depth":223,"text":9988},{"id":10000,"depth":212,"text":10000,"children":10203},[10204,10205,10206,10207,10208],{"id":10008,"depth":223,"text":10009},{"id":10021,"depth":223,"text":10021},{"id":10033,"depth":223,"text":10034},{"id":10046,"depth":223,"text":10047},{"id":10059,"depth":223,"text":10060},{"id":10072,"depth":212,"text":10073,"children":10210},[10211,10212,10213,10214,10215],{"id":10081,"depth":223,"text":10081},{"id":10103,"depth":223,"text":10104},{"id":10116,"depth":223,"text":10117},{"id":10130,"depth":223,"text":10131},{"id":10146,"depth":223,"text":5647},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fcover.png",{},"\u002Farticles\u002F2025-01-24-mac-os-app","2025-01-24 18:30:00",{"title":9537,"description":9542},"articles\u002F2025-01-24-mac-os-app","整理目前自已常用 Mac App，包含開發工具、網路工具、筆記軟體、媒體播放器、壓縮\u002F解壓、密碼管理、系統管理、圖像處理及AI工具",[3998,933],"N4MPdGJ1ZPhYGjQBN5k3ooU7PUeIDvfSyYFtfWfW1dY",{"id":10226,"title":10227,"body":10228,"category":10538,"description":169,"extension":921,"image":10539,"meta":10540,"navigation":226,"path":10541,"pubDate":10542,"seo":10543,"status":226,"stem":10544,"summary":10545,"tags":10546,"__hash__":10548},"content\u002Farticles\u002F2025-01-20-postgresql-materialzed-view.md","PostgreSQL 的高效查詢策略：利用 Materialized View 達成更快的回應速度",{"type":8,"value":10229,"toc":10524},[10230,10234,10244,10248,10251,10254,10280,10283,10343,10347,10361,10365,10368,10371,10391,10395,10402,10431,10434,10437,10458,10462,10469,10478,10482,10485,10516,10518,10521],[44,10231,10233],{"id":10232},"postgresql-view-檢視表-和-materialized-view-實體化檢視表","PostgreSQL VIEW (檢視表) 和 Materialized View (實體化檢視表)",[15,10235,10236,10237,5671,10240,10243],{},"PostgreSQL 提供了 ",[19,10238,10239],{},"VIEW",[19,10241,10242],{},"MATERIALIZED VIEW"," 兩種檢示表，分別用於查詢和儲存結果。",[90,10245,10247],{"id":10246},"view-檢視表","VIEW (檢視表)",[15,10249,10250],{},"是一種虛擬表，它會根據查詢語句來生成資料。當查詢時，PostgreSQL 會自動計算並返回結果集。",[15,10252,10253],{},"其優點如下：",[52,10255,10256,10262,10268,10274],{},[55,10257,10258,10261],{},[28,10259,10260],{},"簡化查詢","：將複雜查詢存為檢示表，可以簡化後續的查詢。",[55,10263,10264,10267],{},[28,10265,10266],{},"提高安全性","：檢視表可以避免直接對數據庫進行操作，提高了安全性，並可以限制用戶對數據資料的查詢權限。",[55,10269,10270,10273],{},[28,10271,10272],{},"可重用性","：檢視表可以被多次使用，而不需要重新計算。",[55,10275,10276,10279],{},[28,10277,10278],{},"節省空間","：不保存數據，節省空間。",[90,10281,10282],{"id":10282},"範例",[164,10284,10288],{"className":10285,"code":10286,"language":10287,"meta":169,"style":169},"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",[19,10289,10290,10304,10327,10335],{"__ignoreMap":169},[173,10291,10292,10295,10298,10301],{"class":175,"line":176},[173,10293,10294],{"class":468},"CREATE",[173,10296,10297],{"class":468},"  VIEW",[173,10299,10300],{"class":179}," my_view",[173,10302,10303],{"class":468}," AS\n",[173,10305,10306,10309,10312,10315,10317,10319,10321,10324],{"class":175,"line":212},[173,10307,10308],{"class":468},"SELECT",[173,10310,10311],{"class":1199}," column1, column2, ",[173,10313,10314],{"class":187},"COUNT",[173,10316,1200],{"class":1199},[173,10318,7498],{"class":468},[173,10320,7791],{"class":1199},[173,10322,10323],{"class":468},"AS",[173,10325,10326],{"class":1199}," total_count\n",[173,10328,10329,10332],{"class":175,"line":223},[173,10330,10331],{"class":468},"FROM",[173,10333,10334],{"class":1199}," my_table\n",[173,10336,10337,10340],{"class":175,"line":230},[173,10338,10339],{"class":468},"GROUP BY",[173,10341,10342],{"class":1199}," column1, column2;\n",[90,10344,10346],{"id":10345},"view-的缺點","VIEW 的缺點",[52,10348,10349,10355],{},[55,10350,10351,10354],{},[28,10352,10353],{},"性能問題","：太複雜的檢示表查詢可能會影響性能。",[55,10356,10357,10360],{},[28,10358,10359],{},"無法建立索引","：檢視表本身不能直接建立索引，需要對原始數據進行索引。",[44,10362,10364],{"id":10363},"materialized-view-實體化檢視表","Materialized View (實體化檢視表)",[15,10366,10367],{},"Materialized View 是一種檢視表，它會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[15,10369,10370],{},"其特點如下：",[52,10372,10373,10379,10385],{},[55,10374,10375,10378],{},[28,10376,10377],{},"資料存儲","：Materialized View 會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[55,10380,10381,10384],{},[28,10382,10383],{},"性能優勢","：因為資料已經被計算好，所以查詢速度會更快，特別是複雜的查詢。",[55,10386,10387,10390],{},[28,10388,10389],{},"索引支持","：Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。",[90,10392,10394],{"id":10393},"建立-materialized-view","建立 Materialized View",[15,10396,10397,10398,10401],{},"在 PostgreSQL 中，可以使用 ",[19,10399,10400],{},"CREATE MATERIALIZED VIEW"," 语句來建立 Materialized View。以下是一個簡單的示例：",[164,10403,10405],{"className":10285,"code":10404,"language":10287,"meta":169,"style":169},"CREATE MATERIALIZED VIEW my_materialized_view AS\nSELECT column1, column2, ...\nFROM my_table;\n",[19,10406,10407,10417,10424],{"__ignoreMap":169},[173,10408,10409,10411,10414],{"class":175,"line":176},[173,10410,10294],{"class":468},[173,10412,10413],{"class":1199}," MATERIALIZED VIEW my_materialized_view ",[173,10415,10416],{"class":468},"AS\n",[173,10418,10419,10421],{"class":175,"line":212},[173,10420,10308],{"class":468},[173,10422,10423],{"class":1199}," column1, column2, ...\n",[173,10425,10426,10428],{"class":175,"line":223},[173,10427,10331],{"class":468},[173,10429,10430],{"class":1199}," my_table;\n",[90,10432,10433],{"id":10433},"建立索引",[15,10435,10436],{},"Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[164,10438,10440],{"className":10285,"code":10439,"language":10287,"meta":169,"style":169},"CREATE INDEX idx_my_materialized_view_column1 ON my_materialized_view(column1);\n",[19,10441,10442],{"__ignoreMap":169},[173,10443,10444,10446,10449,10452,10455],{"class":175,"line":176},[173,10445,10294],{"class":468},[173,10447,10448],{"class":468}," INDEX",[173,10450,10451],{"class":179}," idx_my_materialized_view_column1",[173,10453,10454],{"class":468}," ON",[173,10456,10457],{"class":1199}," my_materialized_view(column1);\n",[90,10459,10461],{"id":10460},"更新-materialized-view","更新 Materialized View",[15,10463,10464,10465,10468],{},"Materialized View 會自動更新，當數據庫中的表發生更改時。你可以使用 ",[19,10466,10467],{},"REFRESH MATERIALIZED VIEW"," 语句來刷新 Materialized View：",[164,10470,10472],{"className":10285,"code":10471,"language":10287,"meta":169,"style":169},"REFRESH MATERIALIZED VIEW my_materialized_view;\n",[19,10473,10474],{"__ignoreMap":169},[173,10475,10476],{"class":175,"line":176},[173,10477,10471],{"class":1199},[90,10479,10481],{"id":10480},"使用-materialized-view","使用 Materialized View",[15,10483,10484],{},"Materialized View 可以像普通表一樣使用，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[164,10486,10488],{"className":10285,"code":10487,"language":10287,"meta":169,"style":169},"SELECT * FROM my_materialized_view WHERE column1 = 'value';\n",[19,10489,10490],{"__ignoreMap":169},[173,10491,10492,10494,10497,10500,10503,10506,10509,10511,10514],{"class":175,"line":176},[173,10493,10308],{"class":468},[173,10495,10496],{"class":468}," *",[173,10498,10499],{"class":468}," FROM",[173,10501,10502],{"class":1199}," my_materialized_view ",[173,10504,10505],{"class":468},"WHERE",[173,10507,10508],{"class":1199}," column1 ",[173,10510,1206],{"class":468},[173,10512,10513],{"class":183}," 'value'",[173,10515,1442],{"class":1199},[44,10517,2584],{"id":2584},[15,10519,10520],{},"Materialized View 是一個非常有用的工具，它可以在數據庫中提供快速的查詢結果。通過使用索引和定期刷新，Materialized View 可以提高查詢性能，使應用程序更加高效。",[894,10522,10523],{},"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":169,"searchDepth":212,"depth":212,"links":10525},[10526,10531,10537],{"id":10232,"depth":212,"text":10233,"children":10527},[10528,10529,10530],{"id":10246,"depth":223,"text":10247},{"id":10282,"depth":223,"text":10282},{"id":10345,"depth":223,"text":10346},{"id":10363,"depth":212,"text":10364,"children":10532},[10533,10534,10535,10536],{"id":10393,"depth":223,"text":10394},{"id":10433,"depth":223,"text":10433},{"id":10460,"depth":223,"text":10461},{"id":10480,"depth":223,"text":10481},{"id":2584,"depth":212,"text":2584},"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":10227,"description":169},"articles\u002F2025-01-20-postgresql-materialzed-view","PostgreSQL Materialized View 是一種數據視圖，它會將查詢結果儲存到一個表中，以便在需要時快速訪問。",[10547],"Postgresql","OtEICcXMOXYLMC9l2mst1JtQEi3zUxzEx8O9Q062GcY",{"id":10550,"title":10551,"body":10552,"category":2718,"description":169,"extension":921,"image":10592,"meta":10593,"navigation":226,"path":10594,"pubDate":10595,"seo":10596,"status":226,"stem":10597,"summary":10598,"tags":10599,"__hash__":10600},"content\u002Farticles\u002F2025-01-19-2025-new-theme.md","2025 新版型",{"type":8,"value":10553,"toc":10589},[10554,10556,10571,10580],[44,10555,2654],{"id":2654},[15,10557,10558,10559,10562,10563,10566,10567,10570],{},"年初時，我對自己的部落格進行了重新設計和結構化。這次重構依然採用了 ",[19,10560,10561],{},"Nuxt.js"," 和其 ",[19,10564,10565],{},"Nuxt\u002Fcontent"," 模組來管理文章內容，並利用 ",[19,10568,10569],{},"Tailwind CSS"," 進行樣式設定。",[15,10572,10573,10574,10576,10577,10579],{},"原本打算使用 ",[19,10575,10561],{}," V3 來完成此次更新，因為網站已經接近完成狀態。然而，在生成靜態頁面時遇到了一些問題，因此決定先以穩定的 ",[19,10578,10561],{}," V2 進行重構工作。",[15,10581,10582,10583,10585,10586,10588],{},"尽管如此，我仍將持續研究 ",[19,10584,10561],{}," V3 的相關功能，並期待將這些新特性引入到我的項目中。即使官方對 ",[19,10587,10561],{}," V2 還會提供安全更新，但許多令人興奮的新功能僅在 V3 中實現。",{"title":169,"searchDepth":212,"depth":212,"links":10590},[10591],{"id":2654,"depth":212,"text":2654},"\u002Fimages\u002Farticles\u002F2025-01-19-2025-new-theme\u002Fcover.png",{},"\u002Farticles\u002F2025-01-19-2025-new-theme","2025-01-19 22:48:30",{"title":10551,"description":169},"articles\u002F2025-01-19-2025-new-theme","替網站做了新版型，新版型回歸簡約風格",[2718],"MsdGgluY9CLV2K69xHavUg9vNq1FVnQLpldIMwcohqI",{"id":10602,"title":10603,"body":10604,"category":919,"description":169,"extension":921,"image":10990,"meta":10991,"navigation":226,"path":10992,"pubDate":10993,"seo":10994,"status":226,"stem":10995,"summary":10996,"tags":10997,"__hash__":10998},"content\u002Farticles\u002F2024-06-07-ollama.md","用 ollama 來玩免費開源語言模型",{"type":8,"value":10605,"toc":10975},[10606,10608,10625,10628,10645,10649,10652,10656,10674,10678,10693,10695,10792,10796,10799,10832,10835,10874,10878,10893,10905,10948,10952,10964,10972],[44,10607,942],{"id":942},[15,10609,10610,10611,10614,10615,10614,10618,10614,10621,10624],{},"Ollama 是一個支持 ",[19,10612,10613],{},"Llama 3"," 、 ",[19,10616,10617],{},"Mistral",[19,10619,10620],{},"Gemma",[19,10622,10623],{},"Phi 3"," 等大型語言模型的框架，適用於 macOS、Windows、Linux 和 Docker。",[44,10626,10627],{"id":10627},"下載",[15,10629,10630,10631,10636,10637,10636,10641,469],{},"下載位址：\n| ",[283,10632,10635],{"href":10633,"rel":10634},"https:\u002F\u002Follama.com\u002Fdownload\u002Fmac",[287],"MAC"," | ",[283,10638,195],{"href":10639,"rel":10640},"https:\u002F\u002Follama.com\u002Fdownload\u002Flinux",[287],[283,10642,4103],{"href":10643,"rel":10644},"https:\u002F\u002Follama.com\u002Fdownload\u002Fwindows",[287],[90,10646,10648],{"id":10647},"windows-macos-安裝","Windows \u002F MacOS 安裝",[15,10650,10651],{},"依安裝精靈進行即可",[90,10653,10655],{"id":10654},"linux-在透過-curl-安裝","Linux 在透過 curl 安裝",[164,10657,10659],{"className":166,"code":10658,"language":168,"meta":169,"style":169},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n",[19,10660,10661],{"__ignoreMap":169},[173,10662,10663,10665,10667,10670,10672],{"class":175,"line":176},[173,10664,272],{"class":179},[173,10666,275],{"class":187},[173,10668,10669],{"class":183}," https:\u002F\u002Follama.com\u002Finstall.sh",[173,10671,469],{"class":468},[173,10673,472],{"class":179},[90,10675,10677],{"id":10676},"docker-安裝","Docker 安裝",[164,10679,10681],{"className":166,"code":10680,"language":168,"meta":169,"style":169},"docker pull ollama\u002Follama\n",[19,10682,10683],{"__ignoreMap":169},[173,10684,10685,10687,10690],{"class":175,"line":176},[173,10686,9631],{"class":179},[173,10688,10689],{"class":183}," pull",[173,10691,10692],{"class":183}," ollama\u002Follama\n",[44,10694,492],{"id":492},[825,10696,10697,10717,10738,10754,10775],{},[55,10698,10699,10700,10702,10703],{},"運行 ",[19,10701,10613],{}," 模型",[164,10704,10706],{"className":166,"code":10705,"language":168,"meta":169,"style":169},"ollama run llama3\n",[19,10707,10708],{"__ignoreMap":169},[173,10709,10710,10712,10714],{"class":175,"line":176},[173,10711,10081],{"class":179},[173,10713,4888],{"class":183},[173,10715,10716],{"class":183}," llama3\n",[55,10718,10719,10720,10732,10734],{},"查看所有支持的模型：",[164,10721,10723],{"className":166,"code":10722,"language":168,"meta":169,"style":169},"ollama list\n",[19,10724,10725],{"__ignoreMap":169},[173,10726,10727,10729],{"class":175,"line":176},[173,10728,10081],{"class":179},[173,10730,10731],{"class":183}," list\n",[8345,10733],{},[543,10735],{"alt":10736,"src":10737,"title":10736},"ollama list","\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Follama-list.png",[55,10739,10740,10741],{},"拉取模型",[164,10742,10744],{"className":166,"code":10743,"language":168,"meta":169,"style":169},"ollama pull llama3\n",[19,10745,10746],{"__ignoreMap":169},[173,10747,10748,10750,10752],{"class":175,"line":176},[173,10749,10081],{"class":179},[173,10751,10689],{"class":183},[173,10753,10716],{"class":183},[55,10755,10756,10757],{},"複製模型",[164,10758,10760],{"className":166,"code":10759,"language":168,"meta":169,"style":169},"ollama cp llama3 my-model\n",[19,10761,10762],{"__ignoreMap":169},[173,10763,10764,10766,10769,10772],{"class":175,"line":176},[173,10765,10081],{"class":179},[173,10767,10768],{"class":183}," cp",[173,10770,10771],{"class":183}," llama3",[173,10773,10774],{"class":183}," my-model\n",[55,10776,10777,10778],{},"刪除模型",[164,10779,10781],{"className":166,"code":10780,"language":168,"meta":169,"style":169},"ollama rm llama3\n",[19,10782,10783],{"__ignoreMap":169},[173,10784,10785,10787,10790],{"class":175,"line":176},[173,10786,10081],{"class":179},[173,10788,10789],{"class":183}," rm",[173,10791,10716],{"class":183},[44,10793,10795],{"id":10794},"利用-rest-api","利用 REST API",[90,10797,10798],{"id":10798},"產生回應",[164,10800,10802],{"className":166,"code":10801,"language":168,"meta":169,"style":169},"curl http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate -d '{\n  \"model\": \"llama3\",\n  \"prompt\":\"Why is the sky blue?\"\n}'\n",[19,10803,10804,10817,10822,10827],{"__ignoreMap":169},[173,10805,10806,10808,10811,10814],{"class":175,"line":176},[173,10807,272],{"class":179},[173,10809,10810],{"class":183}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate",[173,10812,10813],{"class":187}," -d",[173,10815,10816],{"class":183}," '{\n",[173,10818,10819],{"class":175,"line":212},[173,10820,10821],{"class":183},"  \"model\": \"llama3\",\n",[173,10823,10824],{"class":175,"line":223},[173,10825,10826],{"class":183},"  \"prompt\":\"Why is the sky blue?\"\n",[173,10828,10829],{"class":175,"line":230},[173,10830,10831],{"class":183},"}'\n",[90,10833,10834],{"id":10834},"使用一個模型聊天",[164,10836,10838],{"className":166,"code":10837,"language":168,"meta":169,"style":169},"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",[19,10839,10840,10851,10855,10860,10865,10870],{"__ignoreMap":169},[173,10841,10842,10844,10847,10849],{"class":175,"line":176},[173,10843,272],{"class":179},[173,10845,10846],{"class":183}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fchat",[173,10848,10813],{"class":187},[173,10850,10816],{"class":183},[173,10852,10853],{"class":175,"line":212},[173,10854,10821],{"class":183},[173,10856,10857],{"class":175,"line":223},[173,10858,10859],{"class":183},"  \"messages\": [\n",[173,10861,10862],{"class":175,"line":230},[173,10863,10864],{"class":183},"    { \"role\": \"user\", \"content\": \"why is the sky blue?\" }\n",[173,10866,10867],{"class":175,"line":236},[173,10868,10869],{"class":183},"  ]\n",[173,10871,10872],{"class":175,"line":249},[173,10873,10831],{"class":183},[44,10875,10877],{"id":10876},"open-webui-圖型化介面","Open WebUI 圖型化介面",[15,10879,10880,10881,2614,10883,10885,10886,10889,10890,10892],{},"由於 ollama 是開源，所以有不少開源軟體，幫 ollama 製作圖型化介面。而目前站長推薦使用 ",[19,10882,10117],{},[19,10884,10117],{},"的操作介面和 ",[19,10887,10888],{},"chatGPT"," 很接近，是運行在 ",[19,10891,9631],{},"的環境下。",[15,10894,10895,10896,10898,10899,10901,10902,10904],{},"只要安裝好",[19,10897,9632],{},"的環境後和",[19,10900,10081],{},"的服務後，只要執行下列指令就可以開始玩",[19,10903,10081],{},"了",[164,10906,10908],{"className":166,"code":10907,"language":168,"meta":169,"style":169},"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",[19,10909,10910],{"__ignoreMap":169},[173,10911,10912,10914,10916,10918,10921,10924,10927,10930,10933,10936,10939,10942,10945],{"class":175,"line":176},[173,10913,9631],{"class":179},[173,10915,4888],{"class":183},[173,10917,10813],{"class":187},[173,10919,10920],{"class":187}," -p",[173,10922,10923],{"class":183}," 3000:8080",[173,10925,10926],{"class":187}," --add-host=host.docker.internal:host-gateway",[173,10928,10929],{"class":187}," -v",[173,10931,10932],{"class":183}," open-webui:\u002Fapp\u002Fbackend\u002Fdata",[173,10934,10935],{"class":187}," --name",[173,10937,10938],{"class":183}," open-webui",[173,10940,10941],{"class":187}," --restart",[173,10943,10944],{"class":183}," always",[173,10946,10947],{"class":183}," ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[44,10949,10951],{"id":10950},"使用-vscode-插件","使用 VScode 插件",[15,10953,10954,10955,10957,10958,10961,10962],{},"除了用 ",[19,10956,10117],{}," 之外，有在使用 ",[19,10959,10960],{},"VScode"," 編輯器，可以安裝下面插件，就可使用 ",[19,10963,10081],{},[15,10965,10966,10967],{},"插件網址： ",[283,10968,10971],{"href":10969,"rel":10970},"https:\u002F\u002Fwww.continue.dev\u002F",[287],"插件官網",[894,10973,10974],{},"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":169,"searchDepth":212,"depth":212,"links":10976},[10977,10978,10983,10984,10988,10989],{"id":942,"depth":212,"text":942},{"id":10627,"depth":212,"text":10627,"children":10979},[10980,10981,10982],{"id":10647,"depth":223,"text":10648},{"id":10654,"depth":223,"text":10655},{"id":10676,"depth":223,"text":10677},{"id":492,"depth":212,"text":492},{"id":10794,"depth":212,"text":10795,"children":10985},[10986,10987],{"id":10798,"depth":223,"text":10798},{"id":10834,"depth":223,"text":10834},{"id":10876,"depth":212,"text":10877},{"id":10950,"depth":212,"text":10951},"\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Fcover.png",{},"\u002Farticles\u002F2024-06-07-ollama","2024-06-07 22:48:30",{"title":10603,"description":169},"articles\u002F2024-06-07-ollama","在 ChatGPT 問世後，大多數科技大廠都推出了自家的語言模型，而有不少開源模型出現。我們可以透過 OLLAMA 在自己的電腦中，建立私有的語言模型服務，並且能夠自由控制和定制模型的性能和功能。",[930,933],"msNB0mNO6nmpAdDzC7_7HVLJFs6WFG8kMP_fzndMH6A",{"id":11000,"title":11001,"body":11002,"category":2635,"description":169,"extension":921,"image":12556,"meta":12557,"navigation":226,"path":12558,"pubDate":12559,"seo":12560,"status":226,"stem":12561,"summary":12562,"tags":12563,"__hash__":12564},"content\u002Farticles\u002F2023-10-04-php-carbon.md","【PHP】如何利用 nesbot\u002Fcarbon 處理日期和時間",{"type":8,"value":11003,"toc":12546},[11004,11006,11015,11030,11033,11090,11093,11101,11104,11208,11210,12032,12035,12084,12087,12543],[44,11005,993],{"id":993},[15,11007,5140,11008,11011,11012],{},[19,11009,11010],{},"composer"," 安裝 ",[19,11013,11014],{},"carbon",[164,11016,11018],{"className":166,"code":11017,"language":168,"meta":169,"style":169},"composer require nesbot\u002Fcarbon\n",[19,11019,11020],{"__ignoreMap":169},[173,11021,11022,11024,11027],{"class":175,"line":176},[173,11023,11010],{"class":179},[173,11025,11026],{"class":183}," require",[173,11028,11029],{"class":183}," nesbot\u002Fcarbon\n",[15,11031,11032],{},"簡易使用範例：",[164,11034,11036],{"className":1183,"code":11035,"language":1130,"meta":169,"style":169},"require 'vendor\u002Fautoload.php';\n\nuse Carbon\\Carbon;\n\nprintf(\"Now: %s\", Carbon::now());\n",[19,11037,11038,11048,11052,11062,11066],{"__ignoreMap":169},[173,11039,11040,11043,11046],{"class":175,"line":176},[173,11041,11042],{"class":468},"require",[173,11044,11045],{"class":183}," 'vendor\u002Fautoload.php'",[173,11047,1442],{"class":1199},[173,11049,11050],{"class":175,"line":212},[173,11051,227],{"emptyLinePlaceholder":226},[173,11053,11054,11057,11060],{"class":175,"line":223},[173,11055,11056],{"class":468},"use",[173,11058,11059],{"class":187}," Carbon\\Carbon",[173,11061,1442],{"class":1199},[173,11063,11064],{"class":175,"line":230},[173,11065,227],{"emptyLinePlaceholder":226},[173,11067,11068,11071,11073,11076,11078,11081,11084,11087],{"class":175,"line":236},[173,11069,11070],{"class":187},"printf",[173,11072,1200],{"class":1199},[173,11074,11075],{"class":183},"\"Now: %s\"",[173,11077,1279],{"class":1199},[173,11079,11080],{"class":187},"Carbon",[173,11082,11083],{"class":468},"::",[173,11085,11086],{"class":179},"now",[173,11088,11089],{"class":1199},"());\n",[44,11091,11092],{"id":11092},"日期格式化",[52,11094,11095],{},[55,11096,11097,11100],{},[19,11098,11099],{},"format($value)","：將日期時間進行格式化輸出，其中格式",[44,11102,11103],{"id":11103},"取得與調整時間",[52,11105,11106,11112,11118,11124,11130,11142,11153,11164,11175,11186,11197],{},[55,11107,11108,11111],{},[19,11109,11110],{},"now()","：獲得當前的日期與時間",[55,11113,11114,11117],{},[19,11115,11116],{},"today()","：獲得當天的日期",[55,11119,11120,11123],{},[19,11121,11122],{},"tomorrow()","：獲取明天的日期",[55,11125,11126,11129],{},[19,11127,11128],{},"yesterday()","：：獲取昨天的日期",[55,11131,11132,8572,11135,11138,11139],{},[19,11133,11134],{},"addYear($value)",[19,11136,11137],{},"subYear($value)","：將年份增加\u002F減少 ",[19,11140,11141],{},"$value",[55,11143,11144,8572,11147,11150,11151],{},[19,11145,11146],{},"addQuarter($value)",[19,11148,11149],{},"subQuarter($value)","：將季度增加\u002F減少 ",[19,11152,11141],{},[55,11154,11155,8572,11158,11161,11162],{},[19,11156,11157],{},"addMonth($value)",[19,11159,11160],{},"subMonth($value)","：將月份增加\u002F減少 ",[19,11163,11141],{},[55,11165,11166,8572,11169,11172,11173],{},[19,11167,11168],{},"addDay($value)",[19,11170,11171],{},"subDay($value)","：將天數增加\u002F減少 ",[19,11174,11141],{},[55,11176,11177,8572,11180,11183,11184],{},[19,11178,11179],{},"addHour($value)",[19,11181,11182],{},"subHour($value)","：將小時增加\u002F減少 ",[19,11185,11141],{},[55,11187,11188,8572,11191,11194,11195],{},[19,11189,11190],{},"addMinute($value)",[19,11192,11193],{},"subMinute($value)","：將分鐘增加\u002F減少 ",[19,11196,11141],{},[55,11198,11199,8572,11202,11205,11206],{},[19,11200,11201],{},"addSecond($value)",[19,11203,11204],{},"subSecond($value)","：將秒數增加\u002F減少 ",[19,11207,11141],{},[90,11209,10282],{"id":10282},[164,11211,11213],{"className":1183,"code":11212,"language":1130,"meta":169,"style":169},"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",[19,11214,11215,11223,11227,11232,11237,11242,11255,11259,11264,11268,11272,11277,11281,11307,11311,11316,11320,11324,11329,11333,11337,11360,11364,11369,11373,11377,11382,11386,11390,11413,11417,11422,11426,11430,11435,11439,11443,11477,11486,11519,11523,11528,11532,11536,11541,11545,11549,11582,11590,11623,11627,11632,11636,11640,11645,11649,11682,11690,11723,11727,11732,11736,11740,11745,11749,11782,11790,11823,11827,11832,11836,11840,11845,11849,11882,11890,11923,11927,11932,11936,11940,11945,11949,11982,11990,12023,12027],{"__ignoreMap":169},[173,11216,11217,11219,11221],{"class":175,"line":176},[173,11218,11056],{"class":468},[173,11220,11059],{"class":187},[173,11222,1442],{"class":1199},[173,11224,11225],{"class":175,"line":212},[173,11226,227],{"emptyLinePlaceholder":226},[173,11228,11229],{"class":175,"line":223},[173,11230,11231],{"class":208},"\u002F**\n",[173,11233,11234],{"class":175,"line":230},[173,11235,11236],{"class":208}," * ：獲得當前的日期與時間\n",[173,11238,11239],{"class":175,"line":236},[173,11240,11241],{"class":208}," *\u002F\n",[173,11243,11244,11246,11249,11251,11253],{"class":175,"line":249},[173,11245,1424],{"class":187},[173,11247,11248],{"class":187}," Carbon",[173,11250,11083],{"class":468},[173,11252,11086],{"class":179},[173,11254,1413],{"class":1199},[173,11256,11257],{"class":175,"line":254},[173,11258,227],{"emptyLinePlaceholder":226},[173,11260,11261],{"class":175,"line":260},[173,11262,11263],{"class":208},"\u002F\u002F印出結果：2023-10-25 07:12:30\n",[173,11265,11266],{"class":175,"line":356},[173,11267,227],{"emptyLinePlaceholder":226},[173,11269,11270],{"class":175,"line":362},[173,11271,11231],{"class":208},[173,11273,11274],{"class":175,"line":368},[173,11275,11276],{"class":208}," * 獲得當天的日期\n",[173,11278,11279],{"class":175,"line":374},[173,11280,11241],{"class":208},[173,11282,11283,11285,11287,11289,11292,11295,11297,11300,11302,11305],{"class":175,"line":380},[173,11284,1424],{"class":187},[173,11286,11248],{"class":187},[173,11288,11083],{"class":468},[173,11290,11291],{"class":179},"today",[173,11293,11294],{"class":1199},"()",[173,11296,1268],{"class":468},[173,11298,11299],{"class":179},"format",[173,11301,1200],{"class":1199},[173,11303,11304],{"class":183},"\"Y-m-d\"",[173,11306,1212],{"class":1199},[173,11308,11309],{"class":175,"line":385},[173,11310,227],{"emptyLinePlaceholder":226},[173,11312,11313],{"class":175,"line":1405},[173,11314,11315],{"class":208},"\u002F\u002F印出結果：2023-10-25\n",[173,11317,11318],{"class":175,"line":1416},[173,11319,227],{"emptyLinePlaceholder":226},[173,11321,11322],{"class":175,"line":1421},[173,11323,11231],{"class":208},[173,11325,11326],{"class":175,"line":1718},[173,11327,11328],{"class":208}," * 獲取明天的日期\n",[173,11330,11331],{"class":175,"line":1724},[173,11332,11241],{"class":208},[173,11334,11335],{"class":175,"line":1729},[173,11336,227],{"emptyLinePlaceholder":226},[173,11338,11339,11341,11343,11345,11348,11350,11352,11354,11356,11358],{"class":175,"line":1735},[173,11340,1424],{"class":187},[173,11342,11248],{"class":187},[173,11344,11083],{"class":468},[173,11346,11347],{"class":179},"tomorrow",[173,11349,11294],{"class":1199},[173,11351,1268],{"class":468},[173,11353,11299],{"class":179},[173,11355,1200],{"class":1199},[173,11357,11304],{"class":183},[173,11359,1212],{"class":1199},[173,11361,11362],{"class":175,"line":4815},[173,11363,227],{"emptyLinePlaceholder":226},[173,11365,11366],{"class":175,"line":4826},[173,11367,11368],{"class":208},"\u002F\u002F印出結果：2023-10-26\n",[173,11370,11371],{"class":175,"line":4837},[173,11372,227],{"emptyLinePlaceholder":226},[173,11374,11375],{"class":175,"line":4842},[173,11376,11231],{"class":208},[173,11378,11379],{"class":175,"line":4848},[173,11380,11381],{"class":208}," * 獲取昨天的日期\n",[173,11383,11384],{"class":175,"line":4858},[173,11385,11241],{"class":208},[173,11387,11388],{"class":175,"line":4872},[173,11389,227],{"emptyLinePlaceholder":226},[173,11391,11392,11394,11396,11398,11401,11403,11405,11407,11409,11411],{"class":175,"line":4877},[173,11393,1424],{"class":187},[173,11395,11248],{"class":187},[173,11397,11083],{"class":468},[173,11399,11400],{"class":179},"yesterday",[173,11402,11294],{"class":1199},[173,11404,1268],{"class":468},[173,11406,11299],{"class":179},[173,11408,1200],{"class":1199},[173,11410,11304],{"class":183},[173,11412,1212],{"class":1199},[173,11414,11415],{"class":175,"line":4883},[173,11416,227],{"emptyLinePlaceholder":226},[173,11418,11419],{"class":175,"line":4897},[173,11420,11421],{"class":208},"\u002F\u002F印出結果： 2023-10-24\n",[173,11423,11424],{"class":175,"line":4908},[173,11425,227],{"emptyLinePlaceholder":226},[173,11427,11428],{"class":175,"line":4919},[173,11429,11231],{"class":208},[173,11431,11432],{"class":175,"line":6841},[173,11433,11434],{"class":208}," * 將年份增加\u002F減少 `$value`\n",[173,11436,11437],{"class":175,"line":6873},[173,11438,11241],{"class":208},[173,11440,11441],{"class":175,"line":6884},[173,11442,227],{"emptyLinePlaceholder":226},[173,11444,11445,11447,11449,11451,11453,11455,11457,11460,11462,11464,11466,11468,11470,11472,11475],{"class":175,"line":6895},[173,11446,1424],{"class":187},[173,11448,11248],{"class":187},[173,11450,11083],{"class":468},[173,11452,11086],{"class":179},[173,11454,11294],{"class":1199},[173,11456,1268],{"class":468},[173,11458,11459],{"class":179},"addYear",[173,11461,1200],{"class":1199},[173,11463,1209],{"class":187},[173,11465,308],{"class":1199},[173,11467,1268],{"class":468},[173,11469,11299],{"class":179},[173,11471,1200],{"class":1199},[173,11473,11474],{"class":183},"\"Y-m-d H:i:s\"",[173,11476,1212],{"class":1199},[173,11478,11479,11481,11484],{"class":175,"line":6906},[173,11480,1424],{"class":187},[173,11482,11483],{"class":183}," \" \u002F \"",[173,11485,1442],{"class":1199},[173,11487,11488,11490,11492,11494,11496,11498,11500,11503,11505,11507,11509,11511,11513,11515,11517],{"class":175,"line":6917},[173,11489,1424],{"class":187},[173,11491,11248],{"class":187},[173,11493,11083],{"class":468},[173,11495,11086],{"class":179},[173,11497,11294],{"class":1199},[173,11499,1268],{"class":468},[173,11501,11502],{"class":179},"subYear",[173,11504,1200],{"class":1199},[173,11506,1209],{"class":187},[173,11508,308],{"class":1199},[173,11510,1268],{"class":468},[173,11512,11299],{"class":179},[173,11514,1200],{"class":1199},[173,11516,11474],{"class":183},[173,11518,1212],{"class":1199},[173,11520,11521],{"class":175,"line":6928},[173,11522,227],{"emptyLinePlaceholder":226},[173,11524,11525],{"class":175,"line":6940},[173,11526,11527],{"class":208},"\u002F\u002F印出結果： 2024-10-25 07:30:52 \u002F 2022-10-25 07:30:52\n",[173,11529,11530],{"class":175,"line":6945},[173,11531,227],{"emptyLinePlaceholder":226},[173,11533,11534],{"class":175,"line":6950},[173,11535,11231],{"class":208},[173,11537,11538],{"class":175,"line":6957},[173,11539,11540],{"class":208}," * 將季度增加\u002F減少 `$value`\n",[173,11542,11543],{"class":175,"line":6968},[173,11544,11241],{"class":208},[173,11546,11547],{"class":175,"line":6993},[173,11548,227],{"emptyLinePlaceholder":226},[173,11550,11551,11553,11555,11557,11559,11561,11563,11566,11568,11570,11572,11574,11576,11578,11580],{"class":175,"line":6998},[173,11552,1424],{"class":187},[173,11554,11248],{"class":187},[173,11556,11083],{"class":468},[173,11558,11086],{"class":179},[173,11560,11294],{"class":1199},[173,11562,1268],{"class":468},[173,11564,11565],{"class":179},"addQuarter",[173,11567,1200],{"class":1199},[173,11569,1209],{"class":187},[173,11571,308],{"class":1199},[173,11573,1268],{"class":468},[173,11575,11299],{"class":179},[173,11577,1200],{"class":1199},[173,11579,11474],{"class":183},[173,11581,1212],{"class":1199},[173,11583,11584,11586,11588],{"class":175,"line":7003},[173,11585,1424],{"class":187},[173,11587,11483],{"class":183},[173,11589,1442],{"class":1199},[173,11591,11592,11594,11596,11598,11600,11602,11604,11607,11609,11611,11613,11615,11617,11619,11621],{"class":175,"line":7010},[173,11593,1424],{"class":187},[173,11595,11248],{"class":187},[173,11597,11083],{"class":468},[173,11599,11086],{"class":179},[173,11601,11294],{"class":1199},[173,11603,1268],{"class":468},[173,11605,11606],{"class":179},"subQuarter",[173,11608,1200],{"class":1199},[173,11610,1209],{"class":187},[173,11612,308],{"class":1199},[173,11614,1268],{"class":468},[173,11616,11299],{"class":179},[173,11618,1200],{"class":1199},[173,11620,11474],{"class":183},[173,11622,1212],{"class":1199},[173,11624,11625],{"class":175,"line":7023},[173,11626,227],{"emptyLinePlaceholder":226},[173,11628,11629],{"class":175,"line":7028},[173,11630,11631],{"class":208},"\u002F\u002F印出結果：2024-01-25 07:31:57 \u002F 2023-07-25 07:31:57\n",[173,11633,11634],{"class":175,"line":7033},[173,11635,227],{"emptyLinePlaceholder":226},[173,11637,11638],{"class":175,"line":7038},[173,11639,11231],{"class":208},[173,11641,11642],{"class":175,"line":7048},[173,11643,11644],{"class":208}," * 將月份增加\u002F減少 `$value`\n",[173,11646,11647],{"class":175,"line":7089},[173,11648,11241],{"class":208},[173,11650,11651,11653,11655,11657,11659,11661,11663,11666,11668,11670,11672,11674,11676,11678,11680],{"class":175,"line":7100},[173,11652,1424],{"class":187},[173,11654,11248],{"class":187},[173,11656,11083],{"class":468},[173,11658,11086],{"class":179},[173,11660,11294],{"class":1199},[173,11662,1268],{"class":468},[173,11664,11665],{"class":179},"subMonth",[173,11667,1200],{"class":1199},[173,11669,1209],{"class":187},[173,11671,308],{"class":1199},[173,11673,1268],{"class":468},[173,11675,11299],{"class":179},[173,11677,1200],{"class":1199},[173,11679,11474],{"class":183},[173,11681,1212],{"class":1199},[173,11683,11684,11686,11688],{"class":175,"line":7111},[173,11685,1424],{"class":187},[173,11687,11483],{"class":183},[173,11689,1442],{"class":1199},[173,11691,11692,11694,11696,11698,11700,11702,11704,11707,11709,11711,11713,11715,11717,11719,11721],{"class":175,"line":7122},[173,11693,1424],{"class":187},[173,11695,11248],{"class":187},[173,11697,11083],{"class":468},[173,11699,11086],{"class":179},[173,11701,11294],{"class":1199},[173,11703,1268],{"class":468},[173,11705,11706],{"class":179},"addMonth",[173,11708,1200],{"class":1199},[173,11710,1209],{"class":187},[173,11712,308],{"class":1199},[173,11714,1268],{"class":468},[173,11716,11299],{"class":179},[173,11718,1200],{"class":1199},[173,11720,11474],{"class":183},[173,11722,1212],{"class":1199},[173,11724,11725],{"class":175,"line":7133},[173,11726,227],{"emptyLinePlaceholder":226},[173,11728,11729],{"class":175,"line":7144},[173,11730,11731],{"class":208},"\u002F\u002F印出結果：2023-09-25 07:37:37 \u002F 2023-11-25 07:37:37\n",[173,11733,11734],{"class":175,"line":7155},[173,11735,227],{"emptyLinePlaceholder":226},[173,11737,11738],{"class":175,"line":7168},[173,11739,11231],{"class":208},[173,11741,11742],{"class":175,"line":7173},[173,11743,11744],{"class":208}," * 將天數增加\u002F減少 `$value`\n",[173,11746,11747],{"class":175,"line":7178},[173,11748,11241],{"class":208},[173,11750,11751,11753,11755,11757,11759,11761,11763,11766,11768,11770,11772,11774,11776,11778,11780],{"class":175,"line":7185},[173,11752,1424],{"class":187},[173,11754,11248],{"class":187},[173,11756,11083],{"class":468},[173,11758,11086],{"class":179},[173,11760,11294],{"class":1199},[173,11762,1268],{"class":468},[173,11764,11765],{"class":179},"subDay",[173,11767,1200],{"class":1199},[173,11769,1209],{"class":187},[173,11771,308],{"class":1199},[173,11773,1268],{"class":468},[173,11775,11299],{"class":179},[173,11777,1200],{"class":1199},[173,11779,11474],{"class":183},[173,11781,1212],{"class":1199},[173,11783,11784,11786,11788],{"class":175,"line":7196},[173,11785,1424],{"class":187},[173,11787,11483],{"class":183},[173,11789,1442],{"class":1199},[173,11791,11792,11794,11796,11798,11800,11802,11804,11807,11809,11811,11813,11815,11817,11819,11821],{"class":175,"line":7221},[173,11793,1424],{"class":187},[173,11795,11248],{"class":187},[173,11797,11083],{"class":468},[173,11799,11086],{"class":179},[173,11801,11294],{"class":1199},[173,11803,1268],{"class":468},[173,11805,11806],{"class":179},"addDay",[173,11808,1200],{"class":1199},[173,11810,1209],{"class":187},[173,11812,308],{"class":1199},[173,11814,1268],{"class":468},[173,11816,11299],{"class":179},[173,11818,1200],{"class":1199},[173,11820,11474],{"class":183},[173,11822,1212],{"class":1199},[173,11824,11825],{"class":175,"line":7226},[173,11826,227],{"emptyLinePlaceholder":226},[173,11828,11829],{"class":175,"line":7231},[173,11830,11831],{"class":208},"\u002F\u002F印出結果：2023-10-24 07:38:45 \u002F 2023-10-26 07:38:45\n",[173,11833,11834],{"class":175,"line":7238},[173,11835,227],{"emptyLinePlaceholder":226},[173,11837,11838],{"class":175,"line":7251},[173,11839,11231],{"class":208},[173,11841,11842],{"class":175,"line":7256},[173,11843,11844],{"class":208}," * 將小時增加\u002F減少 `$value`\n",[173,11846,11847],{"class":175,"line":7261},[173,11848,11241],{"class":208},[173,11850,11851,11853,11855,11857,11859,11861,11863,11866,11868,11870,11872,11874,11876,11878,11880],{"class":175,"line":7266},[173,11852,1424],{"class":187},[173,11854,11248],{"class":187},[173,11856,11083],{"class":468},[173,11858,11086],{"class":179},[173,11860,11294],{"class":1199},[173,11862,1268],{"class":468},[173,11864,11865],{"class":179},"subHour",[173,11867,1200],{"class":1199},[173,11869,1209],{"class":187},[173,11871,308],{"class":1199},[173,11873,1268],{"class":468},[173,11875,11299],{"class":179},[173,11877,1200],{"class":1199},[173,11879,11474],{"class":183},[173,11881,1212],{"class":1199},[173,11883,11884,11886,11888],{"class":175,"line":7317},[173,11885,1424],{"class":187},[173,11887,11483],{"class":183},[173,11889,1442],{"class":1199},[173,11891,11892,11894,11896,11898,11900,11902,11904,11907,11909,11911,11913,11915,11917,11919,11921],{"class":175,"line":7330},[173,11893,1424],{"class":187},[173,11895,11248],{"class":187},[173,11897,11083],{"class":468},[173,11899,11086],{"class":179},[173,11901,11294],{"class":1199},[173,11903,1268],{"class":468},[173,11905,11906],{"class":179},"addHour",[173,11908,1200],{"class":1199},[173,11910,1209],{"class":187},[173,11912,308],{"class":1199},[173,11914,1268],{"class":468},[173,11916,11299],{"class":179},[173,11918,1200],{"class":1199},[173,11920,11474],{"class":183},[173,11922,1212],{"class":1199},[173,11924,11925],{"class":175,"line":7342},[173,11926,227],{"emptyLinePlaceholder":226},[173,11928,11929],{"class":175,"line":7347},[173,11930,11931],{"class":208},"\u002F\u002F印出結果：2023-10-25 06:48:25 \u002F 2023-10-25 08:48:25\n",[173,11933,11934],{"class":175,"line":7358},[173,11935,227],{"emptyLinePlaceholder":226},[173,11937,11938],{"class":175,"line":7389},[173,11939,11231],{"class":208},[173,11941,11942],{"class":175,"line":7414},[173,11943,11944],{"class":208}," * 將秒數增加\u002F減少 `$value`\n",[173,11946,11947],{"class":175,"line":7435},[173,11948,11241],{"class":208},[173,11950,11951,11953,11955,11957,11959,11961,11963,11966,11968,11970,11972,11974,11976,11978,11980],{"class":175,"line":7459},[173,11952,1424],{"class":187},[173,11954,11248],{"class":187},[173,11956,11083],{"class":468},[173,11958,11086],{"class":179},[173,11960,11294],{"class":1199},[173,11962,1268],{"class":468},[173,11964,11965],{"class":179},"subSecond",[173,11967,1200],{"class":1199},[173,11969,1209],{"class":187},[173,11971,308],{"class":1199},[173,11973,1268],{"class":468},[173,11975,11299],{"class":179},[173,11977,1200],{"class":1199},[173,11979,11474],{"class":183},[173,11981,1212],{"class":1199},[173,11983,11984,11986,11988],{"class":175,"line":7482},[173,11985,1424],{"class":187},[173,11987,11483],{"class":183},[173,11989,1442],{"class":1199},[173,11991,11992,11994,11996,11998,12000,12002,12004,12007,12009,12011,12013,12015,12017,12019,12021],{"class":175,"line":7509},[173,11993,1424],{"class":187},[173,11995,11248],{"class":187},[173,11997,11083],{"class":468},[173,11999,11086],{"class":179},[173,12001,11294],{"class":1199},[173,12003,1268],{"class":468},[173,12005,12006],{"class":179},"addSecond",[173,12008,1200],{"class":1199},[173,12010,1209],{"class":187},[173,12012,308],{"class":1199},[173,12014,1268],{"class":468},[173,12016,11299],{"class":179},[173,12018,1200],{"class":1199},[173,12020,11474],{"class":183},[173,12022,1212],{"class":1199},[173,12024,12025],{"class":175,"line":7524},[173,12026,227],{"emptyLinePlaceholder":226},[173,12028,12029],{"class":175,"line":7543},[173,12030,12031],{"class":208},"\u002F\u002F印出結果：2023-10-25 07:49:58 \u002F 2023-10-25 07:50:00\n",[44,12033,12034],{"id":12034},"比較時間",[52,12036,12037,12047,12055,12063,12071],{},[55,12038,12039,12042,12043,12046],{},[19,12040,12041],{},"eq($datetime)","：是否等於 ",[19,12044,12045],{},"$datetime","，回傳布林值",[55,12048,12049,12052,12053,12046],{},[19,12050,12051],{},"ne($datetime)","：是否不等於 ",[19,12054,12045],{},[55,12056,12057,12060,12061,12046],{},[19,12058,12059],{},"gt($datetime)","：是否大於 ",[19,12062,12045],{},[55,12064,12065,12068,12069,12046],{},[19,12066,12067],{},"lt($datetime)","：是否小於 ",[19,12070,12045],{},[55,12072,12073,12076,12077,2590,12080,12083],{},[19,12074,12075],{},"between($startTime, $endTime)","：是否介於 ",[19,12078,12079],{},"$startTime",[19,12081,12082],{},"$endTime"," 之間，回傳布林值",[90,12085,10282],{"id":12086},"範例-1",[164,12088,12090],{"className":1183,"code":12089,"language":1130,"meta":169,"style":169},"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",[19,12091,12092,12100,12104,12108,12113,12117,12148,12153,12181,12186,12190,12194,12199,12203,12232,12236,12264,12268,12272,12276,12281,12285,12314,12318,12346,12350,12354,12358,12363,12367,12396,12400,12428,12432,12436,12440,12445,12449,12487,12492,12538],{"__ignoreMap":169},[173,12093,12094,12096,12098],{"class":175,"line":176},[173,12095,11056],{"class":468},[173,12097,11059],{"class":187},[173,12099,1442],{"class":1199},[173,12101,12102],{"class":175,"line":212},[173,12103,227],{"emptyLinePlaceholder":226},[173,12105,12106],{"class":175,"line":223},[173,12107,11231],{"class":208},[173,12109,12110],{"class":175,"line":230},[173,12111,12112],{"class":208}," * 比較兩個時間，是否相等\n",[173,12114,12115],{"class":175,"line":236},[173,12116,11241],{"class":208},[173,12118,12119,12122,12124,12126,12128,12130,12132,12134,12137,12139,12141,12143,12145],{"class":175,"line":249},[173,12120,12121],{"class":187},"var_dump",[173,12123,1200],{"class":1199},[173,12125,11080],{"class":187},[173,12127,11083],{"class":468},[173,12129,11291],{"class":179},[173,12131,11294],{"class":1199},[173,12133,1268],{"class":468},[173,12135,12136],{"class":179},"eq",[173,12138,1200],{"class":1199},[173,12140,11080],{"class":187},[173,12142,11083],{"class":468},[173,12144,11291],{"class":179},[173,12146,12147],{"class":1199},"()));\n",[173,12149,12150],{"class":175,"line":254},[173,12151,12152],{"class":208},"\u002F\u002F印出結果：bool(true)\n",[173,12154,12155,12157,12159,12161,12163,12165,12167,12169,12171,12173,12175,12177,12179],{"class":175,"line":260},[173,12156,12121],{"class":187},[173,12158,1200],{"class":1199},[173,12160,11080],{"class":187},[173,12162,11083],{"class":468},[173,12164,11291],{"class":179},[173,12166,11294],{"class":1199},[173,12168,1268],{"class":468},[173,12170,12136],{"class":179},[173,12172,1200],{"class":1199},[173,12174,11080],{"class":187},[173,12176,11083],{"class":468},[173,12178,11086],{"class":179},[173,12180,12147],{"class":1199},[173,12182,12183],{"class":175,"line":356},[173,12184,12185],{"class":208},"\u002F\u002F印出結果：bool(false)\n",[173,12187,12188],{"class":175,"line":362},[173,12189,227],{"emptyLinePlaceholder":226},[173,12191,12192],{"class":175,"line":368},[173,12193,11231],{"class":208},[173,12195,12196],{"class":175,"line":374},[173,12197,12198],{"class":208}," * 比較兩個時間，是否不相等\n",[173,12200,12201],{"class":175,"line":380},[173,12202,11241],{"class":208},[173,12204,12205,12207,12209,12211,12213,12215,12217,12219,12222,12224,12226,12228,12230],{"class":175,"line":385},[173,12206,12121],{"class":187},[173,12208,1200],{"class":1199},[173,12210,11080],{"class":187},[173,12212,11083],{"class":468},[173,12214,11291],{"class":179},[173,12216,11294],{"class":1199},[173,12218,1268],{"class":468},[173,12220,12221],{"class":179},"ne",[173,12223,1200],{"class":1199},[173,12225,11080],{"class":187},[173,12227,11083],{"class":468},[173,12229,11291],{"class":179},[173,12231,12147],{"class":1199},[173,12233,12234],{"class":175,"line":1405},[173,12235,12185],{"class":208},[173,12237,12238,12240,12242,12244,12246,12248,12250,12252,12254,12256,12258,12260,12262],{"class":175,"line":1416},[173,12239,12121],{"class":187},[173,12241,1200],{"class":1199},[173,12243,11080],{"class":187},[173,12245,11083],{"class":468},[173,12247,11291],{"class":179},[173,12249,11294],{"class":1199},[173,12251,1268],{"class":468},[173,12253,12221],{"class":179},[173,12255,1200],{"class":1199},[173,12257,11080],{"class":187},[173,12259,11083],{"class":468},[173,12261,11347],{"class":179},[173,12263,12147],{"class":1199},[173,12265,12266],{"class":175,"line":1421},[173,12267,12152],{"class":208},[173,12269,12270],{"class":175,"line":1718},[173,12271,227],{"emptyLinePlaceholder":226},[173,12273,12274],{"class":175,"line":1724},[173,12275,11231],{"class":208},[173,12277,12278],{"class":175,"line":1729},[173,12279,12280],{"class":208}," * 比較兩個時間，是否大於\n",[173,12282,12283],{"class":175,"line":1735},[173,12284,11241],{"class":208},[173,12286,12287,12289,12291,12293,12295,12297,12299,12301,12304,12306,12308,12310,12312],{"class":175,"line":4815},[173,12288,12121],{"class":187},[173,12290,1200],{"class":1199},[173,12292,11080],{"class":187},[173,12294,11083],{"class":468},[173,12296,11347],{"class":179},[173,12298,11294],{"class":1199},[173,12300,1268],{"class":468},[173,12302,12303],{"class":179},"gt",[173,12305,1200],{"class":1199},[173,12307,11080],{"class":187},[173,12309,11083],{"class":468},[173,12311,11086],{"class":179},[173,12313,12147],{"class":1199},[173,12315,12316],{"class":175,"line":4826},[173,12317,12152],{"class":208},[173,12319,12320,12322,12324,12326,12328,12330,12332,12334,12336,12338,12340,12342,12344],{"class":175,"line":4837},[173,12321,12121],{"class":187},[173,12323,1200],{"class":1199},[173,12325,11080],{"class":187},[173,12327,11083],{"class":468},[173,12329,11086],{"class":179},[173,12331,11294],{"class":1199},[173,12333,1268],{"class":468},[173,12335,12303],{"class":179},[173,12337,1200],{"class":1199},[173,12339,11080],{"class":187},[173,12341,11083],{"class":468},[173,12343,11347],{"class":179},[173,12345,12147],{"class":1199},[173,12347,12348],{"class":175,"line":4842},[173,12349,12185],{"class":208},[173,12351,12352],{"class":175,"line":4848},[173,12353,227],{"emptyLinePlaceholder":226},[173,12355,12356],{"class":175,"line":4858},[173,12357,11231],{"class":208},[173,12359,12360],{"class":175,"line":4872},[173,12361,12362],{"class":208}," * 比較兩個時間，是否小於\n",[173,12364,12365],{"class":175,"line":4877},[173,12366,11241],{"class":208},[173,12368,12369,12371,12373,12375,12377,12379,12381,12383,12386,12388,12390,12392,12394],{"class":175,"line":4883},[173,12370,12121],{"class":187},[173,12372,1200],{"class":1199},[173,12374,11080],{"class":187},[173,12376,11083],{"class":468},[173,12378,11086],{"class":179},[173,12380,11294],{"class":1199},[173,12382,1268],{"class":468},[173,12384,12385],{"class":179},"lt",[173,12387,1200],{"class":1199},[173,12389,11080],{"class":187},[173,12391,11083],{"class":468},[173,12393,11347],{"class":179},[173,12395,12147],{"class":1199},[173,12397,12398],{"class":175,"line":4897},[173,12399,12152],{"class":208},[173,12401,12402,12404,12406,12408,12410,12412,12414,12416,12418,12420,12422,12424,12426],{"class":175,"line":4908},[173,12403,12121],{"class":187},[173,12405,1200],{"class":1199},[173,12407,11080],{"class":187},[173,12409,11083],{"class":468},[173,12411,11347],{"class":179},[173,12413,11294],{"class":1199},[173,12415,1268],{"class":468},[173,12417,12385],{"class":179},[173,12419,1200],{"class":1199},[173,12421,11080],{"class":187},[173,12423,11083],{"class":468},[173,12425,11086],{"class":179},[173,12427,12147],{"class":1199},[173,12429,12430],{"class":175,"line":4919},[173,12431,12185],{"class":208},[173,12433,12434],{"class":175,"line":6841},[173,12435,227],{"emptyLinePlaceholder":226},[173,12437,12438],{"class":175,"line":6873},[173,12439,11231],{"class":208},[173,12441,12442],{"class":175,"line":6884},[173,12443,12444],{"class":208}," * 是否介於 `$startTime`、`$endTime` 之間\n",[173,12446,12447],{"class":175,"line":6895},[173,12448,11241],{"class":208},[173,12450,12451,12453,12455,12457,12459,12461,12463,12465,12468,12470,12472,12474,12476,12479,12481,12483,12485],{"class":175,"line":6906},[173,12452,12121],{"class":187},[173,12454,1200],{"class":1199},[173,12456,11080],{"class":187},[173,12458,11083],{"class":468},[173,12460,11086],{"class":179},[173,12462,11294],{"class":1199},[173,12464,1268],{"class":468},[173,12466,12467],{"class":179},"between",[173,12469,1200],{"class":1199},[173,12471,11080],{"class":187},[173,12473,11083],{"class":468},[173,12475,11400],{"class":179},[173,12477,12478],{"class":1199},"(), ",[173,12480,11080],{"class":187},[173,12482,11083],{"class":468},[173,12484,11347],{"class":179},[173,12486,12147],{"class":1199},[173,12488,12489],{"class":175,"line":6917},[173,12490,12491],{"class":208},"\u002F\u002F 印出結果：bool(true)\n",[173,12493,12494,12496,12498,12500,12502,12504,12506,12508,12510,12512,12514,12516,12518,12520,12522,12524,12526,12528,12530,12532,12534,12536],{"class":175,"line":6928},[173,12495,12121],{"class":187},[173,12497,1200],{"class":1199},[173,12499,11080],{"class":187},[173,12501,11083],{"class":468},[173,12503,11086],{"class":179},[173,12505,11294],{"class":1199},[173,12507,1268],{"class":468},[173,12509,11806],{"class":179},[173,12511,1200],{"class":1199},[173,12513,1698],{"class":187},[173,12515,308],{"class":1199},[173,12517,1268],{"class":468},[173,12519,12467],{"class":179},[173,12521,1200],{"class":1199},[173,12523,11080],{"class":187},[173,12525,11083],{"class":468},[173,12527,11400],{"class":179},[173,12529,12478],{"class":1199},[173,12531,11080],{"class":187},[173,12533,11083],{"class":468},[173,12535,11347],{"class":179},[173,12537,12147],{"class":1199},[173,12539,12540],{"class":175,"line":6940},[173,12541,12542],{"class":208},"\u002F\u002F 印出結果：bool(false)\n",[894,12544,12545],{},"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":169,"searchDepth":212,"depth":212,"links":12547},[12548,12549,12550,12553],{"id":993,"depth":212,"text":993},{"id":11092,"depth":212,"text":11092},{"id":11103,"depth":212,"text":11103,"children":12551},[12552],{"id":10282,"depth":223,"text":10282},{"id":12034,"depth":212,"text":12034,"children":12554},[12555],{"id":12086,"depth":223,"text":10282},"\u002Fimages\u002Farticles\u002F2023-10-04-php-carbon\u002Fcover.png",{},"\u002Farticles\u002F2023-10-04-php-carbon","2023-10-04 18:34:00",{"title":11001,"description":169},"articles\u002F2023-10-04-php-carbon","PHP語言在處理日期和時間時，Carbon 套件是一個非常有用的工具。Carbon 套件繼承了原生的 Datetime，並新增了許多語意化的行為，讓處理時間的難度降低許多。在這篇教學中，將會介紹 Carbon 套件的基本使用方法，以及如何在 PHP 中使用 Carbon 套件來處理日期和時間。",[1130],"Xh7cdroYoCQtQdwWDDM6GaqTsi98DBN_3I6O6Srqow4",{"id":12566,"title":12567,"body":12568,"category":2635,"description":169,"extension":921,"image":12646,"meta":12647,"navigation":226,"path":12648,"pubDate":12559,"seo":12649,"status":226,"stem":12650,"summary":12651,"tags":12652,"__hash__":12654},"content\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id.md","如何取得 Telegram Bot 所有的 Chat ID",{"type":8,"value":12569,"toc":12639},[12570,12574,12577,12581,12588,12593,12596,12600,12603,12607,12614,12618,12627],[44,12571,12573],{"id":12572},"步驟1-創建-telegram-bot-並獲取-api-token","步驟1: 創建 Telegram Bot 並獲取 API Token",[15,12575,12576],{},"首先,我們需要透過 Telegram 的 @BotFather 創建一個新的 Bot,並獲取該 Bot 的 API Token。API Token 是一個類似於 \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\" 的字串,用於向 Telegram 的 API 服務器進行身份驗證。",[44,12578,12580],{"id":12579},"步驟2-使用-getupdates-方法獲取更新","步驟2: 使用 getUpdates 方法獲取更新",[15,12582,12583,12584],{},"接下來,我們可以在瀏覽器中訪問以下 URL,將 ",[12585,12586,12587],"token",{}," 替換為你的 API Token:",[15,12589,12590],{},[19,12591,12592],{},"https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002FgetUpdates",[15,12594,12595],{},"這將返回一個 JSON 格式的數據,包含了最近的更新。",[44,12597,12599],{"id":12598},"步驟3-從更新中提取-chat-id","步驟3: 從更新中提取 Chat ID",[15,12601,12602],{},"在返回的 JSON 數據中,查找 \"result\" 數組。每個元素代表一個更新,其中包含 \"message\" 或 \"channel_post\" 對象。在這些對象中,可以找到 \"chat\" 對象,其 \"id\" 字段就是該會話的 Chat ID。\n對於私人會話,Chat ID 為正整數。對於群組,Chat ID 為負數,需要在前面加 \"-100\"。",[44,12604,12606],{"id":12605},"步驟4-儲存所有-chat-id","步驟4: 儲存所有 Chat ID",[15,12608,12609,12610,12613],{},"遍歷所有更新的 \"chat\" 對象,獲取並儲存所有的 Chat ID。需要注意的是,",[19,12611,12612],{},"getUpdates"," 只能獲取最近的更新,如果要獲取所有的 Chat ID,可能需要多次調用該方法。",[44,12615,12617],{"id":12616},"在-php-語言中如何快速取得","在 PHP 語言中，如何快速取得",[15,12619,12620,12621,12626],{},"可使用 ",[283,12622,12625],{"href":12623,"rel":12624},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore",[287],"php-telegram-bot\u002Fcore"," 這個套件處理。",[15,12628,12629,12630,12633,12634],{},"透過 Webhook 方式，使用 ",[19,12631,12632],{},"getupdates"," 函式來取得 chat id, 可參考 ",[283,12635,12638],{"href":12636,"rel":12637},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore?tab=readme-ov-file#getupdates-installation",[287],"官方教學",{"title":169,"searchDepth":212,"depth":212,"links":12640},[12641,12642,12643,12644,12645],{"id":12572,"depth":212,"text":12573},{"id":12579,"depth":212,"text":12580},{"id":12598,"depth":212,"text":12599},{"id":12605,"depth":212,"text":12606},{"id":12616,"depth":212,"text":12617},"\u002Fimages\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id\u002Fcover.png",{},"\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id",{"title":12567,"description":169},"articles\u002F2024-05-01-telegram-bot-get-chat-id","在開發 Telegram Bot 時,有時候我們需要獲取所有與 Bot 互動過的 Chat ID,無論是私人對話還是群組對話。取得這些 Chat ID 對於發送廣播消息或管理會話非常有用。本文將詳細介紹如何透過 Telegram Bot API 獲取所有的 Chat ID。",[12653,1130],"Telegram","NGatZI0ync1nfpUr5-l0cWDQlW30EzCC3zULFpvSyyw",{"id":12656,"title":12657,"body":12658,"category":2635,"description":169,"extension":921,"image":13533,"meta":13534,"navigation":226,"path":13535,"pubDate":13536,"seo":13537,"status":226,"stem":13538,"summary":13539,"tags":13540,"__hash__":13541},"content\u002Farticles\u002F2023-05-07-go-function.md","《Go 學習筆記6》函式",{"type":8,"value":12659,"toc":13529},[12660,12665,12668,12671,12732,12736,12866,12870,12891,12895,12943,12947,13075,13079,13088,13092,13097,13164,13168,13497,13501,13526],[621,12661,12662],{},[15,12663,12664],{},"這是自學 Go lang 的筆記，若內容有誤，請留言區提醒，我會儘快改正，謝謝",[15,12666,12667],{},"在 Go 語中，為了可以重復使用某個程式碼片段，我們使用函式 (function) 來進實作。而在 Go 語言中，function 可以輸入多個參數值，也可以回傳多個參數值",[15,12669,12670],{},"##無 return 函式",[164,12672,12676],{"className":12673,"code":12674,"language":12675,"meta":169,"style":169},"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",[19,12677,12678,12706,12711,12715,12719,12724],{"__ignoreMap":169},[173,12679,12680,12683,12686,12689,12692,12694,12697,12699,12701,12704],{"class":175,"line":176},[173,12681,12682],{"class":468},"func",[173,12684,12685],{"class":1199}," 函式名 (",[173,12687,12688],{"class":6549},"參數1",[173,12690,12691],{"class":179}," 變數型態",[173,12693,1279],{"class":1199},[173,12695,12696],{"class":6549},"參數2",[173,12698,12691],{"class":179},[173,12700,1279],{"class":1199},[173,12702,12703],{"class":468},"...",[173,12705,1622],{"class":1199},[173,12707,12708],{"class":175,"line":212},[173,12709,12710],{"class":208},"    \u002F\u002F執行程式片段\n",[173,12712,12713],{"class":175,"line":223},[173,12714,1721],{"class":1199},[173,12716,12717],{"class":175,"line":230},[173,12718,227],{"emptyLinePlaceholder":226},[173,12720,12721],{"class":175,"line":236},[173,12722,12723],{"class":208},"\u002F\u002F呼叫方式\n",[173,12725,12726,12729],{"class":175,"line":249},[173,12727,12728],{"class":179},"函式名",[173,12730,12731],{"class":1199},"(參數1, 參數2)\n",[15,12733,12734],{},[28,12735,10282],{},[164,12737,12739],{"className":12673,"code":12738,"language":12675,"meta":169,"style":169},"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",[19,12740,12741,12749,12763,12772,12789,12793,12797,12822,12843,12862],{"__ignoreMap":169},[173,12742,12743,12746],{"class":175,"line":176},[173,12744,12745],{"class":468},"package",[173,12747,12748],{"class":179}," main\n",[173,12750,12751,12754,12757,12760],{"class":175,"line":212},[173,12752,12753],{"class":468},"import",[173,12755,12756],{"class":183}," \"",[173,12758,12759],{"class":179},"fmt",[173,12761,12762],{"class":183},"\"\n",[173,12764,12765,12767,12770],{"class":175,"line":223},[173,12766,12682],{"class":468},[173,12768,12769],{"class":179}," main",[173,12771,6664],{"class":1199},[173,12773,12774,12777,12779,12782,12784,12787],{"class":175,"line":230},[173,12775,12776],{"class":179},"    hello",[173,12778,1200],{"class":1199},[173,12780,12781],{"class":183},"\"Allen\"",[173,12783,1279],{"class":1199},[173,12785,12786],{"class":187},"23",[173,12788,1285],{"class":1199},[173,12790,12791],{"class":175,"line":236},[173,12792,1721],{"class":1199},[173,12794,12795],{"class":175,"line":249},[173,12796,227],{"emptyLinePlaceholder":226},[173,12798,12799,12801,12804,12806,12809,12812,12814,12817,12820],{"class":175,"line":254},[173,12800,12682],{"class":468},[173,12802,12803],{"class":179}," hello",[173,12805,1200],{"class":1199},[173,12807,12808],{"class":6549},"name",[173,12810,12811],{"class":468}," string",[173,12813,1279],{"class":1199},[173,12815,12816],{"class":6549},"age",[173,12818,12819],{"class":468}," int8",[173,12821,1622],{"class":1199},[173,12823,12824,12827,12830,12832,12835,12838,12840],{"class":175,"line":260},[173,12825,12826],{"class":1199},"    fmt.",[173,12828,12829],{"class":179},"Printf",[173,12831,1200],{"class":1199},[173,12833,12834],{"class":183},"\"Hello ",[173,12836,12837],{"class":187},"%s\\r\\n",[173,12839,1439],{"class":183},[173,12841,12842],{"class":1199},", name)\n",[173,12844,12845,12847,12849,12851,12854,12857,12859],{"class":175,"line":356},[173,12846,12826],{"class":1199},[173,12848,12829],{"class":179},[173,12850,1200],{"class":1199},[173,12852,12853],{"class":183},"\"年紀 ",[173,12855,12856],{"class":187},"%d\\r\\n",[173,12858,1439],{"class":183},[173,12860,12861],{"class":1199},", age)\n",[173,12863,12864],{"class":175,"line":362},[173,12865,1721],{"class":1199},[15,12867,12868],{},[28,12869,8332],{},[164,12871,12873],{"className":166,"code":12872,"language":168,"meta":169,"style":169},"Hello Allen\n年紀 23\n",[19,12874,12875,12883],{"__ignoreMap":169},[173,12876,12877,12880],{"class":175,"line":176},[173,12878,12879],{"class":179},"Hello",[173,12881,12882],{"class":183}," Allen\n",[173,12884,12885,12888],{"class":175,"line":212},[173,12886,12887],{"class":179},"年紀",[173,12889,12890],{"class":187}," 23\n",[44,12892,12894],{"id":12893},"return-函式","return 函式",[164,12896,12898],{"className":12673,"code":12897,"language":12675,"meta":169,"style":169},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) 回傳型態 {\n    \u002F\u002F執行程式片段\n    return 回傳值\n}\n",[19,12899,12900,12928,12932,12939],{"__ignoreMap":169},[173,12901,12902,12904,12907,12909,12911,12913,12915,12917,12919,12921,12923,12926],{"class":175,"line":176},[173,12903,12682],{"class":468},[173,12905,12906],{"class":1199}," 函式名  (",[173,12908,12688],{"class":6549},[173,12910,12691],{"class":179},[173,12912,1279],{"class":1199},[173,12914,12696],{"class":6549},[173,12916,12691],{"class":179},[173,12918,1279],{"class":1199},[173,12920,12703],{"class":468},[173,12922,7791],{"class":1199},[173,12924,12925],{"class":179},"回傳型態",[173,12927,6254],{"class":1199},[173,12929,12930],{"class":175,"line":212},[173,12931,12710],{"class":208},[173,12933,12934,12936],{"class":175,"line":223},[173,12935,7630],{"class":468},[173,12937,12938],{"class":1199}," 回傳值\n",[173,12940,12941],{"class":175,"line":230},[173,12942,1721],{"class":1199},[15,12944,12945],{},[28,12946,10282],{},[164,12948,12950],{"className":12673,"code":12949,"language":12675,"meta":169,"style":169},"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",[19,12951,12952,12958,12968,12976,13002,13013,13017,13021,13054,13071],{"__ignoreMap":169},[173,12953,12954,12956],{"class":175,"line":176},[173,12955,12745],{"class":468},[173,12957,12748],{"class":179},[173,12959,12960,12962,12964,12966],{"class":175,"line":212},[173,12961,12753],{"class":468},[173,12963,12756],{"class":183},[173,12965,12759],{"class":179},[173,12967,12762],{"class":183},[173,12969,12970,12972,12974],{"class":175,"line":223},[173,12971,12682],{"class":468},[173,12973,12769],{"class":179},[173,12975,6664],{"class":1199},[173,12977,12978,12981,12984,12987,12989,12991,12993,12995,12997,13000],{"class":175,"line":230},[173,12979,12980],{"class":1199},"    total ",[173,12982,12983],{"class":468},":=",[173,12985,12986],{"class":179}," sum",[173,12988,1200],{"class":1199},[173,12990,2192],{"class":187},[173,12992,1279],{"class":1199},[173,12994,1698],{"class":187},[173,12996,1279],{"class":1199},[173,12998,12999],{"class":187},"3",[173,13001,1285],{"class":1199},[173,13003,13004,13007,13010],{"class":175,"line":236},[173,13005,13006],{"class":1199},"    fmt.",[173,13008,13009],{"class":179},"Println",[173,13011,13012],{"class":1199},"(total)\n",[173,13014,13015],{"class":175,"line":249},[173,13016,1721],{"class":1199},[173,13018,13019],{"class":175,"line":254},[173,13020,227],{"emptyLinePlaceholder":226},[173,13022,13023,13025,13027,13029,13031,13034,13036,13038,13040,13042,13045,13047,13049,13052],{"class":175,"line":260},[173,13024,12682],{"class":468},[173,13026,12986],{"class":179},[173,13028,1200],{"class":1199},[173,13030,6550],{"class":6549},[173,13032,13033],{"class":468}," int",[173,13035,1279],{"class":1199},[173,13037,6555],{"class":6549},[173,13039,13033],{"class":468},[173,13041,1279],{"class":1199},[173,13043,13044],{"class":6549},"z",[173,13046,13033],{"class":468},[173,13048,7791],{"class":1199},[173,13050,13051],{"class":468},"int",[173,13053,6254],{"class":1199},[173,13055,13056,13058,13061,13063,13066,13068],{"class":175,"line":356},[173,13057,7630],{"class":468},[173,13059,13060],{"class":1199}," x ",[173,13062,7641],{"class":468},[173,13064,13065],{"class":1199}," y ",[173,13067,7641],{"class":468},[173,13069,13070],{"class":1199}," z\n",[173,13072,13073],{"class":175,"line":362},[173,13074,1721],{"class":1199},[15,13076,13077],{},[28,13078,8332],{},[164,13080,13082],{"className":166,"code":13081,"language":168,"meta":169,"style":169},"9\n",[19,13083,13084],{"__ignoreMap":169},[173,13085,13086],{"class":175,"line":176},[173,13087,13081],{"class":179},[44,13089,13091],{"id":13090},"return-多個值","return 多個值",[15,13093,13094],{},[28,13095,13096],{},"格式",[164,13098,13100],{"className":12673,"code":13099,"language":12675,"meta":169,"style":169},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) (回傳型態1, 回傳型態2, 回傳型態3,...) {\n    \u002F\u002F執行程式片段1\n    return 回傳值1, 回傳值2, 回傳值3,...\n}\n",[19,13101,13102,13145,13150,13160],{"__ignoreMap":169},[173,13103,13104,13106,13108,13110,13112,13114,13116,13118,13120,13122,13125,13128,13130,13133,13135,13138,13141,13143],{"class":175,"line":176},[173,13105,12682],{"class":468},[173,13107,12906],{"class":1199},[173,13109,12688],{"class":6549},[173,13111,12691],{"class":179},[173,13113,1279],{"class":1199},[173,13115,12696],{"class":6549},[173,13117,12691],{"class":179},[173,13119,1279],{"class":1199},[173,13121,12703],{"class":468},[173,13123,13124],{"class":1199},") (",[173,13126,13127],{"class":179},"回傳型態1",[173,13129,1279],{"class":1199},[173,13131,13132],{"class":179},"回傳型態2",[173,13134,1279],{"class":1199},[173,13136,13137],{"class":179},"回傳型態3",[173,13139,13140],{"class":1199},",",[173,13142,12703],{"class":468},[173,13144,1622],{"class":1199},[173,13146,13147],{"class":175,"line":212},[173,13148,13149],{"class":208},"    \u002F\u002F執行程式片段1\n",[173,13151,13152,13154,13157],{"class":175,"line":223},[173,13153,7630],{"class":468},[173,13155,13156],{"class":1199}," 回傳值1, 回傳值2, 回傳值3,",[173,13158,13159],{"class":468},"...\n",[173,13161,13162],{"class":175,"line":230},[173,13163,1721],{"class":1199},[15,13165,13166],{},[28,13167,10282],{},[164,13169,13171],{"className":12673,"code":13170,"language":12675,"meta":169,"style":169},"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",[19,13172,13173,13179,13189,13193,13201,13212,13222,13232,13241,13250,13255,13267,13271,13284,13288,13305,13323,13342,13360,13364,13368,13372,13400,13422,13426,13430,13450,13463,13471,13481,13488,13493],{"__ignoreMap":169},[173,13174,13175,13177],{"class":175,"line":176},[173,13176,12745],{"class":468},[173,13178,12748],{"class":179},[173,13180,13181,13183,13185,13187],{"class":175,"line":212},[173,13182,12753],{"class":468},[173,13184,12756],{"class":183},[173,13186,12759],{"class":179},[173,13188,12762],{"class":183},[173,13190,13191],{"class":175,"line":223},[173,13192,227],{"emptyLinePlaceholder":226},[173,13194,13195,13197,13199],{"class":175,"line":230},[173,13196,12682],{"class":468},[173,13198,12769],{"class":179},[173,13200,6664],{"class":1199},[173,13202,13203,13206,13209],{"class":175,"line":236},[173,13204,13205],{"class":468},"    var",[173,13207,13208],{"class":1199}," name ",[173,13210,13211],{"class":468},"string\n",[173,13213,13214,13216,13219],{"class":175,"line":249},[173,13215,13205],{"class":468},[173,13217,13218],{"class":1199}," sex ",[173,13220,13221],{"class":468},"bool\n",[173,13223,13224,13226,13229],{"class":175,"line":254},[173,13225,13205],{"class":468},[173,13227,13228],{"class":1199}," height ",[173,13230,13231],{"class":468},"float32\n",[173,13233,13234,13236,13239],{"class":175,"line":260},[173,13235,13205],{"class":468},[173,13237,13238],{"class":1199}," weight ",[173,13240,13231],{"class":468},[173,13242,13243,13245,13248],{"class":175,"line":356},[173,13244,13205],{"class":468},[173,13246,13247],{"class":1199}," sexString ",[173,13249,13211],{"class":468},[173,13251,13252],{"class":175,"line":362},[173,13253,13254],{"class":1199},"    \n",[173,13256,13257,13260,13262,13265],{"class":175,"line":368},[173,13258,13259],{"class":1199},"    name, sex, height, weight ",[173,13261,1206],{"class":468},[173,13263,13264],{"class":179}," getPersonData",[173,13266,1856],{"class":1199},[173,13268,13269],{"class":175,"line":374},[173,13270,227],{"emptyLinePlaceholder":226},[173,13272,13273,13276,13278,13281],{"class":175,"line":380},[173,13274,13275],{"class":1199},"    sexString ",[173,13277,1206],{"class":468},[173,13279,13280],{"class":179}," getSexString",[173,13282,13283],{"class":1199},"(sex)\n",[173,13285,13286],{"class":175,"line":385},[173,13287,227],{"emptyLinePlaceholder":226},[173,13289,13290,13292,13294,13296,13299,13301,13303],{"class":175,"line":1405},[173,13291,13006],{"class":1199},[173,13293,12829],{"class":179},[173,13295,1200],{"class":1199},[173,13297,13298],{"class":183},"\"姓名：",[173,13300,12837],{"class":187},[173,13302,1439],{"class":183},[173,13304,12842],{"class":1199},[173,13306,13307,13309,13311,13313,13316,13318,13320],{"class":175,"line":1416},[173,13308,13006],{"class":1199},[173,13310,12829],{"class":179},[173,13312,1200],{"class":1199},[173,13314,13315],{"class":183},"\"性別：",[173,13317,12837],{"class":187},[173,13319,1439],{"class":183},[173,13321,13322],{"class":1199},", sexString)\n",[173,13324,13325,13327,13329,13331,13334,13337,13339],{"class":175,"line":1421},[173,13326,13006],{"class":1199},[173,13328,12829],{"class":179},[173,13330,1200],{"class":1199},[173,13332,13333],{"class":183},"\"身高：",[173,13335,13336],{"class":187},"%.2f\\r\\n",[173,13338,1439],{"class":183},[173,13340,13341],{"class":1199},", height)\n",[173,13343,13344,13346,13348,13350,13353,13355,13357],{"class":175,"line":1718},[173,13345,13006],{"class":1199},[173,13347,12829],{"class":179},[173,13349,1200],{"class":1199},[173,13351,13352],{"class":183},"\"體重：",[173,13354,13336],{"class":187},[173,13356,1439],{"class":183},[173,13358,13359],{"class":1199},", weight)\n",[173,13361,13362],{"class":175,"line":1724},[173,13363,1721],{"class":1199},[173,13365,13366],{"class":175,"line":1729},[173,13367,227],{"emptyLinePlaceholder":226},[173,13369,13370],{"class":175,"line":1735},[173,13371,227],{"emptyLinePlaceholder":226},[173,13373,13374,13376,13378,13381,13384,13386,13389,13391,13394,13396,13398],{"class":175,"line":4815},[173,13375,12682],{"class":468},[173,13377,13264],{"class":179},[173,13379,13380],{"class":1199},"() (",[173,13382,13383],{"class":468},"string",[173,13385,1279],{"class":1199},[173,13387,13388],{"class":468},"bool",[173,13390,1279],{"class":1199},[173,13392,13393],{"class":468},"float32",[173,13395,1279],{"class":1199},[173,13397,13393],{"class":468},[173,13399,1622],{"class":1199},[173,13401,13402,13404,13407,13409,13412,13414,13417,13419],{"class":175,"line":4826},[173,13403,7630],{"class":468},[173,13405,13406],{"class":183}," \"小明\"",[173,13408,1279],{"class":1199},[173,13410,13411],{"class":187},"true",[173,13413,1279],{"class":1199},[173,13415,13416],{"class":187},"175.0",[173,13418,1279],{"class":1199},[173,13420,13421],{"class":187},"60.5\n",[173,13423,13424],{"class":175,"line":4837},[173,13425,1721],{"class":1199},[173,13427,13428],{"class":175,"line":4842},[173,13429,227],{"emptyLinePlaceholder":226},[173,13431,13432,13434,13436,13438,13441,13444,13446,13448],{"class":175,"line":4848},[173,13433,12682],{"class":468},[173,13435,13280],{"class":179},[173,13437,1200],{"class":1199},[173,13439,13440],{"class":6549},"sex",[173,13442,13443],{"class":468}," bool",[173,13445,7791],{"class":1199},[173,13447,13383],{"class":468},[173,13449,6254],{"class":1199},[173,13451,13452,13454,13456,13459,13461],{"class":175,"line":4858},[173,13453,8167],{"class":468},[173,13455,13218],{"class":1199},[173,13457,13458],{"class":468},"==",[173,13460,8159],{"class":187},[173,13462,6254],{"class":1199},[173,13464,13465,13468],{"class":175,"line":4872},[173,13466,13467],{"class":468},"        return",[173,13469,13470],{"class":183}," \"男\"\n",[173,13472,13473,13476,13479],{"class":175,"line":4877},[173,13474,13475],{"class":1199},"    } ",[173,13477,13478],{"class":468},"else",[173,13480,6254],{"class":1199},[173,13482,13483,13485],{"class":175,"line":4883},[173,13484,13467],{"class":468},[173,13486,13487],{"class":183}," \"女\"\n",[173,13489,13490],{"class":175,"line":4897},[173,13491,13492],{"class":1199},"    }\n",[173,13494,13495],{"class":175,"line":4908},[173,13496,1721],{"class":1199},[15,13498,13499],{},[28,13500,8332],{},[164,13502,13504],{"className":166,"code":13503,"language":168,"meta":169,"style":169},"姓名：小明\n性別：男\n身高：175.00\n體重：60.50\n",[19,13505,13506,13511,13516,13521],{"__ignoreMap":169},[173,13507,13508],{"class":175,"line":176},[173,13509,13510],{"class":179},"姓名：小明\n",[173,13512,13513],{"class":175,"line":212},[173,13514,13515],{"class":179},"性別：男\n",[173,13517,13518],{"class":175,"line":223},[173,13519,13520],{"class":179},"身高：175.00\n",[173,13522,13523],{"class":175,"line":230},[173,13524,13525],{"class":179},"體重：60.50\n",[894,13527,13528],{},"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":169,"searchDepth":212,"depth":212,"links":13530},[13531,13532],{"id":12893,"depth":212,"text":12894},{"id":13090,"depth":212,"text":13091},"\u002Fimages\u002Farticles\u002F2023-02-26-go-lang-setup\u002Fcover.png",{},"\u002Farticles\u002F2023-05-07-go-function","2023-04-07 22:34:00",{"title":12657,"description":169},"articles\u002F2023-05-07-go-function","這篇文章，會介紹 Go 語言中，function 的使用方式",[12675],"kPWUrG71WxLeaVN03IJAFQyE8rs9AzsGWm7HLFKYbUw",{"id":13543,"title":13544,"body":13545,"category":2635,"description":169,"extension":921,"image":13533,"meta":16379,"navigation":226,"path":16380,"pubDate":16381,"seo":16382,"status":226,"stem":16383,"summary":16384,"tags":16385,"__hash__":16386},"content\u002Farticles\u002F2023-03-28-flow control.md","《Go 學習筆記5》流程控制",{"type":8,"value":13546,"toc":16370},[13547,13551,13555,13559,13612,13616,13814,13818,13839,13842,13845,13849,13903,13907,14159,14163,14172,14176,14181,14202,14206,14283,14286,14460,14464,15404,15407,15410,15633,15637,15694,15697,15700,16000,16004,16116,16120,16129,16132,16139,16165,16170,16301,16305,16364,16367],[621,13548,13549],{},[15,13550,12664],{},[44,13552,13554],{"id":13553},"if-判斷","if 判斷",[15,13556,13557],{},[28,13558,13096],{},[164,13560,13562],{"className":12673,"code":13561,"language":12675,"meta":169,"style":169},"if 條件1 {\n  \u002F\u002F若條件1成立，則執行此段程式\n} else if 條件2 {\n  \u002F\u002F若條件2成立，則執行此段程式\n} else {\n  \u002F\u002F若上述條件都位成立，則執行本段程式\n}\n",[19,13563,13564,13572,13577,13590,13595,13603,13608],{"__ignoreMap":169},[173,13565,13566,13569],{"class":175,"line":176},[173,13567,13568],{"class":468},"if",[173,13570,13571],{"class":1199}," 條件1 {\n",[173,13573,13574],{"class":175,"line":212},[173,13575,13576],{"class":208},"  \u002F\u002F若條件1成立，則執行此段程式\n",[173,13578,13579,13582,13584,13587],{"class":175,"line":223},[173,13580,13581],{"class":1199},"} ",[173,13583,13478],{"class":468},[173,13585,13586],{"class":468}," if",[173,13588,13589],{"class":1199}," 條件2 {\n",[173,13591,13592],{"class":175,"line":230},[173,13593,13594],{"class":208},"  \u002F\u002F若條件2成立，則執行此段程式\n",[173,13596,13597,13599,13601],{"class":175,"line":236},[173,13598,13581],{"class":1199},[173,13600,13478],{"class":468},[173,13602,6254],{"class":1199},[173,13604,13605],{"class":175,"line":249},[173,13606,13607],{"class":208},"  \u002F\u002F若上述條件都位成立，則執行本段程式\n",[173,13609,13610],{"class":175,"line":254},[173,13611,1721],{"class":1199},[15,13613,13614],{},[28,13615,10282],{},[164,13617,13619],{"className":12673,"code":13618,"language":12675,"meta":169,"style":169},"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",[19,13620,13621,13627,13631,13641,13645,13653,13657,13666,13680,13694,13698,13712,13738,13754,13776,13784,13806,13810],{"__ignoreMap":169},[173,13622,13623,13625],{"class":175,"line":176},[173,13624,12745],{"class":468},[173,13626,12748],{"class":179},[173,13628,13629],{"class":175,"line":212},[173,13630,227],{"emptyLinePlaceholder":226},[173,13632,13633,13635,13637,13639],{"class":175,"line":223},[173,13634,12753],{"class":468},[173,13636,12756],{"class":183},[173,13638,12759],{"class":179},[173,13640,12762],{"class":183},[173,13642,13643],{"class":175,"line":230},[173,13644,227],{"emptyLinePlaceholder":226},[173,13646,13647,13649,13651],{"class":175,"line":236},[173,13648,12682],{"class":468},[173,13650,12769],{"class":179},[173,13652,6664],{"class":1199},[173,13654,13655],{"class":175,"line":249},[173,13656,227],{"emptyLinePlaceholder":226},[173,13658,13659,13661,13664],{"class":175,"line":254},[173,13660,13205],{"class":468},[173,13662,13663],{"class":1199}," grade ",[173,13665,13231],{"class":468},[173,13667,13668,13670,13673,13675,13678],{"class":175,"line":260},[173,13669,13006],{"class":1199},[173,13671,13672],{"class":179},"Print",[173,13674,1200],{"class":1199},[173,13676,13677],{"class":183},"\"請輸入分數：\"",[173,13679,1285],{"class":1199},[173,13681,13682,13684,13687,13689,13691],{"class":175,"line":356},[173,13683,13006],{"class":1199},[173,13685,13686],{"class":179},"Scan",[173,13688,1200],{"class":1199},[173,13690,9392],{"class":468},[173,13692,13693],{"class":1199},"grade)\n",[173,13695,13696],{"class":175,"line":362},[173,13697,227],{"emptyLinePlaceholder":226},[173,13699,13700,13702,13704,13707,13710],{"class":175,"line":368},[173,13701,8167],{"class":468},[173,13703,13663],{"class":1199},[173,13705,13706],{"class":468},">=",[173,13708,13709],{"class":187}," 80",[173,13711,6254],{"class":1199},[173,13713,13714,13717,13719,13721,13724,13727,13730,13733,13735],{"class":175,"line":374},[173,13715,13716],{"class":1199},"        fmt.",[173,13718,12829],{"class":179},[173,13720,1200],{"class":1199},[173,13722,13723],{"class":183},"\"你的成績為：",[173,13725,13726],{"class":187},"%.2f",[173,13728,13729],{"class":183},"，成績不錯唷",[173,13731,13732],{"class":187},"\\r\\n",[173,13734,1439],{"class":183},[173,13736,13737],{"class":1199},", grade)\n",[173,13739,13740,13742,13744,13746,13748,13750,13752],{"class":175,"line":380},[173,13741,13475],{"class":1199},[173,13743,13478],{"class":468},[173,13745,13586],{"class":468},[173,13747,13663],{"class":1199},[173,13749,13706],{"class":468},[173,13751,7298],{"class":187},[173,13753,6254],{"class":1199},[173,13755,13756,13758,13760,13762,13765,13767,13770,13772,13774],{"class":175,"line":385},[173,13757,13716],{"class":1199},[173,13759,12829],{"class":179},[173,13761,1200],{"class":1199},[173,13763,13764],{"class":183},"\"您的成積為 ",[173,13766,13726],{"class":187},[173,13768,13769],{"class":183}," ，恭喜你及格了",[173,13771,13732],{"class":187},[173,13773,1439],{"class":183},[173,13775,13737],{"class":1199},[173,13777,13778,13780,13782],{"class":175,"line":1405},[173,13779,13475],{"class":1199},[173,13781,13478],{"class":468},[173,13783,6254],{"class":1199},[173,13785,13786,13788,13790,13792,13795,13797,13800,13802,13804],{"class":175,"line":1416},[173,13787,13716],{"class":1199},[173,13789,12829],{"class":179},[173,13791,1200],{"class":1199},[173,13793,13794],{"class":183},"\"您的成績為 ",[173,13796,13726],{"class":187},[173,13798,13799],{"class":183}," ，不及格~再努力",[173,13801,13732],{"class":187},[173,13803,1439],{"class":183},[173,13805,13737],{"class":1199},[173,13807,13808],{"class":175,"line":1421},[173,13809,6652],{"class":1199},[173,13811,13812],{"class":175,"line":1718},[173,13813,1721],{"class":1199},[15,13815,13816],{},[28,13817,8332],{},[164,13819,13821],{"className":166,"code":13820,"language":168,"meta":169,"style":169},"請輸入分數：59.99\n您的成績為 59.99 ，不及格~再努力\n",[19,13822,13823,13828],{"__ignoreMap":169},[173,13824,13825],{"class":175,"line":176},[173,13826,13827],{"class":179},"請輸入分數：59.99\n",[173,13829,13830,13833,13836],{"class":175,"line":212},[173,13831,13832],{"class":179},"您的成績為",[173,13834,13835],{"class":187}," 59.99",[173,13837,13838],{"class":183}," ，不及格~再努力\n",[44,13840,13841],{"id":13841},"switch",[15,13843,13844],{},"也是一個判斷語法，會依不用結執行該段程式",[15,13846,13847],{},[28,13848,13096],{},[164,13850,13852],{"className":12673,"code":13851,"language":12675,"meta":169,"style":169},"switch (判斷式) {\n    case value1:\n        \u002F\u002F程式片段1\n    case value2:\n        \u002F\u002F程式片段2\n    default:\n        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n}\n    \n",[19,13853,13854,13861,13869,13874,13881,13886,13894,13899],{"__ignoreMap":169},[173,13855,13856,13858],{"class":175,"line":176},[173,13857,13841],{"class":468},[173,13859,13860],{"class":1199}," (判斷式) {\n",[173,13862,13863,13866],{"class":175,"line":212},[173,13864,13865],{"class":468},"    case",[173,13867,13868],{"class":1199}," value1:\n",[173,13870,13871],{"class":175,"line":223},[173,13872,13873],{"class":208},"        \u002F\u002F程式片段1\n",[173,13875,13876,13878],{"class":175,"line":230},[173,13877,13865],{"class":468},[173,13879,13880],{"class":1199}," value2:\n",[173,13882,13883],{"class":175,"line":236},[173,13884,13885],{"class":208},"        \u002F\u002F程式片段2\n",[173,13887,13888,13891],{"class":175,"line":249},[173,13889,13890],{"class":468},"    default",[173,13892,13893],{"class":1199},":\n",[173,13895,13896],{"class":175,"line":254},[173,13897,13898],{"class":208},"        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n",[173,13900,13901],{"class":175,"line":260},[173,13902,1721],{"class":1199},[15,13904,13905],{},[28,13906,10282],{},[164,13908,13910],{"className":12673,"code":13909,"language":12675,"meta":169,"style":169},"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",[19,13911,13912,13918,13922,13929,13938,13947,13951,13955,13963,13978,13993,14001,14009,14022,14030,14043,14051,14064,14073,14086,14095,14108,14116,14129,14138,14151,14155],{"__ignoreMap":169},[173,13913,13914,13916],{"class":175,"line":176},[173,13915,12745],{"class":468},[173,13917,12748],{"class":179},[173,13919,13920],{"class":175,"line":212},[173,13921,227],{"emptyLinePlaceholder":226},[173,13923,13924,13926],{"class":175,"line":223},[173,13925,12753],{"class":468},[173,13927,13928],{"class":1199}," (\n",[173,13930,13931,13934,13936],{"class":175,"line":230},[173,13932,13933],{"class":183},"    \"",[173,13935,12759],{"class":179},[173,13937,12762],{"class":183},[173,13939,13940,13942,13945],{"class":175,"line":236},[173,13941,13933],{"class":183},[173,13943,13944],{"class":179},"time",[173,13946,12762],{"class":183},[173,13948,13949],{"class":175,"line":249},[173,13950,1285],{"class":1199},[173,13952,13953],{"class":175,"line":254},[173,13954,227],{"emptyLinePlaceholder":226},[173,13956,13957,13959,13961],{"class":175,"line":260},[173,13958,12682],{"class":468},[173,13960,12769],{"class":179},[173,13962,6664],{"class":1199},[173,13964,13965,13968,13970,13973,13976],{"class":175,"line":356},[173,13966,13967],{"class":1199},"    now ",[173,13969,12983],{"class":468},[173,13971,13972],{"class":1199}," time.",[173,13974,13975],{"class":179},"Now",[173,13977,1856],{"class":1199},[173,13979,13980,13983,13985,13988,13991],{"class":175,"line":362},[173,13981,13982],{"class":1199},"    week ",[173,13984,12983],{"class":468},[173,13986,13987],{"class":1199}," now.",[173,13989,13990],{"class":179},"Weekday",[173,13992,1856],{"class":1199},[173,13994,13995,13998],{"class":175,"line":368},[173,13996,13997],{"class":468},"    switch",[173,13999,14000],{"class":1199}," week {\n",[173,14002,14003,14005,14007],{"class":175,"line":374},[173,14004,13865],{"class":468},[173,14006,5572],{"class":187},[173,14008,13893],{"class":1199},[173,14010,14011,14013,14015,14017,14020],{"class":175,"line":380},[173,14012,13716],{"class":1199},[173,14014,13009],{"class":179},[173,14016,1200],{"class":1199},[173,14018,14019],{"class":183},"\"星期日\"",[173,14021,1285],{"class":1199},[173,14023,14024,14026,14028],{"class":175,"line":385},[173,14025,13865],{"class":468},[173,14027,1604],{"class":187},[173,14029,13893],{"class":1199},[173,14031,14032,14034,14036,14038,14041],{"class":175,"line":1405},[173,14033,13716],{"class":1199},[173,14035,13009],{"class":179},[173,14037,1200],{"class":1199},[173,14039,14040],{"class":183},"\"星期一\"",[173,14042,1285],{"class":1199},[173,14044,14045,14047,14049],{"class":175,"line":1416},[173,14046,13865],{"class":468},[173,14048,7285],{"class":187},[173,14050,13893],{"class":1199},[173,14052,14053,14055,14057,14059,14062],{"class":175,"line":1421},[173,14054,13716],{"class":1199},[173,14056,13009],{"class":179},[173,14058,1200],{"class":1199},[173,14060,14061],{"class":183},"\"星期二\"",[173,14063,1285],{"class":1199},[173,14065,14066,14068,14071],{"class":175,"line":1718},[173,14067,13865],{"class":468},[173,14069,14070],{"class":187}," 3",[173,14072,13893],{"class":1199},[173,14074,14075,14077,14079,14081,14084],{"class":175,"line":1724},[173,14076,13716],{"class":1199},[173,14078,13009],{"class":179},[173,14080,1200],{"class":1199},[173,14082,14083],{"class":183},"\"星期三\"",[173,14085,1285],{"class":1199},[173,14087,14088,14090,14093],{"class":175,"line":1729},[173,14089,13865],{"class":468},[173,14091,14092],{"class":187}," 4",[173,14094,13893],{"class":1199},[173,14096,14097,14099,14101,14103,14106],{"class":175,"line":1735},[173,14098,13716],{"class":1199},[173,14100,13009],{"class":179},[173,14102,1200],{"class":1199},[173,14104,14105],{"class":183},"\"星期四\"",[173,14107,1285],{"class":1199},[173,14109,14110,14112,14114],{"class":175,"line":4815},[173,14111,13865],{"class":468},[173,14113,6645],{"class":187},[173,14115,13893],{"class":1199},[173,14117,14118,14120,14122,14124,14127],{"class":175,"line":4826},[173,14119,13716],{"class":1199},[173,14121,13009],{"class":179},[173,14123,1200],{"class":1199},[173,14125,14126],{"class":183},"\"星期五\"",[173,14128,1285],{"class":1199},[173,14130,14131,14133,14136],{"class":175,"line":4837},[173,14132,13865],{"class":468},[173,14134,14135],{"class":187}," 6",[173,14137,13893],{"class":1199},[173,14139,14140,14142,14144,14146,14149],{"class":175,"line":4842},[173,14141,13716],{"class":1199},[173,14143,13009],{"class":179},[173,14145,1200],{"class":1199},[173,14147,14148],{"class":183},"\"星期六\"",[173,14150,1285],{"class":1199},[173,14152,14153],{"class":175,"line":4848},[173,14154,6652],{"class":1199},[173,14156,14157],{"class":175,"line":4858},[173,14158,1721],{"class":1199},[15,14160,14161],{},[28,14162,8332],{},[164,14164,14166],{"className":166,"code":14165,"language":168,"meta":169,"style":169},"星期二\n",[19,14167,14168],{"__ignoreMap":169},[173,14169,14170],{"class":175,"line":176},[173,14171,14165],{"class":179},[44,14173,14175],{"id":14174},"for-迴圈","for 迴圈",[15,14177,14178],{},[28,14179,14180],{},"基本格式",[164,14182,14184],{"className":12673,"code":14183,"language":12675,"meta":169,"style":169},"for 初始執行指令;布林判斷式;後執行指令 {\n    \u002F\u002F若布林判斷式為 true 則執行程式片段\n}\n",[19,14185,14186,14193,14198],{"__ignoreMap":169},[173,14187,14188,14190],{"class":175,"line":176},[173,14189,1596],{"class":468},[173,14191,14192],{"class":1199}," 初始執行指令;布林判斷式;後執行指令 {\n",[173,14194,14195],{"class":175,"line":212},[173,14196,14197],{"class":208},"    \u002F\u002F若布林判斷式為 true 則執行程式片段\n",[173,14199,14200],{"class":175,"line":223},[173,14201,1721],{"class":1199},[15,14203,14204],{},[28,14205,10282],{},[164,14207,14209],{"className":12673,"code":14208,"language":12675,"meta":169,"style":169},"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",[19,14210,14211,14217,14227,14235,14240,14266,14275,14279],{"__ignoreMap":169},[173,14212,14213,14215],{"class":175,"line":176},[173,14214,12745],{"class":468},[173,14216,12748],{"class":179},[173,14218,14219,14221,14223,14225],{"class":175,"line":212},[173,14220,12753],{"class":468},[173,14222,12756],{"class":183},[173,14224,12759],{"class":179},[173,14226,12762],{"class":183},[173,14228,14229,14231,14233],{"class":175,"line":223},[173,14230,12682],{"class":468},[173,14232,12769],{"class":179},[173,14234,6664],{"class":1199},[173,14236,14237],{"class":175,"line":230},[173,14238,14239],{"class":208},"    \u002F\u002F for 循環的基本形式\n",[173,14241,14242,14245,14248,14250,14252,14255,14257,14259,14262,14264],{"class":175,"line":236},[173,14243,14244],{"class":468},"    for",[173,14246,14247],{"class":1199}," i ",[173,14249,12983],{"class":468},[173,14251,5572],{"class":187},[173,14253,14254],{"class":1199},"; i ",[173,14256,6007],{"class":468},[173,14258,6645],{"class":187},[173,14260,14261],{"class":1199},"; i",[173,14263,1619],{"class":468},[173,14265,6254],{"class":1199},[173,14267,14268,14270,14272],{"class":175,"line":249},[173,14269,13716],{"class":1199},[173,14271,13009],{"class":179},[173,14273,14274],{"class":1199},"(i)\n",[173,14276,14277],{"class":175,"line":254},[173,14278,6652],{"class":1199},[173,14280,14281],{"class":175,"line":260},[173,14282,1721],{"class":1199},[15,14284,14285],{},"九九乘法",[164,14287,14289],{"className":12673,"code":14288,"language":12675,"meta":169,"style":169},"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",[19,14290,14291,14297,14307,14311,14319,14328,14336,14361,14386,14405,14435,14439,14452,14456],{"__ignoreMap":169},[173,14292,14293,14295],{"class":175,"line":176},[173,14294,12745],{"class":468},[173,14296,12748],{"class":179},[173,14298,14299,14301,14303,14305],{"class":175,"line":212},[173,14300,12753],{"class":468},[173,14302,12756],{"class":183},[173,14304,12759],{"class":179},[173,14306,12762],{"class":183},[173,14308,14309],{"class":175,"line":223},[173,14310,227],{"emptyLinePlaceholder":226},[173,14312,14313,14315,14317],{"class":175,"line":230},[173,14314,12682],{"class":468},[173,14316,12769],{"class":179},[173,14318,6664],{"class":1199},[173,14320,14321,14323,14325],{"class":175,"line":236},[173,14322,13205],{"class":468},[173,14324,13060],{"class":1199},[173,14326,14327],{"class":468},"int\n",[173,14329,14330,14332,14334],{"class":175,"line":249},[173,14331,13205],{"class":468},[173,14333,13065],{"class":1199},[173,14335,14327],{"class":468},[173,14337,14338,14340,14342,14344,14346,14349,14351,14354,14357,14359],{"class":175,"line":254},[173,14339,14244],{"class":468},[173,14341,13060],{"class":1199},[173,14343,1206],{"class":468},[173,14345,7285],{"class":187},[173,14347,14348],{"class":1199},"; x ",[173,14350,1610],{"class":468},[173,14352,14353],{"class":187}," 9",[173,14355,14356],{"class":1199},"; x",[173,14358,1619],{"class":468},[173,14360,6254],{"class":1199},[173,14362,14363,14366,14368,14370,14372,14375,14377,14379,14382,14384],{"class":175,"line":260},[173,14364,14365],{"class":468},"        for",[173,14367,13065],{"class":1199},[173,14369,1206],{"class":468},[173,14371,1604],{"class":187},[173,14373,14374],{"class":1199},"; y ",[173,14376,1610],{"class":468},[173,14378,14353],{"class":187},[173,14380,14381],{"class":1199},"; y",[173,14383,1619],{"class":468},[173,14385,6254],{"class":1199},[173,14387,14388,14391,14394,14396,14398,14400,14402],{"class":175,"line":356},[173,14389,14390],{"class":468},"            var",[173,14392,14393],{"class":1199}," z ",[173,14395,13051],{"class":468},[173,14397,6440],{"class":468},[173,14399,13060],{"class":1199},[173,14401,7498],{"class":468},[173,14403,14404],{"class":1199}," y\n",[173,14406,14407,14410,14412,14414,14416,14419,14422,14424,14427,14430,14432],{"class":175,"line":362},[173,14408,14409],{"class":1199},"            fmt.",[173,14411,12829],{"class":179},[173,14413,1200],{"class":1199},[173,14415,1439],{"class":183},[173,14417,14418],{"class":187},"%d",[173,14420,14421],{"class":183}," X ",[173,14423,14418],{"class":187},[173,14425,14426],{"class":183}," = ",[173,14428,14429],{"class":187},"%d\\n",[173,14431,1439],{"class":183},[173,14433,14434],{"class":1199},", x, y, z)\n",[173,14436,14437],{"class":175,"line":368},[173,14438,6771],{"class":1199},[173,14440,14441,14443,14445,14447,14450],{"class":175,"line":374},[173,14442,13716],{"class":1199},[173,14444,13009],{"class":179},[173,14446,1200],{"class":1199},[173,14448,14449],{"class":183},"\"==============\"",[173,14451,1285],{"class":1199},[173,14453,14454],{"class":175,"line":380},[173,14455,6652],{"class":1199},[173,14457,14458],{"class":175,"line":385},[173,14459,1721],{"class":1199},[15,14461,14462],{},[28,14463,8332],{},[164,14465,14467],{"className":166,"code":14466,"language":168,"meta":169,"style":169},"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",[19,14468,14469,14483,14496,14509,14522,14535,14548,14562,14576,14589,14594,14606,14618,14631,14643,14656,14668,14681,14694,14707,14711,14723,14735,14747,14759,14772,14784,14797,14810,14823,14827,14839,14851,14863,14875,14888,14901,14914,14927,14940,14944,14957,14969,14981,14993,15005,15017,15030,15043,15056,15060,15072,15084,15096,15108,15120,15132,15145,15158,15171,15175,15188,15200,15212,15224,15236,15248,15260,15273,15286,15290,15303,15315,15327,15339,15351,15363,15375,15387,15400],{"__ignoreMap":169},[173,14470,14471,14473,14476,14478,14480],{"class":175,"line":176},[173,14472,1698],{"class":179},[173,14474,14475],{"class":183}," X",[173,14477,1604],{"class":187},[173,14479,6440],{"class":183},[173,14481,14482],{"class":187}," 2\n",[173,14484,14485,14487,14489,14491,14493],{"class":175,"line":212},[173,14486,1698],{"class":179},[173,14488,14475],{"class":183},[173,14490,7285],{"class":187},[173,14492,6440],{"class":183},[173,14494,14495],{"class":187}," 4\n",[173,14497,14498,14500,14502,14504,14506],{"class":175,"line":223},[173,14499,1698],{"class":179},[173,14501,14475],{"class":183},[173,14503,14070],{"class":187},[173,14505,6440],{"class":183},[173,14507,14508],{"class":187}," 6\n",[173,14510,14511,14513,14515,14517,14519],{"class":175,"line":230},[173,14512,1698],{"class":179},[173,14514,14475],{"class":183},[173,14516,14092],{"class":187},[173,14518,6440],{"class":183},[173,14520,14521],{"class":187}," 8\n",[173,14523,14524,14526,14528,14530,14532],{"class":175,"line":236},[173,14525,1698],{"class":179},[173,14527,14475],{"class":183},[173,14529,6645],{"class":187},[173,14531,6440],{"class":183},[173,14533,14534],{"class":187}," 10\n",[173,14536,14537,14539,14541,14543,14545],{"class":175,"line":249},[173,14538,1698],{"class":179},[173,14540,14475],{"class":183},[173,14542,14135],{"class":187},[173,14544,6440],{"class":183},[173,14546,14547],{"class":187}," 12\n",[173,14549,14550,14552,14554,14557,14559],{"class":175,"line":254},[173,14551,1698],{"class":179},[173,14553,14475],{"class":183},[173,14555,14556],{"class":187}," 7",[173,14558,6440],{"class":183},[173,14560,14561],{"class":187}," 14\n",[173,14563,14564,14566,14568,14571,14573],{"class":175,"line":260},[173,14565,1698],{"class":179},[173,14567,14475],{"class":183},[173,14569,14570],{"class":187}," 8",[173,14572,6440],{"class":183},[173,14574,14575],{"class":187}," 16\n",[173,14577,14578,14580,14582,14584,14586],{"class":175,"line":356},[173,14579,1698],{"class":179},[173,14581,14475],{"class":183},[173,14583,14353],{"class":187},[173,14585,6440],{"class":183},[173,14587,14588],{"class":187}," 18\n",[173,14590,14591],{"class":175,"line":362},[173,14592,14593],{"class":183},"==============\n",[173,14595,14596,14598,14600,14602,14604],{"class":175,"line":368},[173,14597,12999],{"class":179},[173,14599,14475],{"class":183},[173,14601,1604],{"class":187},[173,14603,6440],{"class":183},[173,14605,3015],{"class":187},[173,14607,14608,14610,14612,14614,14616],{"class":175,"line":374},[173,14609,12999],{"class":179},[173,14611,14475],{"class":183},[173,14613,7285],{"class":187},[173,14615,6440],{"class":183},[173,14617,14508],{"class":187},[173,14619,14620,14622,14624,14626,14628],{"class":175,"line":380},[173,14621,12999],{"class":179},[173,14623,14475],{"class":183},[173,14625,14070],{"class":187},[173,14627,6440],{"class":183},[173,14629,14630],{"class":187}," 9\n",[173,14632,14633,14635,14637,14639,14641],{"class":175,"line":385},[173,14634,12999],{"class":179},[173,14636,14475],{"class":183},[173,14638,14092],{"class":187},[173,14640,6440],{"class":183},[173,14642,14547],{"class":187},[173,14644,14645,14647,14649,14651,14653],{"class":175,"line":1405},[173,14646,12999],{"class":179},[173,14648,14475],{"class":183},[173,14650,6645],{"class":187},[173,14652,6440],{"class":183},[173,14654,14655],{"class":187}," 15\n",[173,14657,14658,14660,14662,14664,14666],{"class":175,"line":1416},[173,14659,12999],{"class":179},[173,14661,14475],{"class":183},[173,14663,14135],{"class":187},[173,14665,6440],{"class":183},[173,14667,14588],{"class":187},[173,14669,14670,14672,14674,14676,14678],{"class":175,"line":1421},[173,14671,12999],{"class":179},[173,14673,14475],{"class":183},[173,14675,14556],{"class":187},[173,14677,6440],{"class":183},[173,14679,14680],{"class":187}," 21\n",[173,14682,14683,14685,14687,14689,14691],{"class":175,"line":1718},[173,14684,12999],{"class":179},[173,14686,14475],{"class":183},[173,14688,14570],{"class":187},[173,14690,6440],{"class":183},[173,14692,14693],{"class":187}," 24\n",[173,14695,14696,14698,14700,14702,14704],{"class":175,"line":1724},[173,14697,12999],{"class":179},[173,14699,14475],{"class":183},[173,14701,14353],{"class":187},[173,14703,6440],{"class":183},[173,14705,14706],{"class":187}," 27\n",[173,14708,14709],{"class":175,"line":1729},[173,14710,14593],{"class":183},[173,14712,14713,14715,14717,14719,14721],{"class":175,"line":1735},[173,14714,2192],{"class":179},[173,14716,14475],{"class":183},[173,14718,1604],{"class":187},[173,14720,6440],{"class":183},[173,14722,14495],{"class":187},[173,14724,14725,14727,14729,14731,14733],{"class":175,"line":4815},[173,14726,2192],{"class":179},[173,14728,14475],{"class":183},[173,14730,7285],{"class":187},[173,14732,6440],{"class":183},[173,14734,14521],{"class":187},[173,14736,14737,14739,14741,14743,14745],{"class":175,"line":4826},[173,14738,2192],{"class":179},[173,14740,14475],{"class":183},[173,14742,14070],{"class":187},[173,14744,6440],{"class":183},[173,14746,14547],{"class":187},[173,14748,14749,14751,14753,14755,14757],{"class":175,"line":4837},[173,14750,2192],{"class":179},[173,14752,14475],{"class":183},[173,14754,14092],{"class":187},[173,14756,6440],{"class":183},[173,14758,14575],{"class":187},[173,14760,14761,14763,14765,14767,14769],{"class":175,"line":4842},[173,14762,2192],{"class":179},[173,14764,14475],{"class":183},[173,14766,6645],{"class":187},[173,14768,6440],{"class":183},[173,14770,14771],{"class":187}," 20\n",[173,14773,14774,14776,14778,14780,14782],{"class":175,"line":4848},[173,14775,2192],{"class":179},[173,14777,14475],{"class":183},[173,14779,14135],{"class":187},[173,14781,6440],{"class":183},[173,14783,14693],{"class":187},[173,14785,14786,14788,14790,14792,14794],{"class":175,"line":4858},[173,14787,2192],{"class":179},[173,14789,14475],{"class":183},[173,14791,14556],{"class":187},[173,14793,6440],{"class":183},[173,14795,14796],{"class":187}," 28\n",[173,14798,14799,14801,14803,14805,14807],{"class":175,"line":4872},[173,14800,2192],{"class":179},[173,14802,14475],{"class":183},[173,14804,14570],{"class":187},[173,14806,6440],{"class":183},[173,14808,14809],{"class":187}," 32\n",[173,14811,14812,14814,14816,14818,14820],{"class":175,"line":4877},[173,14813,2192],{"class":179},[173,14815,14475],{"class":183},[173,14817,14353],{"class":187},[173,14819,6440],{"class":183},[173,14821,14822],{"class":187}," 36\n",[173,14824,14825],{"class":175,"line":4883},[173,14826,14593],{"class":183},[173,14828,14829,14831,14833,14835,14837],{"class":175,"line":4897},[173,14830,1376],{"class":179},[173,14832,14475],{"class":183},[173,14834,1604],{"class":187},[173,14836,6440],{"class":183},[173,14838,2949],{"class":187},[173,14840,14841,14843,14845,14847,14849],{"class":175,"line":4908},[173,14842,1376],{"class":179},[173,14844,14475],{"class":183},[173,14846,7285],{"class":187},[173,14848,6440],{"class":183},[173,14850,14534],{"class":187},[173,14852,14853,14855,14857,14859,14861],{"class":175,"line":4919},[173,14854,1376],{"class":179},[173,14856,14475],{"class":183},[173,14858,14070],{"class":187},[173,14860,6440],{"class":183},[173,14862,14655],{"class":187},[173,14864,14865,14867,14869,14871,14873],{"class":175,"line":6841},[173,14866,1376],{"class":179},[173,14868,14475],{"class":183},[173,14870,14092],{"class":187},[173,14872,6440],{"class":183},[173,14874,14771],{"class":187},[173,14876,14877,14879,14881,14883,14885],{"class":175,"line":6873},[173,14878,1376],{"class":179},[173,14880,14475],{"class":183},[173,14882,6645],{"class":187},[173,14884,6440],{"class":183},[173,14886,14887],{"class":187}," 25\n",[173,14889,14890,14892,14894,14896,14898],{"class":175,"line":6884},[173,14891,1376],{"class":179},[173,14893,14475],{"class":183},[173,14895,14135],{"class":187},[173,14897,6440],{"class":183},[173,14899,14900],{"class":187}," 30\n",[173,14902,14903,14905,14907,14909,14911],{"class":175,"line":6895},[173,14904,1376],{"class":179},[173,14906,14475],{"class":183},[173,14908,14556],{"class":187},[173,14910,6440],{"class":183},[173,14912,14913],{"class":187}," 35\n",[173,14915,14916,14918,14920,14922,14924],{"class":175,"line":6906},[173,14917,1376],{"class":179},[173,14919,14475],{"class":183},[173,14921,14570],{"class":187},[173,14923,6440],{"class":183},[173,14925,14926],{"class":187}," 40\n",[173,14928,14929,14931,14933,14935,14937],{"class":175,"line":6917},[173,14930,1376],{"class":179},[173,14932,14475],{"class":183},[173,14934,14353],{"class":187},[173,14936,6440],{"class":183},[173,14938,14939],{"class":187}," 45\n",[173,14941,14942],{"class":175,"line":6928},[173,14943,14593],{"class":183},[173,14945,14946,14949,14951,14953,14955],{"class":175,"line":6940},[173,14947,14948],{"class":179},"6",[173,14950,14475],{"class":183},[173,14952,1604],{"class":187},[173,14954,6440],{"class":183},[173,14956,14508],{"class":187},[173,14958,14959,14961,14963,14965,14967],{"class":175,"line":6945},[173,14960,14948],{"class":179},[173,14962,14475],{"class":183},[173,14964,7285],{"class":187},[173,14966,6440],{"class":183},[173,14968,14547],{"class":187},[173,14970,14971,14973,14975,14977,14979],{"class":175,"line":6950},[173,14972,14948],{"class":179},[173,14974,14475],{"class":183},[173,14976,14070],{"class":187},[173,14978,6440],{"class":183},[173,14980,14588],{"class":187},[173,14982,14983,14985,14987,14989,14991],{"class":175,"line":6957},[173,14984,14948],{"class":179},[173,14986,14475],{"class":183},[173,14988,14092],{"class":187},[173,14990,6440],{"class":183},[173,14992,14693],{"class":187},[173,14994,14995,14997,14999,15001,15003],{"class":175,"line":6968},[173,14996,14948],{"class":179},[173,14998,14475],{"class":183},[173,15000,6645],{"class":187},[173,15002,6440],{"class":183},[173,15004,14900],{"class":187},[173,15006,15007,15009,15011,15013,15015],{"class":175,"line":6993},[173,15008,14948],{"class":179},[173,15010,14475],{"class":183},[173,15012,14135],{"class":187},[173,15014,6440],{"class":183},[173,15016,14822],{"class":187},[173,15018,15019,15021,15023,15025,15027],{"class":175,"line":6998},[173,15020,14948],{"class":179},[173,15022,14475],{"class":183},[173,15024,14556],{"class":187},[173,15026,6440],{"class":183},[173,15028,15029],{"class":187}," 42\n",[173,15031,15032,15034,15036,15038,15040],{"class":175,"line":7003},[173,15033,14948],{"class":179},[173,15035,14475],{"class":183},[173,15037,14570],{"class":187},[173,15039,6440],{"class":183},[173,15041,15042],{"class":187}," 48\n",[173,15044,15045,15047,15049,15051,15053],{"class":175,"line":7010},[173,15046,14948],{"class":179},[173,15048,14475],{"class":183},[173,15050,14353],{"class":187},[173,15052,6440],{"class":183},[173,15054,15055],{"class":187}," 54\n",[173,15057,15058],{"class":175,"line":7023},[173,15059,14593],{"class":183},[173,15061,15062,15064,15066,15068,15070],{"class":175,"line":7028},[173,15063,8228],{"class":179},[173,15065,14475],{"class":183},[173,15067,1604],{"class":187},[173,15069,6440],{"class":183},[173,15071,2874],{"class":187},[173,15073,15074,15076,15078,15080,15082],{"class":175,"line":7033},[173,15075,8228],{"class":179},[173,15077,14475],{"class":183},[173,15079,7285],{"class":187},[173,15081,6440],{"class":183},[173,15083,14561],{"class":187},[173,15085,15086,15088,15090,15092,15094],{"class":175,"line":7038},[173,15087,8228],{"class":179},[173,15089,14475],{"class":183},[173,15091,14070],{"class":187},[173,15093,6440],{"class":183},[173,15095,14680],{"class":187},[173,15097,15098,15100,15102,15104,15106],{"class":175,"line":7048},[173,15099,8228],{"class":179},[173,15101,14475],{"class":183},[173,15103,14092],{"class":187},[173,15105,6440],{"class":183},[173,15107,14796],{"class":187},[173,15109,15110,15112,15114,15116,15118],{"class":175,"line":7089},[173,15111,8228],{"class":179},[173,15113,14475],{"class":183},[173,15115,6645],{"class":187},[173,15117,6440],{"class":183},[173,15119,14913],{"class":187},[173,15121,15122,15124,15126,15128,15130],{"class":175,"line":7100},[173,15123,8228],{"class":179},[173,15125,14475],{"class":183},[173,15127,14135],{"class":187},[173,15129,6440],{"class":183},[173,15131,15029],{"class":187},[173,15133,15134,15136,15138,15140,15142],{"class":175,"line":7111},[173,15135,8228],{"class":179},[173,15137,14475],{"class":183},[173,15139,14556],{"class":187},[173,15141,6440],{"class":183},[173,15143,15144],{"class":187}," 49\n",[173,15146,15147,15149,15151,15153,15155],{"class":175,"line":7122},[173,15148,8228],{"class":179},[173,15150,14475],{"class":183},[173,15152,14570],{"class":187},[173,15154,6440],{"class":183},[173,15156,15157],{"class":187}," 56\n",[173,15159,15160,15162,15164,15166,15168],{"class":175,"line":7133},[173,15161,8228],{"class":179},[173,15163,14475],{"class":183},[173,15165,14353],{"class":187},[173,15167,6440],{"class":183},[173,15169,15170],{"class":187}," 63\n",[173,15172,15173],{"class":175,"line":7144},[173,15174,14593],{"class":183},[173,15176,15177,15180,15182,15184,15186],{"class":175,"line":7155},[173,15178,15179],{"class":179},"8",[173,15181,14475],{"class":183},[173,15183,1604],{"class":187},[173,15185,6440],{"class":183},[173,15187,14521],{"class":187},[173,15189,15190,15192,15194,15196,15198],{"class":175,"line":7168},[173,15191,15179],{"class":179},[173,15193,14475],{"class":183},[173,15195,7285],{"class":187},[173,15197,6440],{"class":183},[173,15199,14575],{"class":187},[173,15201,15202,15204,15206,15208,15210],{"class":175,"line":7173},[173,15203,15179],{"class":179},[173,15205,14475],{"class":183},[173,15207,14070],{"class":187},[173,15209,6440],{"class":183},[173,15211,14693],{"class":187},[173,15213,15214,15216,15218,15220,15222],{"class":175,"line":7178},[173,15215,15179],{"class":179},[173,15217,14475],{"class":183},[173,15219,14092],{"class":187},[173,15221,6440],{"class":183},[173,15223,14809],{"class":187},[173,15225,15226,15228,15230,15232,15234],{"class":175,"line":7185},[173,15227,15179],{"class":179},[173,15229,14475],{"class":183},[173,15231,6645],{"class":187},[173,15233,6440],{"class":183},[173,15235,14926],{"class":187},[173,15237,15238,15240,15242,15244,15246],{"class":175,"line":7196},[173,15239,15179],{"class":179},[173,15241,14475],{"class":183},[173,15243,14135],{"class":187},[173,15245,6440],{"class":183},[173,15247,15042],{"class":187},[173,15249,15250,15252,15254,15256,15258],{"class":175,"line":7221},[173,15251,15179],{"class":179},[173,15253,14475],{"class":183},[173,15255,14556],{"class":187},[173,15257,6440],{"class":183},[173,15259,15157],{"class":187},[173,15261,15262,15264,15266,15268,15270],{"class":175,"line":7226},[173,15263,15179],{"class":179},[173,15265,14475],{"class":183},[173,15267,14570],{"class":187},[173,15269,6440],{"class":183},[173,15271,15272],{"class":187}," 64\n",[173,15274,15275,15277,15279,15281,15283],{"class":175,"line":7231},[173,15276,15179],{"class":179},[173,15278,14475],{"class":183},[173,15280,14353],{"class":187},[173,15282,6440],{"class":183},[173,15284,15285],{"class":187}," 72\n",[173,15287,15288],{"class":175,"line":7238},[173,15289,14593],{"class":183},[173,15291,15292,15295,15297,15299,15301],{"class":175,"line":7251},[173,15293,15294],{"class":179},"9",[173,15296,14475],{"class":183},[173,15298,1604],{"class":187},[173,15300,6440],{"class":183},[173,15302,14630],{"class":187},[173,15304,15305,15307,15309,15311,15313],{"class":175,"line":7256},[173,15306,15294],{"class":179},[173,15308,14475],{"class":183},[173,15310,7285],{"class":187},[173,15312,6440],{"class":183},[173,15314,14588],{"class":187},[173,15316,15317,15319,15321,15323,15325],{"class":175,"line":7261},[173,15318,15294],{"class":179},[173,15320,14475],{"class":183},[173,15322,14070],{"class":187},[173,15324,6440],{"class":183},[173,15326,14706],{"class":187},[173,15328,15329,15331,15333,15335,15337],{"class":175,"line":7266},[173,15330,15294],{"class":179},[173,15332,14475],{"class":183},[173,15334,14092],{"class":187},[173,15336,6440],{"class":183},[173,15338,14822],{"class":187},[173,15340,15341,15343,15345,15347,15349],{"class":175,"line":7317},[173,15342,15294],{"class":179},[173,15344,14475],{"class":183},[173,15346,6645],{"class":187},[173,15348,6440],{"class":183},[173,15350,14939],{"class":187},[173,15352,15353,15355,15357,15359,15361],{"class":175,"line":7330},[173,15354,15294],{"class":179},[173,15356,14475],{"class":183},[173,15358,14135],{"class":187},[173,15360,6440],{"class":183},[173,15362,15055],{"class":187},[173,15364,15365,15367,15369,15371,15373],{"class":175,"line":7342},[173,15366,15294],{"class":179},[173,15368,14475],{"class":183},[173,15370,14556],{"class":187},[173,15372,6440],{"class":183},[173,15374,15170],{"class":187},[173,15376,15377,15379,15381,15383,15385],{"class":175,"line":7347},[173,15378,15294],{"class":179},[173,15380,14475],{"class":183},[173,15382,14570],{"class":187},[173,15384,6440],{"class":183},[173,15386,15285],{"class":187},[173,15388,15389,15391,15393,15395,15397],{"class":175,"line":7358},[173,15390,15294],{"class":179},[173,15392,14475],{"class":183},[173,15394,14353],{"class":187},[173,15396,6440],{"class":183},[173,15398,15399],{"class":187}," 81\n",[173,15401,15402],{"class":175,"line":7389},[173,15403,14593],{"class":183},[90,15405,15406],{"id":15406},"break",[15,15408,15409],{},"用於跳出整個迴圈，結束迴圈的執行",[164,15411,15413],{"className":12673,"code":15412,"language":12675,"meta":169,"style":169},"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",[19,15414,15415,15421,15425,15431,15439,15448,15456,15460,15464,15472,15476,15485,15489,15513,15517,15544,15548,15563,15567,15586,15590,15603,15608,15612,15616,15625,15629],{"__ignoreMap":169},[173,15416,15417,15419],{"class":175,"line":176},[173,15418,12745],{"class":468},[173,15420,12748],{"class":179},[173,15422,15423],{"class":175,"line":212},[173,15424,227],{"emptyLinePlaceholder":226},[173,15426,15427,15429],{"class":175,"line":223},[173,15428,12753],{"class":468},[173,15430,13928],{"class":1199},[173,15432,15433,15435,15437],{"class":175,"line":230},[173,15434,13933],{"class":183},[173,15436,12759],{"class":179},[173,15438,12762],{"class":183},[173,15440,15441,15443,15446],{"class":175,"line":236},[173,15442,13933],{"class":183},[173,15444,15445],{"class":179},"math\u002Frand",[173,15447,12762],{"class":183},[173,15449,15450,15452,15454],{"class":175,"line":249},[173,15451,13933],{"class":183},[173,15453,13944],{"class":179},[173,15455,12762],{"class":183},[173,15457,15458],{"class":175,"line":254},[173,15459,1285],{"class":1199},[173,15461,15462],{"class":175,"line":260},[173,15463,227],{"emptyLinePlaceholder":226},[173,15465,15466,15468,15470],{"class":175,"line":356},[173,15467,12682],{"class":468},[173,15469,12769],{"class":179},[173,15471,6664],{"class":1199},[173,15473,15474],{"class":175,"line":362},[173,15475,227],{"emptyLinePlaceholder":226},[173,15477,15478,15480,15483],{"class":175,"line":368},[173,15479,13205],{"class":468},[173,15481,15482],{"class":1199}," index ",[173,15484,14327],{"class":468},[173,15486,15487],{"class":175,"line":374},[173,15488,227],{"emptyLinePlaceholder":226},[173,15490,15491,15493,15495,15497,15499,15502,15504,15506,15509,15511],{"class":175,"line":380},[173,15492,14244],{"class":468},[173,15494,15482],{"class":1199},[173,15496,1206],{"class":468},[173,15498,5572],{"class":187},[173,15500,15501],{"class":1199},"; index ",[173,15503,6007],{"class":468},[173,15505,5436],{"class":187},[173,15507,15508],{"class":1199},"; index",[173,15510,1619],{"class":468},[173,15512,6254],{"class":1199},[173,15514,15515],{"class":175,"line":385},[173,15516,227],{"emptyLinePlaceholder":226},[173,15518,15519,15522,15524,15527,15530,15533,15535,15538,15541],{"class":175,"line":1405},[173,15520,15521],{"class":1199},"        seed ",[173,15523,12983],{"class":468},[173,15525,15526],{"class":1199}," rand.",[173,15528,15529],{"class":179},"NewSource",[173,15531,15532],{"class":1199},"(time.",[173,15534,13975],{"class":179},[173,15536,15537],{"class":1199},"().",[173,15539,15540],{"class":179},"UnixNano",[173,15542,15543],{"class":1199},"())\n",[173,15545,15546],{"class":175,"line":1416},[173,15547,227],{"emptyLinePlaceholder":226},[173,15549,15550,15553,15555,15557,15560],{"class":175,"line":1421},[173,15551,15552],{"class":1199},"        rNum ",[173,15554,12983],{"class":468},[173,15556,15526],{"class":1199},[173,15558,15559],{"class":179},"New",[173,15561,15562],{"class":1199},"(seed)\n",[173,15564,15565],{"class":175,"line":1718},[173,15566,227],{"emptyLinePlaceholder":226},[173,15568,15569,15572,15574,15577,15580,15582,15584],{"class":175,"line":1724},[173,15570,15571],{"class":1199},"        num ",[173,15573,12983],{"class":468},[173,15575,15576],{"class":1199}," rNum.",[173,15578,15579],{"class":179},"Intn",[173,15581,1200],{"class":1199},[173,15583,1712],{"class":187},[173,15585,1285],{"class":1199},[173,15587,15588],{"class":175,"line":1729},[173,15589,227],{"emptyLinePlaceholder":226},[173,15591,15592,15594,15597,15599,15601],{"class":175,"line":1735},[173,15593,6728],{"class":468},[173,15595,15596],{"class":1199}," num ",[173,15598,6747],{"class":468},[173,15600,7298],{"class":187},[173,15602,6254],{"class":1199},[173,15604,15605],{"class":175,"line":4815},[173,15606,15607],{"class":468},"            break\n",[173,15609,15610],{"class":175,"line":4826},[173,15611,6771],{"class":1199},[173,15613,15614],{"class":175,"line":4837},[173,15615,227],{"emptyLinePlaceholder":226},[173,15617,15618,15620,15622],{"class":175,"line":4842},[173,15619,13716],{"class":1199},[173,15621,13009],{"class":179},[173,15623,15624],{"class":1199},"(index, num)\n",[173,15626,15627],{"class":175,"line":4848},[173,15628,6652],{"class":1199},[173,15630,15631],{"class":175,"line":4858},[173,15632,1721],{"class":1199},[15,15634,15635],{},[28,15636,8332],{},[164,15638,15640],{"className":166,"code":15639,"language":168,"meta":169,"style":169},"0 26\n1 19\n2 59\n3 45\n4 14\n5 25\n6 50\n7 14\n",[19,15641,15642,15649,15656,15663,15669,15675,15681,15688],{"__ignoreMap":169},[173,15643,15644,15646],{"class":175,"line":176},[173,15645,1645],{"class":179},[173,15647,15648],{"class":187}," 26\n",[173,15650,15651,15653],{"class":175,"line":212},[173,15652,1209],{"class":179},[173,15654,15655],{"class":187}," 19\n",[173,15657,15658,15660],{"class":175,"line":223},[173,15659,1698],{"class":179},[173,15661,15662],{"class":187}," 59\n",[173,15664,15665,15667],{"class":175,"line":230},[173,15666,12999],{"class":179},[173,15668,14939],{"class":187},[173,15670,15671,15673],{"class":175,"line":236},[173,15672,2192],{"class":179},[173,15674,14561],{"class":187},[173,15676,15677,15679],{"class":175,"line":249},[173,15678,1376],{"class":179},[173,15680,14887],{"class":187},[173,15682,15683,15685],{"class":175,"line":254},[173,15684,14948],{"class":179},[173,15686,15687],{"class":187}," 50\n",[173,15689,15690,15692],{"class":175,"line":260},[173,15691,8228],{"class":179},[173,15693,14561],{"class":187},[90,15695,15696],{"id":15696},"continue",[15,15698,15699],{},"用於跳過當前迴圈的剩餘部分，直接進入下一次迴圈的執行",[164,15701,15703],{"className":12673,"code":15702,"language":12675,"meta":169,"style":169},"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",[19,15704,15705,15711,15715,15721,15729,15737,15745,15749,15753,15759,15775,15789,15803,15807,15811,15819,15827,15849,15869,15881,15897,15901,15913,15944,15949,15953,15957,15988,15992,15996],{"__ignoreMap":169},[173,15706,15707,15709],{"class":175,"line":176},[173,15708,12745],{"class":468},[173,15710,12748],{"class":179},[173,15712,15713],{"class":175,"line":212},[173,15714,227],{"emptyLinePlaceholder":226},[173,15716,15717,15719],{"class":175,"line":223},[173,15718,12753],{"class":468},[173,15720,13928],{"class":1199},[173,15722,15723,15725,15727],{"class":175,"line":230},[173,15724,13933],{"class":183},[173,15726,12759],{"class":179},[173,15728,12762],{"class":183},[173,15730,15731,15733,15735],{"class":175,"line":236},[173,15732,13933],{"class":183},[173,15734,15445],{"class":179},[173,15736,12762],{"class":183},[173,15738,15739,15741,15743],{"class":175,"line":249},[173,15740,13933],{"class":183},[173,15742,13944],{"class":179},[173,15744,12762],{"class":183},[173,15746,15747],{"class":175,"line":254},[173,15748,1285],{"class":1199},[173,15750,15751],{"class":175,"line":260},[173,15752,227],{"emptyLinePlaceholder":226},[173,15754,15755,15757],{"class":175,"line":356},[173,15756,6434],{"class":468},[173,15758,13928],{"class":1199},[173,15760,15761,15764,15767,15769,15772],{"class":175,"line":362},[173,15762,15763],{"class":187},"    RED",[173,15765,15766],{"class":468},"   =",[173,15768,12756],{"class":183},[173,15770,15771],{"class":187},"\\x1b",[173,15773,15774],{"class":183},"[31m\"\n",[173,15776,15777,15780,15782,15784,15786],{"class":175,"line":368},[173,15778,15779],{"class":187},"    GREEN",[173,15781,6440],{"class":468},[173,15783,12756],{"class":183},[173,15785,15771],{"class":187},[173,15787,15788],{"class":183},"[32m\"\n",[173,15790,15791,15794,15796,15798,15800],{"class":175,"line":374},[173,15792,15793],{"class":187},"    RESET",[173,15795,6440],{"class":468},[173,15797,12756],{"class":183},[173,15799,15771],{"class":187},[173,15801,15802],{"class":183},"[0m\"\n",[173,15804,15805],{"class":175,"line":380},[173,15806,1285],{"class":1199},[173,15808,15809],{"class":175,"line":385},[173,15810,227],{"emptyLinePlaceholder":226},[173,15812,15813,15815,15817],{"class":175,"line":1405},[173,15814,12682],{"class":468},[173,15816,12769],{"class":179},[173,15818,6664],{"class":1199},[173,15820,15821,15823,15825],{"class":175,"line":1416},[173,15822,13205],{"class":468},[173,15824,15482],{"class":1199},[173,15826,14327],{"class":468},[173,15828,15829,15831,15833,15835,15837,15839,15841,15843,15845,15847],{"class":175,"line":1421},[173,15830,14244],{"class":468},[173,15832,15482],{"class":1199},[173,15834,1206],{"class":468},[173,15836,5572],{"class":187},[173,15838,15501],{"class":1199},[173,15840,6007],{"class":468},[173,15842,5436],{"class":187},[173,15844,15508],{"class":1199},[173,15846,1619],{"class":468},[173,15848,6254],{"class":1199},[173,15850,15851,15853,15855,15857,15859,15861,15863,15865,15867],{"class":175,"line":1718},[173,15852,15521],{"class":1199},[173,15854,12983],{"class":468},[173,15856,15526],{"class":1199},[173,15858,15529],{"class":179},[173,15860,15532],{"class":1199},[173,15862,13975],{"class":179},[173,15864,15537],{"class":1199},[173,15866,15540],{"class":179},[173,15868,15543],{"class":1199},[173,15870,15871,15873,15875,15877,15879],{"class":175,"line":1724},[173,15872,15552],{"class":1199},[173,15874,12983],{"class":468},[173,15876,15526],{"class":1199},[173,15878,15559],{"class":179},[173,15880,15562],{"class":1199},[173,15882,15883,15885,15887,15889,15891,15893,15895],{"class":175,"line":1729},[173,15884,15571],{"class":1199},[173,15886,12983],{"class":468},[173,15888,15576],{"class":1199},[173,15890,15579],{"class":179},[173,15892,1200],{"class":1199},[173,15894,1712],{"class":187},[173,15896,1285],{"class":1199},[173,15898,15899],{"class":175,"line":1735},[173,15900,227],{"emptyLinePlaceholder":226},[173,15902,15903,15905,15907,15909,15911],{"class":175,"line":4815},[173,15904,6728],{"class":468},[173,15906,15596],{"class":1199},[173,15908,6007],{"class":468},[173,15910,7298],{"class":187},[173,15912,6254],{"class":1199},[173,15914,15915,15917,15919,15921,15923,15925,15928,15930,15933,15936,15939,15941],{"class":175,"line":4826},[173,15916,14409],{"class":1199},[173,15918,12829],{"class":179},[173,15920,1200],{"class":1199},[173,15922,1439],{"class":183},[173,15924,14418],{"class":187},[173,15926,15927],{"class":183}," 號學生的分數為 ",[173,15929,14418],{"class":187},[173,15931,15932],{"class":187}," %s",[173,15934,15935],{"class":183},"不及格",[173,15937,15938],{"class":187},"%s\\n",[173,15940,1439],{"class":183},[173,15942,15943],{"class":1199},", index, num, RED, RESET)\n",[173,15945,15946],{"class":175,"line":4837},[173,15947,15948],{"class":468},"            continue\n",[173,15950,15951],{"class":175,"line":4842},[173,15952,6771],{"class":1199},[173,15954,15955],{"class":175,"line":4848},[173,15956,227],{"emptyLinePlaceholder":226},[173,15958,15959,15961,15963,15965,15967,15969,15971,15973,15975,15978,15981,15983,15985],{"class":175,"line":4858},[173,15960,13716],{"class":1199},[173,15962,12829],{"class":179},[173,15964,1200],{"class":1199},[173,15966,1439],{"class":183},[173,15968,14418],{"class":187},[173,15970,15927],{"class":183},[173,15972,14418],{"class":187},[173,15974,8402],{"class":183},[173,15976,15977],{"class":187},"%s",[173,15979,15980],{"class":183},"恭喜級格了",[173,15982,15938],{"class":187},[173,15984,1439],{"class":183},[173,15986,15987],{"class":1199},", index, num, GREEN, RESET)\n",[173,15989,15990],{"class":175,"line":4872},[173,15991,6652],{"class":1199},[173,15993,15994],{"class":175,"line":4877},[173,15995,227],{"emptyLinePlaceholder":226},[173,15997,15998],{"class":175,"line":4883},[173,15999,1721],{"class":1199},[15,16001,16002],{},[28,16003,8332],{},[164,16005,16007],{"className":166,"code":16006,"language":168,"meta":169,"style":169},"0 號學生的分數為 38 不及格\n1 號學生的分數為 26 不及格\n2 號學生的分數為 21 不及格\n3 號學生的分數為 37 不及格\n4 號學生的分數為 58 不及格\n5 號學生的分數為 40 不及格\n6 號學生的分數為 44 不及格\n7 號學生的分數為 64，恭喜級格了\n8 號學生的分數為 93，恭喜級格了\n9 號學生的分數為 0 不及格\n",[19,16008,16009,16022,16033,16044,16055,16066,16077,16088,16097,16106],{"__ignoreMap":169},[173,16010,16011,16013,16016,16019],{"class":175,"line":176},[173,16012,1645],{"class":179},[173,16014,16015],{"class":183}," 號學生的分數為",[173,16017,16018],{"class":187}," 38",[173,16020,16021],{"class":183}," 不及格\n",[173,16023,16024,16026,16028,16031],{"class":175,"line":212},[173,16025,1209],{"class":179},[173,16027,16015],{"class":183},[173,16029,16030],{"class":187}," 26",[173,16032,16021],{"class":183},[173,16034,16035,16037,16039,16042],{"class":175,"line":223},[173,16036,1698],{"class":179},[173,16038,16015],{"class":183},[173,16040,16041],{"class":187}," 21",[173,16043,16021],{"class":183},[173,16045,16046,16048,16050,16053],{"class":175,"line":230},[173,16047,12999],{"class":179},[173,16049,16015],{"class":183},[173,16051,16052],{"class":187}," 37",[173,16054,16021],{"class":183},[173,16056,16057,16059,16061,16064],{"class":175,"line":236},[173,16058,2192],{"class":179},[173,16060,16015],{"class":183},[173,16062,16063],{"class":187}," 58",[173,16065,16021],{"class":183},[173,16067,16068,16070,16072,16075],{"class":175,"line":249},[173,16069,1376],{"class":179},[173,16071,16015],{"class":183},[173,16073,16074],{"class":187}," 40",[173,16076,16021],{"class":183},[173,16078,16079,16081,16083,16086],{"class":175,"line":254},[173,16080,14948],{"class":179},[173,16082,16015],{"class":183},[173,16084,16085],{"class":187}," 44",[173,16087,16021],{"class":183},[173,16089,16090,16092,16094],{"class":175,"line":260},[173,16091,8228],{"class":179},[173,16093,16015],{"class":183},[173,16095,16096],{"class":183}," 64，恭喜級格了\n",[173,16098,16099,16101,16103],{"class":175,"line":356},[173,16100,15179],{"class":179},[173,16102,16015],{"class":183},[173,16104,16105],{"class":183}," 93，恭喜級格了\n",[173,16107,16108,16110,16112,16114],{"class":175,"line":362},[173,16109,15294],{"class":179},[173,16111,16015],{"class":183},[173,16113,5572],{"class":187},[173,16115,16021],{"class":183},[15,16117,16118],{},[28,16119,562],{},[15,16121,16122,16123,16125,16126,16128],{},"從上面範例結果，可以了解 ",[19,16124,15406],{}," 只是達成條件，就會跳開整個迴圈，而 ",[19,16127,15696],{},"，只會跳過此次迴圈。",[44,16130,16131],{"id":16131},"goto",[15,16133,16134,16136,16137],{},[19,16135,16131],{}," 程式執行時，無條件跳至某行執行，為確保程式邏輯清晰，程式碼易於維護，不建義使用 ",[19,16138,16131],{},[164,16140,16142],{"className":12673,"code":16141,"language":12675,"meta":169,"style":169},"go label\n\nlabel:\n  \u002F\u002F程式片段\n",[19,16143,16144,16151,16155,16160],{"__ignoreMap":169},[173,16145,16146,16148],{"class":175,"line":176},[173,16147,12675],{"class":468},[173,16149,16150],{"class":1199}," label\n",[173,16152,16153],{"class":175,"line":212},[173,16154,227],{"emptyLinePlaceholder":226},[173,16156,16157],{"class":175,"line":223},[173,16158,16159],{"class":1199},"label:\n",[173,16161,16162],{"class":175,"line":230},[173,16163,16164],{"class":208},"  \u002F\u002F程式片段\n",[15,16166,16167],{},[28,16168,16169],{},"範例程式",[164,16171,16173],{"className":12673,"code":16172,"language":12675,"meta":169,"style":169},"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",[19,16174,16175,16181,16185,16195,16199,16207,16211,16221,16227,16235,16243,16247,16259,16267,16271,16275,16279,16284,16297],{"__ignoreMap":169},[173,16176,16177,16179],{"class":175,"line":176},[173,16178,12745],{"class":468},[173,16180,12748],{"class":179},[173,16182,16183],{"class":175,"line":212},[173,16184,227],{"emptyLinePlaceholder":226},[173,16186,16187,16189,16191,16193],{"class":175,"line":223},[173,16188,12753],{"class":468},[173,16190,12756],{"class":183},[173,16192,12759],{"class":179},[173,16194,12762],{"class":183},[173,16196,16197],{"class":175,"line":230},[173,16198,227],{"emptyLinePlaceholder":226},[173,16200,16201,16203,16205],{"class":175,"line":236},[173,16202,12682],{"class":468},[173,16204,12769],{"class":179},[173,16206,6664],{"class":1199},[173,16208,16209],{"class":175,"line":249},[173,16210,227],{"emptyLinePlaceholder":226},[173,16212,16213,16216,16218],{"class":175,"line":254},[173,16214,16215],{"class":1199},"    i ",[173,16217,12983],{"class":468},[173,16219,16220],{"class":187}," 0\n",[173,16222,16223,16225],{"class":175,"line":260},[173,16224,14244],{"class":468},[173,16226,6254],{"class":1199},[173,16228,16229,16232],{"class":175,"line":356},[173,16230,16231],{"class":1199},"        i",[173,16233,16234],{"class":468},"++\n",[173,16236,16237,16239,16241],{"class":175,"line":362},[173,16238,13716],{"class":1199},[173,16240,13009],{"class":179},[173,16242,14274],{"class":1199},[173,16244,16245],{"class":175,"line":368},[173,16246,227],{"emptyLinePlaceholder":226},[173,16248,16249,16251,16253,16255,16257],{"class":175,"line":374},[173,16250,6728],{"class":468},[173,16252,14247],{"class":1199},[173,16254,13706],{"class":468},[173,16256,5436],{"class":187},[173,16258,6254],{"class":1199},[173,16260,16261,16264],{"class":175,"line":380},[173,16262,16263],{"class":468},"            goto",[173,16265,16266],{"class":1199}," Here\n",[173,16268,16269],{"class":175,"line":385},[173,16270,6771],{"class":1199},[173,16272,16273],{"class":175,"line":1405},[173,16274,6652],{"class":1199},[173,16276,16277],{"class":175,"line":1416},[173,16278,227],{"emptyLinePlaceholder":226},[173,16280,16281],{"class":175,"line":1421},[173,16282,16283],{"class":1199},"Here:\n",[173,16285,16286,16288,16290,16292,16295],{"class":175,"line":1718},[173,16287,13006],{"class":1199},[173,16289,13009],{"class":179},[173,16291,1200],{"class":1199},[173,16293,16294],{"class":183},"\"程式結束\"",[173,16296,1285],{"class":1199},[173,16298,16299],{"class":175,"line":1724},[173,16300,1721],{"class":1199},[15,16302,16303],{},[28,16304,8332],{},[164,16306,16308],{"className":166,"code":16307,"language":168,"meta":169,"style":169},"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n和式結束\n",[19,16309,16310,16315,16320,16325,16330,16335,16340,16345,16350,16354,16359],{"__ignoreMap":169},[173,16311,16312],{"class":175,"line":176},[173,16313,16314],{"class":179},"1\n",[173,16316,16317],{"class":175,"line":212},[173,16318,16319],{"class":179},"2\n",[173,16321,16322],{"class":175,"line":223},[173,16323,16324],{"class":179},"3\n",[173,16326,16327],{"class":175,"line":230},[173,16328,16329],{"class":179},"4\n",[173,16331,16332],{"class":175,"line":236},[173,16333,16334],{"class":179},"5\n",[173,16336,16337],{"class":175,"line":249},[173,16338,16339],{"class":179},"6\n",[173,16341,16342],{"class":175,"line":254},[173,16343,16344],{"class":179},"7\n",[173,16346,16347],{"class":175,"line":260},[173,16348,16349],{"class":179},"8\n",[173,16351,16352],{"class":175,"line":356},[173,16353,13081],{"class":179},[173,16355,16356],{"class":175,"line":362},[173,16357,16358],{"class":179},"10\n",[173,16360,16361],{"class":175,"line":368},[173,16362,16363],{"class":179},"和式結束\n",[15,16365,16366],{},"以上是 go 語言中，常用的流程控制，若有遺漏或說明錯誤可以在下留言討論。",[894,16368,16369],{},"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":169,"searchDepth":212,"depth":212,"links":16371},[16372,16373,16374,16378],{"id":13553,"depth":212,"text":13554},{"id":13841,"depth":212,"text":13841},{"id":14174,"depth":212,"text":14175,"children":16375},[16376,16377],{"id":15406,"depth":223,"text":15406},{"id":15696,"depth":223,"text":15696},{"id":16131,"depth":212,"text":16131},{},"\u002Farticles\u002F2023-03-28-flow-control","2023-03-28 17:34:00",{"title":13544,"description":169},"articles\u002F2023-03-28-flow control","這篇文章，會介紹 Go 語言中，常用的流程控制，包含 if、switch、for 等流程控制",[12675],"PX_VcjowVs0VcmxH_B9vEPuEHEYzfHxwTQKLCqRsmjU",{"id":16388,"title":16389,"body":16390,"category":2635,"description":169,"extension":921,"image":13533,"meta":17139,"navigation":226,"path":17140,"pubDate":17141,"seo":17142,"status":226,"stem":17143,"summary":17144,"tags":17145,"__hash__":17146},"content\u002Farticles\u002F2023-03-07-go-print.md","《Go 學習筆記4》基本輸入輸出",{"type":8,"value":16391,"toc":17135},[16392,16396,16399,16419,16423,16654,16658,16711,16715,16748,16751,16765,16769,17067,17071,17132],[621,16393,16394],{},[15,16395,12664],{},[44,16397,16398],{"id":16398},"輸出",[52,16400,16401,16407,16413],{},[55,16402,16403,16406],{},[19,16404,16405],{},"print(data, data, data)","：輸出資料但不換行",[55,16408,16409,16412],{},[19,16410,16411],{},"Println(data, data, data)","：輸出資料並換行",[55,16414,16415,16418],{},[19,16416,16417],{},"Printf(\"{format}\", data)","：依照格式輸出內容",[15,16420,16421],{},[28,16422,16169],{},[164,16424,16426],{"className":12673,"code":16425,"language":12675,"meta":169,"style":169},"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",[19,16427,16428,16434,16438,16448,16452,16460,16464,16478,16482,16495,16499,16512,16516,16537,16541,16563,16567,16589,16593,16621,16625,16646,16650],{"__ignoreMap":169},[173,16429,16430,16432],{"class":175,"line":176},[173,16431,12745],{"class":468},[173,16433,12748],{"class":179},[173,16435,16436],{"class":175,"line":212},[173,16437,227],{"emptyLinePlaceholder":226},[173,16439,16440,16442,16444,16446],{"class":175,"line":223},[173,16441,12753],{"class":468},[173,16443,12756],{"class":183},[173,16445,12759],{"class":179},[173,16447,12762],{"class":183},[173,16449,16450],{"class":175,"line":230},[173,16451,227],{"emptyLinePlaceholder":226},[173,16453,16454,16456,16458],{"class":175,"line":236},[173,16455,12682],{"class":468},[173,16457,12769],{"class":179},[173,16459,6664],{"class":1199},[173,16461,16462],{"class":175,"line":249},[173,16463,227],{"emptyLinePlaceholder":226},[173,16465,16466,16469,16471,16473,16476],{"class":175,"line":254},[173,16467,16468],{"class":1199},"  fmt.",[173,16470,13672],{"class":179},[173,16472,1200],{"class":1199},[173,16474,16475],{"class":183},"\"我是一行字串\"",[173,16477,1285],{"class":1199},[173,16479,16480],{"class":175,"line":260},[173,16481,227],{"emptyLinePlaceholder":226},[173,16483,16484,16486,16488,16490,16493],{"class":175,"line":356},[173,16485,16468],{"class":1199},[173,16487,13009],{"class":179},[173,16489,1200],{"class":1199},[173,16491,16492],{"class":183},"\"我會換行\"",[173,16494,1285],{"class":1199},[173,16496,16497],{"class":175,"line":362},[173,16498,227],{"emptyLinePlaceholder":226},[173,16500,16501,16503,16505,16507,16510],{"class":175,"line":368},[173,16502,16468],{"class":1199},[173,16504,13009],{"class":179},[173,16506,1200],{"class":1199},[173,16508,16509],{"class":183},"\"你看見換行了嗎\"",[173,16511,1285],{"class":1199},[173,16513,16514],{"class":175,"line":374},[173,16515,227],{"emptyLinePlaceholder":226},[173,16517,16518,16520,16522,16524,16527,16529,16531,16533,16535],{"class":175,"line":380},[173,16519,16468],{"class":1199},[173,16521,12829],{"class":179},[173,16523,1200],{"class":1199},[173,16525,16526],{"class":183},"\"這是一個整數： ",[173,16528,12856],{"class":187},[173,16530,1439],{"class":183},[173,16532,1279],{"class":1199},[173,16534,1376],{"class":187},[173,16536,1285],{"class":1199},[173,16538,16539],{"class":175,"line":385},[173,16540,227],{"emptyLinePlaceholder":226},[173,16542,16543,16545,16547,16549,16552,16554,16556,16558,16561],{"class":175,"line":1405},[173,16544,16468],{"class":1199},[173,16546,12829],{"class":179},[173,16548,1200],{"class":1199},[173,16550,16551],{"class":183},"\"這是一浮點數： ",[173,16553,13336],{"class":187},[173,16555,1439],{"class":183},[173,16557,1279],{"class":1199},[173,16559,16560],{"class":187},"0.344",[173,16562,1285],{"class":1199},[173,16564,16565],{"class":175,"line":1416},[173,16566,227],{"emptyLinePlaceholder":226},[173,16568,16569,16571,16573,16575,16578,16581,16583,16585,16587],{"class":175,"line":1421},[173,16570,16468],{"class":1199},[173,16572,12829],{"class":179},[173,16574,1200],{"class":1199},[173,16576,16577],{"class":183},"\"這是一個布林值： ",[173,16579,16580],{"class":187},"%t\\r\\n",[173,16582,1439],{"class":183},[173,16584,1279],{"class":1199},[173,16586,13411],{"class":187},[173,16588,1285],{"class":1199},[173,16590,16591],{"class":175,"line":1718},[173,16592,227],{"emptyLinePlaceholder":226},[173,16594,16595,16597,16599,16601,16604,16607,16609,16611,16614,16617,16619],{"class":175,"line":1724},[173,16596,16468],{"class":1199},[173,16598,12829],{"class":179},[173,16600,1200],{"class":1199},[173,16602,16603],{"class":183},"\"這是一個字元： ",[173,16605,16606],{"class":187},"%c\\r\\n",[173,16608,1439],{"class":183},[173,16610,1279],{"class":1199},[173,16612,16613],{"class":183},"'",[173,16615,16616],{"class":187},"j",[173,16618,16613],{"class":183},[173,16620,1285],{"class":1199},[173,16622,16623],{"class":175,"line":1729},[173,16624,227],{"emptyLinePlaceholder":226},[173,16626,16627,16629,16631,16633,16636,16638,16640,16642,16644],{"class":175,"line":1735},[173,16628,16468],{"class":1199},[173,16630,12829],{"class":179},[173,16632,1200],{"class":1199},[173,16634,16635],{"class":183},"\"這是一個字串： ",[173,16637,12837],{"class":187},[173,16639,1439],{"class":183},[173,16641,1279],{"class":1199},[173,16643,12781],{"class":183},[173,16645,1285],{"class":1199},[173,16647,16648],{"class":175,"line":4815},[173,16649,227],{"emptyLinePlaceholder":226},[173,16651,16652],{"class":175,"line":4826},[173,16653,1721],{"class":1199},[15,16655,16656],{},[28,16657,8332],{},[164,16659,16661],{"className":166,"code":16660,"language":168,"meta":169,"style":169},"我是一行字串我會換行\n你看見換行了嗎\n這是一個整數： 5\n這是一浮點數： 0.34\n這是一個布林值： true\n這是一個字元： j\n這是一個字串： Allen\n",[19,16662,16663,16668,16673,16680,16688,16696,16704],{"__ignoreMap":169},[173,16664,16665],{"class":175,"line":176},[173,16666,16667],{"class":179},"我是一行字串我會換行\n",[173,16669,16670],{"class":175,"line":212},[173,16671,16672],{"class":179},"你看見換行了嗎\n",[173,16674,16675,16678],{"class":175,"line":223},[173,16676,16677],{"class":179},"這是一個整數：",[173,16679,2949],{"class":187},[173,16681,16682,16685],{"class":175,"line":230},[173,16683,16684],{"class":179},"這是一浮點數：",[173,16686,16687],{"class":187}," 0.34\n",[173,16689,16690,16693],{"class":175,"line":236},[173,16691,16692],{"class":179},"這是一個布林值：",[173,16694,16695],{"class":187}," true\n",[173,16697,16698,16701],{"class":175,"line":249},[173,16699,16700],{"class":179},"這是一個字元：",[173,16702,16703],{"class":183}," j\n",[173,16705,16706,16709],{"class":175,"line":254},[173,16707,16708],{"class":179},"這是一個字串：",[173,16710,12882],{"class":183},[15,16712,16713],{},[28,16714,562],{},[825,16716,16717,16723],{},[55,16718,16719,16720,16722],{},"其中浮點數 ",[19,16721,13726],{}," 表示取到小數點第二位",[55,16724,16725,3931,16727,16729,16730],{},[19,16726,13732],{},[19,16728,1436],{}," 都是換行的控制字元\n",[825,16731,16732,16737],{},[55,16733,16734,16736],{},[19,16735,1436],{},"：在 Unix 系統中，此控制字元，表示換到下一行的開頭，在 Windows 系統中，只會進行換行",[55,16738,16739,16741,16742,16745,16746],{},[19,16740,13732],{},"：在 Windows，",[19,16743,16744],{},"\\r"," 代表 Enter 鍵，所以我們需要換到下一行的開頭時，我們必需用 ",[19,16747,13732],{},[44,16749,16750],{"id":16750},"輸入",[52,16752,16753,16759],{},[55,16754,16755,16758],{},[19,16756,16757],{},"scan(&x)","：會讀取整行輸入，並將輸入內容軟成字串型態",[55,16760,16761,16764],{},[19,16762,16763],{},"scanf(\"%d %.2f\", &x)","：可以指定輸入格式，並可一次輸入多個參數",[15,16766,16767],{},[28,16768,16169],{},[164,16770,16772],{"className":12673,"code":16771,"language":12675,"meta":169,"style":169},"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",[19,16773,16774,16780,16784,16794,16798,16806,16810,16818,16822,16832,16836,16844,16848,16856,16860,16873,16887,16900,16922,16935,16965,16969,16981,16994,17006,17010,17023,17059,17063],{"__ignoreMap":169},[173,16775,16776,16778],{"class":175,"line":176},[173,16777,12745],{"class":468},[173,16779,12748],{"class":179},[173,16781,16782],{"class":175,"line":212},[173,16783,227],{"emptyLinePlaceholder":226},[173,16785,16786,16788,16790,16792],{"class":175,"line":223},[173,16787,12753],{"class":468},[173,16789,12756],{"class":183},[173,16791,12759],{"class":179},[173,16793,12762],{"class":183},[173,16795,16796],{"class":175,"line":230},[173,16797,227],{"emptyLinePlaceholder":226},[173,16799,16800,16802,16804],{"class":175,"line":236},[173,16801,12682],{"class":468},[173,16803,12769],{"class":179},[173,16805,6664],{"class":1199},[173,16807,16808],{"class":175,"line":249},[173,16809,227],{"emptyLinePlaceholder":226},[173,16811,16812,16814,16816],{"class":175,"line":254},[173,16813,13205],{"class":468},[173,16815,13208],{"class":1199},[173,16817,13211],{"class":468},[173,16819,16820],{"class":175,"line":260},[173,16821,227],{"emptyLinePlaceholder":226},[173,16823,16824,16826,16829],{"class":175,"line":356},[173,16825,13205],{"class":468},[173,16827,16828],{"class":1199}," age ",[173,16830,16831],{"class":468},"int8\n",[173,16833,16834],{"class":175,"line":362},[173,16835,227],{"emptyLinePlaceholder":226},[173,16837,16838,16840,16842],{"class":175,"line":368},[173,16839,13205],{"class":468},[173,16841,13228],{"class":1199},[173,16843,13231],{"class":468},[173,16845,16846],{"class":175,"line":374},[173,16847,227],{"emptyLinePlaceholder":226},[173,16849,16850,16852,16854],{"class":175,"line":380},[173,16851,13205],{"class":468},[173,16853,13238],{"class":1199},[173,16855,13231],{"class":468},[173,16857,16858],{"class":175,"line":385},[173,16859,227],{"emptyLinePlaceholder":226},[173,16861,16862,16864,16866,16868,16871],{"class":175,"line":1405},[173,16863,13006],{"class":1199},[173,16865,13672],{"class":179},[173,16867,1200],{"class":1199},[173,16869,16870],{"class":183},"\"請輸入您的姓名：\"",[173,16872,1285],{"class":1199},[173,16874,16875,16877,16880,16882,16884],{"class":175,"line":1416},[173,16876,13006],{"class":1199},[173,16878,16879],{"class":179},"Scanln",[173,16881,1200],{"class":1199},[173,16883,9392],{"class":468},[173,16885,16886],{"class":1199},"name)\n",[173,16888,16889,16891,16893,16895,16898],{"class":175,"line":1421},[173,16890,13006],{"class":1199},[173,16892,13672],{"class":179},[173,16894,1200],{"class":1199},[173,16896,16897],{"class":183},"\"請輸入你的年紀：\"",[173,16899,1285],{"class":1199},[173,16901,16902,16904,16907,16909,16911,16913,16915,16917,16919],{"class":175,"line":1718},[173,16903,13006],{"class":1199},[173,16905,16906],{"class":179},"Scanf",[173,16908,1200],{"class":1199},[173,16910,1439],{"class":183},[173,16912,14418],{"class":187},[173,16914,1439],{"class":183},[173,16916,1279],{"class":1199},[173,16918,9392],{"class":468},[173,16920,16921],{"class":1199},"age)\n",[173,16923,16924,16926,16928,16930,16933],{"class":175,"line":1724},[173,16925,13006],{"class":1199},[173,16927,13672],{"class":179},[173,16929,1200],{"class":1199},[173,16931,16932],{"class":183},"\"請輸入你的身高和體重：\"",[173,16934,1285],{"class":1199},[173,16936,16937,16939,16941,16943,16945,16948,16951,16953,16955,16957,16960,16962],{"class":175,"line":1729},[173,16938,13006],{"class":1199},[173,16940,16906],{"class":179},[173,16942,1200],{"class":1199},[173,16944,1439],{"class":183},[173,16946,16947],{"class":187},"%f",[173,16949,16950],{"class":187}," %f",[173,16952,1439],{"class":183},[173,16954,1279],{"class":1199},[173,16956,9392],{"class":468},[173,16958,16959],{"class":1199},"height, ",[173,16961,9392],{"class":468},[173,16963,16964],{"class":1199},"weight)\n",[173,16966,16967],{"class":175,"line":1735},[173,16968,227],{"emptyLinePlaceholder":226},[173,16970,16971,16974,16976,16978],{"class":175,"line":4815},[173,16972,16973],{"class":1199},"    age ",[173,16975,1206],{"class":468},[173,16977,12819],{"class":468},[173,16979,16980],{"class":1199},"(age)\n",[173,16982,16983,16986,16988,16991],{"class":175,"line":4826},[173,16984,16985],{"class":1199},"    height ",[173,16987,1206],{"class":468},[173,16989,16990],{"class":468}," float32",[173,16992,16993],{"class":1199},"(height)\n",[173,16995,16996,16999,17001,17003],{"class":175,"line":4837},[173,16997,16998],{"class":1199},"    weight ",[173,17000,1206],{"class":468},[173,17002,16990],{"class":468},[173,17004,17005],{"class":1199},"(weight)\n",[173,17007,17008],{"class":175,"line":4842},[173,17009,227],{"emptyLinePlaceholder":226},[173,17011,17012,17014,17016,17018,17021],{"class":175,"line":4848},[173,17013,13006],{"class":1199},[173,17015,13009],{"class":179},[173,17017,1200],{"class":1199},[173,17019,17020],{"class":183},"\"====您輸入的內容如下=====\"",[173,17022,1285],{"class":1199},[173,17024,17025,17027,17029,17031,17034,17036,17039,17042,17044,17047,17049,17052,17054,17056],{"class":175,"line":4858},[173,17026,13006],{"class":1199},[173,17028,12829],{"class":179},[173,17030,1200],{"class":1199},[173,17032,17033],{"class":183},"\"您的大名是： ",[173,17035,15977],{"class":187},[173,17037,17038],{"class":187}," \\r\\n",[173,17040,17041],{"class":183},"您的年齡： ",[173,17043,12856],{"class":187},[173,17045,17046],{"class":183},"您的身高： ",[173,17048,13336],{"class":187},[173,17050,17051],{"class":183},"您的體重：",[173,17053,13336],{"class":187},[173,17055,1439],{"class":183},[173,17057,17058],{"class":1199},", name, age, height, weight)\n",[173,17060,17061],{"class":175,"line":4872},[173,17062,227],{"emptyLinePlaceholder":226},[173,17064,17065],{"class":175,"line":4877},[173,17066,1721],{"class":1199},[15,17068,17069],{},[28,17070,8332],{},[164,17072,17074],{"className":166,"code":17073,"language":168,"meta":169,"style":169},"請輸入您的姓名：Allen\n請輸入你的年紀：25\n請輸入你的身高和體重：175 70 \n====您輸入的內容如下=====\n您的大名是： Allen \n您的年齡： 25\n您的身高： 175.00\n您的體重：70.00\n",[19,17075,17076,17081,17086,17097,17102,17112,17119,17127],{"__ignoreMap":169},[173,17077,17078],{"class":175,"line":176},[173,17079,17080],{"class":179},"請輸入您的姓名：Allen\n",[173,17082,17083],{"class":175,"line":212},[173,17084,17085],{"class":179},"請輸入你的年紀：25\n",[173,17087,17088,17091,17094],{"class":175,"line":223},[173,17089,17090],{"class":179},"請輸入你的身高和體重：175",[173,17092,17093],{"class":187}," 70",[173,17095,17096],{"class":1199}," \n",[173,17098,17099],{"class":175,"line":230},[173,17100,17101],{"class":183},"====您輸入的內容如下=====\n",[173,17103,17104,17107,17110],{"class":175,"line":236},[173,17105,17106],{"class":179},"您的大名是：",[173,17108,17109],{"class":183}," Allen",[173,17111,17096],{"class":1199},[173,17113,17114,17117],{"class":175,"line":249},[173,17115,17116],{"class":179},"您的年齡：",[173,17118,14887],{"class":187},[173,17120,17121,17124],{"class":175,"line":254},[173,17122,17123],{"class":179},"您的身高：",[173,17125,17126],{"class":187}," 175.00\n",[173,17128,17129],{"class":175,"line":260},[173,17130,17131],{"class":179},"您的體重：70.00\n",[894,17133,17134],{},"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":169,"searchDepth":212,"depth":212,"links":17136},[17137,17138],{"id":16398,"depth":212,"text":16398},{"id":16750,"depth":212,"text":16750},{},"\u002Farticles\u002F2023-03-07-go-print","2023-03-07 23:26:00",{"title":16389,"description":169},"articles\u002F2023-03-07-go-print","在 Go lang 中，會使用 `fmt` 這個套件，來處理基本的輸入輸出",[12675],"qed74xM3e9OGLUD8A3VRr5d374RcyCdF1WljBm5JUi0",{"id":17148,"title":17149,"body":17150,"category":2635,"description":169,"extension":921,"image":13533,"meta":17692,"navigation":226,"path":17693,"pubDate":17694,"seo":17695,"status":226,"stem":17696,"summary":17697,"tags":17698,"__hash__":17699},"content\u002Farticles\u002F2023-03-01-go-lang-variable.md","《Go 學習筆記2》 變數型態",{"type":8,"value":17151,"toc":17681},[17152,17156,17159,17168,17212,17217,17249,17252,17266,17270,17328,17331,17471,17474,17486,17489,17496,17499,17507,17528,17531,17539,17542,17550,17659,17663,17678],[621,17153,17154],{},[15,17155,12664],{},[44,17157,17158],{"id":17158},"變數宣告",[15,17160,17161,17162,5671,17165,17167],{},"在 Go lang 變數宣告，可使用 ",[19,17163,17164],{},"var",[19,17166,12983],{}," 兩個關鍵字，進行變數宣告。",[164,17169,17171],{"className":12673,"code":17170,"language":12675,"meta":169,"style":169},"var x int =  10\nvar y float32 = 3.1412\nvar z string = \"Hello World\"\n",[19,17172,17173,17186,17199],{"__ignoreMap":169},[173,17174,17175,17177,17179,17181,17183],{"class":175,"line":176},[173,17176,17164],{"class":468},[173,17178,13060],{"class":1199},[173,17180,13051],{"class":468},[173,17182,6440],{"class":468},[173,17184,17185],{"class":187},"  10\n",[173,17187,17188,17190,17192,17194,17196],{"class":175,"line":212},[173,17189,17164],{"class":468},[173,17191,13065],{"class":1199},[173,17193,13393],{"class":468},[173,17195,6440],{"class":468},[173,17197,17198],{"class":187}," 3.1412\n",[173,17200,17201,17203,17205,17207,17209],{"class":175,"line":223},[173,17202,17164],{"class":468},[173,17204,14393],{"class":1199},[173,17206,13383],{"class":468},[173,17208,6440],{"class":468},[173,17210,17211],{"class":183}," \"Hello World\"\n",[15,17213,5140,17214,17216],{},[19,17215,12983],{}," 符號變數宣告時，可以省略型態，系統會自動推斷變數的型態",[164,17218,17220],{"className":12673,"code":17219,"language":12675,"meta":169,"style":169},"x := 10\ny := 3.1412\nz := \"Hello World\"\n",[19,17221,17222,17231,17240],{"__ignoreMap":169},[173,17223,17224,17227,17229],{"class":175,"line":176},[173,17225,17226],{"class":1199},"x ",[173,17228,12983],{"class":468},[173,17230,14534],{"class":187},[173,17232,17233,17236,17238],{"class":175,"line":212},[173,17234,17235],{"class":1199},"y ",[173,17237,12983],{"class":468},[173,17239,17198],{"class":187},[173,17241,17242,17245,17247],{"class":175,"line":223},[173,17243,17244],{"class":1199},"z ",[173,17246,12983],{"class":468},[173,17248,17211],{"class":183},[15,17250,17251],{},"多變數宣告",[164,17253,17255],{"className":12673,"code":17254,"language":12675,"meta":169,"style":169},"var x, y, z int\n",[19,17256,17257],{"__ignoreMap":169},[173,17258,17259,17261,17264],{"class":175,"line":176},[173,17260,17164],{"class":468},[173,17262,17263],{"class":1199}," x, y, z ",[173,17265,14327],{"class":468},[44,17267,17269],{"id":17268},"go-語言的變數型態包括","Go 語言的變數型態包括:",[52,17271,17272,17304,17312,17323],{},[55,17273,17274,17275,1279,17277,1279,17280,1279,17283,1279,17286,1279,17289,1279,17292,1279,17295,1279,17298,1279,17301],{},"整數類型: ",[19,17276,13051],{},[19,17278,17279],{},"int8",[19,17281,17282],{},"int16",[19,17284,17285],{},"int32",[19,17287,17288],{},"int64",[19,17290,17291],{},"uint",[19,17293,17294],{},"uint8",[19,17296,17297],{},"uint16",[19,17299,17300],{},"uint32",[19,17302,17303],{},"uint64",[55,17305,17306,17307,1279,17309],{},"浮點數類型: ",[19,17308,13393],{},[19,17310,17311],{},"float64",[55,17313,17314,17315,1279,17317,1279,17320],{},"字符類型: ",[19,17316,13383],{},[19,17318,17319],{},"rune",[19,17321,17322],{},"byte",[55,17324,17325,17326],{},"布林類型: ",[19,17327,13388],{},[90,17329,17330],{"id":17330},"整數型態",[825,17332,17333,17403],{},[55,17334,17335,17337,17338],{},[19,17336,13051],{}," ： 是帶有符號的整數，可表示正數與負數\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",[548,17339,17340,17352],{},[551,17341,17342],{},[554,17343,17344,17346,17349],{},[557,17345,4951],{},[557,17347,17348],{},"大小",[557,17350,17351],{},"範圍",[564,17353,17354,17364,17374,17384,17394],{},[554,17355,17356,17358,17361],{},[569,17357,17279],{},[569,17359,17360],{},"8 bits",[569,17362,17363],{},"-128 ~ 127",[554,17365,17366,17368,17371],{},[569,17367,17282],{},[569,17369,17370],{},"16bits",[569,17372,17373],{},"-2^15 ~ 2^15-1",[554,17375,17376,17378,17381],{},[569,17377,17285],{},[569,17379,17380],{},"32bits",[569,17382,17383],{},"-2^31 ~ 2^31-1",[554,17385,17386,17388,17391],{},[569,17387,17288],{},[569,17389,17390],{},"64bits",[569,17392,17393],{},"-2^63 ~ 2^63-1",[554,17395,17396,17398,17401],{},[569,17397,13051],{},[569,17399,17400],{},"取決於平台",[569,17402,17400],{},[55,17404,17405,17408,17409],{},[19,17406,17407],{},"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",[548,17410,17411,17421],{},[551,17412,17413],{},[554,17414,17415,17417,17419],{},[557,17416,4951],{},[557,17418,17348],{},[557,17420,17351],{},[564,17422,17423,17433,17443,17453,17463],{},[554,17424,17425,17428,17430],{},[569,17426,17427],{},"unit8",[569,17429,17360],{},[569,17431,17432],{},"0 ~ 255",[554,17434,17435,17438,17440],{},[569,17436,17437],{},"unit16",[569,17439,17370],{},[569,17441,17442],{},"0 ~ 2^16 - 1",[554,17444,17445,17448,17450],{},[569,17446,17447],{},"unit32",[569,17449,17380],{},[569,17451,17452],{},"0 ~ 2^31 -1",[554,17454,17455,17458,17460],{},[569,17456,17457],{},"unit64",[569,17459,17390],{},[569,17461,17462],{},"0~ 2^63 -1",[554,17464,17465,17467,17469],{},[569,17466,17407],{},[569,17468,17400],{},[569,17470,17400],{},[90,17472,17473],{"id":17473},"浮點數型態",[825,17475,17476,17481],{},[55,17477,17478,17480],{},[19,17479,13393],{},"：在記憶體佔用 32 位元，並以單精度浮點數格式儲存",[55,17482,17483,17485],{},[19,17484,17311],{},"：在記憶體佔用 64 位元，並以倍精度浮點數格式儲存",[90,17487,17488],{"id":17488},"字串",[15,17490,17491,17492,17495],{},"在 Go lang 中，可以使用雙引號來宣告如 ",[19,17493,17494],{},"\"Hello World\""," 也可以使用反引號來宣告 `hello World`",[90,17497,17498],{"id":17498},"字元",[15,17500,17501,17502,5671,17504,17506],{},"在 Go lang 中，以 ",[19,17503,17322],{},[19,17505,17319],{}," 來表示字元的變數型態",[52,17508,17509,17517],{},[55,17510,17511,17513,17514,17516],{},[19,17512,17322],{},"：是 ",[19,17515,17427],{}," 的別名，用來表示一個 8 bits 無符號正整數。它常用來表示 ASCII 碼或 UTF-8 編碼的字元。",[55,17518,17519,17513,17521,17523,17524,17527],{},[19,17520,17319],{},[19,17522,17285],{}," 的別名，用來表示一個 ",[19,17525,17526],{},"Unicode"," 碼點。它常用來表示 UTF-32 編碼的字元。",[90,17529,17530],{"id":17530},"布林值",[15,17532,17533,17534,3931,17536],{},"Go lang 是以 bool 來宣告，其實為 ",[19,17535,13411],{},[19,17537,17538],{},"false",[44,17540,17541],{"id":17541},"型態轉換",[15,17543,17544,17545,5671,17547,17549],{},"由於 Go lang 是強型別語言，所以它不允許表達式中混合不同型態的變數。例如，我們不同直接將 ",[19,17546,17279],{},[19,17548,13393],{}," 進行相加。要解決此問題，我們必需將變數型態，改成同一種變數型態，才能進行運算。",[164,17551,17553],{"className":12673,"code":17552,"language":12675,"meta":169,"style":169},"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",[19,17554,17555,17561,17565,17575,17579,17587,17591,17603,17607,17619,17623,17642,17646,17655],{"__ignoreMap":169},[173,17556,17557,17559],{"class":175,"line":176},[173,17558,12745],{"class":468},[173,17560,12748],{"class":179},[173,17562,17563],{"class":175,"line":212},[173,17564,227],{"emptyLinePlaceholder":226},[173,17566,17567,17569,17571,17573],{"class":175,"line":223},[173,17568,12753],{"class":468},[173,17570,12756],{"class":183},[173,17572,12759],{"class":179},[173,17574,12762],{"class":183},[173,17576,17577],{"class":175,"line":230},[173,17578,227],{"emptyLinePlaceholder":226},[173,17580,17581,17583,17585],{"class":175,"line":236},[173,17582,12682],{"class":468},[173,17584,12769],{"class":179},[173,17586,6664],{"class":1199},[173,17588,17589],{"class":175,"line":249},[173,17590,227],{"emptyLinePlaceholder":226},[173,17592,17593,17595,17597,17599,17601],{"class":175,"line":254},[173,17594,13205],{"class":468},[173,17596,13060],{"class":1199},[173,17598,13051],{"class":468},[173,17600,6440],{"class":468},[173,17602,14534],{"class":187},[173,17604,17605],{"class":175,"line":260},[173,17606,13254],{"class":1199},[173,17608,17609,17611,17613,17615,17617],{"class":175,"line":356},[173,17610,13205],{"class":468},[173,17612,13065],{"class":1199},[173,17614,13393],{"class":468},[173,17616,6440],{"class":468},[173,17618,17198],{"class":187},[173,17620,17621],{"class":175,"line":362},[173,17622,13254],{"class":1199},[173,17624,17625,17627,17629,17631,17633,17635,17638,17640],{"class":175,"line":368},[173,17626,13205],{"class":468},[173,17628,14393],{"class":1199},[173,17630,13393],{"class":468},[173,17632,6440],{"class":468},[173,17634,16990],{"class":468},[173,17636,17637],{"class":1199},"(x) ",[173,17639,7641],{"class":468},[173,17641,14404],{"class":1199},[173,17643,17644],{"class":175,"line":374},[173,17645,13254],{"class":1199},[173,17647,17648,17650,17652],{"class":175,"line":380},[173,17649,13006],{"class":1199},[173,17651,13009],{"class":179},[173,17653,17654],{"class":1199},"(x, y, z)\n",[173,17656,17657],{"class":175,"line":385},[173,17658,1721],{"class":1199},[15,17660,17661],{},[28,17662,8332],{},[164,17664,17666],{"className":166,"code":17665,"language":168,"meta":169,"style":169},"10 3.1412 13.1412\n",[19,17667,17668],{"__ignoreMap":169},[173,17669,17670,17672,17675],{"class":175,"line":176},[173,17671,1395],{"class":179},[173,17673,17674],{"class":187}," 3.1412",[173,17676,17677],{"class":187}," 13.1412\n",[894,17679,17680],{},"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":169,"searchDepth":212,"depth":212,"links":17682},[17683,17684,17691],{"id":17158,"depth":212,"text":17158},{"id":17268,"depth":212,"text":17269,"children":17685},[17686,17687,17688,17689,17690],{"id":17330,"depth":223,"text":17330},{"id":17473,"depth":223,"text":17473},{"id":17488,"depth":223,"text":17488},{"id":17498,"depth":223,"text":17498},{"id":17530,"depth":223,"text":17530},{"id":17541,"depth":212,"text":17541},{},"\u002Farticles\u002F2023-03-01-go-lang-variable","2023-03-01 21:09:00",{"title":17149,"description":169},"articles\u002F2023-03-01-go-lang-variable","Go語言變數的使用",[12675],"DB-nKle0k_0j3qTQYeUi6BcZelDX2AsafhQIlZhDKi4",{"id":17701,"title":17702,"body":17703,"category":2635,"description":169,"extension":921,"image":13533,"meta":17905,"navigation":226,"path":17906,"pubDate":17907,"seo":17908,"status":226,"stem":17909,"summary":17910,"tags":17911,"__hash__":17912},"content\u002Farticles\u002F2023-02-27-hello-world.md","《Go 學習筆記2》不免俗的 Ｈello World",{"type":8,"value":17704,"toc":17897},[17705,17709,17712,17725,17728,17735,17748,17751,17754,17813,17851,17854,17868,17871,17880,17882,17894],[621,17706,17707],{},[15,17708,12664],{},[44,17710,17711],{"id":17711},"建立專案目錄",[164,17713,17715],{"className":166,"code":17714,"language":168,"meta":169,"style":169},"mkdir go-test\n",[19,17716,17717],{"__ignoreMap":169},[173,17718,17719,17722],{"class":175,"line":176},[173,17720,17721],{"class":179},"mkdir",[173,17723,17724],{"class":183}," go-test\n",[44,17726,17727],{"id":17727},"建立程式檔",[15,17729,17730,17731,17734],{},"Go lang 的程式檔，會以 ",[19,17732,17733],{},"*.go"," 為副檔名",[164,17736,17738],{"className":166,"code":17737,"language":168,"meta":169,"style":169},"touch hello.go\n",[19,17739,17740],{"__ignoreMap":169},[173,17741,17742,17745],{"class":175,"line":176},[173,17743,17744],{"class":179},"touch",[173,17746,17747],{"class":183}," hello.go\n",[44,17749,17750],{"id":17750},"編輯程式碼",[15,17752,17753],{},"以文字編輯器或IDE開啟，輸入下列程式碼",[164,17755,17757],{"className":12673,"code":17756,"language":12675,"meta":169,"style":169},"\u002F**\n這是注解\n***\u002F\npackage main\nimport \"fmt\"\nfunc main() {\n    fmt.Println(\"Hello World\")\n}\n",[19,17758,17759,17763,17768,17773,17779,17789,17797,17809],{"__ignoreMap":169},[173,17760,17761],{"class":175,"line":176},[173,17762,11231],{"class":208},[173,17764,17765],{"class":175,"line":212},[173,17766,17767],{"class":208},"這是注解\n",[173,17769,17770],{"class":175,"line":223},[173,17771,17772],{"class":208},"***\u002F\n",[173,17774,17775,17777],{"class":175,"line":230},[173,17776,12745],{"class":468},[173,17778,12748],{"class":179},[173,17780,17781,17783,17785,17787],{"class":175,"line":236},[173,17782,12753],{"class":468},[173,17784,12756],{"class":183},[173,17786,12759],{"class":179},[173,17788,12762],{"class":183},[173,17790,17791,17793,17795],{"class":175,"line":249},[173,17792,12682],{"class":468},[173,17794,12769],{"class":179},[173,17796,6664],{"class":1199},[173,17798,17799,17801,17803,17805,17807],{"class":175,"line":254},[173,17800,13006],{"class":1199},[173,17802,13009],{"class":179},[173,17804,1200],{"class":1199},[173,17806,17494],{"class":183},[173,17808,1285],{"class":1199},[173,17810,17811],{"class":175,"line":260},[173,17812,1721],{"class":1199},[52,17814,17815,17821,17827,17834,17845],{},[55,17816,17817,17820],{},[19,17818,17819],{},"\u002F**\u002F","：為多行註解",[55,17822,17823,17826],{},[19,17824,17825],{},"\u002F\u002F"," ：為單行注解",[55,17828,17829,17830,17833],{},"package：是 Go lang 來定義 namespace 的方式，可以用來避免與第三方套件名稱衝突，若所開發為應用程式，則用 ",[19,17831,17832],{},"main","，若開發的為函式庫，則由開發者自行命名。",[55,17835,17836,17838,17839,17841,17842,17844],{},[19,17837,12753],{}," ：引入函式庫用，包含 Go lang 的標準函式庫或是第三方開發的函式庫，都可以用 ",[19,17840,12753],{}," 引入，而範例中 ",[19,17843,12759],{}," 為 Go lang 的基本輸入輸出的函式庫",[55,17846,17847,17850],{},[19,17848,17849],{},"func main","：為主程式進入點，程式執行時，會先執行該段程式",[44,17852,17853],{"id":17853},"進行編譯",[164,17855,17857],{"className":166,"code":17856,"language":168,"meta":169,"style":169},"go build hello.go\n",[19,17858,17859],{"__ignoreMap":169},[173,17860,17861,17863,17866],{"class":175,"line":176},[173,17862,12675],{"class":179},[173,17864,17865],{"class":183}," build",[173,17867,17747],{"class":183},[44,17869,17870],{"id":17870},"執行程式",[164,17872,17874],{"className":166,"code":17873,"language":168,"meta":169,"style":169},".\u002Fhello\n",[19,17875,17876],{"__ignoreMap":169},[173,17877,17878],{"class":175,"line":176},[173,17879,17873],{"class":179},[44,17881,8332],{"id":8332},[164,17883,17885],{"className":166,"code":17884,"language":168,"meta":169,"style":169},"Hello world\n",[19,17886,17887],{"__ignoreMap":169},[173,17888,17889,17891],{"class":175,"line":176},[173,17890,12879],{"class":179},[173,17892,17893],{"class":183}," world\n",[894,17895,17896],{},"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":169,"searchDepth":212,"depth":212,"links":17898},[17899,17900,17901,17902,17903,17904],{"id":17711,"depth":212,"text":17711},{"id":17727,"depth":212,"text":17727},{"id":17750,"depth":212,"text":17750},{"id":17853,"depth":212,"text":17853},{"id":17870,"depth":212,"text":17870},{"id":8332,"depth":212,"text":8332},{},"\u002Farticles\u002F2023-02-27-hello-world","2023-02-27 22:28:00",{"title":17702,"description":169},"articles\u002F2023-02-27-hello-world","Go語言一些基本操作",[12675],"AGAAFRb7gZGddzu0isU-2bKBkb4OTw3OC0QkXbImczw",{"id":17914,"title":17915,"body":17916,"category":2635,"description":169,"extension":921,"image":13533,"meta":18222,"navigation":226,"path":18223,"pubDate":18224,"seo":18225,"status":226,"stem":18226,"summary":18227,"tags":18228,"__hash__":18229},"content\u002Farticles\u002F2023-02-26-go-lang-setup.md","《Go 學習筆記1》開發環境建置",{"type":8,"value":17917,"toc":18214},[17918,17922,17925,17929,17935,17938,17944,17950,17953,17956,17960,17969,17983,17987,17996,18010,18014,18019,18023,18049,18058,18063,18104,18113,18131,18136,18171,18174,18177,18189,18193,18211],[621,17919,17920],{},[15,17921,12664],{},[15,17923,17924],{},"先從安裝開發環境",[44,17926,17928],{"id":17927},"go-語言官網","Go 語言官網",[15,17930,17931],{},[283,17932,17933],{"href":17933,"rel":17934},"https:\u002F\u002Fgo.dev\u002F",[287],[44,17936,17937],{"id":17937},"官網下載頁",[15,17939,17940],{},[283,17941,17942],{"href":17942,"rel":17943},"https:\u002F\u002Fgo.dev\u002Fdl\u002F",[287],[15,17945,17946],{},[543,17947],{"alt":17948,"src":17949},"alt Go語言下載","\u002Farticles\u002F2023-02-26-go-lang-setup\u002FPasted-image-20230124103550.png",[15,17951,17952],{},"基本上 Windows 和 MacOS 只要下載相對應的的版本，然後依安裝精靈，一步一步安裝裝即可。",[15,17954,17955],{},"也可以用指令安裝",[44,17957,17959],{"id":17958},"windows-指令安裝","Windows 指令安裝",[15,17961,17962,17963,17968],{},"在 Windows 環境下，要透過指令安裝，可以用安裝 ",[283,17964,17967],{"href":17965,"rel":17966},"https:\u002F\u002Fchocolatey.org\u002F",[287],"chocolate"," 後，以下面指令安裝",[164,17970,17972],{"className":166,"code":17971,"language":168,"meta":169,"style":169},"choco install golang\n",[19,17973,17974],{"__ignoreMap":169},[173,17975,17976,17978,17980],{"class":175,"line":176},[173,17977,4121],{"class":179},[173,17979,184],{"class":183},[173,17981,17982],{"class":183}," golang\n",[44,17984,17986],{"id":17985},"macos-指令安裝","MacOS 指令安裝",[15,17988,17989,17990,17995],{},"在 MacOS 環境下，則可透過 ",[283,17991,17994],{"href":17992,"rel":17993},"https:\u002F\u002Fbrew.sh\u002Findex_zh-tw",[287],"Homebrew"," 這個套件管理工具，進行安裝，指令如下：",[164,17997,17999],{"className":166,"code":17998,"language":168,"meta":169,"style":169},"brew install go\n",[19,18000,18001],{"__ignoreMap":169},[173,18002,18003,18005,18007],{"class":175,"line":176},[173,18004,180],{"class":179},[173,18006,184],{"class":183},[173,18008,18009],{"class":183}," go\n",[44,18011,18013],{"id":18012},"linux-指令安裝","Linux 指令安裝",[15,18015,18016],{},[28,18017,18018],{},"一般 Linux",[825,18020,18021],{},[55,18022,10627],{},[164,18024,18026],{"className":166,"code":18025,"language":168,"meta":169,"style":169},"wget https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo\u003C版本號>linux-amd64.tar.gz\n",[19,18027,18028],{"__ignoreMap":169},[173,18029,18030,18033,18036,18038,18041,18044,18046],{"class":175,"line":176},[173,18031,18032],{"class":179},"wget",[173,18034,18035],{"class":183}," https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo",[173,18037,6007],{"class":468},[173,18039,18040],{"class":183},"版本",[173,18042,18043],{"class":1199},"號",[173,18045,6747],{"class":468},[173,18047,18048],{"class":183},"linux-amd64.tar.gz\n",[52,18050,18051],{},[55,18052,18053,18054,18057],{},"版本號：可至 ",[283,18055,17937],{"href":17942,"rel":18056},[287]," 查詢可安裝的版本號",[825,18059,18060],{"start":212},[55,18061,18062],{},"解壓縮",[164,18064,18066],{"className":166,"code":18065,"language":168,"meta":169,"style":169},"   sudo tar -xvf go\u003C版本號>linux-amd64.tar.gz\n   sudo mv go \u002Fusr\u002Flocal\n",[19,18067,18068,18092],{"__ignoreMap":169},[173,18069,18070,18073,18076,18079,18082,18084,18086,18088,18090],{"class":175,"line":176},[173,18071,18072],{"class":179},"   sudo",[173,18074,18075],{"class":183}," tar",[173,18077,18078],{"class":187}," -xvf",[173,18080,18081],{"class":183}," go",[173,18083,6007],{"class":468},[173,18085,18040],{"class":183},[173,18087,18043],{"class":1199},[173,18089,6747],{"class":468},[173,18091,18048],{"class":183},[173,18093,18094,18096,18099,18101],{"class":175,"line":212},[173,18095,18072],{"class":179},[173,18097,18098],{"class":183}," mv",[173,18100,18081],{"class":183},[173,18102,18103],{"class":183}," \u002Fusr\u002Flocal\n",[825,18105,18106],{"start":223},[55,18107,18108,18109,18112],{},"設定環境變數\n在 ",[19,18110,18111],{},"~\u002F.profile"," 最後一行加上",[164,18114,18116],{"className":166,"code":18115,"language":168,"meta":169,"style":169},"   export PATH=$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[19,18117,18118],{"__ignoreMap":169},[173,18119,18120,18123,18126,18128],{"class":175,"line":176},[173,18121,18122],{"class":468},"   export",[173,18124,18125],{"class":1199}," PATH",[173,18127,1206],{"class":468},[173,18129,18130],{"class":1199},"$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[15,18132,18133],{},[28,18134,18135],{},"Ubuntu 指令安裝",[164,18137,18139],{"className":166,"code":18138,"language":168,"meta":169,"style":169},"sudo add-apt-repository ppa:longsleep\u002Fgolang-backports\nsudo apt update\nsudo apt install golang-go\n",[19,18140,18141,18151,18160],{"__ignoreMap":169},[173,18142,18143,18145,18148],{"class":175,"line":176},[173,18144,239],{"class":179},[173,18146,18147],{"class":183}," add-apt-repository",[173,18149,18150],{"class":183}," ppa:longsleep\u002Fgolang-backports\n",[173,18152,18153,18155,18157],{"class":175,"line":212},[173,18154,239],{"class":179},[173,18156,242],{"class":183},[173,18158,18159],{"class":183}," update\n",[173,18161,18162,18164,18166,18168],{"class":175,"line":223},[173,18163,239],{"class":179},[173,18165,242],{"class":183},[173,18167,184],{"class":183},[173,18169,18170],{"class":183}," golang-go\n",[44,18172,18173],{"id":18173},"安裝環境測試",[15,18175,18176],{},"使用下列指令，即可知道安裝環境是否成功，亦可知曉安裝版本號",[164,18178,18180],{"className":166,"code":18179,"language":168,"meta":169,"style":169},"go version\n",[19,18181,18182],{"__ignoreMap":169},[173,18183,18184,18186],{"class":175,"line":176},[173,18185,12675],{"class":179},[173,18187,18188],{"class":183}," version\n",[15,18190,18191],{},[28,18192,8332],{},[164,18194,18196],{"className":166,"code":18195,"language":168,"meta":169,"style":169},"go version go1.20.1 darwin\u002Farm64\n",[19,18197,18198],{"__ignoreMap":169},[173,18199,18200,18202,18205,18208],{"class":175,"line":176},[173,18201,12675],{"class":179},[173,18203,18204],{"class":183}," version",[173,18206,18207],{"class":183}," go1.20.1",[173,18209,18210],{"class":183}," darwin\u002Farm64\n",[894,18212,18213],{},"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":169,"searchDepth":212,"depth":212,"links":18215},[18216,18217,18218,18219,18220,18221],{"id":17927,"depth":212,"text":17928},{"id":17937,"depth":212,"text":17937},{"id":17958,"depth":212,"text":17959},{"id":17985,"depth":212,"text":17986},{"id":18012,"depth":212,"text":18013},{"id":18173,"depth":212,"text":18173},{},"\u002Farticles\u002F2023-02-26-go-lang-setup","2023-02-26 22:07:00",{"title":17915,"description":169},"articles\u002F2023-02-26-go-lang-setup","Go語言開發環境建置",[12675],"1MsaGwXGPaKjHByWDr40lLNGtsFtegUMCMt7bttsgQ8",{"id":18231,"title":18232,"body":18233,"category":10538,"description":18600,"extension":921,"image":18601,"meta":18602,"navigation":226,"path":18603,"pubDate":18604,"seo":18605,"status":226,"stem":18606,"summary":18607,"tags":18608,"__hash__":18610},"content\u002Farticles\u002F2023-01-17-docker-postgresql-import-export.md","Docker 裡的 Postgresql 的匯入與匯出",{"type":8,"value":18234,"toc":18596},[18235,18244,18247,18254,18261,18264,18338,18370,18373,18379,18385,18388,18457,18479,18486,18488,18563,18593],[15,18236,18237,18238,18243],{},"我們可以用 ",[283,18239,18242],{"href":18240,"rel":18241},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fadminer",[287],"Adminer"," 這個資料庫管理工具，來進行匯入匯出，但檔案太大時，用 Adminer 就會顯得力不從心，而我們另外一個選擇，就是透過指令匯入匯出 SQL 檔。",[44,18245,18246],{"id":18246},"匯入",[15,18248,18249,18250,18253],{},"要將 SQL 檔案匯入到 Docker 內的 PostgreSQL 資料庫，您可以使用 ",[19,18251,18252],{},"docker exec","指令來執行 SQL 檔案。首先，確保您已經在 Docker 內運行 PostgreSQL 資料庫，並且已經知道資料庫的容器名稱。",[15,18255,18256,18257,18260],{},"而 Postgresql 要匯入 SQL 檔時，我們會使用 ",[19,18258,18259],{},"psql"," 這個指令",[15,18262,18263],{},"完整指令與參數如下：",[164,18265,18267],{"className":166,"code":18266,"language":168,"meta":169,"style":169},"docker exec -i \u003Ccontainer_name> psql -U \u003Cusername> -d \u003Cdatabase_name> -n \u003Cschema_name> \u003C \u003Csql_file>.sql\n",[19,18268,18269],{"__ignoreMap":169},[173,18270,18271,18273,18276,18278,18280,18283,18285,18287,18290,18293,18295,18298,18300,18302,18304,18306,18309,18311,18313,18315,18317,18320,18322,18324,18326,18328,18331,18333,18335],{"class":175,"line":176},[173,18272,9631],{"class":179},[173,18274,18275],{"class":183}," exec",[173,18277,5269],{"class":187},[173,18279,9479],{"class":468},[173,18281,18282],{"class":183},"container_nam",[173,18284,8142],{"class":1199},[173,18286,6747],{"class":468},[173,18288,18289],{"class":183}," psql",[173,18291,18292],{"class":187}," -U",[173,18294,9479],{"class":468},[173,18296,18297],{"class":183},"usernam",[173,18299,8142],{"class":1199},[173,18301,6747],{"class":468},[173,18303,10813],{"class":187},[173,18305,9479],{"class":468},[173,18307,18308],{"class":183},"database_nam",[173,18310,8142],{"class":1199},[173,18312,6747],{"class":468},[173,18314,8617],{"class":187},[173,18316,9479],{"class":468},[173,18318,18319],{"class":183},"schema_nam",[173,18321,8142],{"class":1199},[173,18323,6747],{"class":468},[173,18325,9479],{"class":468},[173,18327,9479],{"class":468},[173,18329,18330],{"class":183},"sql_fil",[173,18332,8142],{"class":1199},[173,18334,6747],{"class":468},[173,18336,18337],{"class":183},".sql\n",[52,18339,18340,18346,18352,18358,18364],{},[55,18341,18342,18345],{},[19,18343,18344],{},"container_name","：PostgreSQL 容器的名稱",[55,18347,18348,18351],{},[19,18349,18350],{},"username","：資料庫中使用的使用者名稱",[55,18353,18354,18357],{},[19,18355,18356],{},"database_name","： 資料庫名稱",[55,18359,18360,18363],{},[19,18361,18362],{},"schema_name","：要匯入 SQL 檔案的 schema 名稱",[55,18365,18366,18369],{},[19,18367,18368],{},"sql_file","：SQL 檔案 路徑",[44,18371,18372],{"id":18372},"匯出",[15,18374,18375,18376,18378],{},"要將 Docker 裡 Postgresql 服務器中的資料匯出時，我們一樣要使用 ",[19,18377,18252],{}," 這個指令，一樣我們先確認 Docker 內的 Postgresql 資料庫是正常運作。",[15,18380,18381,18382,18260],{},"而 Postgresql 要匯出 SQL 檔時，我們會使用 ",[19,18383,18384],{},"pg_dump",[15,18386,18387],{},"完整指令如下：",[164,18389,18391],{"className":166,"code":18390,"language":168,"meta":169,"style":169},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> > \u003Csql_path>.sql\n",[19,18392,18393],{"__ignoreMap":169},[173,18394,18395,18397,18399,18401,18403,18405,18407,18409,18412,18414,18416,18418,18420,18422,18424,18426,18428,18430,18432,18434,18436,18438,18440,18442,18445,18447,18450,18453,18455],{"class":175,"line":176},[173,18396,9631],{"class":179},[173,18398,18275],{"class":183},[173,18400,5269],{"class":187},[173,18402,9479],{"class":468},[173,18404,18282],{"class":183},[173,18406,8142],{"class":1199},[173,18408,6747],{"class":468},[173,18410,18411],{"class":183}," pg_dump",[173,18413,18292],{"class":187},[173,18415,9479],{"class":468},[173,18417,18297],{"class":183},[173,18419,8142],{"class":1199},[173,18421,6747],{"class":468},[173,18423,10813],{"class":187},[173,18425,9479],{"class":468},[173,18427,18297],{"class":183},[173,18429,8142],{"class":1199},[173,18431,6747],{"class":468},[173,18433,8617],{"class":187},[173,18435,9479],{"class":468},[173,18437,18319],{"class":183},[173,18439,8142],{"class":1199},[173,18441,6747],{"class":468},[173,18443,18444],{"class":468}," >",[173,18446,9479],{"class":468},[173,18448,18449],{"class":183},"sql_pat",[173,18451,18452],{"class":1199},"h",[173,18454,6747],{"class":468},[173,18456,18337],{"class":183},[52,18458,18459,18463,18467,18471,18475],{},[55,18460,18461,18345],{},[19,18462,18344],{},[55,18464,18465,18351],{},[19,18466,18350],{},[55,18468,18469,18357],{},[19,18470,18356],{},[55,18472,18473,18363],{},[19,18474,18362],{},[55,18476,18477,18369],{},[19,18478,18368],{},[15,18480,18481,18482,18485],{},"而我們也可以在匯出時，直接匯出 gzip 壓縮檔，只要我們加上 ",[19,18483,18484],{},"pipe line gzip"," 的指令即可",[15,18487,18387],{},[164,18489,18491],{"className":166,"code":18490,"language":168,"meta":169,"style":169},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> | gzip -9 > \u003Czip_path>.sql.gz\n",[19,18492,18493],{"__ignoreMap":169},[173,18494,18495,18497,18499,18501,18503,18505,18507,18509,18511,18513,18515,18517,18519,18521,18523,18525,18527,18529,18531,18533,18535,18537,18539,18541,18543,18546,18549,18551,18553,18556,18558,18560],{"class":175,"line":176},[173,18496,9631],{"class":179},[173,18498,18275],{"class":183},[173,18500,5269],{"class":187},[173,18502,9479],{"class":468},[173,18504,18282],{"class":183},[173,18506,8142],{"class":1199},[173,18508,6747],{"class":468},[173,18510,18411],{"class":183},[173,18512,18292],{"class":187},[173,18514,9479],{"class":468},[173,18516,18297],{"class":183},[173,18518,8142],{"class":1199},[173,18520,6747],{"class":468},[173,18522,10813],{"class":187},[173,18524,9479],{"class":468},[173,18526,18297],{"class":183},[173,18528,8142],{"class":1199},[173,18530,6747],{"class":468},[173,18532,8617],{"class":187},[173,18534,9479],{"class":468},[173,18536,18319],{"class":183},[173,18538,8142],{"class":1199},[173,18540,6747],{"class":468},[173,18542,469],{"class":468},[173,18544,18545],{"class":179}," gzip",[173,18547,18548],{"class":187}," -9",[173,18550,18444],{"class":468},[173,18552,9479],{"class":468},[173,18554,18555],{"class":183},"zip_pat",[173,18557,18452],{"class":1199},[173,18559,6747],{"class":468},[173,18561,18562],{"class":183},".sql.gz\n",[52,18564,18565,18569,18573,18577,18581,18587],{},[55,18566,18567,18345],{},[19,18568,18344],{},[55,18570,18571,18351],{},[19,18572,18350],{},[55,18574,18575,18357],{},[19,18576,18356],{},[55,18578,18579,18363],{},[19,18580,18362],{},[55,18582,18583,18586],{},[19,18584,18585],{},"zip_path"," ：壓縮檔路徑",[55,18588,18589,18592],{},[19,18590,18591],{},"-9","：為壓縮等級，範圍為 0~9，其中 0 為不壓縮僅打包，9 為最高壓縮等級，這裡也可以不指定壓縮等級，它則會以預設 6 來進行壓縮",[894,18594,18595],{},"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":169,"searchDepth":212,"depth":212,"links":18597},[18598,18599],{"id":18246,"depth":212,"text":18246},{"id":18372,"depth":212,"text":18372},"我們可以用 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":18232,"description":18600},"articles\u002F2023-01-17-docker-postgresql-import-export","在 Docker 的環境，如何匯入匯出 Postgresql",[18609,9632],"PostgreSQL","jNGUE7713QOJ1uS2wd7Q70oQzHSviRpYIk8u2R8U67Y",{"id":18612,"title":18613,"body":18614,"category":19025,"description":169,"extension":921,"image":19026,"meta":19027,"navigation":226,"path":19028,"pubDate":19029,"seo":19030,"status":226,"stem":19031,"summary":19032,"tags":19033,"__hash__":19034},"content\u002Farticles\u002F2022-05-28-front-end-tool.md","2022 前端常用的套件與工具",{"type":8,"value":18615,"toc":19014},[18616,18619,18622,18625,18633,18636,18655,18665,18668,18754,18757,18771,18773,18776,18779,18784,18800,18805,18818,18823,18877,18880,18894,18900,18903,18906,18917,18920,18926,18930,18933,18939,18943,18946,18952,18956,18959,18976,18982,18985,18989,18992,18998,19002,19005,19011],[44,18617,18618],{"id":18618},"nvm",[15,18620,18621],{},"NVM 是 Node Version Manager 的縮寫，主要功能就可以快速切換 Node.js 版本。",[15,18623,18624],{},"使用場景：",[825,18626,18627,18630],{},[55,18628,18629],{},"維護多個不同時期所開發專案",[55,18631,18632],{},"編譯老舊專案",[15,18634,18635],{},"Linux \u002F MacOS 安裝方式",[164,18637,18639],{"className":166,"code":18638,"language":168,"meta":169,"style":169},"curl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh | bash\n",[19,18640,18641],{"__ignoreMap":169},[173,18642,18643,18645,18648,18651,18653],{"class":175,"line":176},[173,18644,272],{"class":179},[173,18646,18647],{"class":187}," -o-",[173,18649,18650],{"class":183}," https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh",[173,18652,469],{"class":468},[173,18654,3664],{"class":179},[15,18656,18657,18658,18661,18662],{},"在終端機設定檔 bash 環境下編輯 ",[19,18659,18660],{},"~\u002F.bashrc"," 或 zsh 環境下編輯 ",[19,18663,18664],{},"~\u002F.zshrc",[15,18666,18667],{},"在文件內加入以下設定：",[164,18669,18671],{"className":166,"code":18670,"language":168,"meta":169,"style":169},"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",[19,18672,18673,18723],{"__ignoreMap":169},[173,18674,18675,18678,18681,18683,18686,18689,18692,18695,18698,18700,18703,18706,18709,18712,18715,18717,18720],{"class":175,"line":176},[173,18676,18677],{"class":468},"export",[173,18679,18680],{"class":1199}," NVM_DIR",[173,18682,1206],{"class":468},[173,18684,18685],{"class":183},"\"$([ ",[173,18687,18688],{"class":468},"-z",[173,18690,18691],{"class":183}," \"${",[173,18693,18694],{"class":1199},"XDG_CONFIG_HOME-",[173,18696,18697],{"class":183},"}\" ] && ",[173,18699,11070],{"class":187},[173,18701,18702],{"class":183}," %s \"${",[173,18704,18705],{"class":1199},"HOME",[173,18707,18708],{"class":183},"}\u002F.nvm\" ",[173,18710,18711],{"class":468},"||",[173,18713,18714],{"class":187}," printf",[173,18716,18702],{"class":183},[173,18718,18719],{"class":1199},"XDG_CONFIG_HOME",[173,18721,18722],{"class":183},"}\u002Fnvm\")\"\n",[173,18724,18725,18728,18731,18733,18736,18739,18742,18745,18747,18749,18751],{"class":175,"line":212},[173,18726,18727],{"class":1199},"[ ",[173,18729,18730],{"class":468},"-s",[173,18732,12756],{"class":183},[173,18734,18735],{"class":1199},"$NVM_DIR",[173,18737,18738],{"class":183},"\u002Fnvm.sh\"",[173,18740,18741],{"class":1199}," ] && ",[173,18743,18744],{"class":179},"\\.",[173,18746,12756],{"class":183},[173,18748,18735],{"class":1199},[173,18750,18738],{"class":183},[173,18752,18753],{"class":208}," # This loads nvm\n",[15,18755,18756],{},"然後執行下面指令",[52,18758,18759,18765],{},[55,18760,18761,18762],{},"bash：",[19,18763,18764],{},"source ~\u002F.bashrc",[55,18766,18767,18768],{},"zsh: ",[19,18769,18770],{},"source ~\u002F.zshrc",[44,18772,4243],{"id":4243},[15,18774,18775],{},"是 Facebook 所開發的前端工具，是 Node.js 的套件管理，算是 npm 的替代品，優點是速度較快。",[15,18777,18778],{},"安裝方式：",[15,18780,18781],{},[28,18782,18783],{},"使用 npm 安裝",[164,18785,18787],{"className":166,"code":18786,"language":168,"meta":169,"style":169},"npm install -g yarn\n",[19,18788,18789],{"__ignoreMap":169},[173,18790,18791,18793,18795,18797],{"class":175,"line":176},[173,18792,4158],{"class":179},[173,18794,184],{"class":183},[173,18796,4163],{"class":187},[173,18798,18799],{"class":183}," yarn\n",[15,18801,18802],{},[28,18803,18804],{},"MacOS安裝",[164,18806,18808],{"className":166,"code":18807,"language":168,"meta":169,"style":169},"brew install yarn\n",[19,18809,18810],{"__ignoreMap":169},[173,18811,18812,18814,18816],{"class":175,"line":176},[173,18813,180],{"class":179},[173,18815,184],{"class":183},[173,18817,18799],{"class":183},[15,18819,18820],{},[28,18821,18822],{},"Ubuntu安裝",[164,18824,18826],{"className":166,"code":18825,"language":168,"meta":169,"style":169},"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",[19,18827,18828,18852,18856],{"__ignoreMap":169},[173,18829,18830,18832,18835,18838,18840,18843,18846,18848,18850],{"class":175,"line":176},[173,18831,272],{"class":179},[173,18833,18834],{"class":187}," -sS",[173,18836,18837],{"class":183}," https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg",[173,18839,469],{"class":468},[173,18841,18842],{"class":179}," sudo",[173,18844,18845],{"class":183}," apt-key",[173,18847,1040],{"class":183},[173,18849,5426],{"class":183},[173,18851,2929],{"class":1199},[173,18853,18854],{"class":175,"line":212},[173,18855,227],{"emptyLinePlaceholder":226},[173,18857,18858,18860,18863,18866,18869,18871,18873,18875],{"class":175,"line":223},[173,18859,239],{"class":179},[173,18861,18862],{"class":183}," apt-get",[173,18864,18865],{"class":183}," update",[173,18867,18868],{"class":1199}," && ",[173,18870,239],{"class":179},[173,18872,18862],{"class":183},[173,18874,184],{"class":183},[173,18876,18799],{"class":183},[44,18878,10561],{"id":18879},"nuxtjs",[15,18881,18882,18883,2590,18886,18889,18890,18893],{},"是一個混合式 Vue 框架，支援 ",[28,18884,18885],{},"服務器渲染(SSR)",[28,18887,18888],{},"生成靜態頁面","或是",[28,18891,18892],{},"單頁應用程式(SPA)","，並優化了SEO，也支援 TypeScript。",[15,18895,9559,18896],{},[283,18897,18898],{"href":18898,"rel":18899},"https:\u002F\u002Fnuxtjs.org\u002F",[287],[44,18901,18902],{"id":18902},"tailwindcss",[15,18904,18905],{},"是一個近期相當流行的 Utility Framework，也是我近期最用的 UI 構建工具，其特色包含：",[825,18907,18908,18911,18914],{},[55,18909,18910],{},"快速上手",[55,18912,18913],{},"快速建置",[55,18915,18916],{},"高度客製化",[15,18918,18919],{},"因為以上特色，真得讓人一用就愛上了。",[15,18921,9559,18922],{},[283,18923,18924],{"href":18924,"rel":18925},"https:\u002F\u002Ftailwindcss.com\u002F",[287],[44,18927,18929],{"id":18928},"bootstrap","Bootstrap",[15,18931,18932],{},"相當知名且老牌的 UI component Framework，可以快速透過各種組件的組合建立 Web App，不過其實近期的專案，我已很少用到 Bootstrap 了。",[15,18934,9559,18935],{},[283,18936,18937],{"href":18937,"rel":18938},"https:\u002F\u002Fgetbootstrap.com\u002F",[287],[44,18940,18942],{"id":18941},"element-ui","element UI",[15,18944,18945],{},"這是我也滿喜歡的一個 UI component Framework，相對於 Bootstrap 它的組件更加豐富，特別適合拿來做管理介面。",[15,18947,9559,18948],{},[283,18949,18950],{"href":18950,"rel":18951},"https:\u002F\u002Felement.eleme.io\u002F",[287],[44,18953,18955],{"id":18954},"momentjs","Moment.js",[15,18957,18958],{},"是一個專門處理日期與時間的Library，功能包含了：",[825,18960,18961,18964,18967,18970,18973],{},[55,18962,18963],{},"日期時間格式化",[55,18965,18966],{},"日期時間相減運算",[55,18968,18969],{},"相對時間時間",[55,18971,18972],{},"時區轉換",[55,18974,18975],{},"支持多語系",[15,18977,9559,18978],{},[283,18979,18980],{"href":18980,"rel":18981},"https:\u002F\u002Fmomentjs.com\u002F",[287],[15,18983,18984],{},"對於日期時間的處理，Moment.js 幾乎都可以滿足",[44,18986,18988],{"id":18987},"lodash","Lodash",[15,18990,18991],{},"在用 javascript 做資料處理，Lodash 可以幫我們省去很多時間。",[15,18993,9559,18994],{},[283,18995,18996],{"href":18996,"rel":18997},"https:\u002F\u002Flodash.com\u002F",[287],[44,18999,19001],{"id":19000},"apache-echarts","Apache ECharts",[15,19003,19004],{},"這是一個開源的繪圖工具，當做數據分析時，需要圖表統計時，ECharts 是不錯的選擇",[15,19006,9559,19007],{},[283,19008,19009],{"href":19009,"rel":19010},"https:\u002F\u002Fecharts.apache.org\u002F",[287],[894,19012,19013],{},"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":169,"searchDepth":212,"depth":212,"links":19015},[19016,19017,19018,19019,19020,19021,19022,19023,19024],{"id":18618,"depth":212,"text":18618},{"id":4243,"depth":212,"text":4243},{"id":18879,"depth":212,"text":10561},{"id":18902,"depth":212,"text":18902},{"id":18928,"depth":212,"text":18929},{"id":18941,"depth":212,"text":18942},{"id":18954,"depth":212,"text":18955},{"id":18987,"depth":212,"text":18988},{"id":19000,"depth":212,"text":19001},"frontend","\u002Fimages\u002Farticles\u002F2022-06-03-frontend-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-05-28-front-end-tool","2022-05-28 11:00:00",{"title":18613,"description":169},"articles\u002F2022-05-28-front-end-tool","這裡收集了我開發前端時，常用的套件與工具",[6427,5985,6245],"aULNoAsXNxW4_qR3-D3eYMi5LPuZ1DlIjYcmbq496Kw",{"id":19036,"title":19037,"body":19038,"category":933,"description":169,"extension":921,"image":19146,"meta":19147,"navigation":226,"path":19148,"pubDate":19149,"seo":19150,"status":226,"stem":19151,"summary":19152,"tags":19153,"__hash__":19154},"content\u002Farticles\u002F2022-04-27-develop-tool.md","開發環境工具介紹-環境篇",{"type":8,"value":19039,"toc":19137},[19040,19042,19045,19051,19055,19058,19065,19069,19072,19078,19080,19083,19089,19092,19095,19102,19104,19107,19114,19118,19129],[44,19041,9632],{"id":9631},[15,19043,19044],{},"有別於傳統虛擬機以作業系統為中心，Docker 則是以應用程式為中心，在達成虛擬化，並不需要完整載入完整的 Guest OS，而只要啟用應用層級程式及相關函式，因此其優勢，不需完整安裝 Guest OS 節省硬碟資源，另外啟用速度快，也是其最大優勢。",[15,19046,9559,19047],{},[283,19048,19050],{"href":9640,"rel":19049},[287],"Home - Docker",[44,19052,19054],{"id":19053},"laradock","Laradock",[15,19056,19057],{},"這應該在 Docker 上最完整的 PHP 開發環境。支持各版本 PHP 切換，支援主流資料庫，如 MySQL、Postgres、MariaDB及各種常用伺服器服務。",[15,19059,19060,19061],{},"官網： ",[283,19062,19063],{"href":19063,"rel":19064},"https:\u002F\u002Flaradock.io\u002F",[287],[44,19066,19068],{"id":19067},"visual-studio-code","Visual Studio Code",[15,19070,19071],{},"微軟開發的開源文字編器，相當受社群歡迎，支援 Windows、MacOS、Linux 三大主流作業系統。另外有各種插件可使用，功能不輸需要付費的IDE。",[15,19073,9559,19074],{},[283,19075,19077],{"href":9562,"rel":19076},[287],"Visual Studio Code - Code Editing. Redefined",[44,19079,9593],{"id":9592},[15,19081,19082],{},"相當知名的 Rest API 測試工具，支援各種API認證、常用的 http method，及常用 Http 的 Authorizing",[15,19084,9559,19085],{},[283,19086,19088],{"href":9601,"rel":19087},[287],"Postman API Platform | Sign Up for Free",[44,19090,19091],{"id":8650},"Git",[15,19093,19094],{},"是一個免費且開源的版控軟體，是目前最主流的版控軟體，支援MacOS、Ｗindows、Linux多平台",[15,19096,9559,19097],{},[283,19098,19101],{"href":19099,"rel":19100},"https:\u002F\u002Fgit-scm.com\u002F",[287],"Git (git-scm.com)",[44,19103,9606],{"id":9605},[15,19105,19106],{},"Git 知名的原始碼代管服務平台，所發行 Git GUI 免費軟體，目前提供 Windows 和 MacOS，介面相當友善， 對 Git 的功能支援的相當完整，很適合 Git 初心者使用。",[15,19108,9559,19109],{},[283,19110,19113],{"href":19111,"rel":19112},"https:\u002F\u002Fdesktop.github.com\u002F",[287],"GitHub Desktop | Simple collaboration from your desktop",[44,19115,19117],{"id":19116},"zsh-command-line-oh-my-zsh","zsh Command Line + oh my zsh",[15,19119,19120,19121,5671,19123,19125,19126,19128],{},"開發網站時常要用到 Command Line，雖然 ",[19,19122,3998],{},[19,19124,195],{}," 都支援 ",[19,19127,168],{},"，但更喜歡 zsh + oh my zsh 各種插件，針對 git 優化，指令提醒功能，甚致可以顯示CPU、記憶體使用量等潮到爆的功能，你也可自訂佈景，讓你的 Command Line 呈現簡約風格。",[15,19130,19131,19132],{},"官綱：",[283,19133,19136],{"href":19134,"rel":19135},"https:\u002F\u002Fohmyz.sh\u002F",[287],"Oh My zsh官網",{"title":169,"searchDepth":212,"depth":212,"links":19138},[19139,19140,19141,19142,19143,19144,19145],{"id":9631,"depth":212,"text":9632},{"id":19053,"depth":212,"text":19054},{"id":19067,"depth":212,"text":19068},{"id":9592,"depth":212,"text":9593},{"id":8650,"depth":212,"text":19091},{"id":9605,"depth":212,"text":9606},{"id":19116,"depth":212,"text":19117},"\u002Fimages\u002Farticles\u002F2022-04-27-develop-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-27-develop-tool","2022-04-27 12:00:00",{"title":19037,"description":169},"articles\u002F2022-04-27-develop-tool","記錄自已在網站開發時，常用的工具",[933],"vI9Ah-vhtRDUUlZPJuEb9VQPYrnvz4BqrjLqFerjxAY",{"id":19156,"title":19157,"body":19158,"category":933,"description":169,"extension":921,"image":19514,"meta":19515,"navigation":226,"path":19516,"pubDate":19517,"seo":19518,"status":226,"stem":19519,"summary":19520,"tags":19521,"__hash__":19522},"content\u002Farticles\u002F2022-04-10-mac-os-tool.md","大推！MacOS 上好用軟體集",{"type":8,"value":19159,"toc":19496},[19160,19164,19180,19186,19188,19208,19211,19221,19226,19228,19235,19261,19268,19271,19286,19288,19291,19308,19311,19317,19324,19328,19331,19337,19339,19345,19351,19353,19363,19368,19370,19373,19378,19382,19385,19391,19397,19399,19415,19417,19420,19425,19427,19430,19435,19439,19442,19445,19450,19454,19457,19462,19464,19467,19472,19474,19477,19482,19484,19487,19493],[44,19161,19163],{"id":19162},"homebrew","HomeBrew",[15,19165,19166,19167,19170,19171,19174,19175,19170,19178],{},"MacOS 上的套件管理，類似 ",[28,19168,19169],{},"Ubuntu"," 上的 ",[19,19172,19173],{},"apt"," 或是 ",[28,19176,19177],{},"CentOS",[19,19179,1057],{},[15,19181,9559,19182],{},[283,19183,19184],{"href":19184,"rel":19185},"https:\u002F\u002Fbrew.sh",[287],[15,19187,18778],{},[164,19189,19191],{"className":166,"code":19190,"language":168,"meta":169,"style":169},"\u002Fbin\u002Fbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[19,19192,19193],{"__ignoreMap":169},[173,19194,19195,19197,19199,19201,19203,19205],{"class":175,"line":176},[173,19196,263],{"class":179},[173,19198,266],{"class":187},[173,19200,269],{"class":183},[173,19202,272],{"class":179},[173,19204,275],{"class":187},[173,19206,19207],{"class":183}," https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[44,19209,19210],{"id":9566},"iTerm2",[15,19212,19213,19214,19216,19217,19220],{},"雖然MacOS有內建terminal，但 ",[19,19215,19210],{},"更加強大，再加上 ",[19,19218,19219],{},"zsh","，真得是開發者必裝軟體",[15,19222,9559,19223],{},[283,19224,9575],{"href":9575,"rel":19225},[287],[44,19227,9864],{"id":9863},[15,19229,19230,19231,19234],{},"好用且",[28,19232,19233],{},"免費開源","的硬體監測軟體，可即時監測以下硬體資訊",[825,19236,19237,19240,19243,19246,19249,19252,19255,19258],{},[55,19238,19239],{},"CPU",[55,19241,19242],{},"RAM",[55,19244,19245],{},"GPU",[55,19247,19248],{},"DISK",[55,19250,19251],{},"溫度",[55,19253,19254],{},"網路使用狀況",[55,19256,19257],{},"電池",[55,19259,19260],{},"藍芽",[15,19262,19263,19264],{},"下載位置： ",[283,19265,19266],{"href":19266,"rel":19267},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats\u002Freleases",[287],[15,19269,19270],{},"HomeBrew 安裝",[164,19272,19274],{"className":166,"code":19273,"language":168,"meta":169,"style":169},"brew install --cask stats\n",[19,19275,19276],{"__ignoreMap":169},[173,19277,19278,19280,19282,19284],{"class":175,"line":176},[173,19279,180],{"class":179},[173,19281,184],{"class":183},[173,19283,188],{"class":187},[173,19285,2787],{"class":183},[44,19287,9916],{"id":9915},[15,19289,19290],{},"是 MacOS 上相當好的螢幕截圖，功能如下：",[825,19292,19293,19296,19299,19302,19305],{},[55,19294,19295],{},"區域截圖",[55,19297,19298],{},"視窗截圖",[55,19300,19301],{},"捲動截圖 (截圖網頁時，超好用 👍)",[55,19303,19304],{},"截圖標示 (可標示矩形、圓形、直線、鉛筆、馬賽克、文字、序號、高亮區塊等)",[55,19306,19307],{},"釘選螢幕 (可在截圖後，將圖片釘在螢幕上)",[15,19309,19310],{},"另外也可付費解鎖更完整的功能",[15,19312,19060,19313],{},[283,19314,19315],{"href":19315,"rel":19316},"http:\u002F\u002Fxnipapp.com\u002F",[287],[15,19318,19319,19320],{},"App Store：",[283,19321,19322],{"href":19322,"rel":19323},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fxnip\u002Fid1221250572?mt=12",[287],[44,19325,19327],{"id":19326},"couleurs","Couleurs",[15,19329,19330],{},"這是一款簡單免費的螢幕選色器，操作上相當直覺。",[15,19332,19060,19333],{},[283,19334,19335],{"href":19335,"rel":19336},"https:\u002F\u002Fcouleursapp.com\u002F",[287],[44,19338,9929],{"id":9928},[15,19340,19341,19342,19344],{},"Apple 觸控板真得很好用，但當你改用滑鼠時，就會讓你感到非常悲劇，那悲催的卡頓感，真得讓人很崩潰，而 ",[28,19343,9929],{}," 就可以改善，滑鼠在MacOS上的使用體驗。",[15,19346,9559,19347],{},[283,19348,19349],{"href":19349,"rel":19350},"https:\u002F\u002Fmos.caldis.me\u002F",[287],[44,19352,3590],{"id":9851},[15,19354,19355,19356,19359,19360,19362],{},"MacOS 在軟體解除安裝，一般是進到 ",[28,19357,19358],{},"應用程式"," 目錄程式中，直接刪除軟體即可，但必竟每個軟體設計都不同，常常刪除不乾淨，而 ",[19,19361,3590],{}," 就可以很好的解決此問題。",[15,19364,9559,19365],{},[283,19366,9859],{"href":9859,"rel":19367},[287],[44,19369,9788],{"id":9787},[15,19371,19372],{},"MacOS上強大好用的影音播放器，支援大部分的影音格式播放，不用在額外安裝各種編碼器，這個播放器一個搞定。",[15,19374,9559,19375],{},[283,19376,9796],{"href":9796,"rel":19377},[287],[44,19379,19381],{"id":19380},"hidden-bar","Hidden Bar",[15,19383,19384],{},"當裝愈來愈多常駐軟體，就會發現上方系統列的ICON愈來愈多，而這個軟體可以暫時隱藏ICON，要用到時可隨時展開",[15,19386,19263,19387],{},[283,19388,19389],{"href":19389,"rel":19390},"https:\u002F\u002Fgithub.com\u002Fdwarvesf\u002Fhidden\u002Freleases",[287],[15,19392,19319,19393],{},[283,19394,19395],{"href":19395,"rel":19396},"https:\u002F\u002Fapps.apple.com\u002Ftw\u002Fapp\u002Fhidden-bar\u002F",[287],[15,19398,19270],{},[164,19400,19402],{"className":166,"code":19401,"language":168,"meta":169,"style":169},"brew install --cask hiddenbar\n",[19,19403,19404],{"__ignoreMap":169},[173,19405,19406,19408,19410,19412],{"class":175,"line":176},[173,19407,180],{"class":179},[173,19409,184],{"class":183},[173,19411,188],{"class":187},[173,19413,19414],{"class":183}," hiddenbar\n",[44,19416,19068],{"id":19067},[15,19418,19419],{},"目前在程式開發上，站長使用的程式碼編輯器，擁有各類插件，可以加快開發速度。",[15,19421,9559,19422],{},[283,19423,9562],{"href":9562,"rel":19424},[287],[44,19426,9619],{"id":9618},[15,19428,19429],{},"雖雖 vscode 很強大，但有時讓人覺得有點肥大，若只是臨時要編輯文字檔，我會用這款輕量編輯器",[15,19431,9559,19432],{},[283,19433,9627],{"href":9627,"rel":19434},[287],[44,19436,19438],{"id":19437},"keka-壓縮軟體","KeKa 壓縮軟體",[15,19440,19441],{},"這是 MacOS 我用過最好用的壓縮軟體，支援多種壓縮格式，密碼保護，分片壓縮等功能，其中最棒是可「排除 MacOS 資源檔」檔的功能。",[15,19443,19444],{},"在以往直接在 MacOS 打包壓縮的檔案，在 Windows 環境下打開，總會多出一些讓使用者迷惑的檔案，而這個功能就會幫忙先排除這檔案。",[15,19446,9559,19447],{},[283,19448,9818],{"href":9818,"rel":19449},[287],[44,19451,19453],{"id":19452},"shottr","Shottr",[15,19455,19456],{},"另一款螢幕截圖軟體，除了一般截圖功能、馬賽克、OCR、釘圖、螢幕選色器 等功能。",[15,19458,9559,19459],{},[283,19460,9911],{"href":9911,"rel":19461},[287],[44,19463,9955],{"id":9954},[15,19465,19466],{},"MacOS 對於外接螢幕，相當不友善，無法用熱健去控制外接螢幕的亮度和音量，而 BetterDisplay 則可以解決這些問題。",[15,19468,9559,19469],{},[283,19470,9963],{"href":9963,"rel":19471},[287],[44,19473,9580],{"id":9579},[15,19475,19476],{},"支援 M1 晶片的虛擬機，除了以接近本機的速度在Apple Silicon上運行ARM64操作系統，在英特爾 Mac 上，x86\u002Fx64 作業系統可以虛擬化。",[15,19478,10123,19479],{},[283,19480,9588],{"href":9588,"rel":19481},[287],[44,19483,9877],{"id":9876},[15,19485,19486],{},"一款能大幅提升你工作效率的 Mac 軟體，可以取代 Spotlight，且功能更加狂大。",[15,19488,10123,19489],{},[283,19490,19491],{"href":19491,"rel":19492},"https:\u002F\u002Fwww.raycast.com\u002F",[287],[894,19494,19495],{},"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":169,"searchDepth":212,"depth":212,"links":19497},[19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513],{"id":19162,"depth":212,"text":19163},{"id":9566,"depth":212,"text":19210},{"id":9863,"depth":212,"text":9864},{"id":9915,"depth":212,"text":9916},{"id":19326,"depth":212,"text":19327},{"id":9928,"depth":212,"text":9929},{"id":9851,"depth":212,"text":3590},{"id":9787,"depth":212,"text":9788},{"id":19380,"depth":212,"text":19381},{"id":19067,"depth":212,"text":19068},{"id":9618,"depth":212,"text":9619},{"id":19437,"depth":212,"text":19438},{"id":19452,"depth":212,"text":19453},{"id":9954,"depth":212,"text":9955},{"id":9579,"depth":212,"text":9580},{"id":9876,"depth":212,"text":9877},"\u002Fimages\u002Farticles\u002F2022-04-10-mas-os-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-10-mac-os-tool","2022-04-10 12:00:00",{"title":19157,"description":169},"articles\u002F2022-04-10-mac-os-tool","這裡收集了，站長在 MacOS 上常用的軟體",[3998,933],"LdwPGKbfWnAayVtGNscPJXvm97oroNn4Ipb5HjBSj7E",{"id":19524,"title":19525,"body":19526,"category":2635,"description":169,"extension":921,"image":19975,"meta":19976,"navigation":226,"path":19977,"pubDate":19978,"seo":19979,"status":226,"stem":19980,"summary":19981,"tags":19982,"__hash__":19983},"content\u002Farticles\u002F2022-03-26-php-zip.md","PHP 產生壓縮檔",{"type":8,"value":19527,"toc":19970},[19528,19531,19539,19545,19571,19574,19579,19640,19646,19649,19663,19668,19685,19688,19696,19701,19718,19720,19733,19738,19755,19757,19771,19776,19793,19795,19803,19808,19825,19827,19835,19840,19857,19859,19873,19878,19894,19897,19901,19951,19955,19968],[44,19529,19530],{"id":19530},"需求",[52,19532,19533,19536],{},[55,19534,19535],{},"php5.2 以上版本",[55,19537,19538],{},"安裝 zip 庫",[15,19540,19541,19542,19544],{},"以 ",[19,19543,19169],{}," 為例：",[164,19546,19548],{"className":166,"code":19547,"language":168,"meta":169,"style":169},"sudo apt update\nsudo apt install -y php7.4-zip\n",[19,19549,19550,19558],{"__ignoreMap":169},[173,19551,19552,19554,19556],{"class":175,"line":176},[173,19553,239],{"class":179},[173,19555,242],{"class":183},[173,19557,18159],{"class":183},[173,19559,19560,19562,19564,19566,19568],{"class":175,"line":212},[173,19561,239],{"class":179},[173,19563,242],{"class":183},[173,19565,184],{"class":183},[173,19567,1020],{"class":187},[173,19569,19570],{"class":183}," php7.4-zip\n",[44,19572,19573],{"id":19573},"壓縮範例程式",[15,19575,19576],{},[28,19577,19578],{},"產生壓縮檔",[164,19580,19582],{"className":1183,"code":19581,"language":1130,"meta":169,"style":169},"\u003C?php\n\u002F\u002Fnew ZipArchive 物件\n$zip = new ZipArchive;\n\n$zip->open('new.zip', ZipArchive::CREATE);\n\n",[19,19583,19584,19591,19596,19610,19614],{"__ignoreMap":169},[173,19585,19586,19588],{"class":175,"line":176},[173,19587,1191],{"class":468},[173,19589,19590],{"class":187},"php\n",[173,19592,19593],{"class":175,"line":212},[173,19594,19595],{"class":208},"\u002F\u002Fnew ZipArchive 物件\n",[173,19597,19598,19601,19603,19605,19608],{"class":175,"line":223},[173,19599,19600],{"class":1199},"$zip ",[173,19602,1206],{"class":468},[173,19604,1226],{"class":468},[173,19606,19607],{"class":187}," ZipArchive",[173,19609,1442],{"class":1199},[173,19611,19612],{"class":175,"line":230},[173,19613,227],{"emptyLinePlaceholder":226},[173,19615,19616,19619,19621,19624,19626,19629,19631,19634,19636,19638],{"class":175,"line":236},[173,19617,19618],{"class":1199},"$zip",[173,19620,1268],{"class":468},[173,19622,19623],{"class":179},"open",[173,19625,1200],{"class":1199},[173,19627,19628],{"class":183},"'new.zip'",[173,19630,1279],{"class":1199},[173,19632,19633],{"class":187},"ZipArchive",[173,19635,11083],{"class":468},[173,19637,10294],{"class":187},[173,19639,1212],{"class":1199},[15,19641,9184,19642,19645],{},[19,19643,19644],{},"$zip->open()"," 第一參數為要產壓縮檔路徑",[15,19647,19648],{},"第二參數為產生檔案的模式",[825,19650,19651,19657],{},[55,19652,19653,19656],{},[19,19654,19655],{},"ZipArchive::CREATE","：產生新檔案",[55,19658,19659,19662],{},[19,19660,19661],{},"ZipArchive::OVERWRITE",": 若壓縮檔存在，則覆蓋檔案",[15,19664,19665],{},[28,19666,19667],{},"加入一個空資料夾",[164,19669,19671],{"className":1183,"code":19670,"language":1130,"meta":169,"style":169},"$zip->addEmptyDir($dirname);\n",[19,19672,19673],{"__ignoreMap":169},[173,19674,19675,19677,19679,19682],{"class":175,"line":176},[173,19676,19618],{"class":1199},[173,19678,1268],{"class":468},[173,19680,19681],{"class":179},"addEmptyDir",[173,19683,19684],{"class":1199},"($dirname);\n",[15,19686,19687],{},"參數說明",[825,19689,19690],{},[55,19691,19692,19695],{},[19,19693,19694],{},"$dirname"," 資料夾名稱",[15,19697,19698],{},[28,19699,19700],{},"將檔案加入壓縮檔",[164,19702,19704],{"className":1183,"code":19703,"language":1130,"meta":169,"style":169},"$zip->addaddFile($filePath, $newFileName);\n",[19,19705,19706],{"__ignoreMap":169},[173,19707,19708,19710,19712,19715],{"class":175,"line":176},[173,19709,19618],{"class":1199},[173,19711,1268],{"class":468},[173,19713,19714],{"class":179},"addaddFile",[173,19716,19717],{"class":1199},"($filePath, $newFileName);\n",[15,19719,19687],{},[825,19721,19722,19727],{},[55,19723,19724,19726],{},[19,19725,1430],{}," 為檔案路徑",[55,19728,19729,19732],{},[19,19730,19731],{},"$newFileName"," 重新命名 (選填)",[15,19734,19735],{},[28,19736,19737],{},"將字串加入文字檔並壓縮",[164,19739,19741],{"className":1183,"code":19740,"language":1130,"meta":169,"style":169},"$zip->addFromString($filename, $content);\n",[19,19742,19743],{"__ignoreMap":169},[173,19744,19745,19747,19749,19752],{"class":175,"line":176},[173,19746,19618],{"class":1199},[173,19748,1268],{"class":468},[173,19750,19751],{"class":179},"addFromString",[173,19753,19754],{"class":1199},"($filename, $content);\n",[15,19756,19687],{},[825,19758,19759,19765],{},[55,19760,19761,19764],{},[19,19762,19763],{},"$filename"," 檔案名稱",[55,19766,19767,19770],{},[19,19768,19769],{},"$content"," 文字內容",[15,19772,19773],{},[28,19774,19775],{},"依索引刪除檔案",[164,19777,19779],{"className":1183,"code":19778,"language":1130,"meta":169,"style":169},"$zip->deleteIndex($index);\n",[19,19780,19781],{"__ignoreMap":169},[173,19782,19783,19785,19787,19790],{"class":175,"line":176},[173,19784,19618],{"class":1199},[173,19786,1268],{"class":468},[173,19788,19789],{"class":179},"deleteIndex",[173,19791,19792],{"class":1199},"($index);\n",[15,19794,19687],{},[825,19796,19797],{},[55,19798,19799,19802],{},[19,19800,19801],{},"$index"," 刪除索引的檔案",[15,19804,19805],{},[28,19806,19807],{},"依檔名刪除檔案",[164,19809,19811],{"className":1183,"code":19810,"language":1130,"meta":169,"style":169},"$zip->deleteName($name);\n",[19,19812,19813],{"__ignoreMap":169},[173,19814,19815,19817,19819,19822],{"class":175,"line":176},[173,19816,19618],{"class":1199},[173,19818,1268],{"class":468},[173,19820,19821],{"class":179},"deleteName",[173,19823,19824],{"class":1199},"($name);\n",[15,19826,19687],{},[825,19828,19829],{},[55,19830,19831,19834],{},[19,19832,19833],{},"$name"," 刪除檔案名稱",[15,19836,19837],{},[28,19838,19839],{},"更改檔名",[164,19841,19843],{"className":1183,"code":19842,"language":1130,"meta":169,"style":169},"$zip->renameName($oldName, $newName);\n",[19,19844,19845],{"__ignoreMap":169},[173,19846,19847,19849,19851,19854],{"class":175,"line":176},[173,19848,19618],{"class":1199},[173,19850,1268],{"class":468},[173,19852,19853],{"class":179},"renameName",[173,19855,19856],{"class":1199},"($oldName, $newName);\n",[15,19858,19687],{},[825,19860,19861,19867],{},[55,19862,19863,19866],{},[19,19864,19865],{},"$oldName"," 原本檔名",[55,19868,19869,19872],{},[19,19870,19871],{},"$newName"," 新檔名",[15,19874,19875],{},[28,19876,19877],{},"關閉壓縮檔",[164,19879,19881],{"className":1183,"code":19880,"language":1130,"meta":169,"style":169},"$zip->close();\n",[19,19882,19883],{"__ignoreMap":169},[173,19884,19885,19887,19889,19892],{"class":175,"line":176},[173,19886,19618],{"class":1199},[173,19888,1268],{"class":468},[173,19890,19891],{"class":179},"close",[173,19893,1413],{"class":1199},[44,19895,19896],{"id":19896},"解壓縮程式",[15,19898,19899],{},[28,19900,16169],{},[164,19902,19904],{"className":1183,"code":19903,"language":1130,"meta":169,"style":169},"$zip = new ZipArchive;\n$zip->open($zipFile);\n$zip->extractTo($filePath);\n$zip->close();\n",[19,19905,19906,19918,19929,19941],{"__ignoreMap":169},[173,19907,19908,19910,19912,19914,19916],{"class":175,"line":176},[173,19909,19600],{"class":1199},[173,19911,1206],{"class":468},[173,19913,1226],{"class":468},[173,19915,19607],{"class":187},[173,19917,1442],{"class":1199},[173,19919,19920,19922,19924,19926],{"class":175,"line":212},[173,19921,19618],{"class":1199},[173,19923,1268],{"class":468},[173,19925,19623],{"class":179},[173,19927,19928],{"class":1199},"($zipFile);\n",[173,19930,19931,19933,19935,19938],{"class":175,"line":223},[173,19932,19618],{"class":1199},[173,19934,1268],{"class":468},[173,19936,19937],{"class":179},"extractTo",[173,19939,19940],{"class":1199},"($filePath);\n",[173,19942,19943,19945,19947,19949],{"class":175,"line":230},[173,19944,19618],{"class":1199},[173,19946,1268],{"class":468},[173,19948,19891],{"class":179},[173,19950,1413],{"class":1199},[15,19952,19953],{},[28,19954,19687],{},[825,19956,19957,19963],{},[55,19958,19959,19962],{},[19,19960,19961],{},"$zipFile"," 壓縮檔位置",[55,19964,19965,19967],{},[19,19966,1430],{}," 解壓縮檔路徑",[894,19969,9314],{},{"title":169,"searchDepth":212,"depth":212,"links":19971},[19972,19973,19974],{"id":19530,"depth":212,"text":19530},{"id":19573,"depth":212,"text":19573},{"id":19896,"depth":212,"text":19896},"\u002Fimages\u002Farticles\u002F2022-03-26-php-zip\u002Fcover.png",{},"\u002Farticles\u002F2022-03-26-php-zip","2022-03-26 11:00:00",{"title":19525,"description":169},"articles\u002F2022-03-26-php-zip","在某些需求，如要讓使用者下載多個檔案時，我們可以打包成一個檔案供用戶下載，或是檔案太大，可以壓縮檔案已減少頻寛。",[1130],"axPiVBtvCJExqY5-9kjtwpxNVXxvivHDhw3IsOl0YXs",{"id":19036,"title":19037,"body":19985,"category":933,"description":169,"extension":921,"image":19146,"meta":20065,"navigation":226,"path":19148,"pubDate":19149,"seo":20066,"status":226,"stem":19151,"summary":19152,"tags":20067,"__hash__":19154},{"type":8,"value":19986,"toc":20056},[19987,19989,19991,19996,19998,20000,20005,20007,20009,20014,20016,20018,20023,20025,20027,20032,20034,20036,20041,20043,20051],[44,19988,9632],{"id":9631},[15,19990,19044],{},[15,19992,9559,19993],{},[283,19994,19050],{"href":9640,"rel":19995},[287],[44,19997,19054],{"id":19053},[15,19999,19057],{},[15,20001,19060,20002],{},[283,20003,19063],{"href":19063,"rel":20004},[287],[44,20006,19068],{"id":19067},[15,20008,19071],{},[15,20010,9559,20011],{},[283,20012,19077],{"href":9562,"rel":20013},[287],[44,20015,9593],{"id":9592},[15,20017,19082],{},[15,20019,9559,20020],{},[283,20021,19088],{"href":9601,"rel":20022},[287],[44,20024,19091],{"id":8650},[15,20026,19094],{},[15,20028,9559,20029],{},[283,20030,19101],{"href":19099,"rel":20031},[287],[44,20033,9606],{"id":9605},[15,20035,19106],{},[15,20037,9559,20038],{},[283,20039,19113],{"href":19111,"rel":20040},[287],[44,20042,19117],{"id":19116},[15,20044,19120,20045,5671,20047,19125,20049,19128],{},[19,20046,3998],{},[19,20048,195],{},[19,20050,168],{},[15,20052,19131,20053],{},[283,20054,19136],{"href":19134,"rel":20055},[287],{"title":169,"searchDepth":212,"depth":212,"links":20057},[20058,20059,20060,20061,20062,20063,20064],{"id":9631,"depth":212,"text":9632},{"id":19053,"depth":212,"text":19054},{"id":19067,"depth":212,"text":19068},{"id":9592,"depth":212,"text":9593},{"id":8650,"depth":212,"text":19091},{"id":9605,"depth":212,"text":9606},{"id":19116,"depth":212,"text":19117},{},{"title":19037,"description":169},[933],[20069,20070],{"title":19157,"path":19516,"stem":19519,"summary":19520,"children":-1},{"title":18613,"path":19028,"stem":19031,"summary":19032,"children":-1},1788415333979]