[{"data":1,"prerenderedAt":22758},["ShallowReactive",2],{"search":3,"tag-Orca":22755},[4,1616,2895,3750,5445,5527,6119,6364,6796,7994,8409,8593,11331,12127,12313,13003,13327,13379,13773,15339,15429,16314,19159,19919,20472,20685,21002,21383,21806,21926,22294],{"id":5,"title":6,"body":7,"category":1599,"description":1600,"extension":1601,"image":1602,"meta":1603,"navigation":263,"path":1604,"pubDate":1605,"seo":1606,"status":263,"stem":1607,"summary":1608,"tags":1609,"__hash__":1615},"content\u002Farticles\u002F2026-11-01-orca-tutorial.md","Orca 教學：用 ADE 同時駕馭多個 AI 編碼 Agent",{"type":8,"value":9,"toc":1582},"minimark",[10,14,41,44,50,53,58,61,117,142,144,148,155,176,183,205,207,211,283,292,302,328,343,345,349,352,430,440,442,446,525,527,531,557,559,563,573,576,899,905,907,911,914,1020,1023,1140,1143,1245,1252,1254,1258,1265,1272,1274,1278,1298,1300,1303,1391,1394,1426,1428,1431,1436,1450,1455,1466,1468,1471,1509,1516,1518,1521,1524,1526,1529,1578],[11,12,6],"h1",{"id":13},"orca-教學用-ade-同時駕馭多個-ai-編碼-agent",[15,16,17,18,22,23,30,31,36,37,40],"p",{},"當一個 Agent 不夠用時，真正的痛點不是模型不夠聰明，而是",[19,20,21],"strong",{},"沒有人統一指揮與對帳","。Orca（",[24,25,29],"a",{"href":26,"rel":27},"https:\u002F\u002Fgithub.com\u002Fstablyai\u002Forca",[28],"nofollow","stablyai\u002Forca","，官網 ",[24,32,35],{"href":33,"rel":34},"https:\u002F\u002Fwww.onorca.dev\u002F",[28],"onorca.dev","）就是為了解決這一段而生：它是一套開源的 ",[19,38,39],{},"ADE（Agent Development Environment，Agent 開發環境）","，讓多個終端 Agent 各自跑在獨立的 git worktree 裡，並在同一介面統一監控、審閱與合併。",[15,42,43],{},"它不賣模型、不吃 token，用的是你自己的訂閱。",[45,46,47],"blockquote",{},[15,48,49],{},"Orca 的定位是「指揮塔」而非 IDE：不寫程式、不生成程式碼，負責隔離、監控、審閱、合併多個 Agent 的產出。",[51,52],"hr",{},[54,55,57],"h2",{"id":56},"什麼是-adeorca-與既有工具的差異","什麼是 ADE？Orca 與既有工具的差異",[15,59,60],{},"Orca 刻意替自己取了一個新品類名字，跟三種既有工具劃清界線：",[62,63,64,80],"table",{},[65,66,67],"thead",{},[68,69,70,74,77],"tr",{},[71,72,73],"th",{},"對照對象",[71,75,76],{},"它是什麼",[71,78,79],{},"Orca 的差異",[81,82,83,95,106],"tbody",{},[68,84,85,89,92],{},[86,87,88],"td",{},"IDE（VS Code、JetBrains）",[86,90,91],{},"給「人」寫程式，一次盯一個檔案",[86,93,94],{},"ADE 是給「人 + Agent 艦隊」的工作台",[68,96,97,100,103],{},[86,98,99],{},"Agent 框架（LangChain 等）",[86,101,102],{},"幫你「組出一個 Agent」的積木",[86,104,105],{},"Orca 不管怎麼造 Agent，只管怎麼同時看住一群",[68,107,108,111,114],{},[86,109,110],{},"終端 multiplexer（tmux）",[86,112,113],{},"把畫面切開，但不理解 Agent 在做什麼",[86,115,116],{},"Orca 懂 Agent 狀態、會隔離改動、能審閱 diff",[45,118,119],{},[15,120,121,125,126,130,131,134,135,137,138,141],{},[122,123,124],"span",{},"!note"," 名稱澄清\n這裡指的是 AI 編碼工具 Orca。同名容易混淆的有：GNOME 桌面閱讀器 ",[127,128,129],"code",{},"orca","（Linux 上的 ",[127,132,133],{},"\u002Fusr\u002Fbin\u002Forca","）、Plotly 的 ",[127,136,129],{}," cask（Homebrew 裸名指的是這個），以及智源的 RoboBrain Orca 模型。安裝時務必用完整名稱 ",[127,139,140],{},"stablyai\u002Forca\u002Forca","。",[51,143],{},[54,145,147],{"id":146},"核心機制parallel-worktrees","核心機制：Parallel Worktrees",[15,149,150,151,154],{},"git worktree 讓同一個 repo 檢出多個工作目錄，各自對應不同分支、共享 ",[127,152,153],{},".git"," 物件庫。對多 Agent 場景意味著：",[156,157,158,166,173],"ul",{},[159,160,161,162,165],"li",{},"Agent A 在 ",[127,163,164],{},"feat\u002Flogin-fix"," 改認證邏輯",[159,167,168,169,172],{},"Agent B 在 ",[127,170,171],{},"feat\u002Fperf-ci"," 優化流水線",[159,174,175],{},"Agent C 用另一家 Agent 嘗試第二種實作",[15,177,178,179,182],{},"三者檔案變更物理隔離，不會互相覆蓋，也不用一直 ",[127,180,181],{},"git stash","。官方典型用法是「Fan one prompt across five agents」——同一條 prompt 給五個 Agent，比對結果後合併勝出者，等於把「模型選型」從事前猜測變成事後 A\u002FB 測試。",[15,184,185,186,189,190,193,194,193,197,200,201,204],{},"Orca 的 worktree 是",[19,187,188],{},"真實的 git worktree","，不是自訂沙盒：在終端裡 ",[127,191,192],{},"git status","、",[127,195,196],{},"git rebase",[127,198,199],{},"git cherry-pick"," 都照常運作，Orca 也能偵測你自己用 ",[127,202,203],{},"git worktree add"," 建的 worktree。",[51,206],{},[54,208,210],{"id":209},"安裝-orca","安裝 Orca",[212,213,218],"pre",{"className":214,"code":215,"language":216,"meta":217,"style":217},"language-bash shiki shiki-themes github-light github-dark github-dark","# macOS（Homebrew，必須用完整名稱）\nbrew install --cask stablyai\u002Forca\u002Forca\nbrew upgrade --cask stablyai\u002Forca\u002Forca\n\n# Arch Linux (AUR)\nyay -S stably-orca-bin\n","bash","",[127,219,220,228,246,258,265,271],{"__ignoreMap":217},[122,221,224],{"class":222,"line":223},"line",1,[122,225,227],{"class":226},"sCsY4","# macOS（Homebrew，必須用完整名稱）\n",[122,229,231,235,239,243],{"class":222,"line":230},2,[122,232,234],{"class":233},"shcOC","brew",[122,236,238],{"class":237},"sfrk1"," install",[122,240,242],{"class":241},"suiK_"," --cask",[122,244,245],{"class":237}," stablyai\u002Forca\u002Forca\n",[122,247,249,251,254,256],{"class":222,"line":248},3,[122,250,234],{"class":233},[122,252,253],{"class":237}," upgrade",[122,255,242],{"class":241},[122,257,245],{"class":237},[122,259,261],{"class":222,"line":260},4,[122,262,264],{"emptyLinePlaceholder":263},true,"\n",[122,266,268],{"class":222,"line":267},5,[122,269,270],{"class":226},"# Arch Linux (AUR)\n",[122,272,274,277,280],{"class":222,"line":273},6,[122,275,276],{"class":233},"yay",[122,278,279],{"class":241}," -S",[122,281,282],{"class":237}," stably-orca-bin\n",[15,284,285,286,291],{},"也可從 ",[24,287,290],{"href":288,"rel":289},"https:\u002F\u002Fonorca.dev\u002Fdownload",[28],"onorca.dev\u002Fdownload"," 或 GitHub Releases 取得 macOS（Apple Silicon \u002F Intel）、Windows、Linux AppImage 安裝檔。授權為 MIT。",[15,293,294,295,298,299,301],{},"安裝後可在 ",[19,296,297],{},"Settings → General → Orca CLI"," 註冊 ",[127,300,129],{}," 指令，並用以下方式驗證：",[212,303,305],{"className":214,"code":304,"language":216,"meta":217,"style":217},"command -v orca\norca status --json\n",[127,306,307,318],{"__ignoreMap":217},[122,308,309,312,315],{"class":222,"line":223},[122,310,311],{"class":241},"command",[122,313,314],{"class":241}," -v",[122,316,317],{"class":237}," orca\n",[122,319,320,322,325],{"class":222,"line":230},[122,321,129],{"class":233},[122,323,324],{"class":237}," status",[122,326,327],{"class":241}," --json\n",[45,329,330],{},[15,331,332,335,336,338,339,342],{},[122,333,334],{},"!tip"," Linux 注意\nLinux 上裸名 ",[127,337,129],{}," 可能解析成 GNOME 螢幕閱讀器；在 Orca 管理的終端裡，Orca 會把自己放在 PATH 最前，但外部 shell 請確認 ",[127,340,341],{},"command -v orca"," 指向正確執行檔。",[51,344],{},[54,346,348],{"id":347},"你的第一個三-agent-工作階段","你的第一個三 Agent 工作階段",[15,350,351],{},"這是文件中最重要的一頁，五分鐘內就能讓三個 Agent 並行。",[353,354,355,369,387,412,418,424],"ol",{},[159,356,357,360,361,364,365,368],{},[19,358,359],{},"加入 repo","：點側邊欄 ",[19,362,363],{},"Add Repo","，指向本地 checkout。Orca 讀取 repo 的 git 狀態，把預設分支當作 ",[19,366,367],{},"base ref","（之後所有新 worktree 都從這裡分支）。",[159,370,371,374,375,378,379,382,383,386],{},[19,372,373],{},"建立 worktree","：點 repo 名稱旁的 ",[19,376,377],{},"+","，輸入任務名稱（例如 ",[127,380,381],{},"fix-login-race","，留空會用海洋生物名稱自動命名）。建立對話框會開 ",[19,384,385],{},"agent combobox","，挑選 Claude Code、Codex、Cursor CLI 或任一支援的 Agent；Orca 會以正確的工作目錄啟動該 CLI 並轉發你的訂閱憑證。",[159,388,389,392,393],{},[19,390,391],{},"重複兩次","，你就有了三個 worktree：\n",[156,394,395,400,406],{},[159,396,397,399],{},[127,398,381],{}," → Claude Code",[159,401,402,405],{},[127,403,404],{},"fix-login-race-2"," → Codex",[159,407,408,411],{},[127,409,410],{},"fix-login-race-3"," → Cursor CLI",[159,413,414,417],{},[19,415,416],{},"貼同一條 prompt"," 給三個 Agent。三條分支、三個 diff、同一個 prompt，讓它們各自工作。",[159,419,420,423],{},[19,421,422],{},"拖曳 worktree 分頁","到 pane 右側或下方分割，就能同時觀察三個 Agent。",[159,425,426,429],{},[19,427,428],{},"選出勝者","：打開每個 worktree 的 diff view，用 Annotate AI Diff 留下 inline 註解送回 Agent 修改，最後 commit \u002F push \u002F 開 PR；另外兩個 worktree 一鍵刪除，分支也會跟著清掉。",[15,431,432,433,436,437,439],{},"建立 worktree 是背景執行的：送出對話框後立即關閉，",[127,434,435],{},"git fetch"," 與 ",[127,438,203],{}," 在背景繼續，新 worktree 會以進度列出現在側邊欄，你可以切到其他 worktree 繼續工作，完成後也不會把你拉走。",[51,441],{},[54,443,445],{"id":444},"worktree-管理重點","Worktree 管理重點",[156,447,448,458,509,519],{},[159,449,450,453,454,457],{},[19,451,452],{},"Start-from picker","：建立時的 ",[19,455,456],{},"Branch from"," 可選 repo 的 base ref（最快路徑）、另一條本地分支（方便疊 PR）、特定 commit SHA、或遠端分支（Orca 會 fetch 並 checkout）。",[159,459,460,463,464],{},[19,461,462],{},"共享依賴與 gitignored 檔案","：全新 worktree 是乾淨 checkout，Orca 用三種方式補足：\n",[353,465,466,472,491],{},[159,467,468,471],{},[19,469,470],{},"Worktree Shared Paths","（per repo，Settings → Repository）：路徑從主 checkout materialize 到每個新 worktree（macOS 優先 APFS clone-copy，否則 symlink）。",[159,473,474,483,484,193,487,490],{},[19,475,476,479,480],{},[127,477,478],{},"worktree.sharedDirectories"," in ",[127,481,482],{},"orca.yaml","：repo 內登记的 gitignored 目錄清單（symlink\u002Fshare，非 copy），適合 ",[127,485,486],{},"node_modules",[127,488,489],{},".cache"," 這類可重建的大樹。",[159,492,493,498,499,502,503,193,506,141],{},[19,494,495],{},[127,496,497],{},".worktreeinclude","：列出要 ",[19,500,501],{},"copy","（非 symlink）進每個 worktree 的 gitignored 檔案\u002F目錄，例如 ",[127,504,505],{},".env",[127,507,508],{},".vscode\u002Fsettings.json",[159,510,511,514,515,518],{},[19,512,513],{},"命名分支","：預設從 workspace 名稱或連結的 PR\u002FIssue 衍生；展開 Advanced drawer 可手動輸入 ",[19,516,517],{},"Branch name","；從 Linear issue 建立時會用 Linear 自己的 branch name。",[159,520,521,524],{},[19,522,523],{},"父子 worktree","：Advanced drawer 可選同一 repo 的 active worktree 作 Parent workspace，只影響側邊欄巢狀分組，不改變 Git 歷史。",[51,526],{},[54,528,530],{"id":529},"統一監控diff-審閱與交付","統一監控、Diff 審閱與交付",[156,532,533,539,545,551],{},[159,534,535,538],{},[19,536,537],{},"Annotate AI Diffs","：在 diff 任一行寫 Markdown 批註，批次送回 Agent 修改，可同時看 CI、解衝突、開 PR。",[159,540,541,544],{},[19,542,543],{},"GitHub \u002F Linear \u002F Jira \u002F GitLab 原生整合","：應用內瀏覽 PR、Issue、看板；從任務一鍵開 worktree，Review 與 Approve 不必跳出 Orca。",[159,546,547,550],{},[19,548,549],{},"Design Mode","：每個 worktree 可掛獨立 Chromium 視窗，點選頁面任一 UI 元素，Orca 自動抓取該元素的 HTML、CSS 與裁剪截圖，直接注入 Agent prompt。做前端微調不必再用文字描述「左上角那個藍色按鈕」。",[159,552,553,556],{},[19,554,555],{},"Commit & push \u002F 開 PR","：全部在 Orca 內完成。",[51,558],{},[54,560,562],{"id":561},"orca-cli把工作流腳本化","Orca CLI：把工作流腳本化",[15,564,565,566,568,569,572],{},"Orca 除了 GUI，還提供 ",[127,567,129],{}," CLI，能建立 worktree、驅動終端、操作內建瀏覽器，甚至讓 Agent 反過來驅動 Orca；",[127,570,571],{},"orca serve"," 可跑在無介面的 Linux 伺服器上。",[15,574,575],{},"常用指令：",[212,577,579],{"className":214,"code":578,"language":216,"meta":217,"style":217},"# 確認連上執行中的 Orca\norca status --json\n\n# Worktree\norca worktree ps --json\norca worktree create --repo id:\u003CrepoId> --name my-task --issue 123 --json\norca worktree current --json\norca worktree rm --worktree id:\u003Cid> --force --json\n\n# 終端\norca terminal list --json\norca terminal read --json\norca terminal send --text \"continue\" --enter --json\norca terminal wait --for tui-idle --timeout-ms 30000 --json\n\n# 檔案與 diff\norca file open src\u002FApp.tsx\norca file diff src\u002FApp.tsx --staged\n\n# 內建瀏覽器（snapshot → click → 再 snapshot）\norca goto --url https:\u002F\u002Fexample.com --json\norca snapshot --json          # 回傳 @e1、@e3 之類的 ref\norca click --element @e3 --json\norca fill --element @e1 --value \"user@example.com\" --json\n",[127,580,581,586,594,598,603,615,658,670,699,704,710,723,735,756,780,785,791,805,821,826,832,848,862,878],{"__ignoreMap":217},[122,582,583],{"class":222,"line":223},[122,584,585],{"class":226},"# 確認連上執行中的 Orca\n",[122,587,588,590,592],{"class":222,"line":230},[122,589,129],{"class":233},[122,591,324],{"class":237},[122,593,327],{"class":241},[122,595,596],{"class":222,"line":248},[122,597,264],{"emptyLinePlaceholder":263},[122,599,600],{"class":222,"line":260},[122,601,602],{"class":226},"# Worktree\n",[122,604,605,607,610,613],{"class":222,"line":267},[122,606,129],{"class":233},[122,608,609],{"class":237}," worktree",[122,611,612],{"class":237}," ps",[122,614,327],{"class":241},[122,616,617,619,621,624,627,630,634,637,641,644,647,650,653,656],{"class":222,"line":273},[122,618,129],{"class":233},[122,620,609],{"class":237},[122,622,623],{"class":237}," create",[122,625,626],{"class":241}," --repo",[122,628,629],{"class":237}," id:",[122,631,633],{"class":632},"so5gQ","\u003C",[122,635,636],{"class":237},"repoI",[122,638,640],{"class":639},"slsVL","d",[122,642,643],{"class":632},">",[122,645,646],{"class":241}," --name",[122,648,649],{"class":237}," my-task",[122,651,652],{"class":241}," --issue",[122,654,655],{"class":241}," 123",[122,657,327],{"class":241},[122,659,661,663,665,668],{"class":222,"line":660},7,[122,662,129],{"class":233},[122,664,609],{"class":237},[122,666,667],{"class":237}," current",[122,669,327],{"class":241},[122,671,673,675,677,680,683,685,687,690,692,694,697],{"class":222,"line":672},8,[122,674,129],{"class":233},[122,676,609],{"class":237},[122,678,679],{"class":237}," rm",[122,681,682],{"class":241}," --worktree",[122,684,629],{"class":237},[122,686,633],{"class":632},[122,688,689],{"class":237},"i",[122,691,640],{"class":639},[122,693,643],{"class":632},[122,695,696],{"class":241}," --force",[122,698,327],{"class":241},[122,700,702],{"class":222,"line":701},9,[122,703,264],{"emptyLinePlaceholder":263},[122,705,707],{"class":222,"line":706},10,[122,708,709],{"class":226},"# 終端\n",[122,711,713,715,718,721],{"class":222,"line":712},11,[122,714,129],{"class":233},[122,716,717],{"class":237}," terminal",[122,719,720],{"class":237}," list",[122,722,327],{"class":241},[122,724,726,728,730,733],{"class":222,"line":725},12,[122,727,129],{"class":233},[122,729,717],{"class":237},[122,731,732],{"class":237}," read",[122,734,327],{"class":241},[122,736,738,740,742,745,748,751,754],{"class":222,"line":737},13,[122,739,129],{"class":233},[122,741,717],{"class":237},[122,743,744],{"class":237}," send",[122,746,747],{"class":241}," --text",[122,749,750],{"class":237}," \"continue\"",[122,752,753],{"class":241}," --enter",[122,755,327],{"class":241},[122,757,759,761,763,766,769,772,775,778],{"class":222,"line":758},14,[122,760,129],{"class":233},[122,762,717],{"class":237},[122,764,765],{"class":237}," wait",[122,767,768],{"class":241}," --for",[122,770,771],{"class":237}," tui-idle",[122,773,774],{"class":241}," --timeout-ms",[122,776,777],{"class":241}," 30000",[122,779,327],{"class":241},[122,781,783],{"class":222,"line":782},15,[122,784,264],{"emptyLinePlaceholder":263},[122,786,788],{"class":222,"line":787},16,[122,789,790],{"class":226},"# 檔案與 diff\n",[122,792,794,796,799,802],{"class":222,"line":793},17,[122,795,129],{"class":233},[122,797,798],{"class":237}," file",[122,800,801],{"class":237}," open",[122,803,804],{"class":237}," src\u002FApp.tsx\n",[122,806,808,810,812,815,818],{"class":222,"line":807},18,[122,809,129],{"class":233},[122,811,798],{"class":237},[122,813,814],{"class":237}," diff",[122,816,817],{"class":237}," src\u002FApp.tsx",[122,819,820],{"class":241}," --staged\n",[122,822,824],{"class":222,"line":823},19,[122,825,264],{"emptyLinePlaceholder":263},[122,827,829],{"class":222,"line":828},20,[122,830,831],{"class":226},"# 內建瀏覽器（snapshot → click → 再 snapshot）\n",[122,833,835,837,840,843,846],{"class":222,"line":834},21,[122,836,129],{"class":233},[122,838,839],{"class":237}," goto",[122,841,842],{"class":241}," --url",[122,844,845],{"class":237}," https:\u002F\u002Fexample.com",[122,847,327],{"class":241},[122,849,851,853,856,859],{"class":222,"line":850},22,[122,852,129],{"class":233},[122,854,855],{"class":237}," snapshot",[122,857,858],{"class":241}," --json",[122,860,861],{"class":226},"          # 回傳 @e1、@e3 之類的 ref\n",[122,863,865,867,870,873,876],{"class":222,"line":864},23,[122,866,129],{"class":233},[122,868,869],{"class":237}," click",[122,871,872],{"class":241}," --element",[122,874,875],{"class":237}," @e3",[122,877,327],{"class":241},[122,879,881,883,886,888,891,894,897],{"class":222,"line":880},24,[122,882,129],{"class":233},[122,884,885],{"class":237}," fill",[122,887,872],{"class":241},[122,889,890],{"class":237}," @e1",[122,892,893],{"class":241}," --value",[122,895,896],{"class":237}," \"user@example.com\"",[122,898,327],{"class":241},[15,900,901,902,141],{},"需要追蹤完成狀態或 DAG 時，改用 orchestration 而不是單純 ",[127,903,904],{},"terminal send",[51,906],{},[54,908,910],{"id":909},"orchestration結構化多-agent-協作","Orchestration：結構化多 Agent 協作",[15,912,913],{},"Orca 的結構化多 Agent 層，由五個概念組成：",[62,915,916,926],{},[65,917,918],{},[68,919,920,923],{},[71,921,922],{},"概念",[71,924,925],{},"作用",[81,927,928,938,968,982,1010],{},[68,929,930,935],{},[86,931,932],{},[19,933,934],{},"Run",[86,936,937],{},"持久命名空間與 coordinator 收件匣，本身不派工",[68,939,940,945],{},[86,941,942],{},[19,943,944],{},"Task",[86,946,947,948,951,952,951,955,951,958,951,961,951,964,967],{},"工作項，含 spec、依賴與狀態（",[127,949,950],{},"pending"," \u002F ",[127,953,954],{},"ready",[127,956,957],{},"dispatched",[127,959,960],{},"completed",[127,962,963],{},"failed",[127,965,966],{},"blocked","）",[68,969,970,975],{},[86,971,972],{},[19,973,974],{},"Dispatch",[86,976,977,978,981],{},"某個 task 在某個終端上的一次嘗試，是 ",[127,979,980],{},"worker_done"," 與 heartbeat 的權威來源",[68,983,984,989],{},[86,985,986],{},[19,987,988],{},"Message",[86,990,991,992,193,995,193,998,193,1000,193,1003,193,1006,1009],{},"收件匣訊息：",[127,993,994],{},"status",[127,996,997],{},"dispatch",[127,999,980],{},[127,1001,1002],{},"escalation",[127,1004,1005],{},"question",[127,1007,1008],{},"heartbeat"," 等",[68,1011,1012,1017],{},[86,1013,1014],{},[19,1015,1016],{},"Decision gate",[86,1018,1019],{},"由 coordinator 持有、會阻塞 task 的待決問題",[15,1021,1022],{},"偏好使用的監督式迴圈：",[212,1024,1026],{"className":214,"code":1025,"language":216,"meta":217,"style":217},"orca orchestration run-create --objective \"Split checkout QA\" --json\norca orchestration task-create --spec \"Audit billing settings\" --task-title \"Billing audit\" --json\norca orchestration worker-start --task \u003CtaskId> --worktree new-child --name billing-audit --agent codex --setup run --json\norca orchestration check --wait --types worker_done,escalation,question --timeout-ms 900000 --json\n",[127,1027,1028,1046,1069,1115],{"__ignoreMap":217},[122,1029,1030,1032,1035,1038,1041,1044],{"class":222,"line":223},[122,1031,129],{"class":233},[122,1033,1034],{"class":237}," orchestration",[122,1036,1037],{"class":237}," run-create",[122,1039,1040],{"class":241}," --objective",[122,1042,1043],{"class":237}," \"Split checkout QA\"",[122,1045,327],{"class":241},[122,1047,1048,1050,1052,1055,1058,1061,1064,1067],{"class":222,"line":230},[122,1049,129],{"class":233},[122,1051,1034],{"class":237},[122,1053,1054],{"class":237}," task-create",[122,1056,1057],{"class":241}," --spec",[122,1059,1060],{"class":237}," \"Audit billing settings\"",[122,1062,1063],{"class":241}," --task-title",[122,1065,1066],{"class":237}," \"Billing audit\"",[122,1068,327],{"class":241},[122,1070,1071,1073,1075,1078,1081,1084,1087,1089,1091,1093,1096,1098,1101,1104,1107,1110,1113],{"class":222,"line":248},[122,1072,129],{"class":233},[122,1074,1034],{"class":237},[122,1076,1077],{"class":237}," worker-start",[122,1079,1080],{"class":241}," --task",[122,1082,1083],{"class":632}," \u003C",[122,1085,1086],{"class":237},"taskI",[122,1088,640],{"class":639},[122,1090,643],{"class":632},[122,1092,682],{"class":241},[122,1094,1095],{"class":237}," new-child",[122,1097,646],{"class":241},[122,1099,1100],{"class":237}," billing-audit",[122,1102,1103],{"class":241}," --agent",[122,1105,1106],{"class":237}," codex",[122,1108,1109],{"class":241}," --setup",[122,1111,1112],{"class":237}," run",[122,1114,327],{"class":241},[122,1116,1117,1119,1121,1124,1127,1130,1133,1135,1138],{"class":222,"line":260},[122,1118,129],{"class":233},[122,1120,1034],{"class":237},[122,1122,1123],{"class":237}," check",[122,1125,1126],{"class":241}," --wait",[122,1128,1129],{"class":241}," --types",[122,1131,1132],{"class":237}," worker_done,escalation,question",[122,1134,774],{"class":241},[122,1136,1137],{"class":241}," 900000",[122,1139,327],{"class":241},[15,1141,1142],{},"Worker 完成回報（從 worker pane，帶入注入的 ID）：",[212,1144,1146],{"className":214,"code":1145,"language":216,"meta":217,"style":217},"orca orchestration send \\\n  --type worker_done \\\n  --subject \"Completed mobile audit\" \\\n  --body \"Fixed footer overlap; no follow-ups.\" \\\n  --task-id \u003CtaskId> \\\n  --dispatch-id \u003CdispatchId> \\\n  --outcome succeeded \\\n  --files-modified \"src\u002Fapp\u002Fsettings\u002FBilling.tsx\" \\\n  --json\n",[127,1147,1148,1159,1169,1179,1189,1204,1220,1230,1240],{"__ignoreMap":217},[122,1149,1150,1152,1154,1156],{"class":222,"line":223},[122,1151,129],{"class":233},[122,1153,1034],{"class":237},[122,1155,744],{"class":237},[122,1157,1158],{"class":241}," \\\n",[122,1160,1161,1164,1167],{"class":222,"line":230},[122,1162,1163],{"class":241},"  --type",[122,1165,1166],{"class":237}," worker_done",[122,1168,1158],{"class":241},[122,1170,1171,1174,1177],{"class":222,"line":248},[122,1172,1173],{"class":241},"  --subject",[122,1175,1176],{"class":237}," \"Completed mobile audit\"",[122,1178,1158],{"class":241},[122,1180,1181,1184,1187],{"class":222,"line":260},[122,1182,1183],{"class":241},"  --body",[122,1185,1186],{"class":237}," \"Fixed footer overlap; no follow-ups.\"",[122,1188,1158],{"class":241},[122,1190,1191,1194,1196,1198,1200,1202],{"class":222,"line":267},[122,1192,1193],{"class":241},"  --task-id",[122,1195,1083],{"class":632},[122,1197,1086],{"class":237},[122,1199,640],{"class":639},[122,1201,643],{"class":632},[122,1203,1158],{"class":241},[122,1205,1206,1209,1211,1214,1216,1218],{"class":222,"line":273},[122,1207,1208],{"class":241},"  --dispatch-id",[122,1210,1083],{"class":632},[122,1212,1213],{"class":237},"dispatchI",[122,1215,640],{"class":639},[122,1217,643],{"class":632},[122,1219,1158],{"class":241},[122,1221,1222,1225,1228],{"class":222,"line":660},[122,1223,1224],{"class":241},"  --outcome",[122,1226,1227],{"class":237}," succeeded",[122,1229,1158],{"class":241},[122,1231,1232,1235,1238],{"class":222,"line":672},[122,1233,1234],{"class":241},"  --files-modified",[122,1236,1237],{"class":237}," \"src\u002Fapp\u002Fsettings\u002FBilling.tsx\"",[122,1239,1158],{"class":241},[122,1241,1242],{"class":222,"line":701},[122,1243,1244],{"class":241},"  --json\n",[15,1246,1247,1248,1251],{},"Heartbeat 預設 5 分鐘，可在 ",[19,1249,1250],{},"Settings → Agent Orchestration"," 調整（1–60 分鐘）。",[51,1253],{},[54,1255,1257],{"id":1256},"支援的-agent","支援的 Agent",[15,1259,1260,1261,1264],{},"原則很簡單：",[19,1262,1263],{},"能在終端跑的就能進 Orca","。官方預置並文件化的包括 Claude Code、Codex、OpenCode、Cursor CLI、GitHub Copilot、Grok、Pi、oh-my-pi、Goose、Cline、Continue、Kimi、Qwen Code、Mistral Vibe、Rovo Dev、Devin、Amp、Antigravity、Hermes 等 25+ 種。",[15,1266,1267,1268,1271],{},"Orca 也支援 ",[19,1269,1270],{},"Account Switcher & Usage Tracking","：查看 Claude \u002F Codex 用量與 rate-limit 重置時間，並熱切換帳號而不必重新登入。",[51,1273],{},[54,1275,1277],{"id":1276},"終端體驗與-ssh-worktrees","終端體驗與 SSH Worktrees",[156,1279,1280,1286,1292],{},[159,1281,1282,1285],{},[19,1283,1284],{},"終端體驗（Ghostty 級）","：WebGL 渲染、無限分屏、重啟後恢復 scrollback、全文搜尋。Agent 本質上是 TUI 程式，Orca 選擇把終端做深而不是只包一層 GUI。",[159,1287,1288,1291],{},[19,1289,1290],{},"SSH Worktrees","：在遠端高規機器上跑 Agent，本地保留檔案編輯、Git 與終端體驗，支援自動重連與端口轉發。適合筆電算力不足、或想長時間跑重任務。",[159,1293,1294,1297],{},[19,1295,1296],{},"手機端","：iOS \u002F Android 伴侶 App 可查看進度、接收完成通知、回覆 Agent 提問、切換工作模式。",[51,1299],{},[54,1301,1302],{"id":1302},"與其他做法的差異",[62,1304,1305,1321],{},[65,1306,1307],{},[68,1308,1309,1312,1315,1318],{},[71,1310,1311],{},"維度",[71,1313,1314],{},"Orca（ADE）",[71,1316,1317],{},"VS Code + Agent 插件",[71,1319,1320],{},"終端多 Tab \u002F tmux",[81,1322,1323,1337,1351,1363,1377],{},[68,1324,1325,1328,1331,1334],{},[86,1326,1327],{},"並行 Agent",[86,1329,1330],{},"原生支援，worktree 隔離",[86,1332,1333],{},"通常一次一個",[86,1335,1336],{},"要自己手動管理",[68,1338,1339,1342,1345,1348],{},[86,1340,1341],{},"統一監控",[86,1343,1344],{},"一個 dashboard 全看到",[86,1346,1347],{},"只看得到當前 Agent",[86,1349,1350],{},"分散在各視窗",[68,1352,1353,1355,1358,1361],{},[86,1354,1296],{},[86,1356,1357],{},"可監控、可介入",[86,1359,1360],{},"沒有",[86,1362,1360],{},[68,1364,1365,1368,1371,1374],{},[86,1366,1367],{},"Agent 來源",[86,1369,1370],{},"任何 CLI Agent",[86,1372,1373],{},"綁定特定插件",[86,1375,1376],{},"任何都行",[68,1378,1379,1382,1385,1388],{},[86,1380,1381],{},"成本",[86,1383,1384],{},"用你自己的訂閱",[86,1386,1387],{},"看插件而定",[86,1389,1390],{},"用你自己的",[15,1392,1393],{},"挑選多 Agent 工具時可對的五個問題：",[353,1395,1396,1402,1408,1414,1420],{},[159,1397,1398,1401],{},[19,1399,1400],{},"費用歸誰？"," 吃自己的訂閱，還是要另買它的 API、再被抽 token？",[159,1403,1404,1407],{},[19,1405,1406],{},"怎麼隔離？"," 用 worktree、用分支，還是要自己開 tab 硬記？",[159,1409,1410,1413],{},[19,1411,1412],{},"看得到全局嗎？"," 有沒有一個地方同時看所有 Agent 的進度？",[159,1415,1416,1419],{},[19,1417,1418],{},"離開電腦能不能管？"," 有沒有手機端？",[159,1421,1422,1425],{},[19,1423,1424],{},"它成熟了嗎？"," 看開放 issue 數量與更新頻率。",[51,1427],{},[54,1429,1430],{"id":1430},"適用與不適用",[15,1432,1433],{},[19,1434,1435],{},"適合",[156,1437,1438,1441,1444,1447],{},[159,1439,1440],{},"日常同時跑 3 個以上 CLI Agent 的開發者",[159,1442,1443],{},"已訂閱 Claude Code + Codex（或 OpenCode），想交叉比對產出",[159,1445,1446],{},"重度使用 GitHub \u002F Linear、需要 worktree 隔離的 Git 工作流",[159,1448,1449],{},"想要開源、可自架（headless）且跨三平臺",[15,1451,1452],{},[19,1453,1454],{},"不適合",[156,1456,1457,1460,1463],{},[159,1458,1459],{},"只偶爾用 AI 補全、單一會話問答 → 現有 IDE 插件就夠",[159,1461,1462],{},"只做單一 Agent、單分支開發 → worktree 編排只是額外複雜度",[159,1464,1465],{},"團隊已深度綁定某家閉源 IDE 且不願切換",[51,1467],{},[54,1469,1470],{"id":1470},"風險與限制",[156,1472,1473,1479,1485,1491,1497,1503],{},[159,1474,1475,1478],{},[19,1476,1477],{},"還很新、穩定性仍在收斂","：2026-07 時開放 issue 約 750 個、PR 約 1,000 個；踩到未修坑的機率比成熟工具高，關鍵流程前先拿自己的專案跑一輪。",[159,1480,1481,1484],{},[19,1482,1483],{},"Electron 吃記憶體","：同時掛多個 Agent 時，RAM 很可能變成瓶頸。",[159,1486,1487,1490],{},[19,1488,1489],{},"它是協調層，不是 Agent 本身","：不會讓程式寫得更好，只解決「同時管很多 Agent」的痛。",[159,1492,1493,1496],{},[19,1494,1495],{},"並行成本不會消失","：多個 Agent 並行 = 多份訂閱消耗 + 多份本地／遠端資源佔用；Orca 降低的是管理複雜度，不是 token 帳單。",[159,1498,1499,1502],{},[19,1500,1501],{},"ADE 品類未定","：這個名字目前基本是 Orca 自己在推；把它當「好用的多 Agent 指揮工具」比當「下一個標準」務實。",[159,1504,1505,1508],{},[19,1506,1507],{},"遙測","：README 提及匿名使用資料收集，提供 opt-out，企業部署前應先讀隱私說明。",[45,1510,1511],{},[15,1512,1513,1515],{},[122,1514,334],{}," 需要人為拆任務\nOrca 不會自動幫你拆解工作。並行要跑得順，仍得自己定義「完成標準」、劃分任務邊界，並指定誰負責最終合併——否則只是同時製造更多 diff。",[51,1517],{},[54,1519,1520],{"id":1520},"總結",[15,1522,1523],{},"Orca 把「多 Agent 並行」從手動切 tab、自己記分支，變成有 worktree 隔離、統一監控、diff 審閱與手機端介入的完整工作流。如果你日常同時跑 3 個以上 CLI Agent，且已經訂閱 Claude Code \u002F Codex \u002F OpenCode，Orca 值得一試；如果你只用單一 Agent，現有的 IDE 插件或終端多 tab 反而更輕。",[51,1525],{},[54,1527,1528],{"id":1528},"相關資源",[156,1530,1531,1537,1544,1551,1558,1565,1571],{},[159,1532,1533],{},[24,1534,1536],{"href":33,"rel":1535},[28],"Orca 官網",[159,1538,1539],{},[24,1540,1543],{"href":1541,"rel":1542},"https:\u002F\u002Fwww.onorca.dev\u002Fdocs",[28],"Orca Docs",[159,1545,1546],{},[24,1547,1550],{"href":1548,"rel":1549},"https:\u002F\u002Fwww.onorca.dev\u002Fdocs\u002Fmodel\u002Fworktrees",[28],"Worktrees 文件",[159,1552,1553],{},[24,1554,1557],{"href":1555,"rel":1556},"https:\u002F\u002Fwww.onorca.dev\u002Fdocs\u002Fcli\u002Foverview",[28],"Orca CLI Overview",[159,1559,1560],{},[24,1561,1564],{"href":1562,"rel":1563},"https:\u002F\u002Fwww.onorca.dev\u002Fdocs\u002Fcli\u002Forchestration",[28],"Orchestration 文件",[159,1566,1567],{},[24,1568,1570],{"href":26,"rel":1569},[28],"GitHub：stablyai\u002Forca",[159,1572,1573],{},[24,1574,1577],{"href":1575,"rel":1576},"https:\u002F\u002Fwww.onorca.dev\u002Fdownload",[28],"下載頁",[1579,1580,1581],"style",{},"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":217,"searchDepth":230,"depth":230,"links":1583},[1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598],{"id":56,"depth":230,"text":57},{"id":146,"depth":230,"text":147},{"id":209,"depth":230,"text":210},{"id":347,"depth":230,"text":348},{"id":444,"depth":230,"text":445},{"id":529,"depth":230,"text":530},{"id":561,"depth":230,"text":562},{"id":909,"depth":230,"text":910},{"id":1256,"depth":230,"text":1257},{"id":1276,"depth":230,"text":1277},{"id":1302,"depth":230,"text":1302},{"id":1430,"depth":230,"text":1430},{"id":1470,"depth":230,"text":1470},{"id":1520,"depth":230,"text":1520},{"id":1528,"depth":230,"text":1528},"ai","當一個 Agent 不夠用時，真正的痛點不是模型不夠聰明，而是沒有人統一指揮與對帳。Orca（stablyai\u002Forca，官網 onorca.dev）就是為了解決這一段而生：它是一套開源的 ADE（Agent Development Environment，Agent 開發環境），讓多個終端 Agent 各自跑在獨立的 git worktree 裡，並在同一介面統一監控、審閱與合併。","md","\u002Fimages\u002Farticles\u002F2026-11-01-orca-tutorial\u002Fcover.png",{},"\u002Farticles\u002F2026-11-01-orca-tutorial","2026-11-01 10:00",{"title":6,"description":1600},"articles\u002F2026-11-01-orca-tutorial","Orca 是一套開源的 Agent Development Environment（ADE），讓 Claude Code、Codex、OpenCode、Cursor CLI 等終端 Agent 各自跑在獨立的 git worktree 中，並在同一介面統一監控、審閱與合併。本文從安裝、第一個三 Agent 工作階段、worktree 管理、diff 審閱到 Orca CLI 與 orchestration，完整整理 Orca 的使用方式。",[1610,1611,1612,1613,1614],"AI","AI Agent","Orca","開發工具","開源","oNjNfKJFVzNOZ9bMtRceDPLweQWEOw024-1G2v_vlcg",{"id":1617,"title":1618,"body":1619,"category":1599,"description":2883,"extension":1601,"image":2884,"meta":2885,"navigation":263,"path":2886,"pubDate":2887,"seo":2888,"status":263,"stem":2889,"summary":2890,"tags":2891,"__hash__":2894},"content\u002Farticles\u002F2026-09-04-herdr-skills.md","讓 AI Agent 自己管理 AI Agent：Herdr Skills 進階實戰",{"type":8,"value":1620,"toc":2866},[1621,1624,1632,1635,1649,1656,1663,1665,1669,1676,1679,1711,1714,1719,1721,1725,1728,1771,1774,1780,1786,1788,1792,1799,1827,1834,1840,1860,1866,1876,1878,1882,1885,1913,1923,1926,1929,1937,1940,1942,1946,1949,2022,2025,2031,2034,2040,2042,2046,2049,2052,2089,2092,2112,2115,2140,2143,2177,2180,2213,2216,2218,2222,2225,2235,2289,2292,2365,2372,2397,2409,2482,2491,2498,2500,2504,2507,2518,2587,2590,2593,2599,2602,2629,2632,2638,2641,2666,2671,2680,2690,2693,2699,2705,2709,2724,2727,2731,2748,2751,2755,2773,2782,2791,2797,2799,2801,2804,2810,2827,2830,2832,2834,2863],[11,1622,1618],{"id":1623},"讓-ai-agent-自己管理-ai-agentherdr-skills-進階實戰",[15,1625,1626,1627,1631],{},"在上一篇〈",[24,1628,1630],{"href":1629},"\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr","AI Agent 時代終端機新選擇：ghostty+herdr","〉中，我們介紹了 Herdr 如何在終端機裡管理多個 AI Agent：工作空間、分頁、窗格，以及一眼就能辨識的 Agent 狀態。",[15,1633,1634],{},"但當 Agent 的數量開始增加，真正的瓶頸往往不在「能不能同時開很多窗格」，而在於：",[156,1636,1637,1640,1643,1646],{},[159,1638,1639],{},"哪一個 Agent 正在執行？",[159,1641,1642],{},"哪一個 Agent 卡在授權或提問畫面？",[159,1644,1645],{},"測試跑完了嗎？",[159,1647,1648],{},"我能不能讓一個 Agent 幫我啟動另一個 Agent，或收集它的執行結果？",[15,1650,1651,1652,1655],{},"Herdr 的答案不是再加一層複雜的控制面板，而是把操作能力交給 Agent 本身。這就是 ",[19,1653,1654],{},"Herdr Skills"," 的用途。",[15,1657,1658,1659,1662],{},"一句話來說：Herdr Skills 是一份提供給 AI Agent 閱讀的操作手冊，讓它知道何時、如何安全地透過 ",[127,1660,1661],{},"herdr"," CLI 控制 Herdr。",[51,1664],{},[54,1666,1668],{"id":1667},"herdr-skills-是什麼","Herdr Skills 是什麼？",[15,1670,1671,1672,1675],{},"Herdr 提供一份可重複使用的 ",[127,1673,1674],{},"SKILL.md"," 檔案，內容不是應用程式，也不是背景服務，而是專門給 AI Agent 理解的 Markdown 指令。",[15,1677,1678],{},"安裝後，Agent 便能理解 Herdr 的結構與操作規範，例如：",[156,1680,1681,1684,1687,1690,1693,1696],{},[159,1682,1683],{},"查看目前的 workspace、tab、pane 與相鄰 Agent",[159,1685,1686],{},"分割窗格，並在背景執行指令",[159,1688,1689],{},"讀取其他窗格的近期輸出或日誌",[159,1691,1692],{},"等待測試、開發伺服器或其他 Agent 完成",[159,1694,1695],{},"在相鄰窗格中啟動協作 Agent",[159,1697,1698,1699,193,1702,193,1705,193,1707,1710],{},"根據 ",[127,1700,1701],{},"idle",[127,1703,1704],{},"working",[127,1706,966],{},[127,1708,1709],{},"done"," 等狀態決定下一步",[15,1712,1713],{},"這讓 Herdr 從「人類管理多個終端」進一步變成「人類與 Agent 一起協調多個 Agent」的工作環境。",[45,1715,1716],{},[15,1717,1718],{},"Herdr Skills 的核心不是讓 Agent 任意操控終端，而是讓它在明確的上下文與安全邊界中協作。",[51,1720],{},[54,1722,1724],{"id":1723},"skills-與-agent-guide用途並不相同","Skills 與 Agent Guide：用途並不相同",[15,1726,1727],{},"Herdr 官方同時提供兩種文件，名稱相近，但適用對象不同。",[62,1729,1730,1743],{},[65,1731,1732],{},[68,1733,1734,1737,1740],{},[71,1735,1736],{},"文件",[71,1738,1739],{},"給誰使用",[71,1741,1742],{},"用途",[81,1744,1745,1758],{},[68,1746,1747,1752,1755],{},[86,1748,1749],{},[127,1750,1751],{},"skills\u002Fherdr\u002FSKILL.md",[86,1753,1754],{},"在 Herdr 窗格內執行的 AI Agent",[86,1756,1757],{},"讓 Agent 操作 Herdr",[68,1759,1760,1765,1768],{},[86,1761,1762],{},[127,1763,1764],{},"agent-guide.md",[86,1766,1767],{},"協助人類的 AI Agent",[86,1769,1770],{},"用來解說、安裝與排除 Herdr 問題",[15,1772,1773],{},"這個差異很重要。",[15,1775,1776,1777,141],{},"如果你的目標是讓 Codex、Claude Code 或其他編程 Agent 幫忙分割窗格、等待測試結果、啟動協作 Agent，應安裝的是 ",[19,1778,1779],{},"Herdr Skill",[15,1781,1782,1783,141],{},"如果你的目標是請 AI 教你如何安裝 Herdr、解釋設定或排除問題，則應參考 ",[19,1784,1785],{},"Agent Guide",[51,1787],{},[54,1789,1791],{"id":1790},"安裝-herdr-skill","安裝 Herdr Skill",[15,1793,1794,1795,1798],{},"官方建議透過 ",[127,1796,1797],{},"npx skills"," 安裝：",[212,1800,1802],{"className":214,"code":1801,"language":216,"meta":217,"style":217},"npx skills add herdrdev\u002Fherdr --skill herdr -g\n",[127,1803,1804],{"__ignoreMap":217},[122,1805,1806,1809,1812,1815,1818,1821,1824],{"class":222,"line":223},[122,1807,1808],{"class":233},"npx",[122,1810,1811],{"class":237}," skills",[122,1813,1814],{"class":237}," add",[122,1816,1817],{"class":237}," herdrdev\u002Fherdr",[122,1819,1820],{"class":241}," --skill",[122,1822,1823],{"class":237}," herdr",[122,1825,1826],{"class":241}," -g\n",[15,1828,1829,1830,1833],{},"其中 ",[127,1831,1832],{},"-g"," 代表全域安裝，讓支援 Skills 的 Agent 在不同專案中都能使用。",[15,1835,1836,1837,1839],{},"如果只希望在目前專案使用，可以省略 ",[127,1838,1832],{},"：",[212,1841,1843],{"className":214,"code":1842,"language":216,"meta":217,"style":217},"npx skills add herdrdev\u002Fherdr --skill herdr\n",[127,1844,1845],{"__ignoreMap":217},[122,1846,1847,1849,1851,1853,1855,1857],{"class":222,"line":223},[122,1848,1808],{"class":233},[122,1850,1811],{"class":237},[122,1852,1814],{"class":237},[122,1854,1817],{"class":237},[122,1856,1820],{"class":241},[122,1858,1859],{"class":237}," herdr\n",[15,1861,1862,1863,1865],{},"安裝完成後，Skill 會以 ",[127,1864,1661],{}," 的名稱提供給 Agent 使用。",[15,1867,1868,1869,1875],{},"若你的 Agent 沒有原生 Skills 系統，也可以將官方 ",[24,1870,1873],{"href":1871,"rel":1872},"https:\u002F\u002Fgithub.com\u002Fherdrdev\u002Fherdr\u002Fblob\u002Fv0.8.2\u002Fskills\u002Fherdr\u002FSKILL.md",[28],[127,1874,1674],{}," 的內容放進專案指令或 Agent 的自訂指令中。",[51,1877],{},[54,1879,1881],{"id":1880},"安全關鍵先確認自己真的在-herdr-裡","安全關鍵：先確認自己真的在 Herdr 裡",[15,1883,1884],{},"Herdr Skill 的第一條規則非常值得理解：",[212,1886,1888],{"className":214,"code":1887,"language":216,"meta":217,"style":217},"test \"${HERDR_ENV:-}\" = 1\n",[127,1889,1890],{"__ignoreMap":217},[122,1891,1892,1895,1898,1901,1904,1907,1910],{"class":222,"line":223},[122,1893,1894],{"class":241},"test",[122,1896,1897],{"class":237}," \"${",[122,1899,1900],{"class":639},"HERDR_ENV",[122,1902,1903],{"class":632},":-",[122,1905,1906],{"class":237},"}\"",[122,1908,1909],{"class":237}," =",[122,1911,1912],{"class":241}," 1\n",[15,1914,1915,1916,1919,1920,1922],{},"只有當 ",[127,1917,1918],{},"HERDR_ENV=1"," 存在時，Agent 才能使用 ",[127,1921,1661],{}," CLI 操作目前的 Herdr session。",[15,1924,1925],{},"這個環境變數代表：目前的 Agent 正在 Herdr 管理的 pane 裡執行，並且可以安全地與本機 Herdr socket 通訊。",[15,1927,1928],{},"若變數不存在，Skill 要求 Agent 立即停止，並告知使用者自己不在 Herdr 管理的窗格中。",[212,1930,1935],{"className":1931,"code":1933,"language":1934,"meta":217},[1932],"language-text","HERDR_ENV=1\n       │\n       ├── 存在：可安全使用 herdr CLI\n       │\n       └── 不存在：停止操作，避免誤控其他終端會話\n","text",[127,1936,1933],{"__ignoreMap":217},[15,1938,1939],{},"這道護欄看起來簡單，實際上非常重要。它避免外部 Agent 因為缺乏正確上下文，而意外控制不屬於自己的終端工作階段。",[51,1941],{},[54,1943,1945],{"id":1944},"agent-如何理解-herdr-的世界","Agent 如何理解 Herdr 的世界？",[15,1947,1948],{},"要讓 Agent 能夠協作，第一步不是直接分割畫面，而是先讀取目前環境。",[212,1950,1952],{"className":214,"code":1951,"language":216,"meta":217,"style":217},"herdr workspace list\nherdr tab list --workspace \"$HERDR_WORKSPACE_ID\"\nherdr pane current --current\nherdr pane list --workspace \"$HERDR_WORKSPACE_ID\"\nherdr agent list\n",[127,1953,1954,1964,1985,1997,2013],{"__ignoreMap":217},[122,1955,1956,1958,1961],{"class":222,"line":223},[122,1957,1661],{"class":233},[122,1959,1960],{"class":237}," workspace",[122,1962,1963],{"class":237}," list\n",[122,1965,1966,1968,1971,1973,1976,1979,1982],{"class":222,"line":230},[122,1967,1661],{"class":233},[122,1969,1970],{"class":237}," tab",[122,1972,720],{"class":237},[122,1974,1975],{"class":241}," --workspace",[122,1977,1978],{"class":237}," \"",[122,1980,1981],{"class":639},"$HERDR_WORKSPACE_ID",[122,1983,1984],{"class":237},"\"\n",[122,1986,1987,1989,1992,1994],{"class":222,"line":248},[122,1988,1661],{"class":233},[122,1990,1991],{"class":237}," pane",[122,1993,667],{"class":237},[122,1995,1996],{"class":241}," --current\n",[122,1998,1999,2001,2003,2005,2007,2009,2011],{"class":222,"line":260},[122,2000,1661],{"class":233},[122,2002,1991],{"class":237},[122,2004,720],{"class":237},[122,2006,1975],{"class":241},[122,2008,1978],{"class":237},[122,2010,1981],{"class":639},[122,2012,1984],{"class":237},[122,2014,2015,2017,2020],{"class":222,"line":267},[122,2016,1661],{"class":233},[122,2018,2019],{"class":237}," agent",[122,2021,1963],{"class":237},[15,2023,2024],{},"Herdr 的階層可以簡化成：",[212,2026,2029],{"className":2027,"code":2028,"language":1934,"meta":217},[1932],"Workspace\n└── Tab\n    ├── Pane：執行 shell、測試或服務\n    ├── Pane：執行主要 Agent\n    └── Pane：執行協作 Agent\n",[127,2030,2028],{"__ignoreMap":217},[15,2032,2033],{},"每一個 workspace、tab、pane 都有穩定的識別 ID。Agent 不應該猜測 ID，也不應該依照畫面順序操作，而是必須從 Herdr 的 JSON 回應中取得正確 ID。",[15,2035,2036,2037],{},"這是自動化最容易被忽略、但最關鍵的原則：",[19,2038,2039],{},"畫面位置會改變，識別 ID 才是可靠的協作介面。",[51,2041],{},[54,2043,2045],{"id":2044},"實戰一用-ai-agent-控制-herdr","實戰一：用 AI agent 控制 herdr",[15,2047,2048],{},"假設主 Agent 正在修改功能，但希望測試在旁邊獨立執行，不干擾目前工作。",[15,2050,2051],{},"它可以先建立一個相鄰分屏：",[212,2053,2055],{"className":214,"code":2054,"language":216,"meta":217,"style":217},"herdr pane split --current --direction right --cwd \"$PWD\" --no-focus\n",[127,2056,2057],{"__ignoreMap":217},[122,2058,2059,2061,2063,2066,2069,2072,2075,2078,2080,2083,2086],{"class":222,"line":223},[122,2060,1661],{"class":233},[122,2062,1991],{"class":237},[122,2064,2065],{"class":237}," split",[122,2067,2068],{"class":241}," --current",[122,2070,2071],{"class":241}," --direction",[122,2073,2074],{"class":237}," right",[122,2076,2077],{"class":241}," --cwd",[122,2079,1978],{"class":237},[122,2081,2082],{"class":639},"$PWD",[122,2084,2085],{"class":237},"\"",[122,2087,2088],{"class":241}," --no-focus\n",[15,2090,2091],{},"這個指令有三個重點：",[156,2093,2094,2100,2106],{},[159,2095,2096,2099],{},[127,2097,2098],{},"--current","：明確指定以目前 pane 為目標",[159,2101,2102,2105],{},[127,2103,2104],{},"--cwd \"$PWD\"","：讓新 pane 保持目前專案目錄",[159,2107,2108,2111],{},[127,2109,2110],{},"--no-focus","：不搶走使用者正在看的畫面",[15,2113,2114],{},"接著，從指令回傳結果取得新 pane 的 ID，再執行測試：",[212,2116,2118],{"className":214,"code":2117,"language":216,"meta":217,"style":217},"herdr pane run \u003Cpane-id> \"yarn build\"\n",[127,2119,2120],{"__ignoreMap":217},[122,2121,2122,2124,2126,2128,2130,2133,2135,2137],{"class":222,"line":223},[122,2123,1661],{"class":233},[122,2125,1991],{"class":237},[122,2127,1112],{"class":237},[122,2129,1083],{"class":632},[122,2131,2132],{"class":237},"pane-i",[122,2134,640],{"class":639},[122,2136,643],{"class":632},[122,2138,2139],{"class":237}," \"yarn build\"\n",[15,2141,2142],{},"最後等待關鍵輸出：",[212,2144,2146],{"className":214,"code":2145,"language":216,"meta":217,"style":217},"herdr pane wait-output \u003Cpane-id> --match \"Tests:\" --timeout 120000\n",[127,2147,2148],{"__ignoreMap":217},[122,2149,2150,2152,2154,2157,2159,2161,2163,2165,2168,2171,2174],{"class":222,"line":223},[122,2151,1661],{"class":233},[122,2153,1991],{"class":237},[122,2155,2156],{"class":237}," wait-output",[122,2158,1083],{"class":632},[122,2160,2132],{"class":237},[122,2162,640],{"class":639},[122,2164,643],{"class":632},[122,2166,2167],{"class":241}," --match",[122,2169,2170],{"class":237}," \"Tests:\"",[122,2172,2173],{"class":241}," --timeout",[122,2175,2176],{"class":241}," 120000\n",[15,2178,2179],{},"需要進一步查看結果時：",[212,2181,2183],{"className":214,"code":2182,"language":216,"meta":217,"style":217},"herdr pane read \u003Cpane-id> --source recent-unwrapped --lines 120\n",[127,2184,2185],{"__ignoreMap":217},[122,2186,2187,2189,2191,2193,2195,2197,2199,2201,2204,2207,2210],{"class":222,"line":223},[122,2188,1661],{"class":233},[122,2190,1991],{"class":237},[122,2192,732],{"class":237},[122,2194,1083],{"class":632},[122,2196,2132],{"class":237},[122,2198,640],{"class":639},[122,2200,643],{"class":632},[122,2202,2203],{"class":241}," --source",[122,2205,2206],{"class":237}," recent-unwrapped",[122,2208,2209],{"class":241}," --lines",[122,2211,2212],{"class":241}," 120\n",[15,2214,2215],{},"這樣主 Agent 不必把測試塞進自己的互動介面，也不需要讓人類頻繁切換分頁。測試成為一個可觀測、可等待、可讀取的獨立工作單元。",[51,2217],{},[54,2219,2221],{"id":2220},"實戰二讓多模態-agent-傳遞圖片分析結果","實戰二：讓多模態 Agent 傳遞圖片分析結果",[15,2223,2224],{},"有些任務的第一步是理解圖片，但後續工作不一定需要多模態能力。例如，先讓一個支援圖片輸入的 Pi Agent 分析介面截圖，再把結構化的文字結果交給另一個成本較低的 Pi Agent 實作功能。Herdr Skills 可以將這兩個階段拆到不同 pane，讓模型能力各自對應到最適合的工作。",[15,2226,2227,2228,2231,2232,1839],{},"先建立兩個相鄰 pane，分別啟動支援多模態的 ",[127,2229,2230],{},"Qwen 3.8 MAX","，以及不支援多模態、負責後續工作的 ",[127,2233,2234],{},"deepseek-v4-flash",[212,2236,2238],{"className":214,"code":2237,"language":216,"meta":217,"style":217},"herdr pane split --current --direction right --cwd \"$PWD\" --no-focus\nherdr pane split --current --direction down --cwd \"$PWD\" --no-focus\n",[127,2239,2240,2264],{"__ignoreMap":217},[122,2241,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262],{"class":222,"line":223},[122,2243,1661],{"class":233},[122,2245,1991],{"class":237},[122,2247,2065],{"class":237},[122,2249,2068],{"class":241},[122,2251,2071],{"class":241},[122,2253,2074],{"class":237},[122,2255,2077],{"class":241},[122,2257,1978],{"class":237},[122,2259,2082],{"class":639},[122,2261,2085],{"class":237},[122,2263,2088],{"class":241},[122,2265,2266,2268,2270,2272,2274,2276,2279,2281,2283,2285,2287],{"class":222,"line":230},[122,2267,1661],{"class":233},[122,2269,1991],{"class":237},[122,2271,2065],{"class":237},[122,2273,2068],{"class":241},[122,2275,2071],{"class":241},[122,2277,2278],{"class":237}," down",[122,2280,2077],{"class":241},[122,2282,1978],{"class":237},[122,2284,2082],{"class":639},[122,2286,2085],{"class":237},[122,2288,2088],{"class":241},[15,2290,2291],{},"從兩次指令的回傳結果取得 pane ID 後，啟動兩個 Pi Agent：",[212,2293,2295],{"className":214,"code":2294,"language":216,"meta":217,"style":217},"herdr agent start vision --kind pi --model \"Qwen 3.8 MAX\" --pane \u003Cvision-pane-id>\nherdr agent start worker --kind pi --model \"deepseek-v4-flash\" --pane \u003Cworker-pane-id>\n",[127,2296,2297,2334],{"__ignoreMap":217},[122,2298,2299,2301,2303,2306,2309,2312,2315,2318,2321,2324,2326,2329,2331],{"class":222,"line":223},[122,2300,1661],{"class":233},[122,2302,2019],{"class":237},[122,2304,2305],{"class":237}," start",[122,2307,2308],{"class":237}," vision",[122,2310,2311],{"class":241}," --kind",[122,2313,2314],{"class":237}," pi",[122,2316,2317],{"class":241}," --model",[122,2319,2320],{"class":237}," \"Qwen 3.8 MAX\"",[122,2322,2323],{"class":241}," --pane",[122,2325,1083],{"class":632},[122,2327,2328],{"class":237},"vision-pane-i",[122,2330,640],{"class":639},[122,2332,2333],{"class":632},">\n",[122,2335,2336,2338,2340,2342,2345,2347,2349,2351,2354,2356,2358,2361,2363],{"class":222,"line":230},[122,2337,1661],{"class":233},[122,2339,2019],{"class":237},[122,2341,2305],{"class":237},[122,2343,2344],{"class":237}," worker",[122,2346,2311],{"class":241},[122,2348,2314],{"class":237},[122,2350,2317],{"class":241},[122,2352,2353],{"class":237}," \"deepseek-v4-flash\"",[122,2355,2323],{"class":241},[122,2357,1083],{"class":632},[122,2359,2360],{"class":237},"worker-pane-i",[122,2362,640],{"class":639},[122,2364,2333],{"class":632},[15,2366,2367,2368,2371],{},"先將圖片與分析要求交給 ",[127,2369,2370],{},"vision","。這個 Agent 的責任是辨識圖片內容，並輸出不依賴圖片本身也能理解的文字描述，例如畫面中的元件、文字、狀態與需要處理的問題：",[212,2373,2375],{"className":214,"code":2374,"language":216,"meta":217,"style":217},"herdr agent prompt vision \"分析 .\u002Fscreenshots\u002Ferror.png，整理畫面內容、錯誤訊息、可疑元件與建議處理方向，請只輸出清楚的文字分析。\" --wait --timeout 120000\n",[127,2376,2377],{"__ignoreMap":217},[122,2378,2379,2381,2383,2386,2388,2391,2393,2395],{"class":222,"line":223},[122,2380,1661],{"class":233},[122,2382,2019],{"class":237},[122,2384,2385],{"class":237}," prompt",[122,2387,2308],{"class":237},[122,2389,2390],{"class":237}," \"分析 .\u002Fscreenshots\u002Ferror.png，整理畫面內容、錯誤訊息、可疑元件與建議處理方向，請只輸出清楚的文字分析。\"",[122,2392,1126],{"class":241},[122,2394,2173],{"class":241},[122,2396,2176],{"class":241},[15,2398,2399,2400,2402,2403,141,2406,2408],{},"接著讀取 ",[127,2401,2370],{}," 的輸出，再將分析文字連同原始任務傳給 ",[127,2404,2405],{},"worker",[127,2407,2405],{}," 不需要直接讀取圖片，只要根據文字上下文完成後續程式修改或其他任務：",[212,2410,2412],{"className":214,"code":2411,"language":216,"meta":217,"style":217},"analysis=$(herdr agent read vision --source recent-unwrapped --lines 120)\nherdr agent prompt worker \"以下是另一個 Agent 對圖片的分析結果：\n\n$analysis\n\n請根據這份分析完成後續任務，檢查現有程式碼，實作必要修改，並回報處理結果。\" --wait --timeout 120000\n",[127,2413,2414,2445,2458,2462,2467,2471],{"__ignoreMap":217},[122,2415,2416,2419,2422,2425,2427,2429,2431,2433,2435,2437,2439,2442],{"class":222,"line":223},[122,2417,2418],{"class":639},"analysis",[122,2420,2421],{"class":632},"=",[122,2423,2424],{"class":639},"$(",[122,2426,1661],{"class":233},[122,2428,2019],{"class":237},[122,2430,732],{"class":237},[122,2432,2308],{"class":237},[122,2434,2203],{"class":241},[122,2436,2206],{"class":237},[122,2438,2209],{"class":241},[122,2440,2441],{"class":241}," 120",[122,2443,2444],{"class":639},")\n",[122,2446,2447,2449,2451,2453,2455],{"class":222,"line":230},[122,2448,1661],{"class":233},[122,2450,2019],{"class":237},[122,2452,2385],{"class":237},[122,2454,2344],{"class":237},[122,2456,2457],{"class":237}," \"以下是另一個 Agent 對圖片的分析結果：\n",[122,2459,2460],{"class":222,"line":248},[122,2461,264],{"emptyLinePlaceholder":263},[122,2463,2464],{"class":222,"line":260},[122,2465,2466],{"class":639},"$analysis\n",[122,2468,2469],{"class":222,"line":267},[122,2470,264],{"emptyLinePlaceholder":263},[122,2472,2473,2476,2478,2480],{"class":222,"line":273},[122,2474,2475],{"class":237},"請根據這份分析完成後續任務，檢查現有程式碼，實作必要修改，並回報處理結果。\"",[122,2477,1126],{"class":241},[122,2479,2173],{"class":241},[122,2481,2176],{"class":241},[15,2483,2484,2485,2487,2488,2490],{},"這種做法的重點不是讓兩個 Agent 同時工作，而是建立清楚的能力接力：",[127,2486,2230],{}," 負責將圖片轉換成可靠的文字上下文，",[127,2489,2234],{}," 則專注在理解需求、操作程式碼與完成後續工作。每個 Agent 都有可追蹤的名稱，輸出也能被下一個階段明確接收。",[15,2492,2493],{},[2494,2495],"img",{"alt":2496,"src":2497},"讓多模態 Agent 傳遞圖片分析結果","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fflow-chart-01.png",[51,2499],{},[54,2501,2503],{"id":2502},"實戰三規劃實作審查的多-agent-協作迴圈","實戰三：規劃、實作、審查的多 Agent 協作迴圈",[15,2505,2506],{},"單一 Agent 可以完成許多工作，但複雜需求通常同時需要架構判斷、程式實作與程式碼審查。把所有階段交給同一個 Agent，雖然方便，卻容易讓規劃與驗證失去獨立性。",[15,2508,2509,2510,2513,2514,2517],{},"這個範例使用 ",[19,2511,2512],{},"三個 Herdr pane","。三個 pane 都執行 ",[19,2515,2516],{},"Pi Agent","，但各自配置不同的 AI 模型，並承擔不同角色。第一個 pane 是整個流程的主控者，負責分派工作、收集結果與決定是否進入下一輪修正。",[62,2519,2520,2536],{},[65,2521,2522],{},[68,2523,2524,2527,2530,2533],{},[71,2525,2526],{},"Pane",[71,2528,2529],{},"角色",[71,2531,2532],{},"Agent 與模型",[71,2534,2535],{},"負責工作",[81,2537,2538,2555,2571],{},[68,2539,2540,2543,2546,2552],{},[86,2541,2542],{},"Pane 1",[86,2544,2545],{},"主控／規劃者",[86,2547,2548,2549],{},"Pi Agent + ",[127,2550,2551],{},"GPT-5.6 Sol",[86,2553,2554],{},"釐清複雜需求、分析程式碼、產出實作方案，並協調整個流程",[68,2556,2557,2560,2563,2568],{},[86,2558,2559],{},"Pane 2",[86,2561,2562],{},"實作者",[86,2564,2548,2565],{},[127,2566,2567],{},"Qwen3.8 Flash",[86,2569,2570],{},"根據方案實作功能、修正問題與回報結果",[68,2572,2573,2576,2579,2584],{},[86,2574,2575],{},"Pane 3",[86,2577,2578],{},"審查者",[86,2580,2548,2581],{},[127,2582,2583],{},"Claude Fable 5.1",[86,2585,2586],{},"對照需求與實作結果，進行獨立 code review",[15,2588,2589],{},"這樣規畫目的，將需要高度思考的工作和驗證工作交由旗艦模型，將實作工作交由較便宜模型實作，這樣可以確保程式碼品質，也可省下不少 Token 費用",[15,2591,2592],{},"我們可以透過以下提示詞先建立起我們的開發環境",[212,2594,2597],{"className":2595,"code":2596,"language":1934,"meta":217},[1932],"herdr\n1. 在右方建立一個新的分屏\n2. 執行 pi agent，並使用 opencode-go 提供的 qwen3.8-flash 模型\n3. 在下方建立一個新的分屏\n4. 執行 pi agent，並使用 opencode 提供的 claude-fable-5-1 模型\n",[127,2598,2596],{"__ignoreMap":217},[15,2600,2601],{},"執行後會輸以下結果，並成開啟三個分屏，我可以記下代號，作為傳送互傳資訊的代碼",[212,2603,2607],{"className":2604,"code":2605,"language":2606,"meta":217,"style":217},"language-markdown shiki shiki-themes github-light github-dark github-dark","佈局（wK:t1）：\n      - wK:p1 左上（原始 pane，保持 focus）\n      - wK:p5 右方 - 佔滿右半部 41x28\n      - wK:p6 下方 - 左下 42x14\n","markdown",[127,2608,2609,2614,2619,2624],{"__ignoreMap":217},[122,2610,2611],{"class":222,"line":223},[122,2612,2613],{},"佈局（wK:t1）：\n",[122,2615,2616],{"class":222,"line":230},[122,2617,2618],{},"      - wK:p1 左上（原始 pane，保持 focus）\n",[122,2620,2621],{"class":222,"line":248},[122,2622,2623],{},"      - wK:p5 右方 - 佔滿右半部 41x28\n",[122,2625,2626],{"class":222,"line":260},[122,2627,2628],{},"      - wK:p6 下方 - 左下 42x14\n",[15,2630,2631],{},"除了用分屏方式，也可以用分頁的方式進行，這可以由開發者需求自行決定。",[212,2633,2636],{"className":2634,"code":2635,"language":1934,"meta":217},[1932],"herdr\n1. 建立新 tab, rename 為「實作」，啟用 pi agent，並使用 opencode-go 提供的 Qwen3.8 Flash 模型\n2. 建立新 tab, rename 為「審查」，啟用 pi agent，並使用 opencode 提供的 Claude Fable 5.1 模型 \n",[127,2637,2635],{"__ignoreMap":217},[15,2639,2640],{},"輸出如下：",[212,2642,2644],{"className":2604,"code":2643,"language":2606,"meta":217,"style":217}," 當前 Tab 列表（wM）：\n - wM:t1 主控 (working)\n - wM:t4 實作 (idle, opencode-go\u002Fqwen3.8-flash)\n - wM:t5 審查 (idle, opencode\u002Fclaude-fable-5-1)\n",[127,2645,2646,2651,2656,2661],{"__ignoreMap":217},[122,2647,2648],{"class":222,"line":223},[122,2649,2650],{}," 當前 Tab 列表（wM）：\n",[122,2652,2653],{"class":222,"line":230},[122,2654,2655],{}," - wM:t1 主控 (working)\n",[122,2657,2658],{"class":222,"line":248},[122,2659,2660],{}," - wM:t4 實作 (idle, opencode-go\u002Fqwen3.8-flash)\n",[122,2662,2663],{"class":222,"line":260},[122,2664,2665],{}," - wM:t5 審查 (idle, opencode\u002Fclaude-fable-5-1)\n",[2667,2668,2670],"h3",{"id":2669},"第一步由旗艦模型建立實作方案","第一步：由旗艦模型建立實作方案",[15,2672,2673,2674,2676,2677,2679],{},"先在 ",[19,2675,2542],{}," 啟動 Pi Agent，並使用 ",[127,2678,2551],{}," 模型處理需求分析、規劃與流程協調。這個 pane 是主控 pane；後續將規劃傳給 wK:p5、把審查結果送回 wK:p6 修正，以及在完成後確認任務結案，皆由它負責。",[2681,2682,2683],"info-block",{},[15,2684,2685,2686,2689],{},"建議：若規畫方案比較複雜，可以請 AI agent 將方案輸出成一分 ",[127,2687,2688],{},"plan.md","，方便在不同 agent 資訊傳遞",[15,2691,2692],{},"範例提示詞：",[212,2694,2697],{"className":2695,"code":2696,"language":1934,"meta":217},[1932],"herdr\n請規畫可執行方案，符合以下需求\n1.你是一位專業的網頁前端工程師與 Three.js 3D 專家。請幫我寫一個完整的、可獨立運行的 HTML 檔案，內含最新版 Tailwind CSS（用於基本排版）與最新版 Three.js（透過 CDN 導入 three.min.js）。\n2. 創建繁忙的城市街景\n3. 固定場景：高樓大廈、摩天大樓，行道樹，馬路\n4. 動態物件：行人，汽車，公車\n5. 右邉選單可以選定飄落物，可項目：無，雪花，櫻花，可設定行人數、汽車數和公車數\n6. 滑鼠左鍵可以移動，滑鼠滾輪可以zoom in 和 zoom out\n7. 待我確認需求將規畫完交由「實作」分頁，進行實際程式碼開發\n8. 將完確認後的規畫輸出至 `plan.md`\n9. 「實作」完成後，將修改摘要和diff交給「審查」分頁，進行code review，code review 結果輸出到 `review.md`\n10. 若 code review 的結果，請將結果回傳「主導」分頁\n\n",[127,2698,2696],{"__ignoreMap":217},[15,2700,2701,2702,2704],{},"AI 會規畫完整輪出到 ",[127,2703,2688],{},"，對交由「實作」分頁",[2667,2706,2708],{"id":2707},"第二步將方案交給-flash-模型實作","第二步：將方案交給 Flash 模型實作",[15,2710,2711,2712,2676,2715,2717,2718,2721,2722,141],{},"接著在 ",[19,2713,2714],{},"實作分頁",[127,2716,2567],{}," 模型。由 ",[19,2719,2720],{},"主控分頁"," 將規劃方案完整傳入 ",[19,2723,2714],{},[15,2725,2726],{},"這個 Agent 的責任是完成實作，不是重新定義需求。因此交付時應一併提供原始需求與規劃結果，讓它在遇到細節不一致時能回到需求本身判斷。",[2667,2728,2730],{"id":2729},"第三步由-旗艦模型-進行獨立-code-review","第三步：由 旗艦模型 進行獨立 code review",[15,2732,2733,2734,2676,2737,2739,2740,2742,2743,2745,2746,141],{},"再在 ",[19,2735,2736],{},"審查分頁",[127,2738,2583],{}," 模型。",[19,2741,2720],{}," 將原始需求與 ",[19,2744,2714],{}," 的實作結果一起送交 ",[19,2747,2736],{},[15,2749,2750],{},"由不同 Agent 審查，能降低實作者因熟悉自己的方案而忽略缺陷的機率。審查者應特別檢查：需求是否完整落實、錯誤處理與邊界條件、既有功能是否被破壞，以及程式碼是否符合專案慣例。",[2667,2752,2754],{"id":2753},"第四步未通過就回到實作通過才通知主控","第四步：未通過就回到實作，通過才通知主控",[15,2756,2757,2758,2760,2761,2763,2764,2766,2767,2769,2770,2772],{},"如果 ",[19,2759,2736],{}," 的 Pi Agent（",[127,2762,2583],{},"）回報需要修正的問題，",[19,2765,2720],{}," 將審查意見連同原始需求傳回 ",[19,2768,2714],{},"  的 Pi Agent（",[127,2771,2567],{},"）：",[15,2774,2775,2776,2778,2779,2781],{},"完成修正後，",[19,2777,2720],{}," 再把新的實作結果交回 ",[19,2780,2736],{}," 進行下一輪 review。這個迴圈持續到審查通過，或由人類介入處理架構爭議與高風險決策。",[15,2783,2784,2785,2787,2788,2790],{},"當 ",[19,2786,2736],{}," 的 review 通過後，",[19,2789,2720],{}," 會收到完成通知，並確認實作結果是否仍符合原本方案與需求。至此，才算完成一次完整的程式碼實作。",[15,2792,2793],{},[2494,2794],{"alt":2795,"src":2796},"多 AI Agent 協作流程圖","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fflow-chart-02.png",[51,2798],{},[54,2800,1520],{"id":1520},[15,2802,2803],{},"Herdr Skills 讓 AI Agent 不再只是終端中的執行者，也能成為理解工作環境的協作者。",[15,2805,2806,2807,2809],{},"安裝一份 ",[127,2808,1674],{}," 後，Agent 可以在 Herdr 的安全範圍內：",[156,2811,2812,2815,2818,2821,2824],{},[159,2813,2814],{},"掌握 workspace、tab 與 pane 的實際狀態",[159,2816,2817],{},"背景執行測試、服務與其他命令",[159,2819,2820],{},"啟動並協調專職的協作 Agent",[159,2822,2823],{},"讀取輸出、等待結果，並辨識被阻擋的工作",[159,2825,2826],{},"保持人類對授權與關鍵決策的最終控制權",[15,2828,2829],{},"如果上一篇的 Ghostty + Herdr 是建立 AI Agent 工作台，那麼 Herdr Skills 就是讓工作台開始具備協作能力的關鍵拼圖。",[51,2831],{},[54,2833,1528],{"id":1528},[156,2835,2836,2843,2849,2856],{},[159,2837,2838],{},[24,2839,2842],{"href":2840,"rel":2841},"https:\u002F\u002Fherdr.dev\u002Fzh-cn\u002Fdocs\u002Fagent-skill\u002F",[28],"Herdr 智能體技能文件官方說明",[159,2844,2845],{},[24,2846,2848],{"href":1871,"rel":2847},[28],"Herdr Skill 原始檔",[159,2850,2851],{},[24,2852,2855],{"href":2853,"rel":2854},"https:\u002F\u002Fherdr.dev\u002Fzh-cn\u002Fdocs\u002F",[28],"Herdr 官方文件",[159,2857,2858],{},[24,2859,2862],{"href":2860,"rel":2861},"https:\u002F\u002Fgithub.com\u002Fherdrdev\u002Fherdr",[28],"Herdr GitHub",[1579,2864,2865],{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":217,"searchDepth":230,"depth":230,"links":2867},[2868,2869,2870,2871,2872,2873,2874,2875,2881,2882],{"id":1667,"depth":230,"text":1668},{"id":1723,"depth":230,"text":1724},{"id":1790,"depth":230,"text":1791},{"id":1880,"depth":230,"text":1881},{"id":1944,"depth":230,"text":1945},{"id":2044,"depth":230,"text":2045},{"id":2220,"depth":230,"text":2221},{"id":2502,"depth":230,"text":2503,"children":2876},[2877,2878,2879,2880],{"id":2669,"depth":248,"text":2670},{"id":2707,"depth":248,"text":2708},{"id":2729,"depth":248,"text":2730},{"id":2753,"depth":248,"text":2754},{"id":1520,"depth":230,"text":1520},{"id":1528,"depth":230,"text":1528},"在上一篇〈AI Agent 時代終端機新選擇：ghostty+herdr〉中，我們介紹了 Herdr 如何在終端機裡管理多個 AI Agent：工作空間、分頁、窗格，以及一眼就能辨識的 Agent 狀態。","\u002Fimages\u002Farticles\u002F2026-09-04-herdr-skills\u002Fcover.png",{},"\u002Farticles\u002F2026-09-04-herdr-skills","2026-09-04 10:45",{"title":1618,"description":2883},"articles\u002F2026-09-04-herdr-skills","上一篇認識 Ghostty 與 Herdr 後，本篇進一步介紹 Herdr Skills。只要將一份 SKILL.md 安裝給編程 Agent，便能讓 Agent 在安全邊界內觀測、分割與協調 Herdr 窗格，打造真正可協作的終端工作流。",[1610,1611,2892,1613,2893],"Herdr","終端機","2G4Ccxu6vW-xv6Zt9dePDYXxWI3oayk4fGdroc9xk2w",{"id":2896,"title":1630,"body":2897,"category":1599,"description":3740,"extension":1601,"image":3741,"meta":3742,"navigation":263,"path":1629,"pubDate":3743,"seo":3744,"status":263,"stem":3745,"summary":3746,"tags":3747,"__hash__":3749},"content\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr.md",{"type":8,"value":2898,"toc":3718},[2899,2902,2917,2927,2931,2934,2960,2963,2965,2969,2973,2976,2979,3033,3037,3042,3058,3062,3065,3134,3149,3152,3162,3236,3238,3242,3246,3253,3256,3259,3295,3299,3319,3322,3335,3338,3376,3379,3382,3388,3441,3443,3447,3451,3454,3459,3465,3468,3472,3500,3504,3540,3544,3547,3597,3601,3604,3630,3633,3635,3637,3647,3650,3675,3678,3680,3682,3715],[11,2900,1630],{"id":2901},"ai-agent-時代終端機新選擇ghosttyherdr",[15,2903,2904,2905,2908,2909,2912,2913,2916],{},"在這個大 AI 時代，使用 AI Agent 進行 ",[127,2906,2907],{},"Vibe Coding"," 已成為工作日常， 而目前各家大廠或開源專案都有提供 ",[127,2910,2911],{},"CLI"," 工作環境，所以終端機效能變得更重要，這也是我選擇 ",[19,2914,2915],{},"ghostty"," 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。",[15,2918,2919,2920,2922,2923,2926],{},"而 ",[19,2921,2892],{}," 更是管理各個 AI Agent CLI 目前最佳解決方案，獨特的 UI 介面可以方便管理工作區、分頁和 Agents，更可以對各 Agents 執行狀態一目了然，更可以透過 ",[127,2924,2925],{},"skills"," 讓不同 agent 相互協作。",[54,2928,2930],{"id":2929},"為什麼終端機需要重新思考","為什麼終端機需要重新思考？",[15,2932,2933],{},"傳統的終端機模擬器在 AI Agent 時代面臨了新的挑戰：",[156,2935,2936,2942,2948,2954],{},[159,2937,2938,2941],{},[19,2939,2940],{},"多代理並行","：一個專案可能同時運行 Claude Code、Codex、OpenCode 等多個代理，傳統終端難以統合管理",[159,2943,2944,2947],{},[19,2945,2946],{},"效能瓶頸","：AI 代理產出大量輸出，CPU 渲染的終端機容易出現卡頓",[159,2949,2950,2953],{},[19,2951,2952],{},"狀態可見性","：哪個代理正在執行？哪個被阻擋？哪個已完成？傳統終端缺乏即時狀態呈現",[159,2955,2956,2959],{},[19,2957,2958],{},"會話持久性","：關閉筆記型電腦後，代理進程隨之消失，無法斷續工作",[15,2961,2962],{},"Ghostty 和 Herdr 分別針對這些痛點提供了解決方案。",[51,2964],{},[54,2966,2968],{"id":2967},"ghosttygpu-加速的下一代終端機","Ghostty：GPU 加速的下一代終端機",[2667,2970,2972],{"id":2971},"什麼是-ghostty","什麼是 Ghostty？",[15,2974,2975],{},"Ghostty 是由 HashiCorp 創辦人 Mitchell Hashimoto 開發的跨平台終端模擬器，使用 Zig 語言構建，並以 GPU 加速渲染為核心特色。2024 年底正式發布 1.0 穩定版（至 2026 年已推進至 1.3+）後，迅速成為開發者社群中最受矚目的終端選擇。",[2667,2977,2978],{"id":2978},"核心特色",[156,2980,2981,2987,2993,2999,3021,3027],{},[159,2982,2983,2986],{},[19,2984,2985],{},"GPU 加速渲染","：透過 OpenGL（Linux）與 Metal（macOS）實現硬體加速，維持約 60fps 的流暢渲染，遠勝 CPU 渲染的傳統終端",[159,2988,2989,2992],{},[19,2990,2991],{},"原生 UI 體驗","：在 macOS 上呈現原生應用外觀，在 Linux 上完美融入 GTK\u002FQt 環境",[159,2994,2995,2998],{},[19,2996,2997],{},"多視窗、分頁、分割畫面","：內建完整的視窗管理功能，無需依賴 tmux",[159,3000,3001,3004,3005,3008,3009,3012,3013,3016,3017,3020],{},[19,3002,3003],{},"即時熱重載配置","：修改 ",[127,3006,3007],{},"~\u002F.config\u002Fghostty\u002Fconfig.ghostty","（1.2.3 前為 ",[127,3010,3011],{},"config","，仍相容）後按 ",[127,3014,3015],{},"cmd+shift+,","（macOS）\u002F ",[127,3018,3019],{},"ctrl+shift+,","（Linux）即可熱重載，無需重啟",[159,3022,3023,3026],{},[19,3024,3025],{},"連字字體與 Nerd Fonts","：原生支援開發者最愛的程式字體",[159,3028,3029,3032],{},[19,3030,3031],{},"智慧搜尋","：1.3.0 版本新增 scrollback search 與原生捲動條",[2667,3034,3036],{"id":3035},"安裝-ghostty","安裝 Ghostty",[3038,3039,3041],"h4",{"id":3040},"macos","macOS",[212,3043,3045],{"className":214,"code":3044,"language":216,"meta":217,"style":217},"brew install --cask ghostty\n",[127,3046,3047],{"__ignoreMap":217},[122,3048,3049,3051,3053,3055],{"class":222,"line":223},[122,3050,234],{"class":233},[122,3052,238],{"class":237},[122,3054,242],{"class":241},[122,3056,3057],{"class":237}," ghostty\n",[3038,3059,3061],{"id":3060},"linux","Linux",[15,3063,3064],{},"Ghostty 官方僅直接發布 macOS 二進制檔，Linux 請透過發行版套件或社群建置安裝：",[212,3066,3068],{"className":214,"code":3067,"language":216,"meta":217,"style":217},"# 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",[127,3069,3070,3075,3084,3088,3093,3105,3109,3114],{"__ignoreMap":217},[122,3071,3072],{"class":222,"line":223},[122,3073,3074],{"class":226},"# Arch Linux\n",[122,3076,3077,3080,3082],{"class":222,"line":230},[122,3078,3079],{"class":233},"pacman",[122,3081,279],{"class":241},[122,3083,3057],{"class":237},[122,3085,3086],{"class":222,"line":248},[122,3087,264],{"emptyLinePlaceholder":263},[122,3089,3090],{"class":222,"line":260},[122,3091,3092],{"class":226},"# Ubuntu 26.04+\n",[122,3094,3095,3098,3101,3103],{"class":222,"line":267},[122,3096,3097],{"class":233},"sudo",[122,3099,3100],{"class":237}," apt",[122,3102,238],{"class":237},[122,3104,3057],{"class":237},[122,3106,3107],{"class":222,"line":273},[122,3108,264],{"emptyLinePlaceholder":263},[122,3110,3111],{"class":222,"line":660},[122,3112,3113],{"class":226},"# Debian \u002F 舊版 Ubuntu（社群 .deb）\n",[122,3115,3116,3119,3122,3125,3128,3131],{"class":222,"line":672},[122,3117,3118],{"class":233},"\u002Fbin\u002Fbash",[122,3120,3121],{"class":241}," -c",[122,3123,3124],{"class":237}," \"$(",[122,3126,3127],{"class":233},"curl",[122,3129,3130],{"class":241}," -fsSL",[122,3132,3133],{"class":237}," https:\u002F\u002Fraw.githubusercontent.com\u002Fmkasberg\u002Fghostty-ubuntu\u002FHEAD\u002Finstall.sh)\"\n",[15,3135,3136,3137,3142,3143,3148],{},"其他發行版請參考 ",[24,3138,3141],{"href":3139,"rel":3140},"https:\u002F\u002Fghostty.org\u002Fdocs\u002Finstall\u002Fbinary",[28],"Ghostty 安裝文件","或從 ",[24,3144,3147],{"href":3145,"rel":3146},"https:\u002F\u002Fgithub.com\u002Fghostty-org\u002Fghostty",[28],"Ghostty GitHub"," 自行編譯。",[2667,3150,3151],{"id":3151},"基本配置",[15,3153,3154,3155,3157,3158,3161],{},"Ghostty 的配置文件位於 ",[127,3156,3007],{},"（相容舊路徑 ",[127,3159,3160],{},"~\u002F.config\u002Fghostty\u002Fconfig",")",[212,3163,3167],{"className":3164,"code":3165,"language":3166,"meta":217,"style":217},"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",[127,3168,3169,3174,3178,3183,3188,3193,3197,3202,3207,3212,3217,3222,3227,3231],{"__ignoreMap":217},[122,3170,3171],{"class":222,"line":223},[122,3172,3173],{},"# ~\u002F.config\u002Fghostty\u002Fconfig.ghostty\n",[122,3175,3176],{"class":222,"line":230},[122,3177,264],{"emptyLinePlaceholder":263},[122,3179,3180],{"class":222,"line":248},[122,3181,3182],{},"font-family = JetBrains Mono\n",[122,3184,3185],{"class":222,"line":260},[122,3186,3187],{},"font-size = 24\n",[122,3189,3190],{"class":222,"line":267},[122,3191,3192],{},"font-feature = calt\n",[122,3194,3195],{"class":222,"line":273},[122,3196,264],{"emptyLinePlaceholder":263},[122,3198,3199],{"class":222,"line":660},[122,3200,3201],{},"# 佈景樣式\n",[122,3203,3204],{"class":222,"line":672},[122,3205,3206],{},"theme = dark:Catppuccin Mocha,light:Espresso Libre\n",[122,3208,3209],{"class":222,"line":701},[122,3210,3211],{},"background-opacity = 0.80\n",[122,3213,3214],{"class":222,"line":706},[122,3215,3216],{},"background-blur-radius = 30\n",[122,3218,3219],{"class":222,"line":712},[122,3220,3221],{},"window-padding-x = 8\n",[122,3223,3224],{"class":222,"line":725},[122,3225,3226],{},"window-padding-y = 8\n",[122,3228,3229],{"class":222,"line":737},[122,3230,264],{"emptyLinePlaceholder":263},[122,3232,3233],{"class":222,"line":758},[122,3234,3235],{},"confirm-close-surface = false\n",[51,3237],{},[54,3239,3241],{"id":3240},"herdr終端原生-ai-代理多工器","Herdr：終端原生 AI 代理多工器",[2667,3243,3245],{"id":3244},"什麼是-herdr","什麼是 Herdr？",[15,3247,3248,3249,3252],{},"Herdr 是一個用 Rust 編寫、基於 Ratatui TUI 庫建構的終端原生 AI 代理多工器。與 tmux 類似，它提供會話持久化與分割畫面管理，但額外增加了 ",[19,3250,3251],{},"AI 代理狀態感知","——能自動偵測每個分割畫面中運行的 AI 代理，並在側邊欄顯示其狀態。",[15,3254,3255],{},"Herdr 的口號是「one terminal for the whole herd」——一個終端機統管所有 AI 代理。",[2667,3257,2978],{"id":3258},"核心特色-1",[156,3260,3261,3267,3273,3279,3289],{},[159,3262,3263,3266],{},[19,3264,3265],{},"代理狀態自動追蹤","：側邊欄即時顯示每個代理的狀態——🔴 blocked、🟡 working、🔵 done、🟢 idle，無需手動配置",[159,3268,3269,3272],{},[19,3270,3271],{},"真實 PTY 分割畫面","：每個代理運行在獨立的真實終端分割畫面中，完整支援全螢幕 TUI 介面（如 Claude Code、Codex 的互動模式）",[159,3274,3275,3278],{},[19,3276,3277],{},"會話持久化","：斷開連線後代理繼續運行，重新連線即可恢復，關閉筆電也不會丟失進程",[159,3280,3281,3284,3285,3288],{},[19,3282,3283],{},"Socket API 自動化","：提供 Unix Socket JSON API（詳見 ",[127,3286,3287],{},"herdr --help"," 與 Socket API 文件，以當前版本為準），代理本身也可以操控 Herdr",[159,3290,3291,3294],{},[19,3292,3293],{},"多代理整合","：支援 Claude Code、Codex、Pi、OpenCode、Cursor 等 15+ 種 AI 編程代理",[2667,3296,3298],{"id":3297},"安裝-herdr","安裝 Herdr",[212,3300,3302],{"className":214,"code":3301,"language":216,"meta":217,"style":217},"curl -fsSL https:\u002F\u002Fherdr.dev\u002Finstall.sh | sh\n",[127,3303,3304],{"__ignoreMap":217},[122,3305,3306,3308,3310,3313,3316],{"class":222,"line":223},[122,3307,3127],{"class":233},[122,3309,3130],{"class":241},[122,3311,3312],{"class":237}," https:\u002F\u002Fherdr.dev\u002Finstall.sh",[122,3314,3315],{"class":632}," |",[122,3317,3318],{"class":233}," sh\n",[15,3320,3321],{},"或使用 Homebrew：",[212,3323,3325],{"className":214,"code":3324,"language":216,"meta":217,"style":217},"brew install herdr\n",[127,3326,3327],{"__ignoreMap":217},[122,3328,3329,3331,3333],{"class":222,"line":223},[122,3330,234],{"class":233},[122,3332,238],{"class":237},[122,3334,1859],{"class":237},[2667,3336,3337],{"id":3337},"快速開始",[212,3339,3341],{"className":214,"code":3340,"language":216,"meta":217,"style":217},"# 啟動 Herdr\nherdr\n\n# 建立工作空間（以專案為單位）\nherdr workspace create --label my-project\n",[127,3342,3343,3348,3353,3357,3362],{"__ignoreMap":217},[122,3344,3345],{"class":222,"line":223},[122,3346,3347],{"class":226},"# 啟動 Herdr\n",[122,3349,3350],{"class":222,"line":230},[122,3351,3352],{"class":233},"herdr\n",[122,3354,3355],{"class":222,"line":248},[122,3356,264],{"emptyLinePlaceholder":263},[122,3358,3359],{"class":222,"line":260},[122,3360,3361],{"class":226},"# 建立工作空間（以專案為單位）\n",[122,3363,3364,3366,3368,3370,3373],{"class":222,"line":267},[122,3365,1661],{"class":233},[122,3367,1960],{"class":237},[122,3369,623],{"class":237},[122,3371,3372],{"class":241}," --label",[122,3374,3375],{"class":237}," my-project\n",[2667,3377,3378],{"id":3378},"工作空間與分割畫面架構",[15,3380,3381],{},"Herdr 的架構：",[15,3383,3384],{},[2494,3385],{"alt":3386,"src":3387},"Herdr UI","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fherdr-ui.png",[62,3389,3390,3400],{},[65,3391,3392],{},[68,3393,3394,3397],{},[71,3395,3396],{},"層級",[71,3398,3399],{},"說明",[81,3401,3402,3412,3422,3431],{},[68,3403,3404,3409],{},[86,3405,3406],{},[19,3407,3408],{},"Workspace",[86,3410,3411],{},"以 Git 儲存庫或 worktree 為單位，對應一個專案",[68,3413,3414,3419],{},[86,3415,3416],{},[19,3417,3418],{},"Tab",[86,3420,3421],{},"每個工作空間可包含多個標籤頁",[68,3423,3424,3428],{},[86,3425,3426],{},[19,3427,2526],{},[86,3429,3430],{},"每個標籤頁可分割為多個真實 PTY 分割畫面，每個運行一個代理",[68,3432,3433,3438],{},[86,3434,3435],{},[19,3436,3437],{},"Agent",[86,3439,3440],{},"自動化與觀測層，能識別並追蹤代理人的執行狀態",[51,3442],{},[54,3444,3446],{"id":3445},"ghostty-herdr終極-ai-agent-開發組合","ghostty + herdr：終極 AI Agent 開發組合",[2667,3448,3450],{"id":3449},"為什麼這組合特別","為什麼這組合特別？",[15,3452,3453],{},"Ghostty 與 Herdr 的結合，形成了一套完整的 AI Agent 開發環境：",[45,3455,3456],{},[15,3457,3458],{},"Herdr 為通用終端多工器，可運行於 iTerm2、Kitty、WezTerm 等任意終端；與 Ghostty 搭配時能額外發揮 GPU 加速與原生 UI 的最佳體驗，兩者並非強綁定。",[212,3460,3463],{"className":3461,"code":3462,"language":1934},[1932],"┌─────────────────────────────────────────────┐\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",[127,3464,3462],{"__ignoreMap":217},[2667,3466,3467],{"id":3467},"實際工作流程",[3038,3469,3471],{"id":3470},"_1-啟動環境","1. 啟動環境",[212,3473,3475],{"className":214,"code":3474,"language":216,"meta":217,"style":217},"# 啟動 Ghostty\nghostty\n\n# 在 Ghostty 中啟動 Herdr\nherdr\n",[127,3476,3477,3482,3487,3491,3496],{"__ignoreMap":217},[122,3478,3479],{"class":222,"line":223},[122,3480,3481],{"class":226},"# 啟動 Ghostty\n",[122,3483,3484],{"class":222,"line":230},[122,3485,3486],{"class":233},"ghostty\n",[122,3488,3489],{"class":222,"line":248},[122,3490,264],{"emptyLinePlaceholder":263},[122,3492,3493],{"class":222,"line":260},[122,3494,3495],{"class":226},"# 在 Ghostty 中啟動 Herdr\n",[122,3497,3498],{"class":222,"line":267},[122,3499,3352],{"class":233},[3038,3501,3503],{"id":3502},"_2-規劃工作空間","2. 規劃工作空間",[212,3505,3507],{"className":214,"code":3506,"language":216,"meta":217,"style":217},"# 為每個專案建立工作空間\nherdr workspace create --label backend-api\nherdr workspace create --label frontend-app\n",[127,3508,3509,3514,3527],{"__ignoreMap":217},[122,3510,3511],{"class":222,"line":223},[122,3512,3513],{"class":226},"# 為每個專案建立工作空間\n",[122,3515,3516,3518,3520,3522,3524],{"class":222,"line":230},[122,3517,1661],{"class":233},[122,3519,1960],{"class":237},[122,3521,623],{"class":237},[122,3523,3372],{"class":241},[122,3525,3526],{"class":237}," backend-api\n",[122,3528,3529,3531,3533,3535,3537],{"class":222,"line":248},[122,3530,1661],{"class":233},[122,3532,1960],{"class":237},[122,3534,623],{"class":237},[122,3536,3372],{"class":241},[122,3538,3539],{"class":237}," frontend-app\n",[3038,3541,3543],{"id":3542},"_3-pane-分配代理","3. PANE 分配代理",[15,3545,3546],{},"每個分割畫面運行一個專門的 AI 代理：",[62,3548,3549,3562],{},[65,3550,3551],{},[68,3552,3553,3556,3559],{},[71,3554,3555],{},"分割畫面",[71,3557,3558],{},"代理",[71,3560,3561],{},"任務",[81,3563,3564,3575,3586],{},[68,3565,3566,3569,3572],{},[86,3567,3568],{},"左上",[86,3570,3571],{},"Claude Code",[86,3573,3574],{},"後端 API 開發",[68,3576,3577,3580,3583],{},[86,3578,3579],{},"右上",[86,3581,3582],{},"OpenCode",[86,3584,3585],{},"前端組件開發",[68,3587,3588,3591,3594],{},[86,3589,3590],{},"下方",[86,3592,3593],{},"Codex",[86,3595,3596],{},"測試與除錯",[3038,3598,3600],{"id":3599},"_4-agents-監控與調度","4. AGENTS 監控與調度",[15,3602,3603],{},"透過 Herdr 側邊欄一目了然：",[156,3605,3606,3612,3618,3624],{},[159,3607,3608,3609,3611],{},"🟢 ",[19,3610,1701],{},"：等待指令",[159,3613,3614,3615,3617],{},"🟡 ",[19,3616,1704],{},"：正在執行任務",[159,3619,3620,3621,3623],{},"🔴 ",[19,3622,966],{},"：需要人工介入",[159,3625,3626,3627,3629],{},"🔵 ",[19,3628,1709],{},"：任務完成",[15,3631,3632],{},"當某個代理被阻擋時，直接點擊對應分割畫面即可介入處理。",[51,3634],{},[54,3636,1520],{"id":1520},[15,3638,3639,3640,3643,3644,3646],{},"在 AI Agent 時代，終端機不再只是執行指令的工具，而是 AI 代理協作的操盤中心。",[19,3641,3642],{},"Ghostty"," 以 GPU 加速與原生 UI 提供了流暢的終端體驗，",[19,3645,2892],{}," 則為終端帶來了專業級的 AI 代理多工管理能力。",[15,3648,3649],{},"這組合的核心優勢在於：",[353,3651,3652,3658,3664,3669],{},[159,3653,3654,3657],{},[19,3655,3656],{},"真正的終端原生","：不依賴 GUI 或雲端服務，純粹在終端機中完成一切",[159,3659,3660,3663],{},[19,3661,3662],{},"代理狀態可見性","：側邊欄即時顯示所有代理的狀態，無需切換画面",[159,3665,3666,3668],{},[19,3667,3277],{},"：斷線重連，長時間任務不再擔心",[159,3670,3671,3674],{},[19,3672,3673],{},"高度可程式化","：Socket API 讓代理之間可以互相操控，實現真正的 AgentOps",[15,3676,3677],{},"如果你正在尋找一個強大的 AI Agent 開發環境，Ghostty + Herdr 的組合值得立即嘗試。兩者皆為開源專案，安裝簡單，卻能帶來生產力的巨大提升。",[51,3679],{},[54,3681,1528],{"id":1528},[156,3683,3684,3691,3696,3703,3708],{},[159,3685,3686],{},[24,3687,3690],{"href":3688,"rel":3689},"https:\u002F\u002Fghostty.org",[28],"Ghostty 官方網站",[159,3692,3693],{},[24,3694,3147],{"href":3145,"rel":3695},[28],[159,3697,3698],{},[24,3699,3702],{"href":3700,"rel":3701},"https:\u002F\u002Fherdr.dev",[28],"Herdr 官方網站",[159,3704,3705],{},[24,3706,2862],{"href":2860,"rel":3707},[28],[159,3709,3710],{},[24,3711,3714],{"href":3712,"rel":3713},"https:\u002F\u002Fherdr.dev\u002Fdocs\u002F",[28],"Herdr 文件",[1579,3716,3717],{},"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":217,"searchDepth":230,"depth":230,"links":3719},[3720,3721,3727,3734,3738,3739],{"id":2929,"depth":230,"text":2930},{"id":2967,"depth":230,"text":2968,"children":3722},[3723,3724,3725,3726],{"id":2971,"depth":248,"text":2972},{"id":2978,"depth":248,"text":2978},{"id":3035,"depth":248,"text":3036},{"id":3151,"depth":248,"text":3151},{"id":3240,"depth":230,"text":3241,"children":3728},[3729,3730,3731,3732,3733],{"id":3244,"depth":248,"text":3245},{"id":3258,"depth":248,"text":2978},{"id":3297,"depth":248,"text":3298},{"id":3337,"depth":248,"text":3337},{"id":3378,"depth":248,"text":3378},{"id":3445,"depth":230,"text":3446,"children":3735},[3736,3737],{"id":3449,"depth":248,"text":3450},{"id":3467,"depth":248,"text":3467},{"id":1520,"depth":230,"text":1520},{"id":1528,"depth":230,"text":1528},"在這個大 AI 時代，使用 AI Agent 進行 Vibe Coding 已成為工作日常， 而目前各家大廠或開源專案都有提供 CLI 工作環境，所以終端機效能變得更重要，這也是我選擇 ghostty 的原因，它原生開發且支持 GPU 渲染，在終端機進行複雜渲染時，不必擔心畫面延遲。","\u002Fimages\u002Farticles\u002F2026-09-01-ai-agent-ghostty-herdr\u002Fcover.png",{},"2026-09-01 12:00:00",{"title":1630,"description":3740},"articles\u002F2026-09-01-ai-agent-ghostty-herdr","在 AI Agent 時代，終端機不僅是開發工具，更是 AI 代理的操盤中心。Ghostty 以 GPU 加速與原生 UI 重新定義終端體驗，Herdr 則為終端帶來 AI 代理多工管理能力。本文將帶你了解這組強大組合如何打造新一代 AI 開發環境。",[1610,1613,1614,3748],"software","RKLoV9NXyu51ay6Nvvbikch7fnhZR3L93WDtxZvWUt4",{"id":3751,"title":3752,"body":3753,"category":5433,"description":217,"extension":1601,"image":5434,"meta":5435,"navigation":263,"path":5436,"pubDate":5437,"seo":5438,"status":263,"stem":5439,"summary":5440,"tags":5441,"__hash__":5444},"content\u002Farticles\u002F2026-08-23-php-xlswriter.md","PHP 高效處理 XLSX 檔案：xlswriter 安裝與實戰教學",{"type":8,"value":3754,"toc":5416},[3755,3758,3765,3779,3782,3786,3800,3806,3809,3813,3816,3897,3901,3916,3923,3932,3935,3955,3958,3976,3988,3992,3995,4250,4256,4260,4267,4546,4553,4565,4569,4572,4680,4683,4827,4830,4872,4876,4879,4889,5062,5065,5091,5094,5097,5247,5250,5257,5384,5387,5402,5414],[54,3756,3757],{"id":3757},"簡介",[15,3759,3760,3761,3764],{},"系統匯出報表時，資料量一大，常常會遇到記憶體不足或等待時間太久的問題。",[127,3762,3763],{},"PhpSpreadsheet"," 功能完整，但它以純 PHP 建立整份活頁簿物件；若要處理數十萬筆以上資料，記憶體成本會很高。",[15,3766,3767,3774,3775,3778],{},[24,3768,3771],{"href":3769,"rel":3770},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter",[28],[127,3772,3773],{},"xlswriter"," 是以 C 實作的 PHP 擴充套件，底層使用 ",[127,3776,3777],{},"libxlsxwriter","，專門處理 Excel 2007 以上的 XLSX 格式。除了文字與數字，也支援公式、圖片、圖表、合併儲存格、自動篩選與樣式等功能。",[15,3780,3781],{},"官方的百萬列基準測試顯示，xlswriter 在速度與記憶體使用上都很適合大量資料匯出。不過實際結果仍會依照硬體、資料欄位數、字串長度與樣式複雜度而改變，建議以自己的正式環境測試為準。",[54,3783,3785],{"id":3784},"xlswriter-適合哪些情境","xlswriter 適合哪些情境？",[156,3787,3788,3791,3794,3797],{},[159,3789,3790],{},"後台需要匯出大量訂單、會員或交易明細。",[159,3792,3793],{},"需要逐列讀取大型 XLSX，避免一次載入所有資料。",[159,3795,3796],{},"要產生具備公式、格式、篩選或多工作表的 Excel 報表。",[159,3798,3799],{},"伺服器的 PHP 記憶體限制較嚴格。",[15,3801,3802,3803,3805],{},"若只要處理少量資料，或部署環境無法安裝 PHP 擴充套件，使用 Composer 安裝的 ",[127,3804,3763],{}," 仍會較方便；但大量資料匯出時，xlswriter 的固定記憶體模式更合適。",[54,3807,3808],{"id":3808},"安裝",[2667,3810,3812],{"id":3811},"安裝-zlib-相依套件","安裝 zlib 相依套件",[15,3814,3815],{},"xlswriter 編譯時需要 zlib 的開發檔案。先依作業系統安裝：",[212,3817,3819],{"className":214,"code":3818,"language":216,"meta":217,"style":217},"# 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",[127,3820,3821,3826,3839,3843,3848,3858,3862,3867,3879,3883,3888],{"__ignoreMap":217},[122,3822,3823],{"class":222,"line":223},[122,3824,3825],{"class":226},"# Debian \u002F Ubuntu\n",[122,3827,3828,3831,3833,3836],{"class":222,"line":230},[122,3829,3830],{"class":233},"apt-get",[122,3832,238],{"class":237},[122,3834,3835],{"class":241}," -y",[122,3837,3838],{"class":237}," zlib1g-dev\n",[122,3840,3841],{"class":222,"line":248},[122,3842,264],{"emptyLinePlaceholder":263},[122,3844,3845],{"class":222,"line":260},[122,3846,3847],{"class":226},"# Alpine\n",[122,3849,3850,3853,3855],{"class":222,"line":267},[122,3851,3852],{"class":233},"apk",[122,3854,1814],{"class":237},[122,3856,3857],{"class":237}," zlib-dev\n",[122,3859,3860],{"class":222,"line":273},[122,3861,264],{"emptyLinePlaceholder":263},[122,3863,3864],{"class":222,"line":660},[122,3865,3866],{"class":226},"# RHEL \u002F CentOS \u002F Fedora\n",[122,3868,3869,3872,3874,3876],{"class":222,"line":672},[122,3870,3871],{"class":233},"yum",[122,3873,238],{"class":237},[122,3875,3835],{"class":241},[122,3877,3878],{"class":237}," zlib-devel\n",[122,3880,3881],{"class":222,"line":701},[122,3882,264],{"emptyLinePlaceholder":263},[122,3884,3885],{"class":222,"line":706},[122,3886,3887],{"class":226},"# macOS\n",[122,3889,3890,3892,3894],{"class":222,"line":712},[122,3891,234],{"class":233},[122,3893,238],{"class":237},[122,3895,3896],{"class":237}," zlib\n",[2667,3898,3900],{"id":3899},"使用-pecl-安裝","使用 PECL 安裝",[212,3902,3904],{"className":214,"code":3903,"language":216,"meta":217,"style":217},"pecl install xlswriter\n",[127,3905,3906],{"__ignoreMap":217},[122,3907,3908,3911,3913],{"class":222,"line":223},[122,3909,3910],{"class":233},"pecl",[122,3912,238],{"class":237},[122,3914,3915],{"class":237}," xlswriter\n",[15,3917,3918,3919,3922],{},"安裝過程中若需要讀取 XLSX，請在提示時啟用 reader。完成後在 ",[127,3920,3921],{},"php.ini"," 加入：",[212,3924,3926],{"className":3164,"code":3925,"language":3166,"meta":217,"style":217},"extension=xlswriter.so\n",[127,3927,3928],{"__ignoreMap":217},[122,3929,3930],{"class":222,"line":223},[122,3931,3925],{},[15,3933,3934],{},"最後確認擴充套件已被載入：",[212,3936,3938],{"className":214,"code":3937,"language":216,"meta":217,"style":217},"php -m | grep xlswriter\n",[127,3939,3940],{"__ignoreMap":217},[122,3941,3942,3945,3948,3950,3953],{"class":222,"line":223},[122,3943,3944],{"class":233},"php",[122,3946,3947],{"class":241}," -m",[122,3949,3315],{"class":632},[122,3951,3952],{"class":233}," grep",[122,3954,3915],{"class":237},[15,3956,3957],{},"也可以使用 PIE 安裝：",[212,3959,3961],{"className":214,"code":3960,"language":216,"meta":217,"style":217},"pie install --auto-install-build-tools viest\u002Fxlswriter\n",[127,3962,3963],{"__ignoreMap":217},[122,3964,3965,3968,3970,3973],{"class":222,"line":223},[122,3966,3967],{"class":233},"pie",[122,3969,238],{"class":237},[122,3971,3972],{"class":241}," --auto-install-build-tools",[122,3974,3975],{"class":237}," viest\u002Fxlswriter\n",[15,3977,3978,3979,3984,3985,3987],{},"Windows 使用者可從 ",[24,3980,3983],{"href":3981,"rel":3982},"https:\u002F\u002Fgithub.com\u002Fviest\u002Fphp-ext-xlswriter\u002Freleases",[28],"GitHub Releases"," 下載符合 PHP 版本、執行緒安全設定與架構的 DLL，再於 ",[127,3986,3921],{}," 啟用。",[54,3989,3991],{"id":3990},"建立第一份-xlsx-報表","建立第一份 XLSX 報表",[15,3993,3994],{},"以下範例建立一張「銷售報表」工作表，先寫入欄位標題，再加入資料。",[212,3996,3999],{"className":3997,"code":3998,"language":3944,"meta":217,"style":217},"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",[127,4000,4001,4025,4029,4045,4059,4064,4068,4097,4124,4133,4153,4171,4190,4209,4214,4224,4228],{"__ignoreMap":217},[122,4002,4003,4006,4008,4011,4014,4017,4019,4022],{"class":222,"line":223},[122,4004,4005],{"class":632},"\u003C?",[122,4007,3944],{"class":241},[122,4009,4010],{"class":632}," declare",[122,4012,4013],{"class":639},"(",[122,4015,4016],{"class":241},"strict_types",[122,4018,2421],{"class":632},[122,4020,4021],{"class":241},"1",[122,4023,4024],{"class":639},");\n",[122,4026,4027],{"class":222,"line":230},[122,4028,264],{"emptyLinePlaceholder":263},[122,4030,4031,4034,4036,4039,4042],{"class":222,"line":248},[122,4032,4033],{"class":639},"$excel ",[122,4035,2421],{"class":632},[122,4037,4038],{"class":632}," new",[122,4040,4041],{"class":241}," \\Vtiful\\Kernel\\Excel",[122,4043,4044],{"class":639},"([\n",[122,4046,4047,4050,4053,4056],{"class":222,"line":260},[122,4048,4049],{"class":237},"    'path'",[122,4051,4052],{"class":632}," =>",[122,4054,4055],{"class":237}," '.\u002Ftmp'",[122,4057,4058],{"class":639},",\n",[122,4060,4061],{"class":222,"line":267},[122,4062,4063],{"class":639},"]);\n",[122,4065,4066],{"class":222,"line":273},[122,4067,264],{"emptyLinePlaceholder":263},[122,4069,4070,4073,4075,4078,4081,4084,4086,4089,4092,4095],{"class":222,"line":660},[122,4071,4072],{"class":639},"$filePath ",[122,4074,2421],{"class":632},[122,4076,4077],{"class":639}," $excel",[122,4079,4080],{"class":632},"->",[122,4082,4083],{"class":233},"fileName",[122,4085,4013],{"class":639},[122,4087,4088],{"class":237},"'sales-report.xlsx'",[122,4090,4091],{"class":639},", ",[122,4093,4094],{"class":237},"'銷售報表'",[122,4096,2444],{"class":639},[122,4098,4099,4102,4105,4108,4111,4113,4116,4118,4121],{"class":222,"line":672},[122,4100,4101],{"class":632},"    ->",[122,4103,4104],{"class":233},"header",[122,4106,4107],{"class":639},"([",[122,4109,4110],{"class":237},"'品項'",[122,4112,4091],{"class":639},[122,4114,4115],{"class":237},"'金額'",[122,4117,4091],{"class":639},[122,4119,4120],{"class":237},"'數量'",[122,4122,4123],{"class":639},"])\n",[122,4125,4126,4128,4131],{"class":222,"line":701},[122,4127,4101],{"class":632},[122,4129,4130],{"class":233},"data",[122,4132,4044],{"class":639},[122,4134,4135,4138,4141,4143,4146,4148,4150],{"class":222,"line":706},[122,4136,4137],{"class":639},"        [",[122,4139,4140],{"class":237},"'租金'",[122,4142,4091],{"class":639},[122,4144,4145],{"class":241},"10000",[122,4147,4091],{"class":639},[122,4149,4021],{"class":241},[122,4151,4152],{"class":639},"],\n",[122,4154,4155,4157,4160,4162,4165,4167,4169],{"class":222,"line":712},[122,4156,4137],{"class":639},[122,4158,4159],{"class":237},"'水電'",[122,4161,4091],{"class":639},[122,4163,4164],{"class":241},"2500",[122,4166,4091],{"class":639},[122,4168,4021],{"class":241},[122,4170,4152],{"class":639},[122,4172,4173,4175,4178,4180,4183,4185,4188],{"class":222,"line":725},[122,4174,4137],{"class":639},[122,4176,4177],{"class":237},"'辦公用品'",[122,4179,4091],{"class":639},[122,4181,4182],{"class":241},"3000",[122,4184,4091],{"class":639},[122,4186,4187],{"class":241},"5",[122,4189,4152],{"class":639},[122,4191,4192,4194,4197,4199,4202,4204,4207],{"class":222,"line":737},[122,4193,4137],{"class":639},[122,4195,4196],{"class":237},"'交通費'",[122,4198,4091],{"class":639},[122,4200,4201],{"class":241},"1200",[122,4203,4091],{"class":639},[122,4205,4206],{"class":241},"10",[122,4208,4152],{"class":639},[122,4210,4211],{"class":222,"line":758},[122,4212,4213],{"class":639},"    ])\n",[122,4215,4216,4218,4221],{"class":222,"line":782},[122,4217,4101],{"class":632},[122,4219,4220],{"class":233},"output",[122,4222,4223],{"class":639},"();\n",[122,4225,4226],{"class":222,"line":787},[122,4227,264],{"emptyLinePlaceholder":263},[122,4229,4230,4233,4236,4239,4242,4245,4247],{"class":222,"line":793},[122,4231,4232],{"class":241},"echo",[122,4234,4235],{"class":237}," \"檔案已儲存至：{",[122,4237,4238],{"class":639},"$filePath",[122,4240,4241],{"class":237},"}",[122,4243,4244],{"class":241},"\\n",[122,4246,2085],{"class":237},[122,4248,4249],{"class":639},";\n",[15,4251,4252,4255],{},[127,4253,4254],{},"path"," 是輸出目錄；Web 專案通常可先輸出至暫存目錄，再透過框架的下載回應將檔案交給使用者。請勿直接把使用者輸入當成檔名或路徑，以免產生路徑穿越風險。",[54,4257,4259],{"id":4258},"大量資料匯出固定記憶體模式","大量資料匯出：固定記憶體模式",[15,4261,4262,4263,4266],{},"大量報表最值得使用的是 ",[127,4264,4265],{},"constMemory()","。這個模式會逐列處理資料，記憶體不會隨著工作表資料量持續增加。",[212,4268,4270],{"className":3997,"code":4269,"language":3944,"meta":217,"style":217},"\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",[127,4271,4272,4290,4294,4306,4316,4320,4324,4329,4355,4359,4364,4390,4394,4399,4430,4456,4486,4522,4527,4531,4536],{"__ignoreMap":217},[122,4273,4274,4276,4278,4280,4282,4284,4286,4288],{"class":222,"line":223},[122,4275,4005],{"class":632},[122,4277,3944],{"class":241},[122,4279,4010],{"class":632},[122,4281,4013],{"class":639},[122,4283,4016],{"class":241},[122,4285,2421],{"class":632},[122,4287,4021],{"class":241},[122,4289,4024],{"class":639},[122,4291,4292],{"class":222,"line":230},[122,4293,264],{"emptyLinePlaceholder":263},[122,4295,4296,4298,4300,4302,4304],{"class":222,"line":248},[122,4297,4033],{"class":639},[122,4299,2421],{"class":632},[122,4301,4038],{"class":632},[122,4303,4041],{"class":241},[122,4305,4044],{"class":639},[122,4307,4308,4310,4312,4314],{"class":222,"line":260},[122,4309,4049],{"class":237},[122,4311,4052],{"class":632},[122,4313,4055],{"class":237},[122,4315,4058],{"class":639},[122,4317,4318],{"class":222,"line":267},[122,4319,4063],{"class":639},[122,4321,4322],{"class":222,"line":273},[122,4323,264],{"emptyLinePlaceholder":263},[122,4325,4326],{"class":222,"line":660},[122,4327,4328],{"class":226},"\u002F\u002F 開啟固定記憶體模式 (參數：檔名, 工作表名稱)\n",[122,4330,4331,4334,4336,4338,4340,4343,4345,4348,4350,4353],{"class":222,"line":672},[122,4332,4333],{"class":639},"$file ",[122,4335,2421],{"class":632},[122,4337,4077],{"class":639},[122,4339,4080],{"class":632},[122,4341,4342],{"class":233},"constMemory",[122,4344,4013],{"class":639},[122,4346,4347],{"class":237},"'large_data.xlsx'",[122,4349,4091],{"class":639},[122,4351,4352],{"class":237},"'Sheet1'",[122,4354,4024],{"class":639},[122,4356,4357],{"class":222,"line":701},[122,4358,264],{"emptyLinePlaceholder":263},[122,4360,4361],{"class":222,"line":706},[122,4362,4363],{"class":226},"\u002F\u002F 寫入表頭\n",[122,4365,4366,4369,4371,4373,4375,4378,4380,4383,4385,4388],{"class":222,"line":712},[122,4367,4368],{"class":639},"$file",[122,4370,4080],{"class":632},[122,4372,4104],{"class":233},[122,4374,4107],{"class":639},[122,4376,4377],{"class":237},"'ID'",[122,4379,4091],{"class":639},[122,4381,4382],{"class":237},"'姓名'",[122,4384,4091],{"class":639},[122,4386,4387],{"class":237},"'數值'",[122,4389,4063],{"class":639},[122,4391,4392],{"class":222,"line":725},[122,4393,264],{"emptyLinePlaceholder":263},[122,4395,4396],{"class":222,"line":737},[122,4397,4398],{"class":226},"\u002F\u002F 迴圈逐行寫入大批量數據\n",[122,4400,4401,4404,4407,4409,4412,4415,4418,4421,4424,4427],{"class":222,"line":758},[122,4402,4403],{"class":632},"for",[122,4405,4406],{"class":639}," ($i ",[122,4408,2421],{"class":632},[122,4410,4411],{"class":241}," 1",[122,4413,4414],{"class":639},"; $i ",[122,4416,4417],{"class":632},"\u003C=",[122,4419,4420],{"class":241}," 1000000",[122,4422,4423],{"class":639},"; $i",[122,4425,4426],{"class":632},"++",[122,4428,4429],{"class":639},") {\n",[122,4431,4432,4435,4437,4440,4443,4446,4448,4450,4453],{"class":222,"line":782},[122,4433,4434],{"class":639},"    $file",[122,4436,4080],{"class":632},[122,4438,4439],{"class":233},"insertText",[122,4441,4442],{"class":639},"($i ",[122,4444,4445],{"class":632},"-",[122,4447,4411],{"class":241},[122,4449,4091],{"class":639},[122,4451,4452],{"class":241},"0",[122,4454,4455],{"class":639},", $i);\n",[122,4457,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4479,4482,4484],{"class":222,"line":787},[122,4459,4434],{"class":639},[122,4461,4080],{"class":632},[122,4463,4439],{"class":233},[122,4465,4442],{"class":639},[122,4467,4445],{"class":632},[122,4469,4411],{"class":241},[122,4471,4091],{"class":639},[122,4473,4021],{"class":241},[122,4475,4091],{"class":639},[122,4477,4478],{"class":237},"\"使用者 {",[122,4480,4481],{"class":639},"$i",[122,4483,1906],{"class":237},[122,4485,4024],{"class":639},[122,4487,4488,4490,4492,4494,4496,4498,4500,4502,4505,4507,4510,4512,4514,4516,4519],{"class":222,"line":793},[122,4489,4434],{"class":639},[122,4491,4080],{"class":632},[122,4493,4439],{"class":233},[122,4495,4442],{"class":639},[122,4497,4445],{"class":632},[122,4499,4411],{"class":241},[122,4501,4091],{"class":639},[122,4503,4504],{"class":241},"2",[122,4506,4091],{"class":639},[122,4508,4509],{"class":241},"rand",[122,4511,4013],{"class":639},[122,4513,4021],{"class":241},[122,4515,4091],{"class":639},[122,4517,4518],{"class":241},"100",[122,4520,4521],{"class":639},"));\n",[122,4523,4524],{"class":222,"line":807},[122,4525,4526],{"class":639},"}\n",[122,4528,4529],{"class":222,"line":823},[122,4530,264],{"emptyLinePlaceholder":263},[122,4532,4533],{"class":222,"line":828},[122,4534,4535],{"class":226},"\u002F\u002F 輸出儲存檔案\n",[122,4537,4538,4540,4542,4544],{"class":222,"line":834},[122,4539,4368],{"class":639},[122,4541,4080],{"class":632},[122,4543,4220],{"class":233},[122,4545,4223],{"class":639},[15,4547,4548,4549,4552],{},"固定記憶體模式的取捨是：資料寫入後不能回頭修改已寫入的儲存格。因此欄位順序、樣式與計算方式要先規劃好；若報表需要任意回寫或重複調整，則使用一般 ",[127,4550,4551],{},"fileName()"," 模式。",[45,4554,4555],{},[15,4556,4557,4560,4561,4564],{},[127,4558,4559],{},"fetchReportRows()"," 代表可逐筆或分批取得資料的 Generator。例如資料庫查詢應避免一次 ",[127,4562,4563],{},"fetchAll()","，才能真正降低整體記憶體用量。",[54,4566,4568],{"id":4567},"讀取-xlsx-檔案","讀取 XLSX 檔案",[15,4570,4571],{},"小型檔案可直接取得工作表全部資料：",[212,4573,4575],{"className":3997,"code":4574,"language":3944,"meta":217,"style":217},"\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",[127,4576,4577,4595,4599,4611,4621,4625,4629,4649,4659,4668,4672],{"__ignoreMap":217},[122,4578,4579,4581,4583,4585,4587,4589,4591,4593],{"class":222,"line":223},[122,4580,4005],{"class":632},[122,4582,3944],{"class":241},[122,4584,4010],{"class":632},[122,4586,4013],{"class":639},[122,4588,4016],{"class":241},[122,4590,2421],{"class":632},[122,4592,4021],{"class":241},[122,4594,4024],{"class":639},[122,4596,4597],{"class":222,"line":230},[122,4598,264],{"emptyLinePlaceholder":263},[122,4600,4601,4603,4605,4607,4609],{"class":222,"line":248},[122,4602,4033],{"class":639},[122,4604,2421],{"class":632},[122,4606,4038],{"class":632},[122,4608,4041],{"class":241},[122,4610,4044],{"class":639},[122,4612,4613,4615,4617,4619],{"class":222,"line":260},[122,4614,4049],{"class":237},[122,4616,4052],{"class":632},[122,4618,4055],{"class":237},[122,4620,4058],{"class":639},[122,4622,4623],{"class":222,"line":267},[122,4624,4063],{"class":639},[122,4626,4627],{"class":222,"line":273},[122,4628,264],{"emptyLinePlaceholder":263},[122,4630,4631,4634,4636,4638,4640,4643,4645,4647],{"class":222,"line":660},[122,4632,4633],{"class":639},"$data ",[122,4635,2421],{"class":632},[122,4637,4077],{"class":639},[122,4639,4080],{"class":632},[122,4641,4642],{"class":233},"openFile",[122,4644,4013],{"class":639},[122,4646,4088],{"class":237},[122,4648,2444],{"class":639},[122,4650,4651,4653,4656],{"class":222,"line":672},[122,4652,4101],{"class":632},[122,4654,4655],{"class":233},"openSheet",[122,4657,4658],{"class":639},"()\n",[122,4660,4661,4663,4666],{"class":222,"line":701},[122,4662,4101],{"class":632},[122,4664,4665],{"class":233},"getSheetData",[122,4667,4223],{"class":639},[122,4669,4670],{"class":222,"line":706},[122,4671,264],{"emptyLinePlaceholder":263},[122,4673,4674,4677],{"class":222,"line":712},[122,4675,4676],{"class":241},"print_r",[122,4678,4679],{"class":639},"($data);\n",[15,4681,4682],{},"如果上傳檔案可能很大，改用游標逐列讀取。這樣可以一筆一筆驗證與寫入資料庫，不必將整個檔案放進記憶體。",[212,4684,4686],{"className":3997,"code":4685,"language":3944,"meta":217,"style":217},"\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",[127,4687,4688,4706,4710,4722,4732,4736,4740,4755,4763,4780,4784,4804,4814,4818,4823],{"__ignoreMap":217},[122,4689,4690,4692,4694,4696,4698,4700,4702,4704],{"class":222,"line":223},[122,4691,4005],{"class":632},[122,4693,3944],{"class":241},[122,4695,4010],{"class":632},[122,4697,4013],{"class":639},[122,4699,4016],{"class":241},[122,4701,2421],{"class":632},[122,4703,4021],{"class":241},[122,4705,4024],{"class":639},[122,4707,4708],{"class":222,"line":230},[122,4709,264],{"emptyLinePlaceholder":263},[122,4711,4712,4714,4716,4718,4720],{"class":222,"line":248},[122,4713,4033],{"class":639},[122,4715,2421],{"class":632},[122,4717,4038],{"class":632},[122,4719,4041],{"class":241},[122,4721,4044],{"class":639},[122,4723,4724,4726,4728,4730],{"class":222,"line":260},[122,4725,4049],{"class":237},[122,4727,4052],{"class":632},[122,4729,4055],{"class":237},[122,4731,4058],{"class":639},[122,4733,4734],{"class":222,"line":267},[122,4735,4063],{"class":639},[122,4737,4738],{"class":222,"line":273},[122,4739,264],{"emptyLinePlaceholder":263},[122,4741,4742,4745,4747,4749,4751,4753],{"class":222,"line":660},[122,4743,4744],{"class":639},"$excel",[122,4746,4080],{"class":632},[122,4748,4642],{"class":233},[122,4750,4013],{"class":639},[122,4752,4347],{"class":237},[122,4754,2444],{"class":639},[122,4756,4757,4759,4761],{"class":222,"line":672},[122,4758,4101],{"class":632},[122,4760,4655],{"class":233},[122,4762,4658],{"class":639},[122,4764,4765,4767,4770,4772,4774,4777],{"class":222,"line":701},[122,4766,4101],{"class":632},[122,4768,4769],{"class":233},"setSkipRows",[122,4771,4013],{"class":639},[122,4773,4021],{"class":241},[122,4775,4776],{"class":639},"); ",[122,4778,4779],{"class":226},"\u002F\u002F 略過標題列\n",[122,4781,4782],{"class":222,"line":706},[122,4783,264],{"emptyLinePlaceholder":263},[122,4785,4786,4789,4792,4794,4796,4798,4801],{"class":222,"line":712},[122,4787,4788],{"class":632},"while",[122,4790,4791],{"class":639}," ($row ",[122,4793,2421],{"class":632},[122,4795,4077],{"class":639},[122,4797,4080],{"class":632},[122,4799,4800],{"class":233},"nextRow",[122,4802,4803],{"class":639},"()) {\n",[122,4805,4806,4809,4811],{"class":222,"line":725},[122,4807,4808],{"class":639},"    [$id, $name, $amount] ",[122,4810,2421],{"class":632},[122,4812,4813],{"class":639}," $row;\n",[122,4815,4816],{"class":222,"line":737},[122,4817,264],{"emptyLinePlaceholder":263},[122,4819,4820],{"class":222,"line":758},[122,4821,4822],{"class":226},"    \u002F\u002F 在此驗證資料並分批寫入資料庫\n",[122,4824,4825],{"class":222,"line":782},[122,4826,4526],{"class":639},[15,4828,4829],{},"若檔案有多張工作表，可先取得清單：",[212,4831,4833],{"className":3997,"code":4832,"language":3944,"meta":217,"style":217},"$sheetList = $excel->openFile('sales-report.xlsx')->sheetList();\n\nprint_r($sheetList);\n",[127,4834,4835,4861,4865],{"__ignoreMap":217},[122,4836,4837,4840,4842,4844,4846,4848,4850,4852,4854,4856,4859],{"class":222,"line":223},[122,4838,4839],{"class":639},"$sheetList ",[122,4841,2421],{"class":632},[122,4843,4077],{"class":639},[122,4845,4080],{"class":632},[122,4847,4642],{"class":233},[122,4849,4013],{"class":639},[122,4851,4088],{"class":237},[122,4853,3161],{"class":639},[122,4855,4080],{"class":632},[122,4857,4858],{"class":233},"sheetList",[122,4860,4223],{"class":639},[122,4862,4863],{"class":222,"line":230},[122,4864,264],{"emptyLinePlaceholder":263},[122,4866,4867,4869],{"class":222,"line":248},[122,4868,4676],{"class":241},[122,4870,4871],{"class":639},"($sheetList);\n",[54,4873,4875],{"id":4874},"常用-excel-功能","常用 Excel 功能",[2667,4877,4878],{"id":4878},"加入公式與數字格式",[15,4880,4881,4884,4885,4888],{},[127,4882,4883],{},"insertFormula()"," 可寫入 Excel 公式；數字格式可交給 ",[127,4886,4887],{},"insertText()"," 的最後一個參數處理。",[212,4890,4892],{"className":3997,"code":4891,"language":3944,"meta":217,"style":217},"$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",[127,4893,4894,4913,4929,4933,4943,4956,4968,4980,4984,5006,5028,5054],{"__ignoreMap":217},[122,4895,4896,4898,4900,4902,4904,4906,4908,4911],{"class":222,"line":223},[122,4897,4333],{"class":639},[122,4899,2421],{"class":632},[122,4901,4077],{"class":639},[122,4903,4080],{"class":632},[122,4905,4083],{"class":233},[122,4907,4013],{"class":639},[122,4909,4910],{"class":237},"'expense-report.xlsx'",[122,4912,2444],{"class":639},[122,4914,4915,4917,4919,4921,4923,4925,4927],{"class":222,"line":230},[122,4916,4101],{"class":632},[122,4918,4104],{"class":233},[122,4920,4107],{"class":639},[122,4922,4110],{"class":237},[122,4924,4091],{"class":639},[122,4926,4115],{"class":237},[122,4928,4063],{"class":639},[122,4930,4931],{"class":222,"line":248},[122,4932,264],{"emptyLinePlaceholder":263},[122,4934,4935,4937,4939,4941],{"class":222,"line":260},[122,4936,4368],{"class":639},[122,4938,4080],{"class":632},[122,4940,4130],{"class":233},[122,4942,4044],{"class":639},[122,4944,4945,4948,4950,4952,4954],{"class":222,"line":267},[122,4946,4947],{"class":639},"    [",[122,4949,4140],{"class":237},[122,4951,4091],{"class":639},[122,4953,4145],{"class":241},[122,4955,4152],{"class":639},[122,4957,4958,4960,4962,4964,4966],{"class":222,"line":273},[122,4959,4947],{"class":639},[122,4961,4159],{"class":237},[122,4963,4091],{"class":639},[122,4965,4164],{"class":241},[122,4967,4152],{"class":639},[122,4969,4970,4972,4974,4976,4978],{"class":222,"line":660},[122,4971,4947],{"class":639},[122,4973,4177],{"class":237},[122,4975,4091],{"class":639},[122,4977,4182],{"class":241},[122,4979,4152],{"class":639},[122,4981,4982],{"class":222,"line":672},[122,4983,4123],{"class":639},[122,4985,4986,4988,4990,4992,4995,4997,4999,5001,5004],{"class":222,"line":701},[122,4987,4101],{"class":632},[122,4989,4439],{"class":233},[122,4991,4013],{"class":639},[122,4993,4994],{"class":241},"4",[122,4996,4091],{"class":639},[122,4998,4452],{"class":241},[122,5000,4091],{"class":639},[122,5002,5003],{"class":237},"'總計'",[122,5005,2444],{"class":639},[122,5007,5008,5010,5013,5015,5017,5019,5021,5023,5026],{"class":222,"line":706},[122,5009,4101],{"class":632},[122,5011,5012],{"class":233},"insertFormula",[122,5014,4013],{"class":639},[122,5016,4994],{"class":241},[122,5018,4091],{"class":639},[122,5020,4021],{"class":241},[122,5022,4091],{"class":639},[122,5024,5025],{"class":237},"'=SUM(B2:B4)'",[122,5027,2444],{"class":639},[122,5029,5030,5032,5034,5036,5038,5040,5042,5044,5047,5049,5052],{"class":222,"line":712},[122,5031,4101],{"class":632},[122,5033,4439],{"class":233},[122,5035,4013],{"class":639},[122,5037,4187],{"class":241},[122,5039,4091],{"class":639},[122,5041,4021],{"class":241},[122,5043,4091],{"class":639},[122,5045,5046],{"class":241},"1234567.89",[122,5048,4091],{"class":639},[122,5050,5051],{"class":237},"'#,##0.00'",[122,5053,2444],{"class":639},[122,5055,5056,5058,5060],{"class":222,"line":725},[122,5057,4101],{"class":632},[122,5059,4220],{"class":233},[122,5061,4223],{"class":639},[15,5063,5064],{},"常用格式包括：",[156,5066,5067,5073,5079,5085],{},[159,5068,5069,5072],{},[127,5070,5071],{},"#,##0","：千分位整數",[159,5074,5075,5078],{},[127,5076,5077],{},"#,##0.00","：千分位與兩位小數",[159,5080,5081,5084],{},[127,5082,5083],{},"0.00%","：百分比",[159,5086,5087,5090],{},[127,5088,5089],{},"yyyy-mm-dd","：日期",[2667,5092,5093],{"id":5093},"凍結標題列與自動篩選",[15,5095,5096],{},"這兩個功能很適合明細型報表，使用者捲動資料時仍可看見欄位名稱，也能直接在 Excel 篩選。",[212,5098,5100],{"className":3997,"code":5099,"language":3944,"meta":217,"style":217},"$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",[127,5101,5102,5117,5139,5147,5166,5185,5204,5208,5225,5239],{"__ignoreMap":217},[122,5103,5104,5106,5108,5110,5112,5115],{"class":222,"line":223},[122,5105,4744],{"class":639},[122,5107,4080],{"class":632},[122,5109,4083],{"class":233},[122,5111,4013],{"class":639},[122,5113,5114],{"class":237},"'employee-report.xlsx'",[122,5116,2444],{"class":639},[122,5118,5119,5121,5123,5125,5127,5129,5132,5134,5137],{"class":222,"line":230},[122,5120,4101],{"class":632},[122,5122,4104],{"class":233},[122,5124,4107],{"class":639},[122,5126,4382],{"class":237},[122,5128,4091],{"class":639},[122,5130,5131],{"class":237},"'部門'",[122,5133,4091],{"class":639},[122,5135,5136],{"class":237},"'薪資'",[122,5138,4123],{"class":639},[122,5140,5141,5143,5145],{"class":222,"line":248},[122,5142,4101],{"class":632},[122,5144,4130],{"class":233},[122,5146,4044],{"class":639},[122,5148,5149,5151,5154,5156,5159,5161,5164],{"class":222,"line":260},[122,5150,4137],{"class":639},[122,5152,5153],{"class":237},"'王小明'",[122,5155,4091],{"class":639},[122,5157,5158],{"class":237},"'工程部'",[122,5160,4091],{"class":639},[122,5162,5163],{"class":241},"60000",[122,5165,4152],{"class":639},[122,5167,5168,5170,5173,5175,5178,5180,5183],{"class":222,"line":267},[122,5169,4137],{"class":639},[122,5171,5172],{"class":237},"'李小華'",[122,5174,4091],{"class":639},[122,5176,5177],{"class":237},"'行銷部'",[122,5179,4091],{"class":639},[122,5181,5182],{"class":241},"55000",[122,5184,4152],{"class":639},[122,5186,5187,5189,5192,5194,5197,5199,5202],{"class":222,"line":273},[122,5188,4137],{"class":639},[122,5190,5191],{"class":237},"'陳美玲'",[122,5193,4091],{"class":639},[122,5195,5196],{"class":237},"'人資部'",[122,5198,4091],{"class":639},[122,5200,5201],{"class":241},"58000",[122,5203,4152],{"class":639},[122,5205,5206],{"class":222,"line":660},[122,5207,4213],{"class":639},[122,5209,5210,5212,5215,5217,5219,5221,5223],{"class":222,"line":672},[122,5211,4101],{"class":632},[122,5213,5214],{"class":233},"freezePanes",[122,5216,4013],{"class":639},[122,5218,4021],{"class":241},[122,5220,4091],{"class":639},[122,5222,4452],{"class":241},[122,5224,2444],{"class":639},[122,5226,5227,5229,5232,5234,5237],{"class":222,"line":701},[122,5228,4101],{"class":632},[122,5230,5231],{"class":233},"autoFilter",[122,5233,4013],{"class":639},[122,5235,5236],{"class":237},"'A1:C4'",[122,5238,2444],{"class":639},[122,5240,5241,5243,5245],{"class":222,"line":706},[122,5242,4101],{"class":632},[122,5244,4220],{"class":233},[122,5246,4223],{"class":639},[2667,5248,5249],{"id":5249},"多個工作表",[15,5251,5252,5253,5256],{},"一份檔案需要不同分類資料時，可使用 ",[127,5254,5255],{},"addSheet()"," 新增工作表。",[212,5258,5260],{"className":3997,"code":5259,"language":3944,"meta":217,"style":217},"$file = $excel->fileName('monthly-report.xlsx', '一月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 50000]]);\n\n$file->addSheet('二月')\n    ->header(['品項', '金額'])\n    ->data([['服務收入', 62000]])\n    ->output();\n",[127,5261,5262,5286,5302,5322,5326,5342,5358,5376],{"__ignoreMap":217},[122,5263,5264,5266,5268,5270,5272,5274,5276,5279,5281,5284],{"class":222,"line":223},[122,5265,4333],{"class":639},[122,5267,2421],{"class":632},[122,5269,4077],{"class":639},[122,5271,4080],{"class":632},[122,5273,4083],{"class":233},[122,5275,4013],{"class":639},[122,5277,5278],{"class":237},"'monthly-report.xlsx'",[122,5280,4091],{"class":639},[122,5282,5283],{"class":237},"'一月'",[122,5285,2444],{"class":639},[122,5287,5288,5290,5292,5294,5296,5298,5300],{"class":222,"line":230},[122,5289,4101],{"class":632},[122,5291,4104],{"class":233},[122,5293,4107],{"class":639},[122,5295,4110],{"class":237},[122,5297,4091],{"class":639},[122,5299,4115],{"class":237},[122,5301,4123],{"class":639},[122,5303,5304,5306,5308,5311,5314,5316,5319],{"class":222,"line":248},[122,5305,4101],{"class":632},[122,5307,4130],{"class":233},[122,5309,5310],{"class":639},"([[",[122,5312,5313],{"class":237},"'服務收入'",[122,5315,4091],{"class":639},[122,5317,5318],{"class":241},"50000",[122,5320,5321],{"class":639},"]]);\n",[122,5323,5324],{"class":222,"line":260},[122,5325,264],{"emptyLinePlaceholder":263},[122,5327,5328,5330,5332,5335,5337,5340],{"class":222,"line":267},[122,5329,4368],{"class":639},[122,5331,4080],{"class":632},[122,5333,5334],{"class":233},"addSheet",[122,5336,4013],{"class":639},[122,5338,5339],{"class":237},"'二月'",[122,5341,2444],{"class":639},[122,5343,5344,5346,5348,5350,5352,5354,5356],{"class":222,"line":273},[122,5345,4101],{"class":632},[122,5347,4104],{"class":233},[122,5349,4107],{"class":639},[122,5351,4110],{"class":237},[122,5353,4091],{"class":639},[122,5355,4115],{"class":237},[122,5357,4123],{"class":639},[122,5359,5360,5362,5364,5366,5368,5370,5373],{"class":222,"line":660},[122,5361,4101],{"class":632},[122,5363,4130],{"class":233},[122,5365,5310],{"class":639},[122,5367,5313],{"class":237},[122,5369,4091],{"class":639},[122,5371,5372],{"class":241},"62000",[122,5374,5375],{"class":639},"]])\n",[122,5377,5378,5380,5382],{"class":222,"line":672},[122,5379,4101],{"class":632},[122,5381,4220],{"class":233},[122,5383,4223],{"class":639},[54,5385,5386],{"id":5386},"結論",[15,5388,5389,5390,193,5392,436,5395,5398,5399,5401],{},"xlswriter 很適合 PHP 專案中「大量資料匯出、低記憶體讀取」的需求。一般報表可從 ",[127,5391,4551],{},[127,5393,5394],{},"header()",[127,5396,5397],{},"data()"," 開始；資料量上來後，再改用 ",[127,5400,4265],{}," 配合逐筆或分批資料來源。",[15,5403,5404,5405,436,5410,141],{},"更多樣式、圖片、圖表、條件格式與資料驗證的使用方式，可參考 ",[24,5406,5409],{"href":5407,"rel":5408},"https:\u002F\u002Fxlswriter-docs.viest.me\u002F",[28],"xlswriter 官方文件",[24,5411,5413],{"href":3769,"rel":5412},[28],"GitHub 專案說明",[1579,5415,1581],{},{"title":217,"searchDepth":230,"depth":230,"links":5417},[5418,5419,5420,5424,5425,5426,5427,5432],{"id":3757,"depth":230,"text":3757},{"id":3784,"depth":230,"text":3785},{"id":3808,"depth":230,"text":3808,"children":5421},[5422,5423],{"id":3811,"depth":248,"text":3812},{"id":3899,"depth":248,"text":3900},{"id":3990,"depth":230,"text":3991},{"id":4258,"depth":230,"text":4259},{"id":4567,"depth":230,"text":4568},{"id":4874,"depth":230,"text":4875,"children":5428},[5429,5430,5431],{"id":4878,"depth":248,"text":4878},{"id":5093,"depth":248,"text":5093},{"id":5249,"depth":248,"text":5249},{"id":5386,"depth":230,"text":5386},"program","\u002Fimages\u002Farticles\u002F2026-08-23-php-xlswriter\u002Fcover.png",{},"\u002Farticles\u002F2026-08-23-php-xlswriter","2026-08-23 16:34:00",{"title":3752,"description":217},"articles\u002F2026-08-23-php-xlswriter","當 PHP 需要匯出或讀取大量 Excel 資料時，xlswriter 能以 C 擴充套件提供低記憶體、高效率的 XLSX 處理方式。本文整理安裝流程、基本讀寫與大檔案實務。",[3944,5442,5443],"xlsx","excel","PjuYpKGMlBP6OKKk89MouFpPRrxi7MEm_mATwpAnBr0",{"id":5446,"title":5447,"body":5448,"category":5516,"description":5517,"extension":1601,"image":5518,"meta":5519,"navigation":263,"path":5520,"pubDate":5521,"seo":5522,"status":263,"stem":5523,"summary":5524,"tags":5525,"__hash__":5526},"content\u002Farticles\u002F2026-08-16-2026-new-theme.md","2026 新版型",{"type":8,"value":5449,"toc":5514},[5450,5453,5473,5491,5494,5505],[11,5451,5452],{"id":5452},"更新內容",[15,5454,5455,5456,5459,5460,5462,5463,5466,5467,5469,5470,5472],{},"這幾年 AI 能力飛越式進步，而 ",[127,5457,5458],{},"vibe coding"," 更是成熱門話題，自己的工作，也開始導入 ",[127,5461,5458],{}," ，最近心血來潮，想著自己的部落格的技術堆疊，也許久沒有更新了，還停留在 2022 年的 ",[127,5464,5465],{},"nuxt.js"," 2 建構，而如今 ",[127,5468,5465],{}," 已然更新至第 4 版了，所以不如用 ",[127,5471,5458],{}," 來重建自己的部落格。",[15,5474,5475,5476,5479,5480,5482,5483,5486,5487,5490],{},"這次主要使用 ",[127,5477,5478],{},"opencode"," 來進行開發，使用了 ",[127,5481,5465],{}," 4、",[127,5484,5485],{},"nuxt\u002Fcontent"," v3 和 ",[127,5488,5489],{},"nuxt\u002Fui"," 等套件來建立這個部落格。",[11,5492,5493],{"id":5493},"感想",[15,5495,5475,5496,5498,5499,5501,5502,5504],{},[127,5497,5458],{}," 旳方式進行開發，整個開發體驗想當不錯，或許開發部落格網站，對於 AI 模型的要求並不高，只用了 ",[127,5500,5478],{}," 官方提供的免費模型，就完成了大部份的功能，也且開發時間，記得舊部格程式前後，也差不多也花了一個多月的空閒時間手刻，不過這次用 ",[127,5503,5458],{}," 整體花的時間，約十多天的天數，就完成大部份的功能。",[15,5506,5507,5508,5510,5511,5513],{},"看來 ",[127,5509,5458],{}," 也成為未來開發系統的主流，後續我也會分享自己 ",[127,5512,5458],{}," 的經驗。",{"title":217,"searchDepth":230,"depth":230,"links":5515},[],"站務","這幾年 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":5447,"description":5517},"articles\u002F2026-08-16-2026-new-theme","部落格從 2022 年的 Nuxt 2 升級至 Nuxt 4 與 Nuxt Content v3，全程以 vibe coding 進行，使用 opencode 與免費模型完成大部分功能，開發時間從一個多月縮短至十多天，記錄這次難得的重建體驗。",[5516],"kfi3xMmARhktM-Gn0dE78ZILmke6mSELMjRhOJ857nE",{"id":5528,"title":5529,"body":5530,"category":1599,"description":217,"extension":1601,"image":6110,"meta":6111,"navigation":263,"path":6112,"pubDate":6113,"seo":6114,"status":263,"stem":6115,"summary":6116,"tags":6117,"__hash__":6118},"content\u002Farticles\u002F2026-06-29-opencode-state.md","使用 OpenCode stats 指令掌握 AI 開發成本：完整參數與實戰範例",{"type":8,"value":5531,"toc":6088},[5532,5540,5543,5557,5563,5565,5571,5574,5586,5589,5591,5594,5599,5614,5617,5639,5642,5644,5650,5656,5673,5676,5692,5694,5700,5706,5748,5751,5759,5761,5767,5773,5814,5817,5825,5827,5833,5839,5861,5864,5885,5892,5894,5897,5900,5904,5907,5932,5935,5946,5949,5951,5955,5958,5977,5980,5988,5991,5993,5997,6000,6020,6023,6031,6034,6042,6044,6048,6054,6068,6079,6085],[54,5533,5535,5536,5539],{"id":5534},"為什麼要看-opencode-stats","為什麼要看 ",[127,5537,5538],{},"opencode stats","？",[15,5541,5542],{},"當我們開始大量使用 AI 做開發（Code Review、產生程式碼、寫文件、跑資料分析…），往往會有幾個共同的疑問：",[156,5544,5545,5548,5551,5554],{},[159,5546,5547],{},"最近到底用了多少 Token？",[159,5549,5550],{},"哪些模型最燒錢？",[159,5552,5553],{},"哪些工具（像 bash、webfetch 這類）被呼叫得最頻繁？",[159,5555,5556],{},"某個專案是不是特別花錢？",[15,5558,5559,5560,5562],{},"如果手上沒有清楚的統計數據，很難優化「模型選擇」與「使用習慣」。這時候，OpenCode 的 ",[127,5561,5538],{}," 就派上用場了。",[51,5564],{},[54,5566,5568,5570],{"id":5567},"opencode-stats-基本用法",[127,5569,5538],{}," 基本用法",[15,5572,5573],{},"最基本的指令非常單純：",[212,5575,5577],{"className":214,"code":5576,"language":216,"meta":217,"style":217},"opencode stats  \n",[127,5578,5579],{"__ignoreMap":217},[122,5580,5581,5583],{"class":222,"line":223},[122,5582,5478],{"class":233},[122,5584,5585],{"class":237}," stats\n",[15,5587,5588],{},"不帶任何參數時，它會顯示「所有時間、所有專案」的整體 Token 用量與費用統計，適合當作一個總體健康檢查（Health Check）：最近 AI 用得多不多、成本有沒有暴衝。",[51,5590],{},[54,5592,5593],{"id":5593},"常用參數與行為說明",[15,5595,5596,5598],{},[127,5597,5538],{}," 支援一組 flags，可以自由組合：",[212,5600,5602],{"className":214,"code":5601,"language":216,"meta":217,"style":217},"opencode stats [flags]  \n",[127,5603,5604],{"__ignoreMap":217},[122,5605,5606,5608,5611],{"class":222,"line":223},[122,5607,5478],{"class":233},[122,5609,5610],{"class":237}," stats",[122,5612,5613],{"class":639}," [flags]\n",[15,5615,5616],{},"常用的有這幾個：",[156,5618,5619,5624,5629,5634],{},[159,5620,5621],{},[127,5622,5623],{},"--days N",[159,5625,5626],{},[127,5627,5628],{},"--tools [N]",[159,5630,5631],{},[127,5632,5633],{},"--models [N]",[159,5635,5636],{},[127,5637,5638],{},"--project P",[15,5640,5641],{},"下面逐一說明它們的用途與使用情境。",[51,5643],{},[2667,5645,5647,5649],{"id":5646},"days-n限制查詢時間範圍",[127,5648,5623],{},"：限制查詢時間範圍",[15,5651,5652,5655],{},[127,5653,5654],{},"--days"," 用來控制「要看最近幾天」的用量。例如，只想看最近一週：",[212,5657,5659],{"className":214,"code":5658,"language":216,"meta":217,"style":217},"opencode stats --days 7  \n",[127,5660,5661],{"__ignoreMap":217},[122,5662,5663,5665,5667,5670],{"class":222,"line":223},[122,5664,5478],{"class":233},[122,5666,5610],{"class":237},[122,5668,5669],{"class":241}," --days",[122,5671,5672],{"class":241}," 7\n",[15,5674,5675],{},"這在兩種情境特別好用：",[353,5677,5678,5685],{},[159,5679,5680,5681,5684],{},"每月或每週例行檢查：例如每到月底看一次 ",[127,5682,5683],{},"--days 30","，檢查這個月 AI 成本。",[159,5686,5687,5688,5691],{},"某次實驗或專案密集期：例如你在最近兩週大量嘗試新模型，就可以用 ",[127,5689,5690],{},"--days 14"," 來看這段期間的影響。",[51,5693],{},[2667,5695,5697,5699],{"id":5696},"tools-n觀察工具使用熱度",[127,5698,5628],{},"：觀察工具使用熱度",[15,5701,5702,5705],{},[127,5703,5704],{},"--tools"," 會列出各個工具（例如 bash、webfetch…）的使用統計。若不帶數字，會顯示全部工具；帶數字則只顯示前 N 名。你可以：",[212,5707,5709],{"className":214,"code":5708,"language":216,"meta":217,"style":217},"# 顯示所有工具用量  \nopencode stats --tools  \n\n# 只顯示使用量前 5 名的工具  \nopencode stats --tools 5  \n",[127,5710,5711,5716,5728,5732,5737],{"__ignoreMap":217},[122,5712,5713],{"class":222,"line":223},[122,5714,5715],{"class":226},"# 顯示所有工具用量  \n",[122,5717,5718,5720,5722,5725],{"class":222,"line":230},[122,5719,5478],{"class":233},[122,5721,5610],{"class":237},[122,5723,5724],{"class":241}," --tools",[122,5726,5727],{"class":639},"  \n",[122,5729,5730],{"class":222,"line":248},[122,5731,264],{"emptyLinePlaceholder":263},[122,5733,5734],{"class":222,"line":260},[122,5735,5736],{"class":226},"# 只顯示使用量前 5 名的工具  \n",[122,5738,5739,5741,5743,5745],{"class":222,"line":267},[122,5740,5478],{"class":233},[122,5742,5610],{"class":237},[122,5744,5724],{"class":241},[122,5746,5747],{"class":241}," 5\n",[15,5749,5750],{},"這有幾個實際用途：",[156,5752,5753,5756],{},[159,5754,5755],{},"了解「AI 在幫你做什麼」：是更多在跑 shell 指令、還是瘋狂打 API？",[159,5757,5758],{},"找出可能的最佳化點：某個工具用量特別高，可能代表流程可以再調整，或有機會改成一次性的腳本／排程。",[51,5760],{},[2667,5762,5764,5766],{"id":5763},"models-n檢視模型用量與費用明細",[127,5765,5633],{},"：檢視模型用量與費用明細",[15,5768,5769,5772],{},[127,5770,5771],{},"--models"," 則是針對各個模型（provider\u002Fmodel，例如某家雲廠商的特定模型）的 Token 與費用明細。若不帶數字，會列出所有模型明細；帶數字則只顯示前 N 名。你可以：",[212,5774,5776],{"className":214,"code":5775,"language":216,"meta":217,"style":217},"# 顯示所有模型詳細用量  \nopencode stats --models  \n\n# 只顯示用量前 3 名的模型  \nopencode stats --models 3  \n",[127,5777,5778,5783,5794,5798,5803],{"__ignoreMap":217},[122,5779,5780],{"class":222,"line":223},[122,5781,5782],{"class":226},"# 顯示所有模型詳細用量  \n",[122,5784,5785,5787,5789,5792],{"class":222,"line":230},[122,5786,5478],{"class":233},[122,5788,5610],{"class":237},[122,5790,5791],{"class":241}," --models",[122,5793,5727],{"class":639},[122,5795,5796],{"class":222,"line":248},[122,5797,264],{"emptyLinePlaceholder":263},[122,5799,5800],{"class":222,"line":260},[122,5801,5802],{"class":226},"# 只顯示用量前 3 名的模型  \n",[122,5804,5805,5807,5809,5811],{"class":222,"line":267},[122,5806,5478],{"class":233},[122,5808,5610],{"class":237},[122,5810,5791],{"class":241},[122,5812,5813],{"class":241}," 3\n",[15,5815,5816],{},"這對於成本控管特別關鍵：",[156,5818,5819,5822],{},[159,5820,5821],{},"找出哪幾個模型是主力：你日常最常依賴哪些模型。",[159,5823,5824],{},"監控高單價模型：如果某些高價模型意外成為 Top 3，就需要檢查是否有誤用或參數設計不佳的地方。",[51,5826],{},[2667,5828,5830,5832],{"id":5829},"project-p聚焦在特定專案",[127,5831,5638],{},"：聚焦在特定專案",[15,5834,5835,5838],{},[127,5836,5837],{},"--project"," 用來對某個專案做切片統計：",[212,5840,5842],{"className":214,"code":5841,"language":216,"meta":217,"style":217},"# 只看名為 \"project-name\" 的專案  \nopencode stats --project project-name  \n",[127,5843,5844,5849],{"__ignoreMap":217},[122,5845,5846],{"class":222,"line":223},[122,5847,5848],{"class":226},"# 只看名為 \"project-name\" 的專案  \n",[122,5850,5851,5853,5855,5858],{"class":222,"line":230},[122,5852,5478],{"class":233},[122,5854,5610],{"class":237},[122,5856,5857],{"class":241}," --project",[122,5859,5860],{"class":237}," project-name\n",[15,5862,5863],{},"如果你已經在專案資料夾裡，還可以傳入空字串表示「當前專案」：",[212,5865,5867],{"className":214,"code":5866,"language":216,"meta":217,"style":217},"# 只看目前所在資料夾這個專案的統計  \nopencode stats --project \"\"  \n",[127,5868,5869,5874],{"__ignoreMap":217},[122,5870,5871],{"class":222,"line":223},[122,5872,5873],{"class":226},"# 只看目前所在資料夾這個專案的統計  \n",[122,5875,5876,5878,5880,5882],{"class":222,"line":230},[122,5877,5478],{"class":233},[122,5879,5610],{"class":237},[122,5881,5857],{"class":241},[122,5883,5884],{"class":237}," \"\"\n",[15,5886,5887,5888,5891],{},"這在你只想分析單一 repo 時特別好用。請注意，若你並不在專案資料夾裡，",[127,5889,5890],{},"--project \"\""," 可能不會取得預期結果。",[51,5893],{},[54,5895,5896],{"id":5896},"實戰組合範例",[15,5898,5899],{},"前面介紹完各個參數，我習慣在實作時搭配成幾個常用的查詢模板。",[2667,5901,5903],{"id":5902},"_1-最近-30-天目前專案的模型-top-5","1. 最近 30 天、目前專案的模型 Top 5",[15,5905,5906],{},"當你在某個專案上大量使用 AI 之後，很適合來一個月度回顧：",[212,5908,5910],{"className":214,"code":5909,"language":216,"meta":217,"style":217},"opencode stats --days 30 --project \"\" --models 5  \n",[127,5911,5912],{"__ignoreMap":217},[122,5913,5914,5916,5918,5920,5923,5925,5928,5930],{"class":222,"line":223},[122,5915,5478],{"class":233},[122,5917,5610],{"class":237},[122,5919,5669],{"class":241},[122,5921,5922],{"class":241}," 30",[122,5924,5857],{"class":241},[122,5926,5927],{"class":237}," \"\"",[122,5929,5791],{"class":241},[122,5931,5747],{"class":241},[15,5933,5934],{},"這條指令會告訴你：",[156,5936,5937,5940,5943],{},[159,5938,5939],{},"最近 30 天，這個專案用了哪些模型？",[159,5941,5942],{},"哪些模型是前五名？用量大概占比多少？",[159,5944,5945],{},"有沒有哪個模型使用量超出你原先的預期？",[15,5947,5948],{},"如果你發現某個昂貴的模型排進 Top 5，而且還不是關鍵需求，就可以考慮換成 CP 值更高的選擇。",[51,5950],{},[2667,5952,5954],{"id":5953},"_2-最近-14-天全工作區工具使用總覽","2. 最近 14 天、全工作區工具使用總覽",[15,5956,5957],{},"如果你想從「工作型態」的角度切入，而不是模型角度，可以這樣看工具用量：",[212,5959,5961],{"className":214,"code":5960,"language":216,"meta":217,"style":217},"opencode stats --days 14 --tools  \n",[127,5962,5963],{"__ignoreMap":217},[122,5964,5965,5967,5969,5971,5974],{"class":222,"line":223},[122,5966,5478],{"class":233},[122,5968,5610],{"class":237},[122,5970,5669],{"class":241},[122,5972,5973],{"class":241}," 14",[122,5975,5976],{"class":241}," --tools\n",[15,5978,5979],{},"透過這個視角，你可以觀察：",[156,5981,5982,5985],{},[159,5983,5984],{},"AI 比較常幫你做 I\u002FO（例如 webfetch），還是純文字推理？",[159,5986,5987],{},"是否大量使用某些 Shell 工具（例如 bash），代表你已經開始把 DevOps 類型的任務交給 AI？",[15,5989,5990],{},"這有助於你調整自己的工作習慣，例如將重複性的 CLI 操作逐步交給 AI 自動化。",[51,5992],{},[2667,5994,5996],{"id":5995},"_3-單一專案的完整成本分析模型-工具","3. 單一專案的完整成本分析（模型 + 工具）",[15,5998,5999],{},"當你想為某個專案做一次「完整的 AI 成本盤點」時，可以把模型與工具一起開：",[212,6001,6003],{"className":214,"code":6002,"language":216,"meta":217,"style":217},"opencode stats --project project-name --models --tools  \n",[127,6004,6005],{"__ignoreMap":217},[122,6006,6007,6009,6011,6013,6016,6018],{"class":222,"line":223},[122,6008,5478],{"class":233},[122,6010,5610],{"class":237},[122,6012,5857],{"class":241},[122,6014,6015],{"class":237}," project-name",[122,6017,5791],{"class":241},[122,6019,5976],{"class":241},[15,6021,6022],{},"用這種方式，你可以同時看到：",[156,6024,6025,6028],{},[159,6026,6027],{},"這個專案用了哪些模型、各自的 Token 與費用。",[159,6029,6030],{},"AI 在這個專案裡最常被拿來搭配哪些工具。",[15,6032,6033],{},"從這些數據出發，你可以進一步調整：",[156,6035,6036,6039],{},[159,6037,6038],{},"Default 模型（讓 Plan \u002F Build 走更便宜或更強大的路線）。",[159,6040,6041],{},"工作流程設計（例如是否將某些重度工具操作改成批次執行，而不是在對話中頻繁觸發）。",[51,6043],{},[54,6045,6047],{"id":6046},"結語用數據讓-ai-助手更划算","結語：用數據讓 AI 助手更「划算」",[15,6049,6050,6051,6053],{},"引入 AI 助手到日常開發流程，不只是為了「變快」或「變輕鬆」，更重要的是能長期、可持續地使用。",[127,6052,5538],{}," 提供的，就是一個將「感覺」轉成「數字」的入口。",[15,6055,6056,6057,6059,6060,6062,6063,436,6065,6067],{},"透過 ",[127,6058,5654],{}," 控制時間範圍、",[127,6061,5837],{}," 聚焦特定專案，再搭配 ",[127,6064,5771],{},[127,6066,5704],{}," 做細部分析，你可以：",[156,6069,6070,6073,6076],{},[159,6071,6072],{},"找出真正的主力模型與工具。",[159,6074,6075],{},"及早發現成本異常的使用模式。",[159,6077,6078],{},"有依據地調整預設模型與工作流程設計。",[15,6080,6081,6082,6084],{},"如果你已經習慣用 OpenCode 協助開發，建議把幾條常用的 ",[127,6083,5538],{}," 查詢，加到自己的工作流程（甚至包成 script 或 alias），讓「看 AI 成本」和「看 CI\u002FCD 狀態」、「看監控儀表板」一樣自然，成為開發日常的一部分。",[1579,6086,6087],{},"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":217,"searchDepth":230,"depth":230,"links":6089},[6090,6092,6094,6104,6109],{"id":5534,"depth":230,"text":6091},"為什麼要看 opencode stats？",{"id":5567,"depth":230,"text":6093},"opencode stats 基本用法",{"id":5593,"depth":230,"text":5593,"children":6095},[6096,6098,6100,6102],{"id":5646,"depth":248,"text":6097},"--days N：限制查詢時間範圍",{"id":5696,"depth":248,"text":6099},"--tools [N]：觀察工具使用熱度",{"id":5763,"depth":248,"text":6101},"--models [N]：檢視模型用量與費用明細",{"id":5829,"depth":248,"text":6103},"--project P：聚焦在特定專案",{"id":5896,"depth":230,"text":5896,"children":6105},[6106,6107,6108],{"id":5902,"depth":248,"text":5903},{"id":5953,"depth":248,"text":5954},{"id":5995,"depth":248,"text":5996},{"id":6046,"depth":230,"text":6047},"\u002Fimages\u002Farticles\u002F2026-06-29-opencode-state\u002Fcover.png",{},"\u002Farticles\u002F2026-06-29-opencode-state","2026-06-29 15:02:00",{"title":5529,"description":217},"articles\u002F2026-06-29-opencode-state","當 AI 助手真正進入開發流程後，**量化模型與工具的使用情況、掌握實際成本**就變得非常重要 OpenCode 提供的 `opencode stats` 指令，可以幫你快速統計各模型、各工具、各專案的 Token 用量與花費。從「感覺好像很常用」進化到「有數字、有依據」的資源管理。本文整理 `opencode stats` 的常見參數與組合用法，並分享幾個實務上常用的查詢範例。",[1610,5478,1614,1613],"yQw3h2bKYW2VAUAF2zAXSLe_JOHylI9yq7K7oL9oWVM",{"id":6120,"title":6121,"body":6122,"category":1599,"description":217,"extension":1601,"image":6355,"meta":6356,"navigation":263,"path":6357,"pubDate":6358,"seo":6359,"status":263,"stem":6360,"summary":6361,"tags":6362,"__hash__":6363},"content\u002Farticles\u002F2026-05-15-opencode-context7-mcp.md","告別 AI 幻覺！用 Context7 MCP 讓 Opencode 即時讀取最新官方文件",{"type":8,"value":6123,"toc":6348},[6124,6128,6137,6140,6144,6147,6179,6183,6190,6193,6207,6225,6231,6234,6318,6321,6334,6340,6342,6345],[54,6125,6127],{"id":6126},"何為-mcp","何為  MCP",[15,6129,6130,6131,6136],{},"全名為 Model Context Protocol（模型上下文協定），它是一種讓 AI 可以「連接外部工具、資料、服務」的標準協定。由 ",[24,6132,6135],{"href":6133,"rel":6134},"https:\u002F\u002Fwww.anthropic.com?utm_source=chatgpt.com",[28],"Anthropic"," 在 2024 年提出。",[15,6138,6139],{},"簡單的說讓AI模型與外部工具互通的協定， 摡念就像是不同設備間，可以用 USB 這個通訊協定來互傳資料",[54,6141,6143],{"id":6142},"mcp-可以做什麼","MCP 可以做什麼？",[15,6145,6146],{},"它能讓AI模型做以下事情，甚致更多，只要應用服務商提供 MCP 接口，就可以讓 AI 模型操作各種服務",[156,6148,6149,6152,6155,6158,6161,6164,6167,6170,6173,6176],{},[159,6150,6151],{},"讀檔案",[159,6153,6154],{},"查資料庫",[159,6156,6157],{},"操作 GitHub",[159,6159,6160],{},"控制 Docker",[159,6162,6163],{},"查官方文件",[159,6165,6166],{},"執行 Shell",[159,6168,6169],{},"發 Slack",[159,6171,6172],{},"查 Notion",[159,6174,6175],{},"存取 PostgreSQL",[159,6177,6178],{},"操作 Browser",[54,6180,6182],{"id":6181},"何謂-context7","何謂 Context7",[15,6184,6185,6186,6189],{},"Context7 是 MCP 中很出名的應用服務，它可以讓 AI 模型在 coding 時，可以即時讀取",[19,6187,6188],{},"最新版本的官方文件","，讓 AI 模型在進行回答或 Vibe Coding 時，可以即時查詢官方文件，來回答問題，而非僅靠訓練記憶，更可大幅減少 AI 幻覺。",[15,6191,6192],{},"如可在opencode 中設定 Context7 MCP",[353,6194,6195,6204],{},[159,6196,6197,6198,6203],{},"在 ",[24,6199,6202],{"href":6200,"rel":6201},"https:\u002F\u002Fcontext7.com\u002F",[28],"Context 7 官網"," 註冊帳號",[159,6205,6206],{},"在命令列執行以下指令：",[212,6208,6210],{"className":214,"code":6209,"language":216,"meta":217,"style":217},"npx ctx7 setup --opencode\n",[127,6211,6212],{"__ignoreMap":217},[122,6213,6214,6216,6219,6222],{"class":222,"line":223},[122,6215,1808],{"class":233},[122,6217,6218],{"class":237}," ctx7",[122,6220,6221],{"class":237}," setup",[122,6223,6224],{"class":241}," --opencode\n",[15,6226,6227,6228],{},"此指令將會幫你取得 Context7 API key，建議先入 ",[24,6229,6202],{"href":6200,"rel":6230},[28],[15,6232,6233],{},"安裝成功會出現以下訊息：",[212,6235,6237],{"className":214,"code":6236,"language":216,"meta":217,"style":217},"✔ 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",[127,6238,6239,6252,6256,6261,6284,6289,6299,6304,6313],{"__ignoreMap":217},[122,6240,6241,6244,6247,6249],{"class":222,"line":223},[122,6242,6243],{"class":233},"✔",[122,6245,6246],{"class":237}," Context7",[122,6248,6221],{"class":237},[122,6250,6251],{"class":237}," complete\n",[122,6253,6254],{"class":222,"line":230},[122,6255,264],{"emptyLinePlaceholder":263},[122,6257,6258],{"class":222,"line":248},[122,6259,6260],{"class":233},"  OpenCode\n",[122,6262,6263,6266,6269,6272,6275,6278,6281],{"class":222,"line":260},[122,6264,6265],{"class":233},"    +",[122,6267,6268],{"class":237}," MCP",[122,6270,6271],{"class":237}," server",[122,6273,6274],{"class":237}," configured",[122,6276,6277],{"class":237}," with",[122,6279,6280],{"class":237}," API",[122,6282,6283],{"class":237}," Key\n",[122,6285,6286],{"class":222,"line":267},[122,6287,6288],{"class":233},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002Fopencode.json\n",[122,6290,6291,6293,6296],{"class":222,"line":273},[122,6292,6265],{"class":233},[122,6294,6295],{"class":237}," Rule",[122,6297,6298],{"class":237}," installed\n",[122,6300,6301],{"class":222,"line":660},[122,6302,6303],{"class":233},"      \u002FUsers\u002Fuser\u002F.config\u002Fopencode\u002FAGENTS.md\n",[122,6305,6306,6308,6311],{"class":222,"line":672},[122,6307,6265],{"class":233},[122,6309,6310],{"class":237}," Skill",[122,6312,6298],{"class":237},[122,6314,6315],{"class":222,"line":701},[122,6316,6317],{"class":233},"      \u002FUsers\u002Fuser\u002F.agents\u002Fskills\u002Fcontext7-mcp\u002FSKILL.md\n",[54,6319,6320],{"id":6320},"驗證安裝",[15,6322,6197,6323,6325,6326,6329,6330,6333],{},[127,6324,5478],{}," 命令列中，輪入 ",[127,6327,6328],{},"\u002Fmcps"," 在列表中看見 ",[127,6331,6332],{},"context7 connected"," 資訊表示安裝成功",[15,6335,6336],{},[2494,6337],{"alt":6338,"src":6339},"Opencode MCP List","\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fopencode-mcp.png",[54,6341,5386],{"id":5386},[15,6343,6344],{},"MCP 協定的出現讓 AI 從單純的「知識庫」轉變為能操作工具的「代理人」。而 Context7 則解決了 AI 最令人頭痛的「過時資訊」問題。將其設定在 Opencode 中後，AI 能夠在即時對接官方文件的基礎上進行編碼，讓開發體驗更加流暢且可靠。",[1579,6346,6347],{},"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":217,"searchDepth":230,"depth":230,"links":6349},[6350,6351,6352,6353,6354],{"id":6126,"depth":230,"text":6127},{"id":6142,"depth":230,"text":6143},{"id":6181,"depth":230,"text":6182},{"id":6320,"depth":230,"text":6320},{"id":5386,"depth":230,"text":5386},"\u002Fimages\u002Farticles\u002F2026-05-15-opencode-context7-mcp\u002Fcover.png",{},"\u002Farticles\u002F2026-05-15-opencode-context7-mcp","2026-05-15 14:44:00",{"title":6121,"description":217},"articles\u002F2026-05-15-opencode-context7-mcp","Context7 這款 MCP 應用，它能讓 Opencode 在編碼時即時讀取最新版本的官方文件，而非僅依賴過時的訓練記憶，從而大幅減少 AI 幻覺並提升回答的準確性。",[1610,5478,1614,1613],"MD4aLm9bpk4W1cPswPYYPpPu2SWjkYB6cY0MKJo50aY",{"id":6365,"title":6366,"body":6367,"category":3748,"description":217,"extension":1601,"image":6785,"meta":6786,"navigation":263,"path":6787,"pubDate":6788,"seo":6789,"status":263,"stem":6790,"summary":6791,"tags":6792,"__hash__":6795},"content\u002Farticles\u002F2026-02-27-mole-tutorial.md","Mole 使用教學：macOS 深度清理與優化神器",{"type":8,"value":6368,"toc":6762},[6369,6373,6397,6400,6409,6411,6415,6418,6422,6436,6439,6442,6461,6468,6470,6473,6480,6483,6501,6537,6544,6550,6562,6565,6572,6578,6586,6598,6605,6608,6625,6637,6644,6647,6665,6677,6684,6699,6711,6713,6716,6750,6752,6754,6757,6759],[54,6370,6372],{"id":6371},"什麼是-mole","什麼是 Mole？",[15,6374,6375,6380,6381,6384,6385,6388,6389,6392,6393,6396],{},[24,6376,6379],{"href":6377,"rel":6378},"https:\u002F\u002Fgithub.com\u002Ftw93\u002FMole",[28],"Mole"," 是一個為 macOS 設計的開源全能工具箱。它的目標是取代多個付費或分散的工具，將 ",[19,6382,6383],{},"CleanMyMac","（清理）、",[19,6386,6387],{},"AppCleaner","（解除安裝）、",[19,6390,6391],{},"DaisyDisk","（磁碟分析）以及 ",[19,6394,6395],{},"iStat Menus","（實時監控）的核心功能整合進一個單一的二進位檔案中。",[15,6398,6399],{},"Mole 採用終端機介面（TUI），操作流暢且反應迅速，非常適合喜愛簡潔、高效工作的開發者與進階使用者。",[15,6401,6402,1839,6405],{},[19,6403,6404],{},"專案網址",[24,6406,6408],{"href":6377,"rel":6407},[28],"tw93\u002FMole",[51,6410],{},[54,6412,6414],{"id":6413},"安裝-mole","安裝 Mole",[15,6416,6417],{},"安裝 Mole 極其簡單，你可以選擇透過 Homebrew（推薦）或是官方腳本。",[2667,6419,6421],{"id":6420},"使用-homebrew","使用 Homebrew",[212,6423,6425],{"className":214,"code":6424,"language":216,"meta":217,"style":217},"brew install mole\n",[127,6426,6427],{"__ignoreMap":217},[122,6428,6429,6431,6433],{"class":222,"line":223},[122,6430,234],{"class":233},[122,6432,238],{"class":237},[122,6434,6435],{"class":237}," mole\n",[2667,6437,6438],{"id":6438},"使用官方腳本",[15,6440,6441],{},"如果你沒有安裝 Homebrew，也可以直接執行安裝腳本：",[212,6443,6445],{"className":214,"code":6444,"language":216,"meta":217,"style":217},"curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh | bash\n",[127,6446,6447],{"__ignoreMap":217},[122,6448,6449,6451,6453,6456,6458],{"class":222,"line":223},[122,6450,3127],{"class":233},[122,6452,3130],{"class":241},[122,6454,6455],{"class":237}," https:\u002F\u002Fraw.githubusercontent.com\u002Ftw93\u002Fmole\u002Fmain\u002Finstall.sh",[122,6457,3315],{"class":632},[122,6459,6460],{"class":233}," bash\n",[15,6462,6463,6464,6467],{},"安裝完成後，在終端機輸入 ",[127,6465,6466],{},"mo"," 即可啟動互動式選單，或直接加上子命令執行特定功能。",[51,6469],{},[54,6471,6472],{"id":6472},"核心功能詳解",[2667,6474,6476,6477,3161],{"id":6475},"_1-深度系統清理-mo-clean","1. 深度系統清理 (",[127,6478,6479],{},"mo clean",[15,6481,6482],{},"這是 Mole 最常用的功能。它會掃描系統中的各種快取、日誌與垃圾檔案，並提供視覺化的清理建議。",[156,6484,6485,6491],{},[159,6486,6487,6490],{},[19,6488,6489],{},"掃描範疇","：應用程式快取、瀏覽器快取（Chrome, Safari, Firefox）、開發者工具（Xcode, Node.js）、系統日誌、垃圾桶等。",[159,6492,6493,6496,6497,6500],{},[19,6494,6495],{},"預覽模式","：建議先執行 ",[127,6498,6499],{},"mo clean --dry-run"," 來查看預計清理的內容與風險等級。",[212,6502,6504],{"className":214,"code":6503,"language":216,"meta":217,"style":217},"# 執行深度清理\nmo clean\n\n# 僅查看預覽，不實際刪除\nmo clean --dry-run\n",[127,6505,6506,6511,6518,6522,6527],{"__ignoreMap":217},[122,6507,6508],{"class":222,"line":223},[122,6509,6510],{"class":226},"# 執行深度清理\n",[122,6512,6513,6515],{"class":222,"line":230},[122,6514,6466],{"class":233},[122,6516,6517],{"class":237}," clean\n",[122,6519,6520],{"class":222,"line":248},[122,6521,264],{"emptyLinePlaceholder":263},[122,6523,6524],{"class":222,"line":260},[122,6525,6526],{"class":226},"# 僅查看預覽，不實際刪除\n",[122,6528,6529,6531,6534],{"class":222,"line":267},[122,6530,6466],{"class":233},[122,6532,6533],{"class":237}," clean",[122,6535,6536],{"class":241}," --dry-run\n",[2667,6538,6540,6541,3161],{"id":6539},"_2-智慧解除安裝-mo-uninstall","2. 智慧解除安裝 (",[127,6542,6543],{},"mo uninstall",[15,6545,6546,6547,6549],{},"普通的刪除應用程式往往會留下許多「殘骸」。",[127,6548,6543],{}," 會搜尋並清理所有相關的偏好設定、支援檔案、Launch Agents 以及隱藏的殘留物。",[212,6551,6553],{"className":214,"code":6552,"language":216,"meta":217,"style":217},"mo uninstall\n",[127,6554,6555],{"__ignoreMap":217},[122,6556,6557,6559],{"class":222,"line":223},[122,6558,6466],{"class":233},[122,6560,6561],{"class":237}," uninstall\n",[15,6563,6564],{},"執行後會彈出清單，讓你選擇想要徹底移除的應用程式。",[2667,6566,6568,6569,3161],{"id":6567},"_3-系統優化-mo-optimize","3. 系統優化 (",[127,6570,6571],{},"mo optimize",[15,6573,6574,6575,6577],{},"當你感覺電腦變慢或網路異常時，",[127,6576,6571],{}," 可以幫助你快速重整系統狀態。",[156,6579,6580],{},[159,6581,6582,6585],{},[19,6583,6584],{},"功能包括","：重建系統資料庫、重置網路服務、重啟 Finder 與 Dock、清理診斷紀錄、重建 Spotlight 索引等。",[212,6587,6589],{"className":214,"code":6588,"language":216,"meta":217,"style":217},"mo optimize\n",[127,6590,6591],{"__ignoreMap":217},[122,6592,6593,6595],{"class":222,"line":223},[122,6594,6466],{"class":233},[122,6596,6597],{"class":237}," optimize\n",[2667,6599,6601,6602,3161],{"id":6600},"_4-磁碟空間分析-mo-analyze","4. 磁碟空間分析 (",[127,6603,6604],{},"mo analyze",[15,6606,6607],{},"類似於 DaisyDisk，這個功能會以視覺化條狀圖顯示各個目錄的空間佔用情況，並讓你輕鬆找出隱藏的大檔案。",[156,6609,6610,6616],{},[159,6611,6612,6615],{},[19,6613,6614],{},"導覽方式","：支援方向鍵與 Vim 鍵位（h\u002Fj\u002Fk\u002Fl）。",[159,6617,6618,6621,6622,141],{},[19,6619,6620],{},"外部磁碟","：預設跳過外部磁碟以加快速度，若要分析外接硬碟可指定路徑：",[127,6623,6624],{},"mo analyze \u002FVolumes",[212,6626,6628],{"className":214,"code":6627,"language":216,"meta":217,"style":217},"mo analyze\n",[127,6629,6630],{"__ignoreMap":217},[122,6631,6632,6634],{"class":222,"line":223},[122,6633,6466],{"class":233},[122,6635,6636],{"class":237}," analyze\n",[2667,6638,6640,6641,3161],{"id":6639},"_5-實時系統狀態-mo-status","5. 實時系統狀態 (",[127,6642,6643],{},"mo status",[15,6645,6646],{},"這是一個精美的實時儀表板，提供 CPU、GPU、記憶體、磁碟 I\u002FO、網路流量以及硬體健康度（如電池循環、溫度、風扇轉速）的完整資訊。",[156,6648,6649,6655],{},[159,6650,6651,6654],{},[19,6652,6653],{},"Health Score","：根據系統壓力自動計算的健康分數。",[159,6656,6657,6660,6661,6664],{},[19,6658,6659],{},"小彩蛋","：在狀態頁面按下 ",[127,6662,6663],{},"k"," 可以召喚「太空貓」陪你工作。",[212,6666,6668],{"className":214,"code":6667,"language":216,"meta":217,"style":217},"mo status\n",[127,6669,6670],{"__ignoreMap":217},[122,6671,6672,6674],{"class":222,"line":223},[122,6673,6466],{"class":233},[122,6675,6676],{"class":237}," status\n",[2667,6678,6680,6681,3161],{"id":6679},"_6-專案快取清理-mo-purge","6. 專案快取清理 (",[127,6682,6683],{},"mo purge",[15,6685,6686,6687,193,6689,193,6692,6695,6696,6698],{},"對於開發者來說，硬碟空間常被無數專案的 ",[127,6688,486],{},[127,6690,6691],{},"target",[127,6693,6694],{},"build"," 等資料夾吞噬。",[127,6697,6683],{}," 能自動找出並清理這些舊專案的構建產物。",[212,6700,6702],{"className":214,"code":6701,"language":216,"meta":217,"style":217},"mo purge\n",[127,6703,6704],{"__ignoreMap":217},[122,6705,6706,6708],{"class":222,"line":223},[122,6707,6466],{"class":233},[122,6709,6710],{"class":237}," purge\n",[51,6712],{},[54,6714,6715],{"id":6715},"使用技巧與安全性",[156,6717,6718,6730,6740],{},[159,6719,6720,6723,6724,6726,6727,6729],{},[19,6721,6722],{},"安全第一","：Mole 刪除的檔案通常是永久性的。請務必仔細檢查清理清單，特別是在執行 ",[127,6725,6479],{}," 或 ",[127,6728,6683],{}," 時。",[159,6731,6732,6735,6736,6739],{},[19,6733,6734],{},"白名單功能","：如果你希望保護特定的快取不被清理，可以使用 ",[127,6737,6738],{},"mo clean --whitelist"," 進行設定。",[159,6741,6742,6745,6746,6749],{},[19,6743,6744],{},"日誌追蹤","：所有的檔案操作都會記錄在 ",[127,6747,6748],{},"~\u002F.config\u002Fmole\u002Foperations.log","，方便事後追蹤。",[51,6751],{},[54,6753,1520],{"id":1520},[15,6755,6756],{},"Mole 不僅是一個清理工具，更是一個讓 Mac 保持最佳狀態的隨身護理師。它開源、輕量且極致快速的原生體驗，使其成為 macOS 平台上非常具有競爭力的開源方案。如果你還在為磁碟空間不足或系統卡頓煩惱，不妨現在就安裝 Mole 體驗一下！",[51,6758],{},[1579,6760,6761],{},"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":217,"searchDepth":230,"depth":230,"links":6763},[6764,6765,6769,6783,6784],{"id":6371,"depth":230,"text":6372},{"id":6413,"depth":230,"text":6414,"children":6766},[6767,6768],{"id":6420,"depth":248,"text":6421},{"id":6438,"depth":248,"text":6438},{"id":6472,"depth":230,"text":6472,"children":6770},[6771,6773,6775,6777,6779,6781],{"id":6475,"depth":248,"text":6772},"1. 深度系統清理 (mo clean)",{"id":6539,"depth":248,"text":6774},"2. 智慧解除安裝 (mo uninstall)",{"id":6567,"depth":248,"text":6776},"3. 系統優化 (mo optimize)",{"id":6600,"depth":248,"text":6778},"4. 磁碟空間分析 (mo analyze)",{"id":6639,"depth":248,"text":6780},"5. 實時系統狀態 (mo status)",{"id":6679,"depth":248,"text":6782},"6. 專案快取清理 (mo purge)",{"id":6715,"depth":230,"text":6715},{"id":1520,"depth":230,"text":1520},"\u002Fimages\u002Farticles\u002F2026-02-27-mole-tutorial\u002Fcover.png",{},"\u002Farticles\u002F2026-02-27-mole-tutorial","2026-02-27 14:15:00",{"title":6366,"description":217},"articles\u002F2026-02-27-mole-tutorial","Mole 是一個開源的全能 macOS 優化工具，結合了 CleanMyMac、AppCleaner、DaisyDisk 和 iStat Menus 的核心功能。本文將帶你一步步掌握 Mole 的各項強大功能，讓你的 Mac 恢復往日的流暢與潔淨。",[6793,6794,1614],"MacOS","系統優化","mziUNXsCHKI6FoJ52Gvu-RdbPJ5he5GSmjS74gVH9ME",{"id":6797,"title":6798,"body":6799,"category":1599,"description":217,"extension":1601,"image":7985,"meta":7986,"navigation":263,"path":7987,"pubDate":7988,"seo":7989,"status":263,"stem":7990,"summary":7991,"tags":7992,"__hash__":7993},"content\u002Farticles\u002F2026-02-24-opencode.md","OpenCode 完全指南：開源 AI 程式碼助手讓開發效率飆升",{"type":8,"value":6800,"toc":7947},[6801,6805,6808,6812,6844,6846,6850,6853,6857,6860,6878,6881,6895,6899,6902,6962,6965,7046,7048,7052,7055,7059,7062,7086,7090,7093,7095,7098,7101,7119,7122,7131,7138,7140,7144,7147,7154,7160,7163,7166,7169,7186,7189,7192,7198,7201,7208,7214,7217,7219,7223,7226,7230,7237,7423,7427,7430,7716,7720,7729,7786,7790,7796,7810,7866,7869,7871,7874,7877,7880,7883,7886,7889,7892,7895,7898,7902,7905,7909,7912,7914,7917,7920,7922,7925,7931,7933,7935,7938,7944],[54,6802,6804],{"id":6803},"什麼是-opencode","什麼是 OpenCode？",[15,6806,6807],{},"OpenCode 是一個開源的 AI 程式碼助手，致力於讓開發者能夠在終端機、IDE 或桌面環境中更高效地撰寫程式碼。由 Anomaly 團隊開發，目前在 GitHub 上已累積超過 10 萬顆星標，擁有超過 700 位貢獻者，每月服務超過 250 萬名開發者。",[2667,6809,6811],{"id":6810},"opencode-的核心特點","OpenCode 的核心特點",[156,6813,6814,6820,6826,6832,6838],{},[159,6815,6816,6819],{},[19,6817,6818],{},"LSP 自動啟用","：自動載入正確的 LSP（Language Server Protocol）服務",[159,6821,6822,6825],{},[19,6823,6824],{},"多工作階段","：可同時在同一專案上啟動多個代理程式",[159,6827,6828,6831],{},[19,6829,6830],{},"分享連結","：可分享工作階段連結供他人參考或除錯",[159,6833,6834,6837],{},[19,6835,6836],{},"廣泛模型支援","：支援 75 種以上的 LLM 提供者，包括 Claude、GPT、Gemini 等",[159,6839,6840,6843],{},[19,6841,6842],{},"隱私優先","：不儲存任何程式碼或上下文資料，確保隱私安全",[51,6845],{},[54,6847,6849],{"id":6848},"安裝-opencode","安裝 OpenCode",[15,6851,6852],{},"OpenCode 支援多種安裝方式，以下是各平台的安裝方法：",[2667,6854,6856],{"id":6855},"linux-和-macos","Linux 和 macOS",[15,6858,6859],{},"使用官方安裝腳本是最簡單的方式：",[212,6861,6863],{"className":214,"code":6862,"language":216,"meta":217,"style":217},"curl -fsSL https:\u002F\u002Fopencode.ai\u002Finstall | bash\n",[127,6864,6865],{"__ignoreMap":217},[122,6866,6867,6869,6871,6874,6876],{"class":222,"line":223},[122,6868,3127],{"class":233},[122,6870,3130],{"class":241},[122,6872,6873],{"class":237}," https:\u002F\u002Fopencode.ai\u002Finstall",[122,6875,3315],{"class":632},[122,6877,6460],{"class":233},[15,6879,6880],{},"或者使用 Homebrew：",[212,6882,6884],{"className":214,"code":6883,"language":216,"meta":217,"style":217},"brew install anomalyco\u002Ftap\u002Fopencode\n",[127,6885,6886],{"__ignoreMap":217},[122,6887,6888,6890,6892],{"class":222,"line":223},[122,6889,234],{"class":233},[122,6891,238],{"class":237},[122,6893,6894],{"class":237}," anomalyco\u002Ftap\u002Fopencode\n",[2667,6896,6898],{"id":6897},"windows","Windows",[15,6900,6901],{},"在 Windows 上建議使用 WSL（Windows Subsystem for Linux）以獲得最佳體驗：",[212,6903,6905],{"className":214,"code":6904,"language":216,"meta":217,"style":217},"# 使用 Chocolatey\nchoco install opencode\n\n# 使用 Scoop\nscoop install opencode\n\n# 使用 NPM\nnpm install -g opencode-ai\n",[127,6906,6907,6912,6922,6926,6931,6940,6944,6949],{"__ignoreMap":217},[122,6908,6909],{"class":222,"line":223},[122,6910,6911],{"class":226},"# 使用 Chocolatey\n",[122,6913,6914,6917,6919],{"class":222,"line":230},[122,6915,6916],{"class":233},"choco",[122,6918,238],{"class":237},[122,6920,6921],{"class":237}," opencode\n",[122,6923,6924],{"class":222,"line":248},[122,6925,264],{"emptyLinePlaceholder":263},[122,6927,6928],{"class":222,"line":260},[122,6929,6930],{"class":226},"# 使用 Scoop\n",[122,6932,6933,6936,6938],{"class":222,"line":267},[122,6934,6935],{"class":233},"scoop",[122,6937,238],{"class":237},[122,6939,6921],{"class":237},[122,6941,6942],{"class":222,"line":273},[122,6943,264],{"emptyLinePlaceholder":263},[122,6945,6946],{"class":222,"line":660},[122,6947,6948],{"class":226},"# 使用 NPM\n",[122,6950,6951,6954,6956,6959],{"class":222,"line":672},[122,6952,6953],{"class":233},"npm",[122,6955,238],{"class":237},[122,6957,6958],{"class":241}," -g",[122,6960,6961],{"class":237}," opencode-ai\n",[2667,6963,6964],{"id":6964},"使用套件管理器",[212,6966,6968],{"className":214,"code":6967,"language":216,"meta":217,"style":217},"# 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",[127,6969,6970,6975,6985,6989,6994,7005,7009,7014,7025,7029,7034],{"__ignoreMap":217},[122,6971,6972],{"class":222,"line":223},[122,6973,6974],{"class":226},"# Node.js (npm)\n",[122,6976,6977,6979,6981,6983],{"class":222,"line":230},[122,6978,6953],{"class":233},[122,6980,238],{"class":237},[122,6982,6958],{"class":241},[122,6984,6961],{"class":237},[122,6986,6987],{"class":222,"line":248},[122,6988,264],{"emptyLinePlaceholder":263},[122,6990,6991],{"class":222,"line":260},[122,6992,6993],{"class":226},"# Bun\n",[122,6995,6996,6999,7001,7003],{"class":222,"line":267},[122,6997,6998],{"class":233},"bun",[122,7000,238],{"class":237},[122,7002,6958],{"class":241},[122,7004,6961],{"class":237},[122,7006,7007],{"class":222,"line":273},[122,7008,264],{"emptyLinePlaceholder":263},[122,7010,7011],{"class":222,"line":660},[122,7012,7013],{"class":226},"# pnpm\n",[122,7015,7016,7019,7021,7023],{"class":222,"line":672},[122,7017,7018],{"class":233},"pnpm",[122,7020,238],{"class":237},[122,7022,6958],{"class":241},[122,7024,6961],{"class":237},[122,7026,7027],{"class":222,"line":701},[122,7028,264],{"emptyLinePlaceholder":263},[122,7030,7031],{"class":222,"line":706},[122,7032,7033],{"class":226},"# Yarn\n",[122,7035,7036,7039,7042,7044],{"class":222,"line":712},[122,7037,7038],{"class":233},"yarn",[122,7040,7041],{"class":237}," global",[122,7043,1814],{"class":237},[122,7045,6961],{"class":237},[51,7047],{},[54,7049,7051],{"id":7050},"配置-opencode","配置 OpenCode",[15,7053,7054],{},"安裝完成後，需要配置 LLM 提供者才能開始使用。",[2667,7056,7058],{"id":7057},"連接-opencode-zen推薦","連接 OpenCode Zen（推薦）",[15,7060,7061],{},"OpenCode Zen 是經過團隊測試和驗證的優化模型集合，無需擔心模型品質不一致的問題。",[353,7063,7064,7071,7080,7083],{},[159,7065,7066,7067,7070],{},"在終端機中輸入 ",[127,7068,7069],{},"\u002Fconnect"," 命令",[159,7072,7073,7074,7079],{},"選擇 opencode 並前往 ",[24,7075,7078],{"href":7076,"rel":7077},"https:\u002F\u002Fopencode.ai\u002Fauth",[28],"opencode.ai\u002Fauth"," 進行驗證",[159,7081,7082],{},"登入後新增付款資訊並複製 API 金鑰",[159,7084,7085],{},"將 API 金鑰貼上即可完成配置",[2667,7087,7089],{"id":7088},"其他-llm-提供者","其他 LLM 提供者",[15,7091,7092],{},"如果你想使用其他 LLM 提供者（如 Claude、GPT、Gemini 等），也可以手動配置各提供者的 API 金鑰。",[51,7094],{},[54,7096,7097],{"id":7097},"初始化專案",[15,7099,7100],{},"配置完成後，即可開始使用 OpenCode：",[212,7102,7104],{"className":214,"code":7103,"language":216,"meta":217,"style":217},"cd \u002Fpath\u002Fto\u002Fyour\u002Fproject\nopencode\n",[127,7105,7106,7114],{"__ignoreMap":217},[122,7107,7108,7111],{"class":222,"line":223},[122,7109,7110],{"class":241},"cd",[122,7112,7113],{"class":237}," \u002Fpath\u002Fto\u002Fyour\u002Fproject\n",[122,7115,7116],{"class":222,"line":230},[122,7117,7118],{"class":233},"opencode\n",[15,7120,7121],{},"初始化專案：",[212,7123,7125],{"className":214,"code":7124,"language":216,"meta":217,"style":217},"\u002Finit\n",[127,7126,7127],{"__ignoreMap":217},[122,7128,7129],{"class":222,"line":223},[122,7130,7124],{"class":233},[15,7132,7133,7134,7137],{},"這會讓 OpenCode 分析你的專案並在專案根目錄建立 ",[127,7135,7136],{},"AGENTS.md"," 檔案。建議將此檔案提交至 Git，這能幫助 OpenCode 理解專案結構和編碼規範。",[51,7139],{},[54,7141,7143],{"id":7142},"opencode-實際應用","OpenCode 實際應用",[2667,7145,7146],{"id":7146},"提問與解答",[15,7148,7149,7150,7153],{},"你可以讓 OpenCode 幫你解釋程式碼。使用 ",[127,7151,7152],{},"@"," 鍵可模糊搜尋專案中的檔案：",[212,7155,7158],{"className":7156,"code":7157,"language":1934},[1932],"How is authentication handled in @packages\u002Ffunctions\u002Fsrc\u002Fapi\u002Findex.ts\n",[127,7159,7157],{"__ignoreMap":217},[15,7161,7162],{},"這對於了解他人撰寫的程式碼特別有幫助。",[2667,7164,7165],{"id":7165},"新增功能",[15,7167,7168],{},"OpenCode 的「規劃模式」是其強大功能之一。在這個模式下，OpenCode 不會直接修改程式碼，而是會提出實作計畫供你審視。",[353,7170,7171,7177,7180,7183],{},[159,7172,7173,7174,7176],{},"按下 ",[19,7175,3418],{}," 鍵切換到規劃模式（畫面右下角會顯示指示器）",[159,7178,7179],{},"描述你想要的功能",[159,7181,7182],{},"檢視計畫並提供回饋或補充細節",[159,7184,7185],{},"確認計畫後，再切換回「建置模式」讓 OpenCode 執行修改",[2667,7187,7188],{"id":7188},"程式碼修改",[15,7190,7191],{},"對於較簡單的修改，你可以直接要求 OpenCode 進行修改：",[212,7193,7196],{"className":7194,"code":7195,"language":1934},[1932],"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",[127,7197,7195],{"__ignoreMap":217},[2667,7199,7200],{"id":7200},"復原變更",[15,7202,7203,7204,7207],{},"如果修改結果不滿意，可以使用 ",[127,7205,7206],{},"\u002Fundo"," 命令復原：",[212,7209,7212],{"className":7210,"code":7211,"language":1934},[1932],"\u002Fundo\n",[127,7213,7211],{"__ignoreMap":217},[15,7215,7216],{},"OpenCode 會恢復變更並顯示你原本的訊息，讓你可以調整提示後再試一次。",[51,7218],{},[54,7220,7222],{"id":7221},"opencode-常用指令","OpenCode 常用指令",[15,7224,7225],{},"OpenCode 提供了豐富的指令來提升開發效率。這些指令可分為 TUI 指令和 CLI 指令兩種類型。",[2667,7227,7229],{"id":7228},"tui-指令","TUI 指令",[15,7231,7232,7233,7236],{},"在 OpenCode 終端機介面中，輸入 ",[127,7234,7235],{},"\u002F"," 後跟指令名稱即可執行。以下是常用的 TUI 指令：",[62,7238,7239,7248],{},[65,7240,7241],{},[68,7242,7243,7246],{},[71,7244,7245],{},"指令",[71,7247,3399],{},[81,7249,7250,7263,7276,7285,7295,7305,7315,7331,7341,7351,7360,7373,7383,7393,7403,7413],{},[68,7251,7252,7257],{},[86,7253,7254],{},[127,7255,7256],{},"\u002Finit",[86,7258,7259,7260,7262],{},"建立或更新 ",[127,7261,7136],{}," 檔案，分析專案結構並建立開發規範文件",[68,7264,7265,7270],{},[86,7266,7267],{},[127,7268,7269],{},"\u002Fnew",[86,7271,7272,7273],{},"開始新的工作階段，別名：",[127,7274,7275],{},"\u002Fclear",[68,7277,7278,7282],{},[86,7279,7280],{},[127,7281,7206],{},[86,7283,7284],{},"復原對話中的最後一條訊息，包括所有檔案變更",[68,7286,7287,7292],{},[86,7288,7289],{},[127,7290,7291],{},"\u002Fredo",[86,7293,7294],{},"重做之前復原的訊息",[68,7296,7297,7302],{},[86,7298,7299],{},[127,7300,7301],{},"\u002Fshare",[86,7303,7304],{},"分享當前工作階段，建立可分享的連結",[68,7306,7307,7312],{},[86,7308,7309],{},[127,7310,7311],{},"\u002Funshare",[86,7313,7314],{},"取消分享當前工作階段",[68,7316,7317,7322],{},[86,7318,7319],{},[127,7320,7321],{},"\u002Fsessions",[86,7323,7324,7325,193,7328],{},"列出工作階段並在工作階段之間切換，別名：",[127,7326,7327],{},"\u002Fresume",[127,7329,7330],{},"\u002Fcontinue",[68,7332,7333,7338],{},[86,7334,7335],{},[127,7336,7337],{},"\u002Fmodels",[86,7339,7340],{},"列出所有可用的模型",[68,7342,7343,7348],{},[86,7344,7345],{},[127,7346,7347],{},"\u002Fthemes",[86,7349,7350],{},"列出可用的主題",[68,7352,7353,7357],{},[86,7354,7355],{},[127,7356,7069],{},[86,7358,7359],{},"將 LLM 提供者新增到 OpenCode",[68,7361,7362,7367],{},[86,7363,7364],{},[127,7365,7366],{},"\u002Fcompact",[86,7368,7369,7370],{},"壓縮當前工作階段，別名：",[127,7371,7372],{},"\u002Fsummarize",[68,7374,7375,7380],{},[86,7376,7377],{},[127,7378,7379],{},"\u002Fdetails",[86,7381,7382],{},"切換工具執行詳情的顯示",[68,7384,7385,7390],{},[86,7386,7387],{},[127,7388,7389],{},"\u002Feditor",[86,7391,7392],{},"開啟外部編輯器來撰寫訊息",[68,7394,7395,7400],{},[86,7396,7397],{},[127,7398,7399],{},"\u002Fexport",[86,7401,7402],{},"將當前對話匯出為 Markdown",[68,7404,7405,7410],{},[86,7406,7407],{},[127,7408,7409],{},"\u002Fthinking",[86,7411,7412],{},"切換思考\u002F推理區塊的可見性",[68,7414,7415,7420],{},[86,7416,7417],{},[127,7418,7419],{},"\u002Fhelp",[86,7421,7422],{},"顯示說明對話框",[2667,7424,7426],{"id":7425},"cli-指令","CLI 指令",[15,7428,7429],{},"除了 TUI 指令，OpenCode 還提供強大的命令列工具。以下是常用的 CLI 指令：",[212,7431,7433],{"className":214,"code":7432,"language":216,"meta":217,"style":217},"# 啟動 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",[127,7434,7435,7440,7447,7457,7467,7471,7476,7486,7498,7510,7514,7519,7530,7541,7545,7550,7562,7573,7585,7589,7594,7606,7616,7626,7630,7636,7646,7660,7665,7671,7684,7695,7706],{"__ignoreMap":217},[122,7436,7437],{"class":222,"line":223},[122,7438,7439],{"class":226},"# 啟動 OpenCode\n",[122,7441,7442,7444],{"class":222,"line":230},[122,7443,5478],{"class":233},[122,7445,7446],{"class":226},"                          # 啟動 TUI\n",[122,7448,7449,7451,7454],{"class":222,"line":248},[122,7450,5478],{"class":233},[122,7452,7453],{"class":237}," \u002Fpath\u002Fto\u002Fproject",[122,7455,7456],{"class":226},"         # 指定專案目錄啟動\n",[122,7458,7459,7461,7464],{"class":222,"line":260},[122,7460,5478],{"class":233},[122,7462,7463],{"class":241}," --continue",[122,7465,7466],{"class":226},"               # 繼續上一個工作階段\n",[122,7468,7469],{"class":222,"line":267},[122,7470,264],{"emptyLinePlaceholder":263},[122,7472,7473],{"class":222,"line":273},[122,7474,7475],{"class":226},"# 模型管理\n",[122,7477,7478,7480,7483],{"class":222,"line":660},[122,7479,5478],{"class":233},[122,7481,7482],{"class":237}," models",[122,7484,7485],{"class":226},"                   # 列出所有可用模型\n",[122,7487,7488,7490,7492,7495],{"class":222,"line":672},[122,7489,5478],{"class":233},[122,7491,7482],{"class":237},[122,7493,7494],{"class":237}," anthropic",[122,7496,7497],{"class":226},"         # 列出特定提供者的模型\n",[122,7499,7500,7502,7504,7507],{"class":222,"line":701},[122,7501,5478],{"class":233},[122,7503,7482],{"class":237},[122,7505,7506],{"class":241}," --refresh",[122,7508,7509],{"class":226},"         # 重新整理模型快取\n",[122,7511,7512],{"class":222,"line":706},[122,7513,264],{"emptyLinePlaceholder":263},[122,7515,7516],{"class":222,"line":712},[122,7517,7518],{"class":226},"# 代理管理\n",[122,7520,7521,7523,7525,7527],{"class":222,"line":725},[122,7522,5478],{"class":233},[122,7524,2019],{"class":237},[122,7526,623],{"class":237},[122,7528,7529],{"class":226},"             # 建立新代理\n",[122,7531,7532,7534,7536,7538],{"class":222,"line":737},[122,7533,5478],{"class":233},[122,7535,2019],{"class":237},[122,7537,720],{"class":237},[122,7539,7540],{"class":226},"               # 列出所有代理\n",[122,7542,7543],{"class":222,"line":758},[122,7544,264],{"emptyLinePlaceholder":263},[122,7546,7547],{"class":222,"line":782},[122,7548,7549],{"class":226},"# MCP 伺服器管理\n",[122,7551,7552,7554,7557,7559],{"class":222,"line":787},[122,7553,5478],{"class":233},[122,7555,7556],{"class":237}," mcp",[122,7558,1814],{"class":237},[122,7560,7561],{"class":226},"                  # 新增 MCP 伺服器\n",[122,7563,7564,7566,7568,7570],{"class":222,"line":793},[122,7565,5478],{"class":233},[122,7567,7556],{"class":237},[122,7569,720],{"class":237},[122,7571,7572],{"class":226},"                 # 列出所有 MCP 伺服器\n",[122,7574,7575,7577,7579,7582],{"class":222,"line":807},[122,7576,5478],{"class":233},[122,7578,7556],{"class":237},[122,7580,7581],{"class":237}," auth",[122,7583,7584],{"class":226},"                 # 對 MCP 伺服器進行認證\n",[122,7586,7587],{"class":222,"line":823},[122,7588,264],{"emptyLinePlaceholder":263},[122,7590,7591],{"class":222,"line":828},[122,7592,7593],{"class":226},"# 工作階段管理\n",[122,7595,7596,7598,7601,7603],{"class":222,"line":834},[122,7597,5478],{"class":233},[122,7599,7600],{"class":237}," session",[122,7602,720],{"class":237},[122,7604,7605],{"class":226},"             # 列出所有工作階段\n",[122,7607,7608,7610,7613],{"class":222,"line":850},[122,7609,5478],{"class":233},[122,7611,7612],{"class":237}," export",[122,7614,7615],{"class":226},"                   # 匯出工作階段資料\n",[122,7617,7618,7620,7623],{"class":222,"line":864},[122,7619,5478],{"class":233},[122,7621,7622],{"class":237}," import",[122,7624,7625],{"class":226},"                   # 匯入工作階段資料\n",[122,7627,7628],{"class":222,"line":880},[122,7629,264],{"emptyLinePlaceholder":263},[122,7631,7633],{"class":222,"line":7632},25,[122,7634,7635],{"class":226},"# 統計資訊\n",[122,7637,7639,7641,7643],{"class":222,"line":7638},26,[122,7640,5478],{"class":233},[122,7642,5610],{"class":237},[122,7644,7645],{"class":226},"                    # 顯示 Token 用量和費用統計\n",[122,7647,7649,7651,7653,7655,7657],{"class":222,"line":7648},27,[122,7650,5478],{"class":233},[122,7652,5610],{"class":237},[122,7654,5669],{"class":241},[122,7656,5922],{"class":241},[122,7658,7659],{"class":226},"          # 顯示最近 30 天的統計\n",[122,7661,7663],{"class":222,"line":7662},28,[122,7664,264],{"emptyLinePlaceholder":263},[122,7666,7668],{"class":222,"line":7667},29,[122,7669,7670],{"class":226},"# 其他實用指令\n",[122,7672,7674,7676,7678,7681],{"class":222,"line":7673},30,[122,7675,5478],{"class":233},[122,7677,1112],{"class":237},[122,7679,7680],{"class":237}," \"提示詞\"",[122,7682,7683],{"class":226},"             # 非互動模式執行\n",[122,7685,7687,7689,7692],{"class":222,"line":7686},31,[122,7688,5478],{"class":233},[122,7690,7691],{"class":237}," serve",[122,7693,7694],{"class":226},"                    # 啟動 API 伺服器\n",[122,7696,7698,7700,7703],{"class":222,"line":7697},32,[122,7699,5478],{"class":233},[122,7701,7702],{"class":237}," web",[122,7704,7705],{"class":226},"                      # 啟動 Web 介面\n",[122,7707,7709,7711,7713],{"class":222,"line":7708},33,[122,7710,5478],{"class":233},[122,7712,253],{"class":237},[122,7714,7715],{"class":226},"                  # 更新 OpenCode\n",[2667,7717,7719],{"id":7718},"代理agents","代理（Agents）",[15,7721,7722,7723,7725,7726,7728],{},"OpenCode 內建了多種代理類型，可透過 ",[19,7724,3418],{}," 鍵切換或使用 ",[127,7727,7152],{}," 提及呼叫：",[62,7730,7731,7742],{},[65,7732,7733],{},[68,7734,7735,7737,7740],{},[71,7736,3558],{},[71,7738,7739],{},"類型",[71,7741,3399],{},[81,7743,7744,7755,7765,7776],{},[68,7745,7746,7749,7752],{},[86,7747,7748],{},"Build",[86,7750,7751],{},"主代理",[86,7753,7754],{},"預設代理，啟用所有工具",[68,7756,7757,7760,7762],{},[86,7758,7759],{},"Plan",[86,7761,7751],{},[86,7763,7764],{},"規劃和分析代理，無法修改檔案",[68,7766,7767,7770,7773],{},[86,7768,7769],{},"General",[86,7771,7772],{},"子代理",[86,7774,7775],{},"通用研究代理，完整工具存取",[68,7777,7778,7781,7783],{},[86,7779,7780],{},"Explore",[86,7782,7772],{},[86,7784,7785],{},"快速唯讀代理，用於探索程式碼庫",[2667,7787,7789],{"id":7788},"技能skills","技能（Skills）",[15,7791,7792,7793,7795],{},"技能是可重複使用的行為定義，透過 ",[127,7794,1674],{}," 檔案設定。技能檔案放置位置：",[156,7797,7798,7804],{},[159,7799,7800,7801],{},"專案：",[127,7802,7803],{},".opencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[159,7805,7806,7807],{},"全域：",[127,7808,7809],{},"~\u002F.config\u002Fopencode\u002Fskills\u002F\u003Cname>\u002FSKILL.md",[212,7811,7815],{"className":7812,"code":7813,"language":7814,"meta":217,"style":217},"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",[127,7816,7817,7822,7827,7832,7836,7841,7846,7851,7856,7861],{"__ignoreMap":217},[122,7818,7819],{"class":222,"line":223},[122,7820,7821],{},"---\n",[122,7823,7824],{"class":222,"line":230},[122,7825,7826],{},"name: git-release\n",[122,7828,7829],{"class":222,"line":248},[122,7830,7831],{},"description: Create consistent releases and changelogs\n",[122,7833,7834],{"class":222,"line":260},[122,7835,7821],{},[122,7837,7838],{"class":222,"line":267},[122,7839,7840],{},"## What I do\n",[122,7842,7843],{"class":222,"line":273},[122,7844,7845],{},"- Draft release notes from merged PRs\n",[122,7847,7848],{"class":222,"line":660},[122,7849,7850],{},"- Propose a version bump\n",[122,7852,7853],{"class":222,"line":672},[122,7854,7855],{},"- Provide a copy-pasteable git command\n",[122,7857,7858],{"class":222,"line":701},[122,7859,7860],{},"## When to use me\n",[122,7862,7863],{"class":222,"line":706},[122,7864,7865],{},"Use this when you are preparing a tagged release.\n",[15,7867,7868],{},"透過靈活運用這些指令和快捷鍵，可以大幅提升使用 OpenCode 的開發效率。",[51,7870],{},[54,7872,7873],{"id":7873},"進階功能",[2667,7875,7876],{"id":7876},"主題自訂",[15,7878,7879],{},"OpenCode 支援多種主題，你可以根據喜好進行設定。",[2667,7881,7882],{"id":7882},"快捷鍵自訂",[15,7884,7885],{},"自訂鍵位綁定以符合個人工作流程。",[2667,7887,7888],{"id":7888},"程式碼格式化",[15,7890,7891],{},"配置程式碼格式化工具，確保程式碼風格一致。",[2667,7893,7894],{"id":7894},"自訂命令",[15,7896,7897],{},"建立重複使用的自訂命令，提高工作效率。",[2667,7899,7901],{"id":7900},"整合-github-copilot","整合 GitHub Copilot",[15,7903,7904],{},"登入 GitHub 即可使用現有的 Copilot 帳戶。",[2667,7906,7908],{"id":7907},"整合-ide","整合 IDE",[15,7910,7911],{},"OpenCode 提供 IDE 擴充功能，讓你可在喜愛的編輯器中使用。",[51,7913],{},[54,7915,7916],{"id":7916},"圖片支援",[15,7918,7919],{},"OpenCode 支援圖片分析功能。你可以將圖片拖曳到終端機中，OpenCode 會掃描圖片並將其加入提示中。這對於設計 UI 時參考範例圖片特別有用。",[51,7921],{},[54,7923,7924],{"id":7924},"分享功能",[15,7926,7927,7928,7930],{},"使用 ",[127,7929,7301],{}," 命令可建立當前對話的分享連結，讓團隊成員能夠參考你的工作階段或協助除錯。",[51,7932],{},[54,7934,1520],{"id":1520},[15,7936,7937],{},"OpenCode 作為一個開源的 AI 程式碼助手，提供了豐富的功能來提升開發效率。從自動化的 LSP 支援到多模型整合，再到強大的規劃和復原機制，OpenCode 為開發者提供了一個靈活且強大的 AI 輔助工具。",[15,7939,7940,7941,7943],{},"對於團隊開發而言，將 ",[127,7942,7136],{}," 提交至版本控制系統，能確保所有成員都能獲得一致的 AI 輔助體驗。而其隱私優先的設計理念，更讓企業和重視資料安全的開發者能夠放心使用。",[1579,7945,7946],{},"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":217,"searchDepth":230,"depth":230,"links":7948},[7949,7952,7957,7961,7962,7968,7974,7982,7983,7984],{"id":6803,"depth":230,"text":6804,"children":7950},[7951],{"id":6810,"depth":248,"text":6811},{"id":6848,"depth":230,"text":6849,"children":7953},[7954,7955,7956],{"id":6855,"depth":248,"text":6856},{"id":6897,"depth":248,"text":6898},{"id":6964,"depth":248,"text":6964},{"id":7050,"depth":230,"text":7051,"children":7958},[7959,7960],{"id":7057,"depth":248,"text":7058},{"id":7088,"depth":248,"text":7089},{"id":7097,"depth":230,"text":7097},{"id":7142,"depth":230,"text":7143,"children":7963},[7964,7965,7966,7967],{"id":7146,"depth":248,"text":7146},{"id":7165,"depth":248,"text":7165},{"id":7188,"depth":248,"text":7188},{"id":7200,"depth":248,"text":7200},{"id":7221,"depth":230,"text":7222,"children":7969},[7970,7971,7972,7973],{"id":7228,"depth":248,"text":7229},{"id":7425,"depth":248,"text":7426},{"id":7718,"depth":248,"text":7719},{"id":7788,"depth":248,"text":7789},{"id":7873,"depth":230,"text":7873,"children":7975},[7976,7977,7978,7979,7980,7981],{"id":7876,"depth":248,"text":7876},{"id":7882,"depth":248,"text":7882},{"id":7888,"depth":248,"text":7888},{"id":7894,"depth":248,"text":7894},{"id":7900,"depth":248,"text":7901},{"id":7907,"depth":248,"text":7908},{"id":7916,"depth":230,"text":7916},{"id":7924,"depth":230,"text":7924},{"id":1520,"depth":230,"text":1520},"\u002Fimages\u002Farticles\u002F2026-02-24-opencode\u002Fcover.png",{},"\u002Farticles\u002F2026-02-24-opencode","2026-02-24 12:00:00",{"title":6798,"description":217},"articles\u002F2026-02-24-opencode","OpenCode 是一個開源的 AI 程式碼助手，支援終端機、桌面應用程式和 IDE 擴充功能。本文將帶你深入了解 OpenCode 的安裝、配置和各項強大功能，讓你體驗 AI 輔助開發的便利性。",[5478,1610,1613,1614],"hCbyfY05rfnLeV9qp9nMDhmuIDOO6nXzSa_pGswgHzA",{"id":7995,"title":7996,"body":7997,"category":3748,"description":217,"extension":1601,"image":8399,"meta":8400,"navigation":263,"path":8401,"pubDate":8402,"seo":8403,"status":263,"stem":8404,"summary":8405,"tags":8406,"__hash__":8408},"content\u002Farticles\u002F2025-11-16-ffmpeg-getting-started.md","FFmpeg 新手入門：從安裝到常用指令實戰",{"type":8,"value":7998,"toc":8391},[7999,8001,8004,8006,8009,8023,8026,8039,8042,8045,8063,8066,8094,8108,8111,8127,8130,8146,8149,8174,8193,8196,8199,8232,8256,8259,8262,8299,8319,8322,8372,8377,8379,8388],[54,8000,3757],{"id":3757},[15,8002,8003],{},"FFmpeg 是一套以命令列為主的開源多媒體處理工具，支援幾乎所有常見的音訊與影像格式（編碼\u002F封裝）。\n對開發者、系統工程師與內容創作者而言，FFmpeg 是自動化轉檔、批次處理、串流轉封裝與影音後製流程中不可或缺的工具。\n本文以實務為導向，示範安裝步驟與常用命令（轉檔、壓縮、截圖、合併、裁切等），並說明常見選項與應用場景，協助你快速在專案或腳本中整合 FFmpeg。",[54,8005,3808],{"id":3808},[15,8007,8008],{},"一、在 MacOS 安裝 ffmpeg",[212,8010,8012],{"className":214,"code":8011,"language":216,"meta":217,"style":217},"brew install ffmpeg\n",[127,8013,8014],{"__ignoreMap":217},[122,8015,8016,8018,8020],{"class":222,"line":223},[122,8017,234],{"class":233},[122,8019,238],{"class":237},[122,8021,8022],{"class":237}," ffmpeg\n",[15,8024,8025],{},"二、在終端機輸入以下指令，可取得 ffmpeg 版本號和相關設定資訊",[212,8027,8029],{"className":214,"code":8028,"language":216,"meta":217,"style":217},"ffmpeg -version\n",[127,8030,8031],{"__ignoreMap":217},[122,8032,8033,8036],{"class":222,"line":223},[122,8034,8035],{"class":233},"ffmpeg",[122,8037,8038],{"class":241}," -version\n",[54,8040,8041],{"id":8041},"轉檔",[15,8043,8044],{},"一、基本轉檔",[212,8046,8048],{"className":214,"code":8047,"language":216,"meta":217,"style":217},"ffmpeg -i input.mov output.mp4\n",[127,8049,8050],{"__ignoreMap":217},[122,8051,8052,8054,8057,8060],{"class":222,"line":223},[122,8053,8035],{"class":233},[122,8055,8056],{"class":241}," -i",[122,8058,8059],{"class":237}," input.mov",[122,8061,8062],{"class":237}," output.mp4\n",[15,8064,8065],{},"二、更換影片和音訊的編碼",[212,8067,8069],{"className":214,"code":8068,"language":216,"meta":217,"style":217},"ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4\n",[127,8070,8071],{"__ignoreMap":217},[122,8072,8073,8075,8077,8080,8083,8086,8089,8092],{"class":222,"line":223},[122,8074,8035],{"class":233},[122,8076,8056],{"class":241},[122,8078,8079],{"class":237}," input.mp4",[122,8081,8082],{"class":241}," -c:v",[122,8084,8085],{"class":237}," libx264",[122,8087,8088],{"class":241}," -c:a",[122,8090,8091],{"class":237}," aac",[122,8093,8062],{"class":237},[156,8095,8096,8102],{},[159,8097,8098,8101],{},[127,8099,8100],{},"-c:v libx264","：指定使用 H.264 編碼器進行影片編碼。",[159,8103,8104,8107],{},[127,8105,8106],{},"-c:a aac","： 指定使用 AAC 編碼器進行音頻編碼。",[15,8109,8110],{},"三、影片轉成序列圖片檔",[212,8112,8114],{"className":214,"code":8113,"language":216,"meta":217,"style":217},"ffmpeg -i input.mp4 video\u002Foutput_%04d.png\n",[127,8115,8116],{"__ignoreMap":217},[122,8117,8118,8120,8122,8124],{"class":222,"line":223},[122,8119,8035],{"class":233},[122,8121,8056],{"class":241},[122,8123,8079],{"class":237},[122,8125,8126],{"class":237}," video\u002Foutput_%04d.png\n",[15,8128,8129],{},"四、影片轉成音訊檔",[212,8131,8133],{"className":214,"code":8132,"language":216,"meta":217,"style":217},"ffmpeg -i input.mp4 music\u002Foutput.mp3\n",[127,8134,8135],{"__ignoreMap":217},[122,8136,8137,8139,8141,8143],{"class":222,"line":223},[122,8138,8035],{"class":233},[122,8140,8056],{"class":241},[122,8142,8079],{"class":237},[122,8144,8145],{"class":237}," music\u002Foutput.mp3\n",[15,8147,8148],{},"五、序列圖片轉成影片檔",[212,8150,8152],{"className":214,"code":8151,"language":216,"meta":217,"style":217},"ffmpeg -framerate 30 -i video\u002Foutput_%04d.png -c:v libx264 output.mp4\n",[127,8153,8154],{"__ignoreMap":217},[122,8155,8156,8158,8161,8163,8165,8168,8170,8172],{"class":222,"line":223},[122,8157,8035],{"class":233},[122,8159,8160],{"class":241}," -framerate",[122,8162,5922],{"class":241},[122,8164,8056],{"class":241},[122,8166,8167],{"class":237}," video\u002Foutput_%04d.png",[122,8169,8082],{"class":241},[122,8171,8085],{"class":237},[122,8173,8062],{"class":237},[156,8175,8176,8182,8188],{},[159,8177,8178,8181],{},[127,8179,8180],{},"framerate","：影格率（fps）",[159,8183,8184,8187],{},[127,8185,8186],{},"-i","：輸入",[159,8189,8190,8192],{},[127,8191,8100],{},"：使用 H264 編碼",[54,8194,8195],{"id":8195},"剪裁",[15,8197,8198],{},"一、時間裁切（截取片段）",[212,8200,8202],{"className":214,"code":8201,"language":216,"meta":217,"style":217},"ffmpeg -ss - -i input.mp4 -t 10 -c copy output_trim.mp4\n",[127,8203,8204],{"__ignoreMap":217},[122,8205,8206,8208,8211,8214,8216,8218,8221,8224,8226,8229],{"class":222,"line":223},[122,8207,8035],{"class":233},[122,8209,8210],{"class":241}," -ss",[122,8212,8213],{"class":237}," -",[122,8215,8056],{"class":241},[122,8217,8079],{"class":237},[122,8219,8220],{"class":241}," -t",[122,8222,8223],{"class":241}," 10",[122,8225,3121],{"class":241},[122,8227,8228],{"class":237}," copy",[122,8230,8231],{"class":237}," output_trim.mp4\n",[156,8233,8234,8240,8244,8250],{},[159,8235,8236,8239],{},[127,8237,8238],{},"-ss","： 開始時間",[159,8241,8242,8187],{},[127,8243,8186],{},[159,8245,8246,8249],{},[127,8247,8248],{},"-t","：截取時間(秒)",[159,8251,8252,8255],{},[127,8253,8254],{},"-c copy","：不進行重新編碼-",[54,8257,8258],{"id":8258},"合併",[15,8260,8261],{},"一、合併影片檔和聲音檔",[212,8263,8265],{"className":214,"code":8264,"language":216,"meta":217,"style":217},"ffmpeg -i input.mp4 -i audio.wav -c:v copy -c:a aac -b:a 192k -shortest output.mp4\n",[127,8266,8267],{"__ignoreMap":217},[122,8268,8269,8271,8273,8275,8277,8280,8282,8284,8286,8288,8291,8294,8297],{"class":222,"line":223},[122,8270,8035],{"class":233},[122,8272,8056],{"class":241},[122,8274,8079],{"class":237},[122,8276,8056],{"class":241},[122,8278,8279],{"class":237}," audio.wav",[122,8281,8082],{"class":241},[122,8283,8228],{"class":237},[122,8285,8088],{"class":241},[122,8287,8091],{"class":237},[122,8289,8290],{"class":241}," -b:a",[122,8292,8293],{"class":237}," 192k",[122,8295,8296],{"class":241}," -shortest",[122,8298,8062],{"class":237},[156,8300,8301,8307,8313],{},[159,8302,8303,8306],{},[127,8304,8305],{},"-c:v copy","：複製原影片，不重新編碼（保留畫質、速度快）",[159,8308,8309,8312],{},[127,8310,8311],{},"-c:a aac -b:a 192k","： 把音訊編成 AAC，192 kbps 常見且相容性好。",[159,8314,8315,8318],{},[127,8316,8317],{},"-shortest","：以較短的軌為準，避免多出黑畫面或靜音尾巴",[15,8320,8321],{},"二、合併圖片",[156,8323,8324,8336],{},[159,8325,8326,8327,8330],{},"建立影像清單 ",[127,8328,8329],{},"filelist.txt",[212,8331,8334],{"className":8332,"code":8333,"language":1934,"meta":217},[1932],"file 'part1.mp4'\nfile 'part2.mp4'\nfile 'part3.mp4'\n",[127,8335,8333],{"__ignoreMap":217},[159,8337,8338,8339],{},"串連輸出",[212,8340,8342],{"className":214,"code":8341,"language":216,"meta":217,"style":217},"ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_concat.mp4\n",[127,8343,8344],{"__ignoreMap":217},[122,8345,8346,8348,8351,8354,8357,8360,8362,8365,8367,8369],{"class":222,"line":223},[122,8347,8035],{"class":233},[122,8349,8350],{"class":241}," -f",[122,8352,8353],{"class":237}," concat",[122,8355,8356],{"class":241}," -safe",[122,8358,8359],{"class":241}," 0",[122,8361,8056],{"class":241},[122,8363,8364],{"class":237}," filelist.txt",[122,8366,3121],{"class":241},[122,8368,8228],{"class":237},[122,8370,8371],{"class":237}," output_concat.mp4\n",[15,8373,8374],{},[19,8375,8376],{},"注意：所有影片片段編碼參數需相同，否則會有導致音畫不同步，或是合併失敗",[54,8378,5386],{"id":5386},[15,8380,8381,8382,8387],{},"總結來說，FFmpeg 是一個功能強大的影音處理工具，只是功能對一般人來說複雜，而本文整理常用的使用情境，期望讓使用快速上手，若要更詳細的功能使用，可以參考",[24,8383,8386],{"href":8384,"rel":8385},"https:\u002F\u002Fffmpeg.org\u002Fffmpeg.html",[28],"官方文件","，希望這份指南能幫助你更好地利用 FFmpeg，打造更完美的影音作品！",[1579,8389,8390],{},"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":217,"searchDepth":230,"depth":230,"links":8392},[8393,8394,8395,8396,8397,8398],{"id":3757,"depth":230,"text":3757},{"id":3808,"depth":230,"text":3808},{"id":8041,"depth":230,"text":8041},{"id":8195,"depth":230,"text":8195},{"id":8258,"depth":230,"text":8258},{"id":5386,"depth":230,"text":5386},"\u002Fimages\u002Farticles\u002F2025-11-16-ffmpeg-getting-started\u002Fcover.png",{},"\u002Farticles\u002F2025-11-16-ffmpeg-getting-started","2025-11-16 16:54:00",{"title":7996,"description":217},"articles\u002F2025-11-16-ffmpeg-getting-started","FFmpeg 是一個跨平台的開源多媒體工具組，用來處理音樂與影片。",[8407,3748,1614],"video","ZdvGeair61zT3Br9J0Csx2v78hP1q2MfzpRednjS9zw",{"id":8410,"title":8411,"body":8412,"category":1599,"description":217,"extension":1601,"image":8583,"meta":8584,"navigation":263,"path":8585,"pubDate":8586,"seo":8587,"status":263,"stem":8588,"summary":8589,"tags":8590,"__hash__":8592},"content\u002Farticles\u002F2025-08-05-ai-upscayl.md","告別模糊！用 Upscayl 輕鬆放大照片，讓細節更清晰",{"type":8,"value":8413,"toc":8575},[8414,8418,8421,8424,8479,8482,8488,8491,8497,8548,8551,8565,8567,8570],[54,8415,8417],{"id":8416},"什麼是-upscayl","什麼是 Upscayl？",[15,8419,8420],{},"Upscayl 是一款免費、開源的圖像放大（upscaling）工具，利用 AI（人工智慧）技術，尤其是 圖像超解析度（Super-Resolution）模型，將低解析度的圖片放大為高解析度，同時盡可能保留或重建細節，讓圖片變得更清晰、更銳利。",[54,8422,8423],{"id":8423},"主要特色",[156,8425,8426,8448,8461,8467,8473],{},[159,8427,8428,8431,8432,193,8435,193,8438,193,8441,193,8444,8447],{},[19,8429,8430],{},"多個AI模型可選擇","： ",[127,8433,8434],{},"Upscayl",[127,8436,8437],{},"Upscayl lite",[127,8439,8440],{},"Remacri",[127,8442,8443],{},"Ultramax",[127,8445,8446],{},"Ultrasharp"," 等可以選擇",[159,8449,8450,8453,8454,193,8456,8458,8459],{},[19,8451,8452],{},"跨平台","：支援 ",[127,8455,6898],{},[127,8457,3061],{}," 和 ",[127,8460,6793],{},[159,8462,8463,8466],{},[19,8464,8465],{},"開援授權","：採用 MIT 授權",[159,8468,8469,8472],{},[19,8470,8471],{},"支援批次處理","：可以處理多張圖片",[159,8474,8475,8478],{},[19,8476,8477],{},"操作簡單","：使用介面非常友善，新手小白輕易上手",[54,8480,8481],{"id":8481},"下載網址",[15,8483,8484],{},[24,8485,8486],{"href":8486,"rel":8487},"https:\u002F\u002Fupscayl.github.io\u002F",[28],[54,8489,8490],{"id":8490},"操作介紹",[15,8492,8493],{},[2494,8494],{"alt":8495,"src":8496},"操作介面","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-01.png",[353,8498,8499,8505,8511,8520,8526,8532,8538],{},[159,8500,8501,8504],{},[19,8502,8503],{},"選擇批次處理","：可選擇單張圖片放大，或批次放大",[159,8506,8507,8510],{},[19,8508,8509],{},"選舉圖片","：若單張放大時，則選擇圖片，若選擇批次放大，則選擇目錄",[159,8512,8513,8516,8517],{},[19,8514,8515],{},"選擇放大模型","：可以依自已需求，選擇放大模型 ",[2494,8518],{"alt":8515,"src":8519},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-02.png",[159,8521,8522,8525],{},[19,8523,8524],{},"雙次放大","：進行兩次放大",[159,8527,8528,8531],{},[19,8529,8530],{},"放大比例","：可選擇放大倍率",[159,8533,8534,8537],{},[19,8535,8536],{},"選擇輸出位置","：可選擇輸出目錄",[159,8539,8540,8543,8544],{},[19,8541,8542],{},"開始處理","：開始放大 ",[2494,8545],{"alt":8546,"src":8547},"放大後可瀏覽結果","\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002FUpscayl-03.png",[54,8549,8550],{"id":8550},"使用情境",[156,8552,8553,8556,8559,8562],{},[159,8554,8555],{},"放大老照片或低清圖片",[159,8557,8558],{},"為插圖、漫畫、像素風圖片增強清晰度",[159,8560,8561],{},"為網路下載的壓縮圖片進行畫質修復",[159,8563,8564],{},"用於 2D 遊戲素材的升級",[54,8566,5386],{"id":5386},[15,8568,8569],{},"Upscayl 是一款結合人工智慧與開源精神的圖像放大工具，讓使用者即使沒有專業技術背景，也能輕鬆將模糊、低解析度的圖片轉換為更清晰、可用的高解析版本。無論是修復舊照片、強化插圖，還是優化網路圖片，Upscayl 都提供了一種快速且免費的解決方案，是創作者與設計師不可或缺的好幫手。",[15,8571,8572],{},[19,8573,8574],{},"注意！Upscayl 提供部份模型是無法使用於商用",{"title":217,"searchDepth":230,"depth":230,"links":8576},[8577,8578,8579,8580,8581,8582],{"id":8416,"depth":230,"text":8417},{"id":8423,"depth":230,"text":8423},{"id":8481,"depth":230,"text":8481},{"id":8490,"depth":230,"text":8490},{"id":8550,"depth":230,"text":8550},{"id":5386,"depth":230,"text":5386},"\u002Fimages\u002Farticles\u002F2025-08-05-ai-upscayl\u002Fcover.png",{},"\u002Farticles\u002F2025-08-05-ai-upscayl","2025-08-05 20:38:00",{"title":8411,"description":217},"articles\u002F2025-08-05-ai-upscayl","Upscayl 是一個基於開源人工智慧的免費圖片放大軟體，可以有效地提升低解析度的圖片品質。它支援 Linux、Windows 和 macOS 平台，並能將照片放大到超越原始畫質的程度。",[1610,8591,3748,1614],"圖片處理","tRflg5x3IYHijIQy2fPVyq0DlJreuDRMFZP2NyCvLa0",{"id":8594,"title":8595,"body":8596,"category":1599,"description":11321,"extension":1601,"image":11322,"meta":11323,"navigation":263,"path":11324,"pubDate":11325,"seo":11326,"status":263,"stem":11327,"summary":11328,"tags":11329,"__hash__":11330},"content\u002Farticles\u002F2025-07-12-gemini-cli.md","Gemini CLI 教學：善用 AI 提升你的終端機開發效率",{"type":8,"value":8597,"toc":11308},[8598,8602,8616,8620,8623,8627,8665,8669,8673,8720,8724,8727,8732,8738,8744,8750,8756,8765,8768,9021,9026,9203,9208,11094,11097,11104,11110,11115,11121,11145,11151,11157,11161,11169,11175,11179,11191,11275,11281,11283,11286,11289,11305],[11,8599,8601],{"id":8600},"gemini-cli-教學將-gemini-的強大-ai-能力帶入你的終端機","Gemini CLI 教學：將 Gemini 的強大 AI 能力帶入你的終端機",[15,8603,8604,8605,8608,8609,8611,8612,8615],{},"Google 發最新的 AI 開發工具 ",[127,8606,8607],{},"Gemini CLI","，可以對標 Anthropic 的 ",[127,8610,3571],{}," 和 OpenAI 的 ",[127,8613,8614],{},"Codex CLI","等 AI 開發工具，也讓使得 AI開發工具的竸爭進入白熱化。",[54,8617,8619],{"id":8618},"gemini-cli-是什麼","Gemini CLI 是什麼？",[15,8621,8622],{},"Gemini CLI 是一個開源的 AI 代理（AI Agent），它將 Google 的 Gemini 模型（特別是 Gemini 2.5 Pro）的能力直接整合到你的終端機環境中。這意味著你可以在不離開終端機的情況下，利用 AI 來協助你完成各種開發工作。",[2667,8624,8626],{"id":8625},"主要特色與優勢","主要特色與優勢：",[156,8628,8629,8635,8641,8647,8653,8659],{},[159,8630,8631,8634],{},[19,8632,8633],{},"無縫整合 Gemini 模型："," 直接在終端機中使用 Gemini 2.5 Pro 的強大功能，包括其高達 100 萬詞元的長脈絡（context window）。",[159,8636,8637,8640],{},[19,8638,8639],{},"開源且高度擴充："," 採用 Apache 2.0 授權，原始碼公開透明，並支援 Model Context Protocol (MCP) 等擴充功能，讓你可以自訂和擴展其能力。",[159,8642,8643,8646],{},[19,8644,8645],{},"多功能性："," 不僅限於程式碼生成，還能協助檔案操作、指令執行、動態故障排除、內容生成、問題解決、深入研究和任務管理。",[159,8648,8649,8652],{},[19,8650,8651],{},"個人開發者免費額度："," 使用個人 Google 帳戶即可免費使用 Gemini CLI，提供業界領先的免費使用額度（每分鐘 60 次，每日最多 1,000 次模型執行）。",[159,8654,8655,8658],{},[19,8656,8657],{},"AI-First Coding 概念："," 鼓勵開發者以 AI 為優先，將 AI 視為協作夥伴，透過清晰的提示詞引導 AI 完成任務，並審核其產出。",[159,8660,8661,8664],{},[19,8662,8663],{},"與 Gemini Code Assist 整合："," 與 Google 的 AI 程式碼編寫輔助工具 Gemini Code Assist 採用相同核心技術，提供更一致的 AI 開發體驗。",[54,8666,8668],{"id":8667},"開始使用-gemini-cli","開始使用 Gemini CLI",[2667,8670,8672],{"id":8671},"安裝步驟","安裝步驟：",[353,8674,8675,8688,8710],{},[159,8676,8677,8680,8681,8684,8685,141],{},[19,8678,8679],{},"安裝 Node.js："," 確保你的系統已安裝 Node.js 版本 ",[127,8682,8683],{},"18"," 或以上，建議使用版本 ",[127,8686,8687],{},"20",[159,8689,8690,8693,8694],{},[19,8691,8692],{},"安裝 Gemini CLI："," 在終端機中執行以下指令進行全域安裝：\n",[212,8695,8697],{"className":214,"code":8696,"language":216,"meta":217,"style":217},"npm install -g @google\u002Fgemini-cli\n",[127,8698,8699],{"__ignoreMap":217},[122,8700,8701,8703,8705,8707],{"class":222,"line":223},[122,8702,6953],{"class":233},[122,8704,238],{"class":237},[122,8706,6958],{"class":241},[122,8708,8709],{"class":237}," @google\u002Fgemini-cli\n",[159,8711,8712,8715,8716,8719],{},[19,8713,8714],{},"初步設定："," 執行 ",[127,8717,8718],{},"gemini"," 指令，依照提示完成初步設定，例如選擇你偏好的 Theme 和進行身份驗證（通常是登入你的 Google 帳戶）。",[2667,8721,8723],{"id":8722},"快速入門","快速入門：",[15,8725,8726],{},"讓我們透過一個簡單的範例來體驗 Gemini CLI 的強大之處。假設我們想生成一個計算費式數列的 Python 程式碼，並將其儲存並執行。",[15,8728,8729],{},[19,8730,8731],{},"Prompt：",[212,8733,8736],{"className":8734,"code":8735,"language":1934},[1932],"使用html5開發一個飛機射擊遊戲，需有計分系統，每擊敗普通怪物得5分，擊敗Boss級怪物得100分，專案目錄：`~\u002Fwww\u002FAircraft-shooting`\n",[127,8737,8735],{"__ignoreMap":217},[15,8739,8740,8741,8743],{},"在執行過程中，",[127,8742,8607],{}," 會使用詢問互動方式，來協助使用者完成專案",[15,8745,8746,8747,8749],{},"建立檔案產與寫入檔案時，",[127,8748,8607],{}," 會讓使用者確認",[15,8751,8752],{},[2494,8753],{"alt":8754,"src":8755},"Gemini CLI詢問使用者是否建立檔案","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-01.png",[15,8757,8758,8759,8761,8762,8764],{},"確認後 ",[127,8760,8607],{}," 會開始建立相關程式，以此為例，",[127,8763,8607],{}," 建了以下程式",[15,8766,8767],{},"1 index.html",[212,8769,8773],{"className":8770,"code":8771,"language":8772,"meta":217,"style":217},"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",[127,8774,8775,8789,8805,8814,8832,8856,8870,8895,8904,8913,8925,8963,8984,9005,9013],{"__ignoreMap":217},[122,8776,8777,8780,8784,8787],{"class":222,"line":223},[122,8778,8779],{"class":639},"\u003C!",[122,8781,8783],{"class":8782},"sByVh","DOCTYPE",[122,8785,8786],{"class":233}," html",[122,8788,2333],{"class":639},[122,8790,8791,8793,8795,8798,8800,8803],{"class":222,"line":230},[122,8792,633],{"class":639},[122,8794,8772],{"class":8782},[122,8796,8797],{"class":233}," lang",[122,8799,2421],{"class":639},[122,8801,8802],{"class":237},"\"en\"",[122,8804,2333],{"class":639},[122,8806,8807,8809,8812],{"class":222,"line":248},[122,8808,633],{"class":639},[122,8810,8811],{"class":8782},"head",[122,8813,2333],{"class":639},[122,8815,8816,8819,8822,8825,8827,8830],{"class":222,"line":260},[122,8817,8818],{"class":639},"    \u003C",[122,8820,8821],{"class":8782},"meta",[122,8823,8824],{"class":233}," charset",[122,8826,2421],{"class":639},[122,8828,8829],{"class":237},"\"UTF-8\"",[122,8831,2333],{"class":639},[122,8833,8834,8836,8838,8841,8843,8846,8849,8851,8854],{"class":222,"line":267},[122,8835,8818],{"class":639},[122,8837,8821],{"class":8782},[122,8839,8840],{"class":233}," name",[122,8842,2421],{"class":639},[122,8844,8845],{"class":237},"\"viewport\"",[122,8847,8848],{"class":233}," content",[122,8850,2421],{"class":639},[122,8852,8853],{"class":237},"\"width=device-width, initial-scale=1.0\"",[122,8855,2333],{"class":639},[122,8857,8858,8860,8863,8866,8868],{"class":222,"line":273},[122,8859,8818],{"class":639},[122,8861,8862],{"class":8782},"title",[122,8864,8865],{"class":639},">Aircraft Shooting Game\u003C\u002F",[122,8867,8862],{"class":8782},[122,8869,2333],{"class":639},[122,8871,8872,8874,8877,8880,8882,8885,8888,8890,8893],{"class":222,"line":660},[122,8873,8818],{"class":639},[122,8875,8876],{"class":8782},"link",[122,8878,8879],{"class":233}," rel",[122,8881,2421],{"class":639},[122,8883,8884],{"class":237},"\"stylesheet\"",[122,8886,8887],{"class":233}," href",[122,8889,2421],{"class":639},[122,8891,8892],{"class":237},"\"style.css\"",[122,8894,2333],{"class":639},[122,8896,8897,8900,8902],{"class":222,"line":672},[122,8898,8899],{"class":639},"\u003C\u002F",[122,8901,8811],{"class":8782},[122,8903,2333],{"class":639},[122,8905,8906,8908,8911],{"class":222,"line":701},[122,8907,633],{"class":639},[122,8909,8910],{"class":8782},"body",[122,8912,2333],{"class":639},[122,8914,8915,8917,8919,8921,8923],{"class":222,"line":706},[122,8916,8818],{"class":639},[122,8918,11],{"class":8782},[122,8920,8865],{"class":639},[122,8922,11],{"class":8782},[122,8924,2333],{"class":639},[122,8926,8927,8929,8932,8935,8937,8940,8943,8945,8948,8951,8953,8956,8959,8961],{"class":222,"line":712},[122,8928,8818],{"class":639},[122,8930,8931],{"class":8782},"canvas",[122,8933,8934],{"class":233}," id",[122,8936,2421],{"class":639},[122,8938,8939],{"class":237},"\"gameCanvas\"",[122,8941,8942],{"class":233}," width",[122,8944,2421],{"class":639},[122,8946,8947],{"class":237},"\"800\"",[122,8949,8950],{"class":233}," height",[122,8952,2421],{"class":639},[122,8954,8955],{"class":237},"\"600\"",[122,8957,8958],{"class":639},">\u003C\u002F",[122,8960,8931],{"class":8782},[122,8962,2333],{"class":639},[122,8964,8965,8967,8970,8972,8974,8977,8980,8982],{"class":222,"line":725},[122,8966,8818],{"class":639},[122,8968,8969],{"class":8782},"div",[122,8971,8934],{"class":233},[122,8973,2421],{"class":639},[122,8975,8976],{"class":237},"\"score\"",[122,8978,8979],{"class":639},">Score: 0\u003C\u002F",[122,8981,8969],{"class":8782},[122,8983,2333],{"class":639},[122,8985,8986,8988,8991,8994,8996,8999,9001,9003],{"class":222,"line":737},[122,8987,8818],{"class":639},[122,8989,8990],{"class":8782},"script",[122,8992,8993],{"class":233}," src",[122,8995,2421],{"class":639},[122,8997,8998],{"class":237},"\"game.js\"",[122,9000,8958],{"class":639},[122,9002,8990],{"class":8782},[122,9004,2333],{"class":639},[122,9006,9007,9009,9011],{"class":222,"line":758},[122,9008,8899],{"class":639},[122,9010,8910],{"class":8782},[122,9012,2333],{"class":639},[122,9014,9015,9017,9019],{"class":222,"line":782},[122,9016,8899],{"class":639},[122,9018,8772],{"class":8782},[122,9020,2333],{"class":639},[353,9022,9023],{"start":230},[159,9024,9025],{},"style.css",[212,9027,9031],{"className":9028,"code":9029,"language":9030,"meta":217,"style":217},"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",[127,9032,9033,9040,9053,9065,9077,9089,9100,9112,9116,9120,9126,9146,9157,9161,9165,9172,9185,9199],{"__ignoreMap":217},[122,9034,9035,9037],{"class":222,"line":223},[122,9036,8910],{"class":8782},[122,9038,9039],{"class":639}," {\n",[122,9041,9042,9045,9048,9051],{"class":222,"line":230},[122,9043,9044],{"class":241},"    font-family",[122,9046,9047],{"class":639},": ",[122,9049,9050],{"class":241},"sans-serif",[122,9052,4249],{"class":639},[122,9054,9055,9058,9060,9063],{"class":222,"line":248},[122,9056,9057],{"class":241},"    display",[122,9059,9047],{"class":639},[122,9061,9062],{"class":241},"flex",[122,9064,4249],{"class":639},[122,9066,9067,9070,9072,9075],{"class":222,"line":260},[122,9068,9069],{"class":241},"    flex-direction",[122,9071,9047],{"class":639},[122,9073,9074],{"class":241},"column",[122,9076,4249],{"class":639},[122,9078,9079,9082,9084,9087],{"class":222,"line":267},[122,9080,9081],{"class":241},"    align-items",[122,9083,9047],{"class":639},[122,9085,9086],{"class":241},"center",[122,9088,4249],{"class":639},[122,9090,9091,9094,9096,9098],{"class":222,"line":273},[122,9092,9093],{"class":241},"    margin",[122,9095,9047],{"class":639},[122,9097,4452],{"class":241},[122,9099,4249],{"class":639},[122,9101,9102,9105,9107,9110],{"class":222,"line":660},[122,9103,9104],{"class":241},"    background-color",[122,9106,9047],{"class":639},[122,9108,9109],{"class":241},"#f0f0f0",[122,9111,4249],{"class":639},[122,9113,9114],{"class":222,"line":672},[122,9115,4526],{"class":639},[122,9117,9118],{"class":222,"line":701},[122,9119,264],{"emptyLinePlaceholder":263},[122,9121,9122,9124],{"class":222,"line":706},[122,9123,8931],{"class":8782},[122,9125,9039],{"class":639},[122,9127,9128,9131,9133,9135,9138,9141,9144],{"class":222,"line":712},[122,9129,9130],{"class":241},"    border",[122,9132,9047],{"class":639},[122,9134,4021],{"class":241},[122,9136,9137],{"class":632},"px",[122,9139,9140],{"class":241}," solid",[122,9142,9143],{"class":241}," black",[122,9145,4249],{"class":639},[122,9147,9148,9150,9152,9155],{"class":222,"line":725},[122,9149,9104],{"class":241},[122,9151,9047],{"class":639},[122,9153,9154],{"class":241},"#fff",[122,9156,4249],{"class":639},[122,9158,9159],{"class":222,"line":737},[122,9160,4526],{"class":639},[122,9162,9163],{"class":222,"line":758},[122,9164,264],{"emptyLinePlaceholder":263},[122,9166,9167,9170],{"class":222,"line":782},[122,9168,9169],{"class":233},"#score",[122,9171,9039],{"class":639},[122,9173,9174,9177,9179,9181,9183],{"class":222,"line":787},[122,9175,9176],{"class":241},"    margin-top",[122,9178,9047],{"class":639},[122,9180,4206],{"class":241},[122,9182,9137],{"class":632},[122,9184,4249],{"class":639},[122,9186,9187,9190,9192,9195,9197],{"class":222,"line":793},[122,9188,9189],{"class":241},"    font-size",[122,9191,9047],{"class":639},[122,9193,9194],{"class":241},"24",[122,9196,9137],{"class":632},[122,9198,4249],{"class":639},[122,9200,9201],{"class":222,"line":807},[122,9202,4526],{"class":639},[353,9204,9205],{"start":248},[159,9206,9207],{},"game.js",[212,9209,9213],{"className":9210,"code":9211,"language":9212,"meta":217,"style":217},"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",[127,9214,9215,9238,9260,9280,9284,9298,9310,9314,9324,9357,9370,9382,9394,9406,9418,9432,9437,9441,9449,9462,9493,9497,9501,9508,9535,9550,9555,9584,9597,9601,9605,9609,9613,9622,9654,9665,9676,9687,9698,9709,9721,9726,9731,9738,9749,9774,9779,9784,9791,9804,9809,9814,9819,9829,9870,9881,9892,9903,9914,9925,9936,9949,9954,9959,9966,9977,10002,10007,10012,10019,10032,10037,10042,10047,10098,10111,10123,10128,10139,10170,10195,10216,10240,10263,10290,10305,10324,10329,10334,10349,10360,10379,10384,10389,10408,10430,10447,10465,10480,10485,10490,10500,10520,10525,10536,10546,10551,10579,10589,10598,10603,10617,10633,10638,10643,10667,10682,10696,10711,10730,10736,10742,10748,10753,10774,10784,10793,10798,10811,10825,10830,10835,10847,10860,10871,10876,10881,10886,10895,10900,10905,10931,10944,10961,11013,11018,11024,11029,11051,11062,11067,11072,11086],{"__ignoreMap":217},[122,9216,9217,9220,9223,9225,9228,9231,9233,9236],{"class":222,"line":223},[122,9218,9219],{"class":632},"const",[122,9221,9222],{"class":241}," canvas",[122,9224,1909],{"class":632},[122,9226,9227],{"class":639}," document.",[122,9229,9230],{"class":233},"getElementById",[122,9232,4013],{"class":639},[122,9234,9235],{"class":237},"'gameCanvas'",[122,9237,4024],{"class":639},[122,9239,9240,9242,9245,9247,9250,9253,9255,9258],{"class":222,"line":230},[122,9241,9219],{"class":632},[122,9243,9244],{"class":241}," ctx",[122,9246,1909],{"class":632},[122,9248,9249],{"class":639}," canvas.",[122,9251,9252],{"class":233},"getContext",[122,9254,4013],{"class":639},[122,9256,9257],{"class":237},"'2d'",[122,9259,4024],{"class":639},[122,9261,9262,9264,9267,9269,9271,9273,9275,9278],{"class":222,"line":248},[122,9263,9219],{"class":632},[122,9265,9266],{"class":241}," scoreElement",[122,9268,1909],{"class":632},[122,9270,9227],{"class":639},[122,9272,9230],{"class":233},[122,9274,4013],{"class":639},[122,9276,9277],{"class":237},"'score'",[122,9279,4024],{"class":639},[122,9281,9282],{"class":222,"line":260},[122,9283,264],{"emptyLinePlaceholder":263},[122,9285,9286,9289,9292,9294,9296],{"class":222,"line":267},[122,9287,9288],{"class":632},"let",[122,9290,9291],{"class":639}," score ",[122,9293,2421],{"class":632},[122,9295,8359],{"class":241},[122,9297,4249],{"class":639},[122,9299,9300,9302,9305,9307],{"class":222,"line":273},[122,9301,9288],{"class":632},[122,9303,9304],{"class":639}," keys ",[122,9306,2421],{"class":632},[122,9308,9309],{"class":639}," {};\n",[122,9311,9312],{"class":222,"line":660},[122,9313,264],{"emptyLinePlaceholder":263},[122,9315,9316,9319,9322],{"class":222,"line":672},[122,9317,9318],{"class":632},"class",[122,9320,9321],{"class":233}," Player",[122,9323,9039],{"class":639},[122,9325,9326,9329,9331,9335,9337,9340,9342,9345,9347,9350,9352,9355],{"class":222,"line":701},[122,9327,9328],{"class":632},"    constructor",[122,9330,4013],{"class":639},[122,9332,9334],{"class":9333},"sQHwn","x",[122,9336,4091],{"class":639},[122,9338,9339],{"class":9333},"y",[122,9341,4091],{"class":639},[122,9343,9344],{"class":9333},"width",[122,9346,4091],{"class":639},[122,9348,9349],{"class":9333},"height",[122,9351,4091],{"class":639},[122,9353,9354],{"class":9333},"color",[122,9356,4429],{"class":639},[122,9358,9359,9362,9365,9367],{"class":222,"line":706},[122,9360,9361],{"class":241},"        this",[122,9363,9364],{"class":639},".x ",[122,9366,2421],{"class":632},[122,9368,9369],{"class":639}," x;\n",[122,9371,9372,9374,9377,9379],{"class":222,"line":712},[122,9373,9361],{"class":241},[122,9375,9376],{"class":639},".y ",[122,9378,2421],{"class":632},[122,9380,9381],{"class":639}," y;\n",[122,9383,9384,9386,9389,9391],{"class":222,"line":725},[122,9385,9361],{"class":241},[122,9387,9388],{"class":639},".width ",[122,9390,2421],{"class":632},[122,9392,9393],{"class":639}," width;\n",[122,9395,9396,9398,9401,9403],{"class":222,"line":737},[122,9397,9361],{"class":241},[122,9399,9400],{"class":639},".height ",[122,9402,2421],{"class":632},[122,9404,9405],{"class":639}," height;\n",[122,9407,9408,9410,9413,9415],{"class":222,"line":758},[122,9409,9361],{"class":241},[122,9411,9412],{"class":639},".color ",[122,9414,2421],{"class":632},[122,9416,9417],{"class":639}," color;\n",[122,9419,9420,9422,9425,9427,9430],{"class":222,"line":782},[122,9421,9361],{"class":241},[122,9423,9424],{"class":639},".speed ",[122,9426,2421],{"class":632},[122,9428,9429],{"class":241}," 5",[122,9431,4249],{"class":639},[122,9433,9434],{"class":222,"line":787},[122,9435,9436],{"class":639},"    }\n",[122,9438,9439],{"class":222,"line":793},[122,9440,264],{"emptyLinePlaceholder":263},[122,9442,9443,9446],{"class":222,"line":807},[122,9444,9445],{"class":233},"    draw",[122,9447,9448],{"class":639},"() {\n",[122,9450,9451,9454,9456,9459],{"class":222,"line":823},[122,9452,9453],{"class":639},"        ctx.fillStyle ",[122,9455,2421],{"class":632},[122,9457,9458],{"class":241}," this",[122,9460,9461],{"class":639},".color;\n",[122,9463,9464,9467,9470,9472,9475,9478,9480,9483,9485,9488,9490],{"class":222,"line":828},[122,9465,9466],{"class":639},"        ctx.",[122,9468,9469],{"class":233},"fillRect",[122,9471,4013],{"class":639},[122,9473,9474],{"class":241},"this",[122,9476,9477],{"class":639},".x, ",[122,9479,9474],{"class":241},[122,9481,9482],{"class":639},".y, ",[122,9484,9474],{"class":241},[122,9486,9487],{"class":639},".width, ",[122,9489,9474],{"class":241},[122,9491,9492],{"class":639},".height);\n",[122,9494,9495],{"class":222,"line":834},[122,9496,9436],{"class":639},[122,9498,9499],{"class":222,"line":850},[122,9500,264],{"emptyLinePlaceholder":263},[122,9502,9503,9506],{"class":222,"line":864},[122,9504,9505],{"class":233},"    update",[122,9507,9448],{"class":639},[122,9509,9510,9513,9516,9519,9522,9525,9527,9529,9531,9533],{"class":222,"line":880},[122,9511,9512],{"class":632},"        if",[122,9514,9515],{"class":639}," (keys[",[122,9517,9518],{"class":237},"'ArrowLeft'",[122,9520,9521],{"class":639},"] ",[122,9523,9524],{"class":632},"&&",[122,9526,9458],{"class":241},[122,9528,9364],{"class":639},[122,9530,643],{"class":632},[122,9532,8359],{"class":241},[122,9534,4429],{"class":639},[122,9536,9537,9540,9542,9545,9547],{"class":222,"line":7632},[122,9538,9539],{"class":241},"            this",[122,9541,9364],{"class":639},[122,9543,9544],{"class":632},"-=",[122,9546,9458],{"class":241},[122,9548,9549],{"class":639},".speed;\n",[122,9551,9552],{"class":222,"line":7638},[122,9553,9554],{"class":639},"        }\n",[122,9556,9557,9559,9561,9564,9566,9568,9570,9572,9574,9577,9579,9581],{"class":222,"line":7648},[122,9558,9512],{"class":632},[122,9560,9515],{"class":639},[122,9562,9563],{"class":237},"'ArrowRight'",[122,9565,9521],{"class":639},[122,9567,9524],{"class":632},[122,9569,9458],{"class":241},[122,9571,9364],{"class":639},[122,9573,633],{"class":632},[122,9575,9576],{"class":639}," canvas.width ",[122,9578,4445],{"class":632},[122,9580,9458],{"class":241},[122,9582,9583],{"class":639},".width) {\n",[122,9585,9586,9588,9590,9593,9595],{"class":222,"line":7662},[122,9587,9539],{"class":241},[122,9589,9364],{"class":639},[122,9591,9592],{"class":632},"+=",[122,9594,9458],{"class":241},[122,9596,9549],{"class":639},[122,9598,9599],{"class":222,"line":7667},[122,9600,9554],{"class":639},[122,9602,9603],{"class":222,"line":7673},[122,9604,9436],{"class":639},[122,9606,9607],{"class":222,"line":7686},[122,9608,4526],{"class":639},[122,9610,9611],{"class":222,"line":7697},[122,9612,264],{"emptyLinePlaceholder":263},[122,9614,9615,9617,9620],{"class":222,"line":7708},[122,9616,9318],{"class":632},[122,9618,9619],{"class":233}," Bullet",[122,9621,9039],{"class":639},[122,9623,9625,9627,9629,9631,9633,9635,9637,9639,9641,9643,9645,9647,9649,9652],{"class":222,"line":9624},34,[122,9626,9328],{"class":632},[122,9628,4013],{"class":639},[122,9630,9334],{"class":9333},[122,9632,4091],{"class":639},[122,9634,9339],{"class":9333},[122,9636,4091],{"class":639},[122,9638,9344],{"class":9333},[122,9640,4091],{"class":639},[122,9642,9349],{"class":9333},[122,9644,4091],{"class":639},[122,9646,9354],{"class":9333},[122,9648,4091],{"class":639},[122,9650,9651],{"class":9333},"speed",[122,9653,4429],{"class":639},[122,9655,9657,9659,9661,9663],{"class":222,"line":9656},35,[122,9658,9361],{"class":241},[122,9660,9364],{"class":639},[122,9662,2421],{"class":632},[122,9664,9369],{"class":639},[122,9666,9668,9670,9672,9674],{"class":222,"line":9667},36,[122,9669,9361],{"class":241},[122,9671,9376],{"class":639},[122,9673,2421],{"class":632},[122,9675,9381],{"class":639},[122,9677,9679,9681,9683,9685],{"class":222,"line":9678},37,[122,9680,9361],{"class":241},[122,9682,9388],{"class":639},[122,9684,2421],{"class":632},[122,9686,9393],{"class":639},[122,9688,9690,9692,9694,9696],{"class":222,"line":9689},38,[122,9691,9361],{"class":241},[122,9693,9400],{"class":639},[122,9695,2421],{"class":632},[122,9697,9405],{"class":639},[122,9699,9701,9703,9705,9707],{"class":222,"line":9700},39,[122,9702,9361],{"class":241},[122,9704,9412],{"class":639},[122,9706,2421],{"class":632},[122,9708,9417],{"class":639},[122,9710,9712,9714,9716,9718],{"class":222,"line":9711},40,[122,9713,9361],{"class":241},[122,9715,9424],{"class":639},[122,9717,2421],{"class":632},[122,9719,9720],{"class":639}," speed;\n",[122,9722,9724],{"class":222,"line":9723},41,[122,9725,9436],{"class":639},[122,9727,9729],{"class":222,"line":9728},42,[122,9730,264],{"emptyLinePlaceholder":263},[122,9732,9734,9736],{"class":222,"line":9733},43,[122,9735,9445],{"class":233},[122,9737,9448],{"class":639},[122,9739,9741,9743,9745,9747],{"class":222,"line":9740},44,[122,9742,9453],{"class":639},[122,9744,2421],{"class":632},[122,9746,9458],{"class":241},[122,9748,9461],{"class":639},[122,9750,9752,9754,9756,9758,9760,9762,9764,9766,9768,9770,9772],{"class":222,"line":9751},45,[122,9753,9466],{"class":639},[122,9755,9469],{"class":233},[122,9757,4013],{"class":639},[122,9759,9474],{"class":241},[122,9761,9477],{"class":639},[122,9763,9474],{"class":241},[122,9765,9482],{"class":639},[122,9767,9474],{"class":241},[122,9769,9487],{"class":639},[122,9771,9474],{"class":241},[122,9773,9492],{"class":639},[122,9775,9777],{"class":222,"line":9776},46,[122,9778,9436],{"class":639},[122,9780,9782],{"class":222,"line":9781},47,[122,9783,264],{"emptyLinePlaceholder":263},[122,9785,9787,9789],{"class":222,"line":9786},48,[122,9788,9505],{"class":233},[122,9790,9448],{"class":639},[122,9792,9794,9796,9798,9800,9802],{"class":222,"line":9793},49,[122,9795,9361],{"class":241},[122,9797,9376],{"class":639},[122,9799,9544],{"class":632},[122,9801,9458],{"class":241},[122,9803,9549],{"class":639},[122,9805,9807],{"class":222,"line":9806},50,[122,9808,9436],{"class":639},[122,9810,9812],{"class":222,"line":9811},51,[122,9813,4526],{"class":639},[122,9815,9817],{"class":222,"line":9816},52,[122,9818,264],{"emptyLinePlaceholder":263},[122,9820,9822,9824,9827],{"class":222,"line":9821},53,[122,9823,9318],{"class":632},[122,9825,9826],{"class":233}," Enemy",[122,9828,9039],{"class":639},[122,9830,9832,9834,9836,9838,9840,9842,9844,9846,9848,9850,9852,9854,9856,9858,9860,9863,9865,9868],{"class":222,"line":9831},54,[122,9833,9328],{"class":632},[122,9835,4013],{"class":639},[122,9837,9334],{"class":9333},[122,9839,4091],{"class":639},[122,9841,9339],{"class":9333},[122,9843,4091],{"class":639},[122,9845,9344],{"class":9333},[122,9847,4091],{"class":639},[122,9849,9349],{"class":9333},[122,9851,4091],{"class":639},[122,9853,9354],{"class":9333},[122,9855,4091],{"class":639},[122,9857,9651],{"class":9333},[122,9859,4091],{"class":639},[122,9861,9862],{"class":9333},"isBoss",[122,9864,1909],{"class":632},[122,9866,9867],{"class":241}," false",[122,9869,4429],{"class":639},[122,9871,9873,9875,9877,9879],{"class":222,"line":9872},55,[122,9874,9361],{"class":241},[122,9876,9364],{"class":639},[122,9878,2421],{"class":632},[122,9880,9369],{"class":639},[122,9882,9884,9886,9888,9890],{"class":222,"line":9883},56,[122,9885,9361],{"class":241},[122,9887,9376],{"class":639},[122,9889,2421],{"class":632},[122,9891,9381],{"class":639},[122,9893,9895,9897,9899,9901],{"class":222,"line":9894},57,[122,9896,9361],{"class":241},[122,9898,9388],{"class":639},[122,9900,2421],{"class":632},[122,9902,9393],{"class":639},[122,9904,9906,9908,9910,9912],{"class":222,"line":9905},58,[122,9907,9361],{"class":241},[122,9909,9400],{"class":639},[122,9911,2421],{"class":632},[122,9913,9405],{"class":639},[122,9915,9917,9919,9921,9923],{"class":222,"line":9916},59,[122,9918,9361],{"class":241},[122,9920,9412],{"class":639},[122,9922,2421],{"class":632},[122,9924,9417],{"class":639},[122,9926,9928,9930,9932,9934],{"class":222,"line":9927},60,[122,9929,9361],{"class":241},[122,9931,9424],{"class":639},[122,9933,2421],{"class":632},[122,9935,9720],{"class":639},[122,9937,9939,9941,9944,9946],{"class":222,"line":9938},61,[122,9940,9361],{"class":241},[122,9942,9943],{"class":639},".isBoss ",[122,9945,2421],{"class":632},[122,9947,9948],{"class":639}," isBoss;\n",[122,9950,9952],{"class":222,"line":9951},62,[122,9953,9436],{"class":639},[122,9955,9957],{"class":222,"line":9956},63,[122,9958,264],{"emptyLinePlaceholder":263},[122,9960,9962,9964],{"class":222,"line":9961},64,[122,9963,9445],{"class":233},[122,9965,9448],{"class":639},[122,9967,9969,9971,9973,9975],{"class":222,"line":9968},65,[122,9970,9453],{"class":639},[122,9972,2421],{"class":632},[122,9974,9458],{"class":241},[122,9976,9461],{"class":639},[122,9978,9980,9982,9984,9986,9988,9990,9992,9994,9996,9998,10000],{"class":222,"line":9979},66,[122,9981,9466],{"class":639},[122,9983,9469],{"class":233},[122,9985,4013],{"class":639},[122,9987,9474],{"class":241},[122,9989,9477],{"class":639},[122,9991,9474],{"class":241},[122,9993,9482],{"class":639},[122,9995,9474],{"class":241},[122,9997,9487],{"class":639},[122,9999,9474],{"class":241},[122,10001,9492],{"class":639},[122,10003,10005],{"class":222,"line":10004},67,[122,10006,9436],{"class":639},[122,10008,10010],{"class":222,"line":10009},68,[122,10011,264],{"emptyLinePlaceholder":263},[122,10013,10015,10017],{"class":222,"line":10014},69,[122,10016,9505],{"class":233},[122,10018,9448],{"class":639},[122,10020,10022,10024,10026,10028,10030],{"class":222,"line":10021},70,[122,10023,9361],{"class":241},[122,10025,9376],{"class":639},[122,10027,9592],{"class":632},[122,10029,9458],{"class":241},[122,10031,9549],{"class":639},[122,10033,10035],{"class":222,"line":10034},71,[122,10036,9436],{"class":639},[122,10038,10040],{"class":222,"line":10039},72,[122,10041,4526],{"class":639},[122,10043,10045],{"class":222,"line":10044},73,[122,10046,264],{"emptyLinePlaceholder":263},[122,10048,10050,10052,10055,10057,10059,10061,10064,10066,10069,10071,10074,10077,10079,10082,10084,10087,10089,10091,10093,10096],{"class":222,"line":10049},74,[122,10051,9219],{"class":632},[122,10053,10054],{"class":241}," player",[122,10056,1909],{"class":632},[122,10058,4038],{"class":632},[122,10060,9321],{"class":233},[122,10062,10063],{"class":639},"(canvas.width ",[122,10065,7235],{"class":632},[122,10067,10068],{"class":241}," 2",[122,10070,8213],{"class":632},[122,10072,10073],{"class":241}," 25",[122,10075,10076],{"class":639},", canvas.height ",[122,10078,4445],{"class":632},[122,10080,10081],{"class":241}," 60",[122,10083,4091],{"class":639},[122,10085,10086],{"class":241},"50",[122,10088,4091],{"class":639},[122,10090,10086],{"class":241},[122,10092,4091],{"class":639},[122,10094,10095],{"class":237},"'blue'",[122,10097,4024],{"class":639},[122,10099,10101,10103,10106,10108],{"class":222,"line":10100},75,[122,10102,9219],{"class":632},[122,10104,10105],{"class":241}," bullets",[122,10107,1909],{"class":632},[122,10109,10110],{"class":639}," [];\n",[122,10112,10114,10116,10119,10121],{"class":222,"line":10113},76,[122,10115,9219],{"class":632},[122,10117,10118],{"class":241}," enemies",[122,10120,1909],{"class":632},[122,10122,10110],{"class":639},[122,10124,10126],{"class":222,"line":10125},77,[122,10127,264],{"emptyLinePlaceholder":263},[122,10129,10131,10134,10137],{"class":222,"line":10130},78,[122,10132,10133],{"class":632},"function",[122,10135,10136],{"class":233}," spawnEnemy",[122,10138,9448],{"class":639},[122,10140,10142,10145,10148,10150,10153,10156,10159,10161,10164,10167],{"class":222,"line":10141},79,[122,10143,10144],{"class":632},"    const",[122,10146,10147],{"class":241}," isBoss",[122,10149,1909],{"class":632},[122,10151,10152],{"class":639}," Math.",[122,10154,10155],{"class":233},"random",[122,10157,10158],{"class":639},"() ",[122,10160,633],{"class":632},[122,10162,10163],{"class":241}," 0.1",[122,10165,10166],{"class":639},"; ",[122,10168,10169],{"class":226},"\u002F\u002F 10% chance of being a boss\n",[122,10171,10173,10175,10177,10179,10182,10185,10188,10191,10193],{"class":222,"line":10172},80,[122,10174,10144],{"class":632},[122,10176,8942],{"class":241},[122,10178,1909],{"class":632},[122,10180,10181],{"class":639}," isBoss ",[122,10183,10184],{"class":632},"?",[122,10186,10187],{"class":241}," 100",[122,10189,10190],{"class":632}," :",[122,10192,5922],{"class":241},[122,10194,4249],{"class":639},[122,10196,10198,10200,10202,10204,10206,10208,10210,10212,10214],{"class":222,"line":10197},81,[122,10199,10144],{"class":632},[122,10201,8950],{"class":241},[122,10203,1909],{"class":632},[122,10205,10181],{"class":639},[122,10207,10184],{"class":632},[122,10209,10187],{"class":241},[122,10211,10190],{"class":632},[122,10213,5922],{"class":241},[122,10215,4249],{"class":639},[122,10217,10219,10221,10224,10226,10228,10230,10233,10235,10238],{"class":222,"line":10218},82,[122,10220,10144],{"class":632},[122,10222,10223],{"class":241}," color",[122,10225,1909],{"class":632},[122,10227,10181],{"class":639},[122,10229,10184],{"class":632},[122,10231,10232],{"class":237}," 'red'",[122,10234,10190],{"class":632},[122,10236,10237],{"class":237}," 'green'",[122,10239,4249],{"class":639},[122,10241,10243,10245,10248,10250,10252,10254,10256,10258,10261],{"class":222,"line":10242},83,[122,10244,10144],{"class":632},[122,10246,10247],{"class":241}," speed",[122,10249,1909],{"class":632},[122,10251,10181],{"class":639},[122,10253,10184],{"class":632},[122,10255,4411],{"class":241},[122,10257,10190],{"class":632},[122,10259,10260],{"class":241}," 0.5",[122,10262,4249],{"class":639},[122,10264,10266,10268,10271,10273,10275,10277,10279,10282,10285,10287],{"class":222,"line":10265},84,[122,10267,10144],{"class":632},[122,10269,10270],{"class":241}," x",[122,10272,1909],{"class":632},[122,10274,10152],{"class":639},[122,10276,10155],{"class":233},[122,10278,10158],{"class":639},[122,10280,10281],{"class":632},"*",[122,10283,10284],{"class":639}," (canvas.width ",[122,10286,4445],{"class":632},[122,10288,10289],{"class":639}," width);\n",[122,10291,10293,10295,10298,10300,10302],{"class":222,"line":10292},85,[122,10294,10144],{"class":632},[122,10296,10297],{"class":241}," y",[122,10299,1909],{"class":632},[122,10301,8213],{"class":632},[122,10303,10304],{"class":639},"height;\n",[122,10306,10308,10311,10314,10316,10319,10321],{"class":222,"line":10307},86,[122,10309,10310],{"class":639},"    enemies.",[122,10312,10313],{"class":233},"push",[122,10315,4013],{"class":639},[122,10317,10318],{"class":632},"new",[122,10320,9826],{"class":233},[122,10322,10323],{"class":639},"(x, y, width, height, color, speed, isBoss));\n",[122,10325,10327],{"class":222,"line":10326},87,[122,10328,4526],{"class":639},[122,10330,10332],{"class":222,"line":10331},88,[122,10333,264],{"emptyLinePlaceholder":263},[122,10335,10337,10339,10342,10344,10347],{"class":222,"line":10336},89,[122,10338,10133],{"class":632},[122,10340,10341],{"class":233}," updateScore",[122,10343,4013],{"class":639},[122,10345,10346],{"class":9333},"points",[122,10348,4429],{"class":639},[122,10350,10352,10355,10357],{"class":222,"line":10351},90,[122,10353,10354],{"class":639},"    score ",[122,10356,9592],{"class":632},[122,10358,10359],{"class":639}," points;\n",[122,10361,10363,10366,10368,10371,10374,10377],{"class":222,"line":10362},91,[122,10364,10365],{"class":639},"    scoreElement.textContent ",[122,10367,2421],{"class":632},[122,10369,10370],{"class":237}," `Score: ${",[122,10372,10373],{"class":639},"score",[122,10375,10376],{"class":237},"}`",[122,10378,4249],{"class":639},[122,10380,10382],{"class":222,"line":10381},92,[122,10383,4526],{"class":639},[122,10385,10387],{"class":222,"line":10386},93,[122,10388,264],{"emptyLinePlaceholder":263},[122,10390,10392,10394,10397,10399,10401,10403,10406],{"class":222,"line":10391},94,[122,10393,10133],{"class":632},[122,10395,10396],{"class":233}," collision",[122,10398,4013],{"class":639},[122,10400,24],{"class":9333},[122,10402,4091],{"class":639},[122,10404,10405],{"class":9333},"b",[122,10407,4429],{"class":639},[122,10409,10411,10414,10417,10419,10422,10424,10427],{"class":222,"line":10410},95,[122,10412,10413],{"class":632},"    return",[122,10415,10416],{"class":639}," a.x ",[122,10418,633],{"class":632},[122,10420,10421],{"class":639}," b.x ",[122,10423,377],{"class":632},[122,10425,10426],{"class":639}," b.width ",[122,10428,10429],{"class":632},"&&\n",[122,10431,10433,10436,10438,10441,10443,10445],{"class":222,"line":10432},96,[122,10434,10435],{"class":639},"           a.x ",[122,10437,377],{"class":632},[122,10439,10440],{"class":639}," a.width ",[122,10442,643],{"class":632},[122,10444,10421],{"class":639},[122,10446,10429],{"class":632},[122,10448,10450,10453,10455,10458,10460,10463],{"class":222,"line":10449},97,[122,10451,10452],{"class":639},"           a.y ",[122,10454,633],{"class":632},[122,10456,10457],{"class":639}," b.y ",[122,10459,377],{"class":632},[122,10461,10462],{"class":639}," b.height ",[122,10464,10429],{"class":632},[122,10466,10468,10470,10472,10475,10477],{"class":222,"line":10467},98,[122,10469,10452],{"class":639},[122,10471,377],{"class":632},[122,10473,10474],{"class":639}," a.height ",[122,10476,643],{"class":632},[122,10478,10479],{"class":639}," b.y;\n",[122,10481,10483],{"class":222,"line":10482},99,[122,10484,4526],{"class":639},[122,10486,10488],{"class":222,"line":10487},100,[122,10489,264],{"emptyLinePlaceholder":263},[122,10491,10493,10495,10498],{"class":222,"line":10492},101,[122,10494,10133],{"class":632},[122,10496,10497],{"class":233}," gameLoop",[122,10499,9448],{"class":639},[122,10501,10503,10506,10509,10511,10513,10515,10517],{"class":222,"line":10502},102,[122,10504,10505],{"class":639},"    ctx.",[122,10507,10508],{"class":233},"clearRect",[122,10510,4013],{"class":639},[122,10512,4452],{"class":241},[122,10514,4091],{"class":639},[122,10516,4452],{"class":241},[122,10518,10519],{"class":639},", canvas.width, canvas.height);\n",[122,10521,10523],{"class":222,"line":10522},103,[122,10524,264],{"emptyLinePlaceholder":263},[122,10526,10528,10531,10534],{"class":222,"line":10527},104,[122,10529,10530],{"class":639},"    player.",[122,10532,10533],{"class":233},"update",[122,10535,4223],{"class":639},[122,10537,10539,10541,10544],{"class":222,"line":10538},105,[122,10540,10530],{"class":639},[122,10542,10543],{"class":233},"draw",[122,10545,4223],{"class":639},[122,10547,10549],{"class":222,"line":10548},106,[122,10550,264],{"emptyLinePlaceholder":263},[122,10552,10554,10557,10560,10563,10566,10568,10571,10574,10577],{"class":222,"line":10553},107,[122,10555,10556],{"class":639},"    bullets.",[122,10558,10559],{"class":233},"forEach",[122,10561,10562],{"class":639},"((",[122,10564,10565],{"class":9333},"bullet",[122,10567,4091],{"class":639},[122,10569,10570],{"class":9333},"bulletIndex",[122,10572,10573],{"class":639},") ",[122,10575,10576],{"class":632},"=>",[122,10578,9039],{"class":639},[122,10580,10582,10585,10587],{"class":222,"line":10581},108,[122,10583,10584],{"class":639},"        bullet.",[122,10586,10533],{"class":233},[122,10588,4223],{"class":639},[122,10590,10592,10594,10596],{"class":222,"line":10591},109,[122,10593,10584],{"class":639},[122,10595,10543],{"class":233},[122,10597,4223],{"class":639},[122,10599,10601],{"class":222,"line":10600},110,[122,10602,264],{"emptyLinePlaceholder":263},[122,10604,10606,10608,10611,10613,10615],{"class":222,"line":10605},111,[122,10607,9512],{"class":632},[122,10609,10610],{"class":639}," (bullet.y ",[122,10612,633],{"class":632},[122,10614,8359],{"class":241},[122,10616,4429],{"class":639},[122,10618,10620,10623,10626,10629,10631],{"class":222,"line":10619},112,[122,10621,10622],{"class":639},"            bullets.",[122,10624,10625],{"class":233},"splice",[122,10627,10628],{"class":639},"(bulletIndex, ",[122,10630,4021],{"class":241},[122,10632,4024],{"class":639},[122,10634,10636],{"class":222,"line":10635},113,[122,10637,9554],{"class":639},[122,10639,10641],{"class":222,"line":10640},114,[122,10642,264],{"emptyLinePlaceholder":263},[122,10644,10646,10649,10651,10653,10656,10658,10661,10663,10665],{"class":222,"line":10645},115,[122,10647,10648],{"class":639},"        enemies.",[122,10650,10559],{"class":233},[122,10652,10562],{"class":639},[122,10654,10655],{"class":9333},"enemy",[122,10657,4091],{"class":639},[122,10659,10660],{"class":9333},"enemyIndex",[122,10662,10573],{"class":639},[122,10664,10576],{"class":632},[122,10666,9039],{"class":639},[122,10668,10670,10673,10676,10679],{"class":222,"line":10669},116,[122,10671,10672],{"class":632},"            if",[122,10674,10675],{"class":639}," (",[122,10677,10678],{"class":233},"collision",[122,10680,10681],{"class":639},"(bullet, enemy)) {\n",[122,10683,10685,10688,10690,10692,10694],{"class":222,"line":10684},117,[122,10686,10687],{"class":639},"                bullets.",[122,10689,10625],{"class":233},[122,10691,10628],{"class":639},[122,10693,4021],{"class":241},[122,10695,4024],{"class":639},[122,10697,10699,10702,10704,10707,10709],{"class":222,"line":10698},118,[122,10700,10701],{"class":639},"                enemies.",[122,10703,10625],{"class":233},[122,10705,10706],{"class":639},"(enemyIndex, ",[122,10708,4021],{"class":241},[122,10710,4024],{"class":639},[122,10712,10714,10717,10720,10722,10724,10726,10728],{"class":222,"line":10713},119,[122,10715,10716],{"class":233},"                updateScore",[122,10718,10719],{"class":639},"(enemy.isBoss ",[122,10721,10184],{"class":632},[122,10723,10187],{"class":241},[122,10725,10190],{"class":632},[122,10727,9429],{"class":241},[122,10729,4024],{"class":639},[122,10731,10733],{"class":222,"line":10732},120,[122,10734,10735],{"class":639},"            }\n",[122,10737,10739],{"class":222,"line":10738},121,[122,10740,10741],{"class":639},"        });\n",[122,10743,10745],{"class":222,"line":10744},122,[122,10746,10747],{"class":639},"    });\n",[122,10749,10751],{"class":222,"line":10750},123,[122,10752,264],{"emptyLinePlaceholder":263},[122,10754,10756,10758,10760,10762,10764,10766,10768,10770,10772],{"class":222,"line":10755},124,[122,10757,10310],{"class":639},[122,10759,10559],{"class":233},[122,10761,10562],{"class":639},[122,10763,10655],{"class":9333},[122,10765,4091],{"class":639},[122,10767,10660],{"class":9333},[122,10769,10573],{"class":639},[122,10771,10576],{"class":632},[122,10773,9039],{"class":639},[122,10775,10777,10780,10782],{"class":222,"line":10776},125,[122,10778,10779],{"class":639},"        enemy.",[122,10781,10533],{"class":233},[122,10783,4223],{"class":639},[122,10785,10787,10789,10791],{"class":222,"line":10786},126,[122,10788,10779],{"class":639},[122,10790,10543],{"class":233},[122,10792,4223],{"class":639},[122,10794,10796],{"class":222,"line":10795},127,[122,10797,264],{"emptyLinePlaceholder":263},[122,10799,10801,10803,10806,10808],{"class":222,"line":10800},128,[122,10802,9512],{"class":632},[122,10804,10805],{"class":639}," (enemy.y ",[122,10807,643],{"class":632},[122,10809,10810],{"class":639}," canvas.height) {\n",[122,10812,10814,10817,10819,10821,10823],{"class":222,"line":10813},129,[122,10815,10816],{"class":639},"            enemies.",[122,10818,10625],{"class":233},[122,10820,10706],{"class":639},[122,10822,4021],{"class":241},[122,10824,4024],{"class":639},[122,10826,10828],{"class":222,"line":10827},130,[122,10829,9554],{"class":639},[122,10831,10833],{"class":222,"line":10832},131,[122,10834,264],{"emptyLinePlaceholder":263},[122,10836,10838,10840,10842,10844],{"class":222,"line":10837},132,[122,10839,9512],{"class":632},[122,10841,10675],{"class":639},[122,10843,10678],{"class":233},[122,10845,10846],{"class":639},"(player, enemy)) {\n",[122,10848,10850,10853,10855,10858],{"class":222,"line":10849},133,[122,10851,10852],{"class":233},"            alert",[122,10854,4013],{"class":639},[122,10856,10857],{"class":237},"'Game Over!'",[122,10859,4024],{"class":639},[122,10861,10863,10866,10869],{"class":222,"line":10862},134,[122,10864,10865],{"class":639},"            document.location.",[122,10867,10868],{"class":233},"reload",[122,10870,4223],{"class":639},[122,10872,10874],{"class":222,"line":10873},135,[122,10875,9554],{"class":639},[122,10877,10879],{"class":222,"line":10878},136,[122,10880,10747],{"class":639},[122,10882,10884],{"class":222,"line":10883},137,[122,10885,264],{"emptyLinePlaceholder":263},[122,10887,10889,10892],{"class":222,"line":10888},138,[122,10890,10891],{"class":233},"    requestAnimationFrame",[122,10893,10894],{"class":639},"(gameLoop);\n",[122,10896,10898],{"class":222,"line":10897},139,[122,10899,4526],{"class":639},[122,10901,10903],{"class":222,"line":10902},140,[122,10904,264],{"emptyLinePlaceholder":263},[122,10906,10908,10911,10914,10916,10919,10922,10925,10927,10929],{"class":222,"line":10907},141,[122,10909,10910],{"class":639},"window.",[122,10912,10913],{"class":233},"addEventListener",[122,10915,4013],{"class":639},[122,10917,10918],{"class":237},"'keydown'",[122,10920,10921],{"class":639},", (",[122,10923,10924],{"class":9333},"e",[122,10926,10573],{"class":639},[122,10928,10576],{"class":632},[122,10930,9039],{"class":639},[122,10932,10934,10937,10939,10942],{"class":222,"line":10933},142,[122,10935,10936],{"class":639},"    keys[e.key] ",[122,10938,2421],{"class":632},[122,10940,10941],{"class":241}," true",[122,10943,4249],{"class":639},[122,10945,10947,10950,10953,10956,10959],{"class":222,"line":10946},143,[122,10948,10949],{"class":632},"    if",[122,10951,10952],{"class":639}," (e.key ",[122,10954,10955],{"class":632},"===",[122,10957,10958],{"class":237}," ' '",[122,10960,4429],{"class":639},[122,10962,10964,10967,10969,10971,10973,10975,10978,10980,10983,10985,10987,10989,10992,10995,10997,10999,11001,11003,11006,11008,11011],{"class":222,"line":10963},144,[122,10965,10966],{"class":639},"        bullets.",[122,10968,10313],{"class":233},[122,10970,4013],{"class":639},[122,10972,10318],{"class":632},[122,10974,9619],{"class":233},[122,10976,10977],{"class":639},"(player.x ",[122,10979,377],{"class":632},[122,10981,10982],{"class":639}," player.width ",[122,10984,7235],{"class":632},[122,10986,10068],{"class":241},[122,10988,8213],{"class":632},[122,10990,10991],{"class":241}," 2.5",[122,10993,10994],{"class":639},", player.y, ",[122,10996,4187],{"class":241},[122,10998,4091],{"class":639},[122,11000,4206],{"class":241},[122,11002,4091],{"class":639},[122,11004,11005],{"class":237},"'black'",[122,11007,4091],{"class":639},[122,11009,11010],{"class":241},"7",[122,11012,4521],{"class":639},[122,11014,11016],{"class":222,"line":11015},145,[122,11017,9436],{"class":639},[122,11019,11021],{"class":222,"line":11020},146,[122,11022,11023],{"class":639},"});\n",[122,11025,11027],{"class":222,"line":11026},147,[122,11028,264],{"emptyLinePlaceholder":263},[122,11030,11032,11034,11036,11038,11041,11043,11045,11047,11049],{"class":222,"line":11031},148,[122,11033,10910],{"class":639},[122,11035,10913],{"class":233},[122,11037,4013],{"class":639},[122,11039,11040],{"class":237},"'keyup'",[122,11042,10921],{"class":639},[122,11044,10924],{"class":9333},[122,11046,10573],{"class":639},[122,11048,10576],{"class":632},[122,11050,9039],{"class":639},[122,11052,11054,11056,11058,11060],{"class":222,"line":11053},149,[122,11055,10936],{"class":639},[122,11057,2421],{"class":632},[122,11059,9867],{"class":241},[122,11061,4249],{"class":639},[122,11063,11065],{"class":222,"line":11064},150,[122,11066,11023],{"class":639},[122,11068,11070],{"class":222,"line":11069},151,[122,11071,264],{"emptyLinePlaceholder":263},[122,11073,11075,11078,11081,11084],{"class":222,"line":11074},152,[122,11076,11077],{"class":233},"setInterval",[122,11079,11080],{"class":639},"(spawnEnemy, ",[122,11082,11083],{"class":241},"2000",[122,11085,4024],{"class":639},[122,11087,11089,11092],{"class":222,"line":11088},153,[122,11090,11091],{"class":233},"gameLoop",[122,11093,4223],{"class":639},[15,11095,11096],{},"4 遊戲玩法",[15,11098,11099,11100,11103],{},"遊戲建立完成，",[127,11101,11102],{},"Gemnini CLI"," 也會提示遊戲玩法",[15,11105,11106],{},[2494,11107],{"alt":11108,"src":11109},"Gemini CLI遊戲玩法","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-03.png",[353,11111,11112],{"start":267},[159,11113,11114],{},"執行結果",[15,11116,11117],{},[2494,11118],{"alt":11119,"src":11120},"Gemini CLI執行結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-04.png",[353,11122,11123,11142],{"start":273},[159,11124,11125,11126,11129,11130,11132,11133],{},"更改風格",[11127,11128],"br",{},"如果你覺得畫面太陽春，你他可以請 ",[127,11131,8607],{}," 幫你優化",[212,11134,11136],{"className":214,"code":11135,"language":216,"meta":217,"style":217},"請將遊戲畫面風格換成2000年街機風格\n",[127,11137,11138],{"__ignoreMap":217},[122,11139,11140],{"class":222,"line":223},[122,11141,11135],{"class":233},[159,11143,11144],{},"修改過後的結果",[15,11146,11147],{},[2494,11148],{"alt":11149,"src":11150},"Gemini CLI修改過後的結果","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-05.png",[15,11152,11153,11154,11156],{},"以上是 ",[127,11155,11102],{}," 簡易使用範例",[2667,11158,11160],{"id":11159},"gemini-cli-的相關指令","Gemini CLI 的相關指令",[15,11162,11163,11165,11166,11168],{},[127,11164,11102],{}," 內建了一個常用指令，詳細可用 ",[127,11167,7419],{}," 進行指令查詢",[15,11170,11171],{},[2494,11172],{"alt":11173,"src":11174},"Gemini CLi help","\u002Fimages\u002Farticles\u002F2025-07-12-gemini-cli\u002Fgemini-cli-help.png",[2667,11176,11178],{"id":11177},"記憶功態-memory","記憶功態 (Memory)",[15,11180,11181,11182,11184,11185,11187,11188,11190],{},"若你要處理比較複雜的問題，由於 LLM 對於長文處理，有時會有失憶的問題，或當我們重啟 ",[127,11183,8607],{},"，",[127,11186,8607],{}," 忘記之前互動的要求，因此 ",[127,11189,8607],{}," 有了記憶功能，而使用方式如下：",[156,11192,11193,11235,11256],{},[159,11194,11195,11196,11198,11199,11202,11203,11220,11222,11223,11225,11226,11228,11229,11231,11232,11234],{},"以",[127,11197,2606],{},"格式，建立 ",[127,11200,11201],{},"GEMINI.md","，你可以將之記錄",[156,11204,11205,11208,11211,11214,11217],{},[159,11206,11207],{},"環境設定",[159,11209,11210],{},"工作需求",[159,11212,11213],{},"工作項目",[159,11215,11216],{},"使用相關 MCP 指令",[159,11218,11219],{},"程式碼風格",[11127,11221],{},"當你在某個目錄下啟動 ",[127,11224,8607],{}," 代理模式時，它會分層搜尋 ",[127,11227,11201],{}," 檔案：從當前工作目錄開始，向上搜尋到專案根目錄，甚至到你的主目錄。它也會搜尋子目錄中的 ",[127,11230,11201],{}," 檔案。所有找到的 ",[127,11233,11201],{}," 檔案的內容會被合併，作為「指令上下文」提供給 Gemini 模型。",[159,11236,11237,11238,6197,11240,11242,11243],{},"更新記憶內容",[11127,11239],{},[127,11241,8607],{}," 下達指令：",[212,11244,11246],{"className":214,"code":11245,"language":216,"meta":217,"style":217},"\u002Fmemory refresh\n",[127,11247,11248],{"__ignoreMap":217},[122,11249,11250,11253],{"class":222,"line":223},[122,11251,11252],{"class":233},"\u002Fmemory",[122,11254,11255],{"class":237}," refresh\n",[159,11257,11258,11259,6197,11261,11242,11263],{},"顯示記憶內容：",[11127,11260],{},[127,11262,8607],{},[212,11264,11266],{"className":214,"code":11265,"language":216,"meta":217,"style":217},"\u002Fmemory show\n",[127,11267,11268],{"__ignoreMap":217},[122,11269,11270,11272],{"class":222,"line":223},[122,11271,11252],{"class":233},[122,11273,11274],{"class":237}," show\n",[15,11276,11277,11278,11280],{},"如此 ",[127,11279,8607],{}," 在執行專案開發時，更能依據我的需求，完成我們的任務。",[54,11282,5386],{"id":5386},[15,11284,11285],{},"Gemini CLI 是一個功能強大且易於使用的工具，它將先進的 AI 能力帶入了開發者最熟悉的終端機環境。透過清晰的提示詞和適當的審核，你可以大幅提升開發效率，加速專案進程。立即安裝 Gemini CLI，體驗用AI開發的魅力吧，而目前提供的免費額度可以完成一些簡單的小專案，若要完成更大的專案，當然就需要考慮付費。",[54,11287,11288],{"id":11288},"相關網站",[156,11290,11291,11298],{},[159,11292,11293,11294],{},"Gemini CLI Github: ",[24,11295,11296],{"href":11296,"rel":11297},"https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli",[28],[159,11299,11300,11301],{},"Google 官方部落格資訊: ",[24,11302,11303],{"href":11303,"rel":11304},"https:\u002F\u002Fblog.google\u002Fintl\u002Fzh-tw\u002Fproducts\u002Fcloud\u002Fgemini-cli-your-open-source-ai-agent\u002F",[28],[1579,11306,11307],{},"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":217,"searchDepth":230,"depth":230,"links":11309},[11310,11313,11319,11320],{"id":8618,"depth":230,"text":8619,"children":11311},[11312],{"id":8625,"depth":248,"text":8626},{"id":8667,"depth":230,"text":8668,"children":11314},[11315,11316,11317,11318],{"id":8671,"depth":248,"text":8672},{"id":8722,"depth":248,"text":8723},{"id":11159,"depth":248,"text":11160},{"id":11177,"depth":248,"text":11178},{"id":5386,"depth":230,"text":5386},{"id":11288,"depth":230,"text":11288},"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":8595,"description":11321},"articles\u002F2025-07-12-gemini-cli","本文將帶你了解 Gemini CLI，一個能將 Gemini 強大 AI 能力整合至終端機的開源工具。學習如何安裝、使用 Gemini CLI 進行程式碼生成、任務自動化，並體驗 AI-First Coding 的開發模式。",[1610,1613,1614],"06YY6CfnzHfs2KDK962SeuY3nvJMZ0lWwdR0AfkGsr8",{"id":11332,"title":11333,"body":11334,"category":1599,"description":217,"extension":1601,"image":12118,"meta":12119,"navigation":263,"path":12120,"pubDate":12121,"seo":12122,"status":263,"stem":12123,"summary":12124,"tags":12125,"__hash__":12126},"content\u002Farticles\u002F2025-03-17-open-manus.md","使用 OpenManus 在本地端玩轉 AI Agent",{"type":8,"value":11335,"toc":12094},[11336,11338,11341,11344,11367,11369,11375,11379,11383,11417,11421,11444,11447,11465,11469,11473,11492,11495,11513,11516,11556,11559,11577,11580,11583,11599,11602,11962,11973,11984,11987,11998,12011,12014,12017,12030,12033,12069,12072,12075,12082,12084,12091],[54,11337,3757],{"id":3757},[15,11339,11340],{},"OpenManus 是一個開源的通用型 AI Agent，是 Manus 的替代方案，無需等待昂貴的激活碼即可使用。以下是 OpenManus 的使用教學，希望能幫助你快速上手：",[54,11342,11343],{"id":11343},"環境需求",[156,11345,11346,11357],{},[159,11347,11348,1839,11351,951,11353,951,11355],{},[19,11349,11350],{},"作業系統",[127,11352,3061],{},[127,11354,6898],{},[127,11356,6793],{},[159,11358,11359,11362,11363,11366],{},[19,11360,11361],{},"Python","：版本 ",[127,11364,11365],{},"3.10"," 以上",[54,11368,6404],{"id":6404},[15,11370,11371],{},[24,11372,11373],{"href":11373,"rel":11374},"https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus",[28],[54,11376,11378],{"id":11377},"使用-conda-安裝","使用 Conda 安裝",[2667,11380,11382],{"id":11381},"建立新的-conda-環境","建立新的 Conda 環境",[212,11384,11386],{"className":214,"code":11385,"language":216,"meta":217,"style":217},"conda create -n open_manus python=3.12\nconda activate open_manus\n",[127,11387,11388,11407],{"__ignoreMap":217},[122,11389,11390,11393,11395,11398,11401,11404],{"class":222,"line":223},[122,11391,11392],{"class":233},"conda",[122,11394,623],{"class":237},[122,11396,11397],{"class":241}," -n",[122,11399,11400],{"class":237}," open_manus",[122,11402,11403],{"class":237}," python=",[122,11405,11406],{"class":241},"3.12\n",[122,11408,11409,11411,11414],{"class":222,"line":230},[122,11410,11392],{"class":233},[122,11412,11413],{"class":237}," activate",[122,11415,11416],{"class":237}," open_manus\n",[2667,11418,11420],{"id":11419},"clone-儲存庫","Clone 儲存庫",[212,11422,11424],{"className":214,"code":11423,"language":216,"meta":217,"style":217},"git clone https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\ncd OpenManus\n",[127,11425,11426,11437],{"__ignoreMap":217},[122,11427,11428,11431,11434],{"class":222,"line":223},[122,11429,11430],{"class":233},"git",[122,11432,11433],{"class":237}," clone",[122,11435,11436],{"class":237}," https:\u002F\u002Fgithub.com\u002Fmannaandpoem\u002FOpenManus.git\n",[122,11438,11439,11441],{"class":222,"line":230},[122,11440,7110],{"class":241},[122,11442,11443],{"class":237}," OpenManus\n",[2667,11445,11446],{"id":11446},"安裝相依套件",[212,11448,11450],{"className":214,"code":11449,"language":216,"meta":217,"style":217},"pip install -r requirements.txt\n",[127,11451,11452],{"__ignoreMap":217},[122,11453,11454,11457,11459,11462],{"class":222,"line":223},[122,11455,11456],{"class":233},"pip",[122,11458,238],{"class":237},[122,11460,11461],{"class":241}," -r",[122,11463,11464],{"class":237}," requirements.txt\n",[54,11466,11468],{"id":11467},"使用-uv-安裝","使用 uv 安裝",[2667,11470,11472],{"id":11471},"安裝-uv-環境","安裝 uv 環境",[212,11474,11476],{"className":214,"code":11475,"language":216,"meta":217,"style":217},"curl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n",[127,11477,11478],{"__ignoreMap":217},[122,11479,11480,11482,11485,11488,11490],{"class":222,"line":223},[122,11481,3127],{"class":233},[122,11483,11484],{"class":241}," -LsSf",[122,11486,11487],{"class":237}," https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh",[122,11489,3315],{"class":632},[122,11491,3318],{"class":233},[2667,11493,11420],{"id":11494},"clone-儲存庫-1",[212,11496,11497],{"className":214,"code":11423,"language":216,"meta":217,"style":217},[127,11498,11499,11507],{"__ignoreMap":217},[122,11500,11501,11503,11505],{"class":222,"line":223},[122,11502,11430],{"class":233},[122,11504,11433],{"class":237},[122,11506,11436],{"class":237},[122,11508,11509,11511],{"class":222,"line":230},[122,11510,7110],{"class":241},[122,11512,11443],{"class":237},[2667,11514,11515],{"id":11515},"建立新的虛擬環境並啟動它",[212,11517,11519],{"className":214,"code":11518,"language":216,"meta":217,"style":217},"uv venv --python 3.12\nsource .venv\u002Fbin\u002Factivate  # On Unix\u002FmacOS\n# Or on Windows:\n# .venv\\Scripts\\activate\n",[127,11520,11521,11535,11546,11551],{"__ignoreMap":217},[122,11522,11523,11526,11529,11532],{"class":222,"line":223},[122,11524,11525],{"class":233},"uv",[122,11527,11528],{"class":237}," venv",[122,11530,11531],{"class":241}," --python",[122,11533,11534],{"class":241}," 3.12\n",[122,11536,11537,11540,11543],{"class":222,"line":230},[122,11538,11539],{"class":241},"source",[122,11541,11542],{"class":237}," .venv\u002Fbin\u002Factivate",[122,11544,11545],{"class":226},"  # On Unix\u002FmacOS\n",[122,11547,11548],{"class":222,"line":248},[122,11549,11550],{"class":226},"# Or on Windows:\n",[122,11552,11553],{"class":222,"line":260},[122,11554,11555],{"class":226},"# .venv\\Scripts\\activate\n",[2667,11557,11446],{"id":11558},"安裝相依套件-1",[212,11560,11562],{"className":214,"code":11561,"language":216,"meta":217,"style":217},"uv pip install -r requirements.txt\n",[127,11563,11564],{"__ignoreMap":217},[122,11565,11566,11568,11571,11573,11575],{"class":222,"line":223},[122,11567,11525],{"class":233},[122,11569,11570],{"class":237}," pip",[122,11572,238],{"class":237},[122,11574,11461],{"class":241},[122,11576,11464],{"class":237},[54,11578,11579],{"id":11579},"設定",[2667,11581,11582],{"id":11582},"建立設定檔",[212,11584,11586],{"className":214,"code":11585,"language":216,"meta":217,"style":217},"cp config\u002Fconfig.example.toml config\u002Fconfig.toml\n",[127,11587,11588],{"__ignoreMap":217},[122,11589,11590,11593,11596],{"class":222,"line":223},[122,11591,11592],{"class":233},"cp",[122,11594,11595],{"class":237}," config\u002Fconfig.example.toml",[122,11597,11598],{"class":237}," config\u002Fconfig.toml\n",[2667,11600,11601],{"id":11601},"編輯設定檔",[212,11603,11605],{"className":214,"code":11604,"language":216,"meta":217,"style":217},"# [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",[127,11606,11607,11612,11617,11622,11627,11632,11637,11642,11647,11651,11659,11669,11679,11689,11699,11709,11719,11723,11728,11733,11738,11743,11748,11753,11758,11762,11770,11779,11789,11798,11807,11816,11825,11829,11834,11839,11844,11849,11854,11859,11864,11869,11874,11879,11884,11889,11894,11899,11904,11908,11913,11918,11923,11928,11933,11937,11942,11947,11952],{"__ignoreMap":217},[122,11608,11609],{"class":222,"line":223},[122,11610,11611],{"class":226},"# [llm] #AZURE OPENAI:\n",[122,11613,11614],{"class":222,"line":230},[122,11615,11616],{"class":226},"# api_type= 'azure'\n",[122,11618,11619],{"class":222,"line":248},[122,11620,11621],{"class":226},"# model = \"YOUR_MODEL_NAME\" #\"gpt-4o-mini\"\n",[122,11623,11624],{"class":222,"line":260},[122,11625,11626],{"class":226},"# base_url = \"{YOUR_AZURE_ENDPOINT.rstrip('\u002F')}\u002Fopenai\u002Fdeployments\u002F{AZURE_DEPOLYMENT_ID}\"\n",[122,11628,11629],{"class":222,"line":267},[122,11630,11631],{"class":226},"# api_key = \"AZURE API KEY\"\n",[122,11633,11634],{"class":222,"line":273},[122,11635,11636],{"class":226},"# max_tokens = 8096\n",[122,11638,11639],{"class":222,"line":660},[122,11640,11641],{"class":226},"# temperature = 0.0\n",[122,11643,11644],{"class":222,"line":672},[122,11645,11646],{"class":226},"# api_version=\"AZURE API VERSION\" #\"2024-08-01-preview\"\n",[122,11648,11649],{"class":222,"line":701},[122,11650,264],{"emptyLinePlaceholder":263},[122,11652,11653,11656],{"class":222,"line":706},[122,11654,11655],{"class":639}," [llm] ",[122,11657,11658],{"class":226},"#OLLAMA:\n",[122,11660,11661,11664,11666],{"class":222,"line":712},[122,11662,11663],{"class":233}," api_type",[122,11665,1909],{"class":237},[122,11667,11668],{"class":237}," 'ollama'\n",[122,11670,11671,11674,11676],{"class":222,"line":725},[122,11672,11673],{"class":233}," model",[122,11675,1909],{"class":237},[122,11677,11678],{"class":237}," \"llama3\"\n",[122,11680,11681,11684,11686],{"class":222,"line":737},[122,11682,11683],{"class":233}," base_url",[122,11685,1909],{"class":237},[122,11687,11688],{"class":237}," \"http:\u002F\u002F127.0.0.1:11434\u002Fv1\"\n",[122,11690,11691,11694,11696],{"class":222,"line":758},[122,11692,11693],{"class":233}," api_key",[122,11695,1909],{"class":237},[122,11697,11698],{"class":237}," \"ollama\"\n",[122,11700,11701,11704,11706],{"class":222,"line":782},[122,11702,11703],{"class":233}," max_tokens",[122,11705,1909],{"class":237},[122,11707,11708],{"class":241}," 4096\n",[122,11710,11711,11714,11716],{"class":222,"line":787},[122,11712,11713],{"class":233}," temperature",[122,11715,1909],{"class":237},[122,11717,11718],{"class":241}," 0.0\n",[122,11720,11721],{"class":222,"line":793},[122,11722,264],{"emptyLinePlaceholder":263},[122,11724,11725],{"class":222,"line":807},[122,11726,11727],{"class":226},"# Optional configuration for specific LLM models\n",[122,11729,11730],{"class":222,"line":823},[122,11731,11732],{"class":226},"#[llm.vision]\n",[122,11734,11735],{"class":222,"line":828},[122,11736,11737],{"class":226},"# model = \"claude-3-7-sonnet\"    # The vision model to use\n",[122,11739,11740],{"class":222,"line":834},[122,11741,11742],{"class":226},"# base_url = \"https:\u002F\u002Fapi.openai.com\u002Fv1\"    # API endpoint URL for vision model\n",[122,11744,11745],{"class":222,"line":850},[122,11746,11747],{"class":226},"# api_key = \"sk-...\"    # Your API key for vision model\n",[122,11749,11750],{"class":222,"line":864},[122,11751,11752],{"class":226},"# max_tokens = 8192     # Maximum number of tokens in the response\n",[122,11754,11755],{"class":222,"line":880},[122,11756,11757],{"class":226},"# temperature = 0.0     # Controls randomness for vision model\n",[122,11759,11760],{"class":222,"line":7632},[122,11761,264],{"emptyLinePlaceholder":263},[122,11763,11764,11767],{"class":222,"line":7638},[122,11765,11766],{"class":639},"[llm.vision] ",[122,11768,11769],{"class":226},"#OLLAMA VISION:\n",[122,11771,11772,11775,11777],{"class":222,"line":7648},[122,11773,11774],{"class":233},"api_type",[122,11776,1909],{"class":237},[122,11778,11668],{"class":237},[122,11780,11781,11784,11786],{"class":222,"line":7662},[122,11782,11783],{"class":233},"model",[122,11785,1909],{"class":237},[122,11787,11788],{"class":237}," \"llama3.2-vision:latest\"\n",[122,11790,11791,11794,11796],{"class":222,"line":7667},[122,11792,11793],{"class":233},"base_url",[122,11795,1909],{"class":237},[122,11797,11688],{"class":237},[122,11799,11800,11803,11805],{"class":222,"line":7673},[122,11801,11802],{"class":233},"api_key",[122,11804,1909],{"class":237},[122,11806,11698],{"class":237},[122,11808,11809,11812,11814],{"class":222,"line":7686},[122,11810,11811],{"class":233},"max_tokens",[122,11813,1909],{"class":237},[122,11815,11708],{"class":241},[122,11817,11818,11821,11823],{"class":222,"line":7697},[122,11819,11820],{"class":233},"temperature",[122,11822,1909],{"class":237},[122,11824,11718],{"class":241},[122,11826,11827],{"class":222,"line":7708},[122,11828,264],{"emptyLinePlaceholder":263},[122,11830,11831],{"class":222,"line":9624},[122,11832,11833],{"class":226},"# Optional configuration for specific browser configuration\n",[122,11835,11836],{"class":222,"line":9656},[122,11837,11838],{"class":226},"# [browser]\n",[122,11840,11841],{"class":222,"line":9667},[122,11842,11843],{"class":226},"# Whether to run browser in headless mode (default: false)\n",[122,11845,11846],{"class":222,"line":9678},[122,11847,11848],{"class":226},"#headless = false\n",[122,11850,11851],{"class":222,"line":9689},[122,11852,11853],{"class":226},"# Disable browser security features (default: true)\n",[122,11855,11856],{"class":222,"line":9700},[122,11857,11858],{"class":226},"#disable_security = true\n",[122,11860,11861],{"class":222,"line":9711},[122,11862,11863],{"class":226},"# Extra arguments to pass to the browser\n",[122,11865,11866],{"class":222,"line":9723},[122,11867,11868],{"class":226},"#extra_chromium_args = []\n",[122,11870,11871],{"class":222,"line":9728},[122,11872,11873],{"class":226},"# Path to a Chrome instance to use to connect to your normal browser\n",[122,11875,11876],{"class":222,"line":9733},[122,11877,11878],{"class":226},"# e.g. '\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome'\n",[122,11880,11881],{"class":222,"line":9740},[122,11882,11883],{"class":226},"#chrome_instance_path = \"\"\n",[122,11885,11886],{"class":222,"line":9751},[122,11887,11888],{"class":226},"# Connect to a browser instance via WebSocket\n",[122,11890,11891],{"class":222,"line":9776},[122,11892,11893],{"class":226},"#wss_url = \"\"\n",[122,11895,11896],{"class":222,"line":9781},[122,11897,11898],{"class":226},"# Connect to a browser instance via CDP\n",[122,11900,11901],{"class":222,"line":9786},[122,11902,11903],{"class":226},"#cdp_url = \"\"\n",[122,11905,11906],{"class":222,"line":9793},[122,11907,264],{"emptyLinePlaceholder":263},[122,11909,11910],{"class":222,"line":9806},[122,11911,11912],{"class":226},"# Optional configuration, Proxy settings for the browser\n",[122,11914,11915],{"class":222,"line":9811},[122,11916,11917],{"class":226},"# [browser.proxy]\n",[122,11919,11920],{"class":222,"line":9816},[122,11921,11922],{"class":226},"# server = \"http:\u002F\u002Fproxy-server:port\"\n",[122,11924,11925],{"class":222,"line":9821},[122,11926,11927],{"class":226},"# username = \"proxy-username\"\n",[122,11929,11930],{"class":222,"line":9831},[122,11931,11932],{"class":226},"# password = \"proxy-password\"\n",[122,11934,11935],{"class":222,"line":9872},[122,11936,264],{"emptyLinePlaceholder":263},[122,11938,11939],{"class":222,"line":9883},[122,11940,11941],{"class":226},"# Optional configuration, Search settings.\n",[122,11943,11944],{"class":222,"line":9894},[122,11945,11946],{"class":226},"# [search]\n",[122,11948,11949],{"class":222,"line":9905},[122,11950,11951],{"class":226},"# Search engine for agent to use. Default is \"Google\", can be set to \"Baidu\" or \"DuckDuckGo\".\n",[122,11953,11954,11957,11959],{"class":222,"line":9916},[122,11955,11956],{"class":233},"engine",[122,11958,1909],{"class":237},[122,11960,11961],{"class":237}," \"Google\"\n",[15,11963,1829,11964,11967,11968],{},[127,11965,11966],{},"[llm]"," 的 ollama model 並非所有 model 著支援，目前只支援 ",[24,11969,11972],{"href":11970,"rel":11971},"https:\u002F\u002Follama.com\u002Fsearch?c=tools",[28],"ollama tool 模型",[15,11974,2919,11975,11978,11979],{},[127,11976,11977],{},"[llm.vision]"," 的 ollama model 則必需支援",[24,11980,11983],{"href":11981,"rel":11982},"https:\u002F\u002Follama.com\u002Fsearch?c=vision",[28],"視覺的模型",[54,11985,11986],{"id":11986},"瀏覽器安裝",[15,11988,11989,11990,11993,11994,11997],{},"在使用 ",[127,11991,11992],{},"OpenManus"," 時，有時需要使用網路爬蟲時，會要求你安裝 ",[127,11995,11996],{},"Chromium"," 瀏覽器，你可以事先透過下列指令進行安裝",[212,11999,12001],{"className":214,"code":12000,"language":216,"meta":217,"style":217},"playwright install\n",[127,12002,12003],{"__ignoreMap":217},[122,12004,12005,12008],{"class":222,"line":223},[122,12006,12007],{"class":233},"playwright",[122,12009,12010],{"class":237}," install\n",[54,12012,12013],{"id":12013},"啟用服務",[15,12015,12016],{},"上面安裝完成後，就可以啟用服務",[212,12018,12020],{"className":214,"code":12019,"language":216,"meta":217,"style":217},"python main.py\n",[127,12021,12022],{"__ignoreMap":217},[122,12023,12024,12027],{"class":222,"line":223},[122,12025,12026],{"class":233},"python",[122,12028,12029],{"class":237}," main.py\n",[54,12031,12032],{"id":12032},"啟用服務的畫面",[212,12034,12036],{"className":214,"code":12035,"language":216,"meta":217,"style":217},"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",[127,12037,12038,12046,12058],{"__ignoreMap":217},[122,12039,12040,12043],{"class":222,"line":223},[122,12041,12042],{"class":233},"INFO",[122,12044,12045],{"class":639},"     [browser_use] BrowserUse logging setup complete with level info\n",[122,12047,12048,12050,12053,12055],{"class":222,"line":230},[122,12049,12042],{"class":233},[122,12051,12052],{"class":639},"     [root] Anonymized telemetry enabled. See https:\u002F\u002Fdocs.browser-use.com\u002Fdevelopment\u002Ftelemetry ",[122,12054,4403],{"class":632},[122,12056,12057],{"class":639}," more information.\n",[122,12059,12060,12063,12066],{"class":222,"line":248},[122,12061,12062],{"class":233},"Enter",[122,12064,12065],{"class":237}," your",[122,12067,12068],{"class":237}," prompt:\n",[15,12070,12071],{},"在終端機輸入你的需求提示詞",[15,12073,12074],{},"如：請從網路上搜尋 近期熱門的 LLM 大語言模型的介紹，並以繁體中文整理成一篇文章，以 markdown 格式輸出 \"LLM_大語言模型介紹.md\"",[15,12076,12077,12078,12081],{},"執行結果會儲存在 ",[127,12079,12080],{},"OpenManus\u002Fworkspace"," 資料夾",[54,12083,5386],{"id":5386},[15,12085,12086,12087,12090],{},"總而言之，OpenManus 提供了一個無需等待邀請碼、即可在本地端體驗 AI Agent 功能的開源方案。透過搭配 Ollama，使用者可以輕鬆地利用各種大型語言模型和視覺模型，執行從網路資訊蒐集到文章撰寫等多種任務。儘管目前 Ollama 對於 ",[127,12088,12089],{},"tool"," 模型和視覺模型的支援仍在發展中，OpenManus 仍然為對 AI Agent 技術感興趣的使用者提供了一個方便且彈性的實驗平台。隨著專案的持續發展和更多模型的支援，OpenManus 有望成為本地端 AI 應用的重要工具之一。",[1579,12092,12093],{},"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":217,"searchDepth":230,"depth":230,"links":12095},[12096,12097,12098,12099,12104,12110,12114,12115,12116,12117],{"id":3757,"depth":230,"text":3757},{"id":11343,"depth":230,"text":11343},{"id":6404,"depth":230,"text":6404},{"id":11377,"depth":230,"text":11378,"children":12100},[12101,12102,12103],{"id":11381,"depth":248,"text":11382},{"id":11419,"depth":248,"text":11420},{"id":11446,"depth":248,"text":11446},{"id":11467,"depth":230,"text":11468,"children":12105},[12106,12107,12108,12109],{"id":11471,"depth":248,"text":11472},{"id":11494,"depth":248,"text":11420},{"id":11515,"depth":248,"text":11515},{"id":11558,"depth":248,"text":11446},{"id":11579,"depth":230,"text":11579,"children":12111},[12112,12113],{"id":11582,"depth":248,"text":11582},{"id":11601,"depth":248,"text":11601},{"id":11986,"depth":230,"text":11986},{"id":12013,"depth":230,"text":12013},{"id":12032,"depth":230,"text":12032},{"id":5386,"depth":230,"text":5386},"\u002Fimages\u002Farticles\u002F2025-03-17-open-manus\u002Fcover.png",{},"\u002Farticles\u002F2025-03-17-open-manus","2025-03-17 14:38:00",{"title":11333,"description":217},"articles\u002F2025-03-17-open-manus","最近的 Manus 爆紅的 AI 工具，但需要邀請碼，而 OpenManus 則是開源版，且可以在本地配合 ollama 使用",[1610],"3Et6YOZPsuqir3pZgApsjYIZn_5nPPKlO4oaWvr2Sj0",{"id":12128,"title":12129,"body":12130,"category":12303,"description":217,"extension":1601,"image":12304,"meta":12305,"navigation":263,"path":12306,"pubDate":12307,"seo":12308,"status":263,"stem":12309,"summary":12310,"tags":12311,"__hash__":12312},"content\u002Farticles\u002F2025-02-05-linux-nohup.md","nohup 指令：讓程式在登出後繼續執行的秘訣",{"type":8,"value":12131,"toc":12295},[12132,12139,12144,12147,12159,12173,12176,12186,12213,12227,12231,12237,12263,12281,12283,12286,12292],[54,12133,12135,12136,5539],{"id":12134},"什麼是-nohup","什麼是 ",[127,12137,12138],{},"nohup",[15,12140,12141,12143],{},[127,12142,12138],{}," 是Linux系統中的一個命令，用於讓指定的程式在用戶登出或終端機連接斷開後繼續執行。它會忽略SIGHUP（掛起）信號，使程序能夠在背景下不受干擾地運行。",[54,12145,12146],{"id":12146},"基本語法",[212,12148,12150],{"className":214,"code":12149,"language":216,"meta":217,"style":217},"nohup [指令] &\n",[127,12151,12152],{"__ignoreMap":217},[122,12153,12154,12156],{"class":222,"line":223},[122,12155,12138],{"class":233},[122,12157,12158],{"class":639}," [指令] &\n",[156,12160,12161,12167],{},[159,12162,12163,12166],{},[127,12164,12165],{},"[指令]","：您希望在背景執行的命令。",[159,12168,12169,12172],{},[127,12170,12171],{},"&","：表示將命令放在後台執行",[54,12174,12175],{"id":12175},"使用範例",[15,12177,12178,12179,12182,12183,12185],{},"假設我們有一個簡單的Python腳本 ",[127,12180,12181],{},"my_script.py","，它會運行一個耗時的計算任務。我們可以使用 ",[127,12184,12138],{}," 命令來確保該任務即使在登出後仍能繼續執行：",[212,12187,12189],{"className":214,"code":12188,"language":216,"meta":217,"style":217},"nohup python my_script.py >> output.log 2>&1 &\n",[127,12190,12191],{"__ignoreMap":217},[122,12192,12193,12195,12198,12201,12204,12207,12210],{"class":222,"line":223},[122,12194,12138],{"class":233},[122,12196,12197],{"class":237}," python",[122,12199,12200],{"class":237}," my_script.py",[122,12202,12203],{"class":632}," >>",[122,12205,12206],{"class":237}," output.log",[122,12208,12209],{"class":632}," 2>&1",[122,12211,12212],{"class":639}," &\n",[156,12214,12215,12221],{},[159,12216,12217,12220],{},[127,12218,12219],{},">>"," output.log：將標準輸出重定向到output.log文件。",[159,12222,12223,12226],{},[127,12224,12225],{},"2>&1","：將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[54,12228,12230],{"id":12229},"過濾-nohup-ignoring-input-訊息","過濾 nohup: ignoring input 訊息",[15,12232,12233,12234,12236],{},"當你使用 ",[127,12235,12138],{}," 執行命令時，它會輸出 nohup: ignoring input，這是因為 nohup 預設會忽略標準輸入 (stdin)，以確保命令不會因等待輸入而中斷。這條訊息通常會寫入 nohup.out 或你指定的 log 檔案。如果你不想讓這行訊息出現在 log 檔案中，可以使用以下方法：",[212,12238,12240],{"className":214,"code":12239,"language":216,"meta":217,"style":217},"nohup python my_script.py >> output.log 2>&1 \u003C \u002Fdev\u002Fnull &\n",[127,12241,12242],{"__ignoreMap":217},[122,12243,12244,12246,12248,12250,12252,12254,12256,12258,12261],{"class":222,"line":223},[122,12245,12138],{"class":233},[122,12247,12197],{"class":237},[122,12249,12200],{"class":237},[122,12251,12203],{"class":632},[122,12253,12206],{"class":237},[122,12255,12209],{"class":632},[122,12257,1083],{"class":632},[122,12259,12260],{"class":237}," \u002Fdev\u002Fnull",[122,12262,12212],{"class":639},[156,12264,12265,12270,12275],{},[159,12266,12267,12269],{},[127,12268,12219],{}," 將標準輸出導向 output.log",[159,12271,12272,12274],{},[127,12273,12225],{}," 將錯誤輸出也重定向到stdout，這樣即使發生錯誤也能被記錄在output.log中。",[159,12276,12277,12280],{},[127,12278,12279],{},"\u003C \u002Fdev\u002Fnull"," 讓標準輸入 (stdin) 來自空設備，避免 nohup 顯示 ignoring input",[54,12282,5386],{"id":5386},[15,12284,12285],{},"掌握nohup指令對Linux使用者來說是非常有用的，特別是在需要長時間運行的任務中。利用這個簡單但強大的工具，您可以讓程序在后台無受干擾地執行，從而提高工作效率。",[15,12287,12288,12289,12291],{},"透過本文介紹的範例和技巧，相信您已經能夠自如地使用 ",[127,12290,12138],{}," 指令來管理您的Linux系統上的背景任務了！",[1579,12293,12294],{},"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":217,"searchDepth":230,"depth":230,"links":12296},[12297,12299,12300,12301,12302],{"id":12134,"depth":230,"text":12298},"什麼是 nohup？",{"id":12146,"depth":230,"text":12146},{"id":12175,"depth":230,"text":12175},{"id":12229,"depth":230,"text":12230},{"id":5386,"depth":230,"text":5386},"dev_ops","\u002Fimages\u002Farticles\u002F2025-02-05-linux-nohup\u002Fcover.png",{},"\u002Farticles\u002F2025-02-05-linux-nohup","2025-02-05 14:30:00",{"title":12129,"description":217},"articles\u002F2025-02-05-linux-nohup","在Linux環境下進行長時間運行的任務時，我們常常希望即使用戶登出終端機或連線中斷，任務也能繼續執行。nohup指令正是為此而生！本文將介紹如何使用nohup來執行背景任務，並重定向其輸出，確保您的程序在離線後仍能順利運行。",[12303,3061],"CwukBZ_XTh1QBVKDTwDEghU7F3HeG06Wv0jF4kxOzVI",{"id":12314,"title":12315,"body":12316,"category":3748,"description":12320,"extension":1601,"image":12994,"meta":12995,"navigation":263,"path":12996,"pubDate":12997,"seo":12998,"status":263,"stem":12999,"summary":13000,"tags":13001,"__hash__":13002},"content\u002Farticles\u002F2025-01-24-mac-os-app.md","MacOS：2025 我推的 Mac 好用 App",{"type":8,"value":12317,"toc":12934},[12318,12321,12323,12328,12332,12335,12342,12346,12349,12355,12359,12362,12368,12372,12375,12381,12385,12388,12394,12398,12401,12407,12411,12414,12420,12424,12427,12433,12437,12440,12446,12450,12453,12459,12463,12466,12472,12476,12479,12485,12488,12494,12498,12501,12507,12511,12514,12520,12524,12527,12533,12536,12542,12546,12549,12555,12558,12563,12567,12570,12576,12580,12585,12589,12592,12598,12601,12606,12610,12613,12619,12622,12627,12630,12633,12639,12643,12646,12652,12656,12659,12665,12669,12672,12678,12682,12685,12691,12695,12698,12704,12708,12711,12717,12721,12724,12730,12734,12737,12743,12747,12750,12756,12763,12767,12770,12776,12779,12784,12788,12791,12797,12800,12803,12809,12813,12816,12822,12826,12829,12835,12839,12842,12848,12852,12857,12860,12873,12879,12883,12886,12892,12896,12899,12906,12910,12913,12916,12922,12925,12928],[15,12319,12320],{},"農曆年假期將近，想要重新安裝我使用 MacOS ，在這邊整理一下目前自已常用的 Mac App。",[54,12322,1613],{"id":1613},[15,12324,12325],{},[2494,12326],{"alt":1613,"src":12327},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fdev-tool.png",[2667,12329,12331],{"id":12330},"vscode","VSCode",[15,12333,12334],{},"一款輕量級但功能強大的源代碼編輯器，支援多種編程語言，並具有豐富的擴展生態系統。",[15,12336,12337,12338],{},"官網：",[24,12339,12340],{"href":12340,"rel":12341},"https:\u002F\u002Fcode.visualstudio.com\u002F",[28],[2667,12343,12345],{"id":12344},"iterm2","Iterm2",[15,12347,12348],{},"一款功能強大的終端模擬器，提供分屏、標籤頁、熱鍵等多種功能，適合開發者使用。",[15,12350,12337,12351],{},[24,12352,12353],{"href":12353,"rel":12354},"https:\u002F\u002Fiterm2.com\u002F",[28],[2667,12356,12358],{"id":12357},"utm","UTM",[15,12360,12361],{},"一款虛擬機應用程式，允許用戶在 macOS 上運行其他操作系統，如 Windows 和 Linux。",[15,12363,12337,12364],{},[24,12365,12366],{"href":12366,"rel":12367},"https:\u002F\u002Fmac.getutm.app\u002F",[28],[2667,12369,12371],{"id":12370},"postman","Postman",[15,12373,12374],{},"API 開發和測試工具，方便發送 HTTP 請求、檢視回應。",[15,12376,12337,12377],{},[24,12378,12379],{"href":12379,"rel":12380},"https:\u002F\u002Fwww.postman.com\u002F",[28],[2667,12382,12384],{"id":12383},"github-desktop","GitHub Desktop",[15,12386,12387],{},"GitHub 官方推出的桌面應用，提供圖形化界面，方便用戶管理 GitHub 上的代碼庫。",[15,12389,12337,12390],{},[24,12391,12392],{"href":12392,"rel":12393},"https:\u002F\u002Fgithub.com\u002Fapps\u002Fdesktop",[28],[2667,12395,12397],{"id":12396},"textmate","TextMate",[15,12399,12400],{},"一款功能強大的文本編輯器，支援多種編程語言，具有語法高亮、代碼折疊等功能。",[15,12402,12337,12403],{},[24,12404,12405],{"href":12405,"rel":12406},"https:\u002F\u002Fmacromates.com\u002F",[28],[2667,12408,12410],{"id":12409},"docker","Docker",[15,12412,12413],{},"一個開源的容器化平台，允許開發者打包應用及其依賴，實現跨平台運行。",[15,12415,12337,12416],{},[24,12417,12418],{"href":12418,"rel":12419},"https:\u002F\u002Fwww.docker.com\u002F",[28],[2667,12421,12423],{"id":12422},"orbstack","Orbstack",[15,12425,12426],{},"一款輕量級的虛擬化工具，專為 macOS 設計，簡化容器和虛擬機的管理。",[15,12428,12337,12429],{},[24,12430,12431],{"href":12431,"rel":12432},"https:\u002F\u002Forbstack.dev\u002F",[28],[2667,12434,12436],{"id":12435},"devtoys","DevToys",[15,12438,12439],{},"提供許多開發者常用的小工具，例如 JSON 格式化、編碼轉換等",[15,12441,12337,12442],{},[24,12443,12444],{"href":12444,"rel":12445},"https:\u002F\u002Fdevtoys.app\u002F",[28],[2667,12447,12449],{"id":12448},"dbeaver","DBeaver",[15,12451,12452],{},"通用資料庫管理工具，支援多種資料庫系統，包含 MySQL、SQLite、PostgreSQL、MongoDB 等。",[15,12454,12337,12455],{},[24,12456,12457],{"href":12457,"rel":12458},"https:\u002F\u002Fdbeaver.io\u002F",[28],[2667,12460,12462],{"id":12461},"pgadmin4","PgAdmin4",[15,12464,12465],{},"PostgreSQL 資料庫的管理工具。",[15,12467,12337,12468],{},[24,12469,12470],{"href":12470,"rel":12471},"https:\u002F\u002Fwww.pgadmin.org\u002F",[28],[2667,12473,12475],{"id":12474},"frame0","Frame0",[15,12477,12478],{},"可以快速建置手繪風格 UI Prototype 的工具。",[15,12480,12337,12481],{},[24,12482,12483],{"href":12483,"rel":12484},"https:\u002F\u002Fframe0.app",[28],[54,12486,12487],{"id":12487},"網路工具",[15,12489,12490],{},[2494,12491],{"alt":12492,"src":12493},"瀏覽器","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fbrowser.png",[2667,12495,12497],{"id":12496},"arc-browser","Arc Browser",[15,12499,12500],{},"rc 瀏覽器由 The Browser Company 開發，旨在重新定義網頁瀏覽體驗。它基於 Chromium 引擎，並使用 Swift 編寫，支援 Chrome 擴充功能，預設搜尋引擎為 Google。",[15,12502,12337,12503],{},[24,12504,12505],{"href":12505,"rel":12506},"https:\u002F\u002Farc.net\u002F",[28],[2667,12508,12510],{"id":12509},"firefox","Firefox",[15,12512,12513],{},"Mozilla Firefox（簡稱 Firefox）是一款由 Mozilla 基金會及其子公司 Mozilla 公司開發的自由且開源的網頁瀏覽器。自 2004 年 11 月 9 日首次發布以來，Firefox 一直致力於提供快速、安全且注重隱私的瀏覽體驗",[15,12515,12337,12516],{},[24,12517,12518],{"href":12518,"rel":12519},"https:\u002F\u002Fwww.mozilla.org\u002Fzh-TW\u002Ffirefox\u002Fnew\u002F",[28],[2667,12521,12523],{"id":12522},"neat-download-manager","Neat Download Manager",[15,12525,12526],{},"Neat Download Manager 是一款免費且輕量級的下載管理器，適用於 Windows 和 macOS 平台。\n該軟體支援多執行緒下載，能有效提升下載速度，並提供續傳、暫停等功能，方便管理下載任務。",[15,12528,12337,12529],{},[24,12530,12531],{"href":12531,"rel":12532},"https:\u002F\u002Fwww.neatdownloadmanager.com\u002Findex.php\u002Fen\u002F",[28],[54,12534,12535],{"id":12535},"筆記軟體",[15,12537,12538],{},[2494,12539],{"alt":12540,"src":12541},"筆記","\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FNotebook.png",[2667,12543,12545],{"id":12544},"obsidian","Obsidian",[15,12547,12548],{},"Obsidian 是一款免費且開源的筆記軟體，支援 Markdown 語法，所有筆記以 .md 檔案形式儲存在指定的資料夾中，方便使用者將檔案匯入其他軟體。",[15,12550,12337,12551],{},[24,12552,12553],{"href":12553,"rel":12554},"https:\u002F\u002Fobsidian.md\u002F",[28],[54,12556,12557],{"id":12557},"媒體播放器",[15,12559,12560],{},[2494,12561],{"alt":12557,"src":12562},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fmedia-player.png",[2667,12564,12566],{"id":12565},"iina","IINA",[15,12568,12569],{},"IINA 是一款專為 macOS 設計的免費開源多媒體播放器，基於 mpv 引擎，使用 Swift 編寫，旨在提供現代化且直覺的使用體驗。",[15,12571,12337,12572],{},[24,12573,12574],{"href":12574,"rel":12575},"https:\u002F\u002Fiina.io\u002F",[28],[54,12577,12579],{"id":12578},"壓縮解壓","壓縮\u002F解壓",[15,12581,12582],{},[2494,12583],{"alt":12579,"src":12584},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fzip.png",[2667,12586,12588],{"id":12587},"keka","Keka",[15,12590,12591],{},"Keka 是一款專為 macOS 設計的免費開源壓縮與解壓縮軟體，支援多種壓縮格式，包括 7Z、ZIP、TAR、GZIP、BZIP2、XZ、LZIP、DMG、ISO、BROTLI、ZSTD、LRZIP、WIM 等。",[15,12593,12337,12594],{},[24,12595,12596],{"href":12596,"rel":12597},"https:\u002F\u002Fwww.keka.io\u002F",[28],[54,12599,12600],{"id":12600},"密碼管理",[15,12602,12603],{},[2494,12604],{"alt":12600,"src":12605},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpassword.png",[2667,12607,12609],{"id":12608},"keepassxc","KeePassXC",[15,12611,12612],{},"KeePassXC 是一款免費且開源的密碼管理器，旨在安全地存儲和管理您的敏感資訊。它基於 KeePassX，並使用 Qt5 庫構建，支援 Windows、macOS 和 Linux 等多個平台。",[15,12614,12337,12615],{},[24,12616,12617],{"href":12617,"rel":12618},"https:\u002F\u002Fkeepassxc.org\u002F",[28],[54,12620,12621],{"id":12621},"系統管理",[15,12623,12624],{},[2494,12625],{"alt":12621,"src":12626},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fsystem.png",[2667,12628,6387],{"id":12629},"appcleaner",[15,12631,12632],{},"AppCleaner 是一款免費且開源的 macOS 應用程式卸載工具，旨在徹底移除應用程式及其相關檔案，避免遺留不必要的設定或暫存檔案。",[15,12634,12337,12635],{},[24,12636,12637],{"href":12637,"rel":12638},"https:\u002F\u002Ffreemacsoft.net\u002Fappcleaner\u002F",[28],[2667,12640,12642],{"id":12641},"stats","Stats",[15,12644,12645],{},"Stats 是一個免費的 macOS 應用程式，可以顯示系統資源使用情況，包括 CPU、記憶體和磁盤空間。它也提供了一些有用的工具來管理這些資源。",[15,12647,12337,12648],{},[24,12649,12650],{"href":12650,"rel":12651},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats",[28],[2667,12653,12655],{"id":12654},"raycast","Raycast",[15,12657,12658],{},"Raycast 是一個 macOS 的應用程式，可以幫助你快速找到和操作文件和資料夾。它還提供了許多其他有用的功能，如搜索、排序和分類。",[15,12660,12337,12661],{},[24,12662,12663],{"href":12663,"rel":12664},"https:\u002F\u002Fraycast.app\u002F",[28],[2667,12666,12668],{"id":12667},"aidente","AIDente",[15,12670,12671],{},"調整 MacBook 電池充電上限的工具，以延長電池壽命。",[15,12673,12337,12674],{},[24,12675,12676],{"href":12676,"rel":12677},"https:\u002F\u002Fapphousekitchen.com",[28],[2667,12679,12681],{"id":12680},"shotter","Shotter",[15,12683,12684],{},"功能強大的螢幕截圖工具，支援滾動截圖、圖片編輯等",[15,12686,12337,12687],{},[24,12688,12689],{"href":12689,"rel":12690},"https:\u002F\u002Fshottr.cc\u002F",[28],[2667,12692,12694],{"id":12693},"xnip","Xnip",[15,12696,12697],{},"另一款好用的截圖工具，提供多種截圖模式和編輯功能。",[15,12699,12337,12700],{},[24,12701,12702],{"href":12702,"rel":12703},"https:\u002F\u002Fxnipapp.com\u002F",[28],[2667,12705,12707],{"id":12706},"mos","Mos",[15,12709,12710],{},"平滑滑鼠滾動的工具，提升使用體驗。",[15,12712,12337,12713],{},[24,12714,12715],{"href":12715,"rel":12716},"https:\u002F\u002Fmos.caldis.me",[28],[2667,12718,12720],{"id":12719},"prettyclean","PrettyClean",[15,12722,12723],{},"清理系統垃圾檔案的工具",[15,12725,12337,12726],{},[24,12727,12728],{"href":12728,"rel":12729},"https:\u002F\u002Fwww.prettyclean.cc\u002Fen",[28],[2667,12731,12733],{"id":12732},"betterdisplay","BetterDisplay",[15,12735,12736],{},"調整螢幕解析度、亮度、對比度等設定的工具",[15,12738,12337,12739],{},[24,12740,12741],{"href":12741,"rel":12742},"https:\u002F\u002Fgithub.com\u002Fwaydabber\u002FBetterDisplay",[28],[2667,12744,12746],{"id":12745},"ntfstool","NTFSTool",[15,12748,12749],{},"在 macOS 上讀寫 NTFS 格式硬碟的工具",[15,12751,12337,12752],{},[24,12753,12754],{"href":12754,"rel":12755},"https:\u002F\u002Fntfstool.com",[28],[15,12757,12758,12759],{},"GitHub：",[24,12760,12761],{"href":12761,"rel":12762},"https:\u002F\u002Fgithub.com\u002Fntfstool\u002Fntfstool",[28],[2667,12764,12766],{"id":12765},"landrop","LANDrop",[15,12768,12769],{},"在區域網路內傳輸檔案的工具，支援多種平台，包含 macOS、Windows、 Linux、Android 和 iOS。",[15,12771,12337,12772],{},[24,12773,12774],{"href":12774,"rel":12775},"https:\u002F\u002Flandrop.app",[28],[54,12777,12778],{"id":12778},"圖像處理",[15,12780,12781],{},[2494,12782],{"alt":12778,"src":12783},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fpicture.png",[2667,12785,12787],{"id":12786},"inkscape","Inkscape",[15,12789,12790],{},"開源的向量圖形編輯器，類似 Adobe Illustrator。",[15,12792,12337,12793],{},[24,12794,12795],{"href":12795,"rel":12796},"https:\u002F\u002Finkscape.org\u002F",[28],[2667,12798,12799],{"id":12799},"krita",[15,12801,12802],{},"開源的繪圖軟體，適合數位繪畫和插圖創作，支援 PNG、JPEG 和 TIFF 等格式。",[15,12804,12337,12805],{},[24,12806,12807],{"href":12807,"rel":12808},"https:\u002F\u002Fkrita.org\u002Fzh-tw\u002F",[28],[2667,12810,12812],{"id":12811},"photoscape-x","Photoscape X",[15,12814,12815],{},"免費的圖片編輯軟體，提供多種編輯工具和特效。",[15,12817,12337,12818],{},[24,12819,12820],{"href":12820,"rel":12821},"http:\u002F\u002Fx.photoscape.org",[28],[2667,12823,12825],{"id":12824},"picture-view","Picture View",[15,12827,12828],{},"Picture View - 是一款輕巧快速的 macOS 圖片瀏覽應用程式。體積小巧，方便快速的檢視圖片，不產生緩存，適合作為預設看圖應用。多種看圖模式，操作方便快捷，支援查看EXIF訊息，支援防止系統休眠",[15,12830,12337,12831],{},[24,12832,12833],{"href":12833,"rel":12834},"https:\u002F\u002Fwl879.github.io\u002Fapps\u002Fpicview\u002Findex.html",[28],[2667,12836,12838],{"id":12837},"itsycal","Itsycal",[15,12840,12841],{},"在選單列顯示小巧的日曆",[15,12843,12337,12844],{},[24,12845,12846],{"href":12846,"rel":12847},"https:\u002F\u002Fwww.mowglii.com\u002Fitsycal\u002F",[28],[54,12849,12851],{"id":12850},"ai工具","AI工具",[15,12853,12854],{},[2494,12855],{"alt":12851,"src":12856},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002FAI.png",[2667,12858,12859],{"id":12859},"ollama",[15,12861,12862,12863,193,12866,193,12869,12872],{},"在本地運行大型語言模型的工具，常見的開源模型如 ",[127,12864,12865],{},"LLama3",[127,12867,12868],{},"Phi4",[127,12870,12871],{},"gemma2","等。",[15,12874,12337,12875],{},[24,12876,12877],{"href":12877,"rel":12878},"https:\u002F\u002Follama.ai\u002F",[28],[2667,12880,12882],{"id":12881},"chatbox-ai","Chatbox AI",[15,12884,12885],{},"Chatbox 是一款免費且開源的跨平台 AI 客戶端應用和智能助手，支援多種先進的 AI 模型和 API，旨在提升用戶的工作與學習效率。",[15,12887,12337,12888],{},[24,12889,12890],{"href":12890,"rel":12891},"https:\u002F\u002Fchatboxai.app\u002Fzh-TW",[28],[2667,12893,12895],{"id":12894},"open-webui","Open WebUI",[15,12897,12898],{},"Open WebUI 是一款免費且開源的自託管 Web 使用者介面，旨在為大型語言模型（LLM）提供直觀且功能豐富的操作平台",[15,12900,12901,12902],{},"網址：",[24,12903,12904],{"href":12904,"rel":12905},"https:\u002F\u002Fopenwebui.com\u002F",[28],[2667,12907,12909],{"id":12908},"pinokio","Pinokio",[15,12911,12912],{},"Pinokio 是一款免費且開源的 AI 應用管理工具，旨在簡化各種 AI 應用和模型的安裝與管理過程。",[15,12914,12915],{},"透過 Pinokio，用戶無需進行繁瑣的環境配置或使用終端命令，即可一鍵安裝和運行多種 AI 工具，如大型語言模型（LLM）、AI 繪畫、AI 語音、AI 視頻以及 AI 音樂等。",[15,12917,12901,12918],{},[24,12919,12920],{"href":12920,"rel":12921},"https:\u002F\u002Fpinokio.computer\u002F",[28],[2667,12923,8434],{"id":12924},"upscayl",[15,12926,12927],{},"使用 AI 技術將圖像轉換為更清晰的版本，並添加更多的细節。Upscayl 是一個非常有用的工具，特別適合需要高質量圖像的人像。",[15,12929,12337,12930],{},[24,12931,12932],{"href":12932,"rel":12933},"https:\u002F\u002Fupscayl.org\u002F",[28],{"title":217,"searchDepth":230,"depth":230,"links":12935},[12936,12950,12955,12958,12961,12964,12967,12980,12987],{"id":1613,"depth":230,"text":1613,"children":12937},[12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948,12949],{"id":12330,"depth":248,"text":12331},{"id":12344,"depth":248,"text":12345},{"id":12357,"depth":248,"text":12358},{"id":12370,"depth":248,"text":12371},{"id":12383,"depth":248,"text":12384},{"id":12396,"depth":248,"text":12397},{"id":12409,"depth":248,"text":12410},{"id":12422,"depth":248,"text":12423},{"id":12435,"depth":248,"text":12436},{"id":12448,"depth":248,"text":12449},{"id":12461,"depth":248,"text":12462},{"id":12474,"depth":248,"text":12475},{"id":12487,"depth":230,"text":12487,"children":12951},[12952,12953,12954],{"id":12496,"depth":248,"text":12497},{"id":12509,"depth":248,"text":12510},{"id":12522,"depth":248,"text":12523},{"id":12535,"depth":230,"text":12535,"children":12956},[12957],{"id":12544,"depth":248,"text":12545},{"id":12557,"depth":230,"text":12557,"children":12959},[12960],{"id":12565,"depth":248,"text":12566},{"id":12578,"depth":230,"text":12579,"children":12962},[12963],{"id":12587,"depth":248,"text":12588},{"id":12600,"depth":230,"text":12600,"children":12965},[12966],{"id":12608,"depth":248,"text":12609},{"id":12621,"depth":230,"text":12621,"children":12968},[12969,12970,12971,12972,12973,12974,12975,12976,12977,12978,12979],{"id":12629,"depth":248,"text":6387},{"id":12641,"depth":248,"text":12642},{"id":12654,"depth":248,"text":12655},{"id":12667,"depth":248,"text":12668},{"id":12680,"depth":248,"text":12681},{"id":12693,"depth":248,"text":12694},{"id":12706,"depth":248,"text":12707},{"id":12719,"depth":248,"text":12720},{"id":12732,"depth":248,"text":12733},{"id":12745,"depth":248,"text":12746},{"id":12765,"depth":248,"text":12766},{"id":12778,"depth":230,"text":12778,"children":12981},[12982,12983,12984,12985,12986],{"id":12786,"depth":248,"text":12787},{"id":12799,"depth":248,"text":12799},{"id":12811,"depth":248,"text":12812},{"id":12824,"depth":248,"text":12825},{"id":12837,"depth":248,"text":12838},{"id":12850,"depth":230,"text":12851,"children":12988},[12989,12990,12991,12992,12993],{"id":12859,"depth":248,"text":12859},{"id":12881,"depth":248,"text":12882},{"id":12894,"depth":248,"text":12895},{"id":12908,"depth":248,"text":12909},{"id":12924,"depth":248,"text":8434},"\u002Fimages\u002Farticles\u002F2025-01-24-mac-os-app\u002Fcover.png",{},"\u002Farticles\u002F2025-01-24-mac-os-app","2025-01-24 18:30:00",{"title":12315,"description":12320},"articles\u002F2025-01-24-mac-os-app","整理目前自已常用 Mac App，包含開發工具、網路工具、筆記軟體、媒體播放器、壓縮\u002F解壓、密碼管理、系統管理、圖像處理及AI工具",[6793,3748],"N4MPdGJ1ZPhYGjQBN5k3ooU7PUeIDvfSyYFtfWfW1dY",{"id":13004,"title":13005,"body":13006,"category":13316,"description":217,"extension":1601,"image":13317,"meta":13318,"navigation":263,"path":13319,"pubDate":13320,"seo":13321,"status":263,"stem":13322,"summary":13323,"tags":13324,"__hash__":13326},"content\u002Farticles\u002F2025-01-20-postgresql-materialzed-view.md","PostgreSQL 的高效查詢策略：利用 Materialized View 達成更快的回應速度",{"type":8,"value":13007,"toc":13302},[13008,13012,13022,13026,13029,13032,13058,13061,13121,13125,13139,13143,13146,13149,13169,13173,13180,13209,13212,13215,13236,13240,13247,13256,13260,13263,13294,13296,13299],[54,13009,13011],{"id":13010},"postgresql-view-檢視表-和-materialized-view-實體化檢視表","PostgreSQL VIEW (檢視表) 和 Materialized View (實體化檢視表)",[15,13013,13014,13015,8458,13018,13021],{},"PostgreSQL 提供了 ",[127,13016,13017],{},"VIEW",[127,13019,13020],{},"MATERIALIZED VIEW"," 兩種檢示表，分別用於查詢和儲存結果。",[2667,13023,13025],{"id":13024},"view-檢視表","VIEW (檢視表)",[15,13027,13028],{},"是一種虛擬表，它會根據查詢語句來生成資料。當查詢時，PostgreSQL 會自動計算並返回結果集。",[15,13030,13031],{},"其優點如下：",[156,13033,13034,13040,13046,13052],{},[159,13035,13036,13039],{},[19,13037,13038],{},"簡化查詢","：將複雜查詢存為檢示表，可以簡化後續的查詢。",[159,13041,13042,13045],{},[19,13043,13044],{},"提高安全性","：檢視表可以避免直接對數據庫進行操作，提高了安全性，並可以限制用戶對數據資料的查詢權限。",[159,13047,13048,13051],{},[19,13049,13050],{},"可重用性","：檢視表可以被多次使用，而不需要重新計算。",[159,13053,13054,13057],{},[19,13055,13056],{},"節省空間","：不保存數據，節省空間。",[2667,13059,13060],{"id":13060},"範例",[212,13062,13066],{"className":13063,"code":13064,"language":13065,"meta":217,"style":217},"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",[127,13067,13068,13082,13105,13113],{"__ignoreMap":217},[122,13069,13070,13073,13076,13079],{"class":222,"line":223},[122,13071,13072],{"class":632},"CREATE",[122,13074,13075],{"class":632},"  VIEW",[122,13077,13078],{"class":233}," my_view",[122,13080,13081],{"class":632}," AS\n",[122,13083,13084,13087,13090,13093,13095,13097,13099,13102],{"class":222,"line":230},[122,13085,13086],{"class":632},"SELECT",[122,13088,13089],{"class":639}," column1, column2, ",[122,13091,13092],{"class":241},"COUNT",[122,13094,4013],{"class":639},[122,13096,10281],{"class":632},[122,13098,10573],{"class":639},[122,13100,13101],{"class":632},"AS",[122,13103,13104],{"class":639}," total_count\n",[122,13106,13107,13110],{"class":222,"line":248},[122,13108,13109],{"class":632},"FROM",[122,13111,13112],{"class":639}," my_table\n",[122,13114,13115,13118],{"class":222,"line":260},[122,13116,13117],{"class":632},"GROUP BY",[122,13119,13120],{"class":639}," column1, column2;\n",[2667,13122,13124],{"id":13123},"view-的缺點","VIEW 的缺點",[156,13126,13127,13133],{},[159,13128,13129,13132],{},[19,13130,13131],{},"性能問題","：太複雜的檢示表查詢可能會影響性能。",[159,13134,13135,13138],{},[19,13136,13137],{},"無法建立索引","：檢視表本身不能直接建立索引，需要對原始數據進行索引。",[54,13140,13142],{"id":13141},"materialized-view-實體化檢視表","Materialized View (實體化檢視表)",[15,13144,13145],{},"Materialized View 是一種檢視表，它會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[15,13147,13148],{},"其特點如下：",[156,13150,13151,13157,13163],{},[159,13152,13153,13156],{},[19,13154,13155],{},"資料存儲","：Materialized View 會在查詢時計算並儲存結果。這意味著當查詢 Materialized View 時，它會直接使用儲存的結果而不是重新計算。",[159,13158,13159,13162],{},[19,13160,13161],{},"性能優勢","：因為資料已經被計算好，所以查詢速度會更快，特別是複雜的查詢。",[159,13164,13165,13168],{},[19,13166,13167],{},"索引支持","：Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。",[2667,13170,13172],{"id":13171},"建立-materialized-view","建立 Materialized View",[15,13174,13175,13176,13179],{},"在 PostgreSQL 中，可以使用 ",[127,13177,13178],{},"CREATE MATERIALIZED VIEW"," 语句來建立 Materialized View。以下是一個簡單的示例：",[212,13181,13183],{"className":13063,"code":13182,"language":13065,"meta":217,"style":217},"CREATE MATERIALIZED VIEW my_materialized_view AS\nSELECT column1, column2, ...\nFROM my_table;\n",[127,13184,13185,13195,13202],{"__ignoreMap":217},[122,13186,13187,13189,13192],{"class":222,"line":223},[122,13188,13072],{"class":632},[122,13190,13191],{"class":639}," MATERIALIZED VIEW my_materialized_view ",[122,13193,13194],{"class":632},"AS\n",[122,13196,13197,13199],{"class":222,"line":230},[122,13198,13086],{"class":632},[122,13200,13201],{"class":639}," column1, column2, ...\n",[122,13203,13204,13206],{"class":222,"line":248},[122,13205,13109],{"class":632},[122,13207,13208],{"class":639}," my_table;\n",[2667,13210,13211],{"id":13211},"建立索引",[15,13213,13214],{},"Materialized View 可以像普通表一樣建立索引，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[212,13216,13218],{"className":13063,"code":13217,"language":13065,"meta":217,"style":217},"CREATE INDEX idx_my_materialized_view_column1 ON my_materialized_view(column1);\n",[127,13219,13220],{"__ignoreMap":217},[122,13221,13222,13224,13227,13230,13233],{"class":222,"line":223},[122,13223,13072],{"class":632},[122,13225,13226],{"class":632}," INDEX",[122,13228,13229],{"class":233}," idx_my_materialized_view_column1",[122,13231,13232],{"class":632}," ON",[122,13234,13235],{"class":639}," my_materialized_view(column1);\n",[2667,13237,13239],{"id":13238},"更新-materialized-view","更新 Materialized View",[15,13241,13242,13243,13246],{},"Materialized View 會自動更新，當數據庫中的表發生更改時。你可以使用 ",[127,13244,13245],{},"REFRESH MATERIALIZED VIEW"," 语句來刷新 Materialized View：",[212,13248,13250],{"className":13063,"code":13249,"language":13065,"meta":217,"style":217},"REFRESH MATERIALIZED VIEW my_materialized_view;\n",[127,13251,13252],{"__ignoreMap":217},[122,13253,13254],{"class":222,"line":223},[122,13255,13249],{"class":639},[2667,13257,13259],{"id":13258},"使用-materialized-view","使用 Materialized View",[15,13261,13262],{},"Materialized View 可以像普通表一樣使用，因此可以對檢視表進行高效的查詢操作。以下是一個示例：",[212,13264,13266],{"className":13063,"code":13265,"language":13065,"meta":217,"style":217},"SELECT * FROM my_materialized_view WHERE column1 = 'value';\n",[127,13267,13268],{"__ignoreMap":217},[122,13269,13270,13272,13275,13278,13281,13284,13287,13289,13292],{"class":222,"line":223},[122,13271,13086],{"class":632},[122,13273,13274],{"class":632}," *",[122,13276,13277],{"class":632}," FROM",[122,13279,13280],{"class":639}," my_materialized_view ",[122,13282,13283],{"class":632},"WHERE",[122,13285,13286],{"class":639}," column1 ",[122,13288,2421],{"class":632},[122,13290,13291],{"class":237}," 'value'",[122,13293,4249],{"class":639},[54,13295,5386],{"id":5386},[15,13297,13298],{},"Materialized View 是一個非常有用的工具，它可以在數據庫中提供快速的查詢結果。通過使用索引和定期刷新，Materialized View 可以提高查詢性能，使應用程序更加高效。",[1579,13300,13301],{},"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":217,"searchDepth":230,"depth":230,"links":13303},[13304,13309,13315],{"id":13010,"depth":230,"text":13011,"children":13305},[13306,13307,13308],{"id":13024,"depth":248,"text":13025},{"id":13060,"depth":248,"text":13060},{"id":13123,"depth":248,"text":13124},{"id":13141,"depth":230,"text":13142,"children":13310},[13311,13312,13313,13314],{"id":13171,"depth":248,"text":13172},{"id":13211,"depth":248,"text":13211},{"id":13238,"depth":248,"text":13239},{"id":13258,"depth":248,"text":13259},{"id":5386,"depth":230,"text":5386},"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":13005,"description":217},"articles\u002F2025-01-20-postgresql-materialzed-view","PostgreSQL Materialized View 是一種數據視圖，它會將查詢結果儲存到一個表中，以便在需要時快速訪問。",[13325],"Postgresql","OtEICcXMOXYLMC9l2mst1JtQEi3zUxzEx8O9Q062GcY",{"id":13328,"title":13329,"body":13330,"category":5516,"description":217,"extension":1601,"image":13370,"meta":13371,"navigation":263,"path":13372,"pubDate":13373,"seo":13374,"status":263,"stem":13375,"summary":13376,"tags":13377,"__hash__":13378},"content\u002Farticles\u002F2025-01-19-2025-new-theme.md","2025 新版型",{"type":8,"value":13331,"toc":13367},[13332,13334,13349,13358],[54,13333,5452],{"id":5452},[15,13335,13336,13337,13340,13341,13344,13345,13348],{},"年初時，我對自己的部落格進行了重新設計和結構化。這次重構依然採用了 ",[127,13338,13339],{},"Nuxt.js"," 和其 ",[127,13342,13343],{},"Nuxt\u002Fcontent"," 模組來管理文章內容，並利用 ",[127,13346,13347],{},"Tailwind CSS"," 進行樣式設定。",[15,13350,13351,13352,13354,13355,13357],{},"原本打算使用 ",[127,13353,13339],{}," V3 來完成此次更新，因為網站已經接近完成狀態。然而，在生成靜態頁面時遇到了一些問題，因此決定先以穩定的 ",[127,13356,13339],{}," V2 進行重構工作。",[15,13359,13360,13361,13363,13364,13366],{},"尽管如此，我仍將持續研究 ",[127,13362,13339],{}," V3 的相關功能，並期待將這些新特性引入到我的項目中。即使官方對 ",[127,13365,13339],{}," V2 還會提供安全更新，但許多令人興奮的新功能僅在 V3 中實現。",{"title":217,"searchDepth":230,"depth":230,"links":13368},[13369],{"id":5452,"depth":230,"text":5452},"\u002Fimages\u002Farticles\u002F2025-01-19-2025-new-theme\u002Fcover.png",{},"\u002Farticles\u002F2025-01-19-2025-new-theme","2025-01-19 22:48:30",{"title":13329,"description":217},"articles\u002F2025-01-19-2025-new-theme","替網站做了新版型，新版型回歸簡約風格",[5516],"MsdGgluY9CLV2K69xHavUg9vNq1FVnQLpldIMwcohqI",{"id":13380,"title":13381,"body":13382,"category":1599,"description":217,"extension":1601,"image":13764,"meta":13765,"navigation":263,"path":13766,"pubDate":13767,"seo":13768,"status":263,"stem":13769,"summary":13770,"tags":13771,"__hash__":13772},"content\u002Farticles\u002F2024-06-07-ollama.md","用 ollama 來玩免費開源語言模型",{"type":8,"value":13383,"toc":13749},[13384,13386,13403,13406,13423,13427,13430,13434,13452,13456,13471,13473,13568,13572,13575,13608,13611,13650,13654,13669,13681,13722,13726,13738,13746],[54,13385,3757],{"id":3757},[15,13387,13388,13389,13392,13393,13392,13396,13392,13399,13402],{},"Ollama 是一個支持 ",[127,13390,13391],{},"Llama 3"," 、 ",[127,13394,13395],{},"Mistral",[127,13397,13398],{},"Gemma",[127,13400,13401],{},"Phi 3"," 等大型語言模型的框架，適用於 macOS、Windows、Linux 和 Docker。",[54,13404,13405],{"id":13405},"下載",[15,13407,13408,13409,13414,13415,13414,13419,3315],{},"下載位址：\n| ",[24,13410,13413],{"href":13411,"rel":13412},"https:\u002F\u002Follama.com\u002Fdownload\u002Fmac",[28],"MAC"," | ",[24,13416,3061],{"href":13417,"rel":13418},"https:\u002F\u002Follama.com\u002Fdownload\u002Flinux",[28],[24,13420,6898],{"href":13421,"rel":13422},"https:\u002F\u002Follama.com\u002Fdownload\u002Fwindows",[28],[2667,13424,13426],{"id":13425},"windows-macos-安裝","Windows \u002F MacOS 安裝",[15,13428,13429],{},"依安裝精靈進行即可",[2667,13431,13433],{"id":13432},"linux-在透過-curl-安裝","Linux 在透過 curl 安裝",[212,13435,13437],{"className":214,"code":13436,"language":216,"meta":217,"style":217},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n",[127,13438,13439],{"__ignoreMap":217},[122,13440,13441,13443,13445,13448,13450],{"class":222,"line":223},[122,13442,3127],{"class":233},[122,13444,3130],{"class":241},[122,13446,13447],{"class":237}," https:\u002F\u002Follama.com\u002Finstall.sh",[122,13449,3315],{"class":632},[122,13451,3318],{"class":233},[2667,13453,13455],{"id":13454},"docker-安裝","Docker 安裝",[212,13457,13459],{"className":214,"code":13458,"language":216,"meta":217,"style":217},"docker pull ollama\u002Follama\n",[127,13460,13461],{"__ignoreMap":217},[122,13462,13463,13465,13468],{"class":222,"line":223},[122,13464,12409],{"class":233},[122,13466,13467],{"class":237}," pull",[122,13469,13470],{"class":237}," ollama\u002Follama\n",[54,13472,3337],{"id":3337},[353,13474,13475,13495,13515,13531,13552],{},[159,13476,13477,13478,13480,13481],{},"運行 ",[127,13479,13391],{}," 模型",[212,13482,13484],{"className":214,"code":13483,"language":216,"meta":217,"style":217},"ollama run llama3\n",[127,13485,13486],{"__ignoreMap":217},[122,13487,13488,13490,13492],{"class":222,"line":223},[122,13489,12859],{"class":233},[122,13491,1112],{"class":237},[122,13493,13494],{"class":237}," llama3\n",[159,13496,13497,13498,13509,13511],{},"查看所有支持的模型：",[212,13499,13501],{"className":214,"code":13500,"language":216,"meta":217,"style":217},"ollama list\n",[127,13502,13503],{"__ignoreMap":217},[122,13504,13505,13507],{"class":222,"line":223},[122,13506,12859],{"class":233},[122,13508,1963],{"class":237},[11127,13510],{},[2494,13512],{"alt":13513,"src":13514,"title":13513},"ollama list","\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Follama-list.png",[159,13516,13517,13518],{},"拉取模型",[212,13519,13521],{"className":214,"code":13520,"language":216,"meta":217,"style":217},"ollama pull llama3\n",[127,13522,13523],{"__ignoreMap":217},[122,13524,13525,13527,13529],{"class":222,"line":223},[122,13526,12859],{"class":233},[122,13528,13467],{"class":237},[122,13530,13494],{"class":237},[159,13532,13533,13534],{},"複製模型",[212,13535,13537],{"className":214,"code":13536,"language":216,"meta":217,"style":217},"ollama cp llama3 my-model\n",[127,13538,13539],{"__ignoreMap":217},[122,13540,13541,13543,13546,13549],{"class":222,"line":223},[122,13542,12859],{"class":233},[122,13544,13545],{"class":237}," cp",[122,13547,13548],{"class":237}," llama3",[122,13550,13551],{"class":237}," my-model\n",[159,13553,13554,13555],{},"刪除模型",[212,13556,13558],{"className":214,"code":13557,"language":216,"meta":217,"style":217},"ollama rm llama3\n",[127,13559,13560],{"__ignoreMap":217},[122,13561,13562,13564,13566],{"class":222,"line":223},[122,13563,12859],{"class":233},[122,13565,679],{"class":237},[122,13567,13494],{"class":237},[54,13569,13571],{"id":13570},"利用-rest-api","利用 REST API",[2667,13573,13574],{"id":13574},"產生回應",[212,13576,13578],{"className":214,"code":13577,"language":216,"meta":217,"style":217},"curl http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate -d '{\n  \"model\": \"llama3\",\n  \"prompt\":\"Why is the sky blue?\"\n}'\n",[127,13579,13580,13593,13598,13603],{"__ignoreMap":217},[122,13581,13582,13584,13587,13590],{"class":222,"line":223},[122,13583,3127],{"class":233},[122,13585,13586],{"class":237}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fgenerate",[122,13588,13589],{"class":241}," -d",[122,13591,13592],{"class":237}," '{\n",[122,13594,13595],{"class":222,"line":230},[122,13596,13597],{"class":237},"  \"model\": \"llama3\",\n",[122,13599,13600],{"class":222,"line":248},[122,13601,13602],{"class":237},"  \"prompt\":\"Why is the sky blue?\"\n",[122,13604,13605],{"class":222,"line":260},[122,13606,13607],{"class":237},"}'\n",[2667,13609,13610],{"id":13610},"使用一個模型聊天",[212,13612,13614],{"className":214,"code":13613,"language":216,"meta":217,"style":217},"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",[127,13615,13616,13627,13631,13636,13641,13646],{"__ignoreMap":217},[122,13617,13618,13620,13623,13625],{"class":222,"line":223},[122,13619,3127],{"class":233},[122,13621,13622],{"class":237}," http:\u002F\u002Flocalhost:11434\u002Fapi\u002Fchat",[122,13624,13589],{"class":241},[122,13626,13592],{"class":237},[122,13628,13629],{"class":222,"line":230},[122,13630,13597],{"class":237},[122,13632,13633],{"class":222,"line":248},[122,13634,13635],{"class":237},"  \"messages\": [\n",[122,13637,13638],{"class":222,"line":260},[122,13639,13640],{"class":237},"    { \"role\": \"user\", \"content\": \"why is the sky blue?\" }\n",[122,13642,13643],{"class":222,"line":267},[122,13644,13645],{"class":237},"  ]\n",[122,13647,13648],{"class":222,"line":273},[122,13649,13607],{"class":237},[54,13651,13653],{"id":13652},"open-webui-圖型化介面","Open WebUI 圖型化介面",[15,13655,13656,13657,141,13659,13661,13662,13665,13666,13668],{},"由於 ollama 是開源，所以有不少開源軟體，幫 ollama 製作圖型化介面。而目前站長推薦使用 ",[127,13658,12895],{},[127,13660,12895],{},"的操作介面和 ",[127,13663,13664],{},"chatGPT"," 很接近，是運行在 ",[127,13667,12409],{},"的環境下。",[15,13670,13671,13672,13674,13675,13677,13678,13680],{},"只要安裝好",[127,13673,12410],{},"的環境後和",[127,13676,12859],{},"的服務後，只要執行下列指令就可以開始玩",[127,13679,12859],{},"了",[212,13682,13684],{"className":214,"code":13683,"language":216,"meta":217,"style":217},"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",[127,13685,13686],{"__ignoreMap":217},[122,13687,13688,13690,13692,13694,13697,13700,13703,13705,13708,13710,13713,13716,13719],{"class":222,"line":223},[122,13689,12409],{"class":233},[122,13691,1112],{"class":237},[122,13693,13589],{"class":241},[122,13695,13696],{"class":241}," -p",[122,13698,13699],{"class":237}," 3000:8080",[122,13701,13702],{"class":241}," --add-host=host.docker.internal:host-gateway",[122,13704,314],{"class":241},[122,13706,13707],{"class":237}," open-webui:\u002Fapp\u002Fbackend\u002Fdata",[122,13709,646],{"class":241},[122,13711,13712],{"class":237}," open-webui",[122,13714,13715],{"class":241}," --restart",[122,13717,13718],{"class":237}," always",[122,13720,13721],{"class":237}," ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[54,13723,13725],{"id":13724},"使用-vscode-插件","使用 VScode 插件",[15,13727,13728,13729,13731,13732,13735,13736],{},"除了用 ",[127,13730,12895],{}," 之外，有在使用 ",[127,13733,13734],{},"VScode"," 編輯器，可以安裝下面插件，就可使用 ",[127,13737,12859],{},[15,13739,13740,13741],{},"插件網址： ",[24,13742,13745],{"href":13743,"rel":13744},"https:\u002F\u002Fwww.continue.dev\u002F",[28],"插件官網",[1579,13747,13748],{},"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":217,"searchDepth":230,"depth":230,"links":13750},[13751,13752,13757,13758,13762,13763],{"id":3757,"depth":230,"text":3757},{"id":13405,"depth":230,"text":13405,"children":13753},[13754,13755,13756],{"id":13425,"depth":248,"text":13426},{"id":13432,"depth":248,"text":13433},{"id":13454,"depth":248,"text":13455},{"id":3337,"depth":230,"text":3337},{"id":13570,"depth":230,"text":13571,"children":13759},[13760,13761],{"id":13574,"depth":248,"text":13574},{"id":13610,"depth":248,"text":13610},{"id":13652,"depth":230,"text":13653},{"id":13724,"depth":230,"text":13725},"\u002Fimages\u002Farticles\u002F2024-06-07-ollama\u002Fcover.png",{},"\u002Farticles\u002F2024-06-07-ollama","2024-06-07 22:48:30",{"title":13381,"description":217},"articles\u002F2024-06-07-ollama","在 ChatGPT 問世後，大多數科技大廠都推出了自家的語言模型，而有不少開源模型出現。我們可以透過 OLLAMA 在自己的電腦中，建立私有的語言模型服務，並且能夠自由控制和定制模型的性能和功能。",[1610,3748],"msNB0mNO6nmpAdDzC7_7HVLJFs6WFG8kMP_fzndMH6A",{"id":13774,"title":13775,"body":13776,"category":5433,"description":217,"extension":1601,"image":15330,"meta":15331,"navigation":263,"path":15332,"pubDate":15333,"seo":15334,"status":263,"stem":15335,"summary":15336,"tags":15337,"__hash__":15338},"content\u002Farticles\u002F2023-10-04-php-carbon.md","【PHP】如何利用 nesbot\u002Fcarbon 處理日期和時間",{"type":8,"value":13777,"toc":15320},[13778,13780,13789,13804,13807,13864,13867,13875,13878,13982,13984,14806,14809,14858,14861,15317],[54,13779,3808],{"id":3808},[15,13781,7927,13782,13785,13786],{},[127,13783,13784],{},"composer"," 安裝 ",[127,13787,13788],{},"carbon",[212,13790,13792],{"className":214,"code":13791,"language":216,"meta":217,"style":217},"composer require nesbot\u002Fcarbon\n",[127,13793,13794],{"__ignoreMap":217},[122,13795,13796,13798,13801],{"class":222,"line":223},[122,13797,13784],{"class":233},[122,13799,13800],{"class":237}," require",[122,13802,13803],{"class":237}," nesbot\u002Fcarbon\n",[15,13805,13806],{},"簡易使用範例：",[212,13808,13810],{"className":3997,"code":13809,"language":3944,"meta":217,"style":217},"require 'vendor\u002Fautoload.php';\n\nuse Carbon\\Carbon;\n\nprintf(\"Now: %s\", Carbon::now());\n",[127,13811,13812,13822,13826,13836,13840],{"__ignoreMap":217},[122,13813,13814,13817,13820],{"class":222,"line":223},[122,13815,13816],{"class":632},"require",[122,13818,13819],{"class":237}," 'vendor\u002Fautoload.php'",[122,13821,4249],{"class":639},[122,13823,13824],{"class":222,"line":230},[122,13825,264],{"emptyLinePlaceholder":263},[122,13827,13828,13831,13834],{"class":222,"line":248},[122,13829,13830],{"class":632},"use",[122,13832,13833],{"class":241}," Carbon\\Carbon",[122,13835,4249],{"class":639},[122,13837,13838],{"class":222,"line":260},[122,13839,264],{"emptyLinePlaceholder":263},[122,13841,13842,13845,13847,13850,13852,13855,13858,13861],{"class":222,"line":267},[122,13843,13844],{"class":241},"printf",[122,13846,4013],{"class":639},[122,13848,13849],{"class":237},"\"Now: %s\"",[122,13851,4091],{"class":639},[122,13853,13854],{"class":241},"Carbon",[122,13856,13857],{"class":632},"::",[122,13859,13860],{"class":233},"now",[122,13862,13863],{"class":639},"());\n",[54,13865,13866],{"id":13866},"日期格式化",[156,13868,13869],{},[159,13870,13871,13874],{},[127,13872,13873],{},"format($value)","：將日期時間進行格式化輸出，其中格式",[54,13876,13877],{"id":13877},"取得與調整時間",[156,13879,13880,13886,13892,13898,13904,13916,13927,13938,13949,13960,13971],{},[159,13881,13882,13885],{},[127,13883,13884],{},"now()","：獲得當前的日期與時間",[159,13887,13888,13891],{},[127,13889,13890],{},"today()","：獲得當天的日期",[159,13893,13894,13897],{},[127,13895,13896],{},"tomorrow()","：獲取明天的日期",[159,13899,13900,13903],{},[127,13901,13902],{},"yesterday()","：：獲取昨天的日期",[159,13905,13906,951,13909,13912,13913],{},[127,13907,13908],{},"addYear($value)",[127,13910,13911],{},"subYear($value)","：將年份增加\u002F減少 ",[127,13914,13915],{},"$value",[159,13917,13918,951,13921,13924,13925],{},[127,13919,13920],{},"addQuarter($value)",[127,13922,13923],{},"subQuarter($value)","：將季度增加\u002F減少 ",[127,13926,13915],{},[159,13928,13929,951,13932,13935,13936],{},[127,13930,13931],{},"addMonth($value)",[127,13933,13934],{},"subMonth($value)","：將月份增加\u002F減少 ",[127,13937,13915],{},[159,13939,13940,951,13943,13946,13947],{},[127,13941,13942],{},"addDay($value)",[127,13944,13945],{},"subDay($value)","：將天數增加\u002F減少 ",[127,13948,13915],{},[159,13950,13951,951,13954,13957,13958],{},[127,13952,13953],{},"addHour($value)",[127,13955,13956],{},"subHour($value)","：將小時增加\u002F減少 ",[127,13959,13915],{},[159,13961,13962,951,13965,13968,13969],{},[127,13963,13964],{},"addMinute($value)",[127,13966,13967],{},"subMinute($value)","：將分鐘增加\u002F減少 ",[127,13970,13915],{},[159,13972,13973,951,13976,13979,13980],{},[127,13974,13975],{},"addSecond($value)",[127,13977,13978],{},"subSecond($value)","：將秒數增加\u002F減少 ",[127,13981,13915],{},[2667,13983,13060],{"id":13060},[212,13985,13987],{"className":3997,"code":13986,"language":3944,"meta":217,"style":217},"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",[127,13988,13989,13997,14001,14006,14011,14016,14029,14033,14038,14042,14046,14051,14055,14081,14085,14090,14094,14098,14103,14107,14111,14134,14138,14143,14147,14151,14156,14160,14164,14187,14191,14196,14200,14204,14209,14213,14217,14251,14260,14293,14297,14302,14306,14310,14315,14319,14323,14356,14364,14397,14401,14406,14410,14414,14419,14423,14456,14464,14497,14501,14506,14510,14514,14519,14523,14556,14564,14597,14601,14606,14610,14614,14619,14623,14656,14664,14697,14701,14706,14710,14714,14719,14723,14756,14764,14797,14801],{"__ignoreMap":217},[122,13990,13991,13993,13995],{"class":222,"line":223},[122,13992,13830],{"class":632},[122,13994,13833],{"class":241},[122,13996,4249],{"class":639},[122,13998,13999],{"class":222,"line":230},[122,14000,264],{"emptyLinePlaceholder":263},[122,14002,14003],{"class":222,"line":248},[122,14004,14005],{"class":226},"\u002F**\n",[122,14007,14008],{"class":222,"line":260},[122,14009,14010],{"class":226}," * ：獲得當前的日期與時間\n",[122,14012,14013],{"class":222,"line":267},[122,14014,14015],{"class":226}," *\u002F\n",[122,14017,14018,14020,14023,14025,14027],{"class":222,"line":273},[122,14019,4232],{"class":241},[122,14021,14022],{"class":241}," Carbon",[122,14024,13857],{"class":632},[122,14026,13860],{"class":233},[122,14028,4223],{"class":639},[122,14030,14031],{"class":222,"line":660},[122,14032,264],{"emptyLinePlaceholder":263},[122,14034,14035],{"class":222,"line":672},[122,14036,14037],{"class":226},"\u002F\u002F印出結果：2023-10-25 07:12:30\n",[122,14039,14040],{"class":222,"line":701},[122,14041,264],{"emptyLinePlaceholder":263},[122,14043,14044],{"class":222,"line":706},[122,14045,14005],{"class":226},[122,14047,14048],{"class":222,"line":712},[122,14049,14050],{"class":226}," * 獲得當天的日期\n",[122,14052,14053],{"class":222,"line":725},[122,14054,14015],{"class":226},[122,14056,14057,14059,14061,14063,14066,14069,14071,14074,14076,14079],{"class":222,"line":737},[122,14058,4232],{"class":241},[122,14060,14022],{"class":241},[122,14062,13857],{"class":632},[122,14064,14065],{"class":233},"today",[122,14067,14068],{"class":639},"()",[122,14070,4080],{"class":632},[122,14072,14073],{"class":233},"format",[122,14075,4013],{"class":639},[122,14077,14078],{"class":237},"\"Y-m-d\"",[122,14080,4024],{"class":639},[122,14082,14083],{"class":222,"line":758},[122,14084,264],{"emptyLinePlaceholder":263},[122,14086,14087],{"class":222,"line":782},[122,14088,14089],{"class":226},"\u002F\u002F印出結果：2023-10-25\n",[122,14091,14092],{"class":222,"line":787},[122,14093,264],{"emptyLinePlaceholder":263},[122,14095,14096],{"class":222,"line":793},[122,14097,14005],{"class":226},[122,14099,14100],{"class":222,"line":807},[122,14101,14102],{"class":226}," * 獲取明天的日期\n",[122,14104,14105],{"class":222,"line":823},[122,14106,14015],{"class":226},[122,14108,14109],{"class":222,"line":828},[122,14110,264],{"emptyLinePlaceholder":263},[122,14112,14113,14115,14117,14119,14122,14124,14126,14128,14130,14132],{"class":222,"line":834},[122,14114,4232],{"class":241},[122,14116,14022],{"class":241},[122,14118,13857],{"class":632},[122,14120,14121],{"class":233},"tomorrow",[122,14123,14068],{"class":639},[122,14125,4080],{"class":632},[122,14127,14073],{"class":233},[122,14129,4013],{"class":639},[122,14131,14078],{"class":237},[122,14133,4024],{"class":639},[122,14135,14136],{"class":222,"line":850},[122,14137,264],{"emptyLinePlaceholder":263},[122,14139,14140],{"class":222,"line":864},[122,14141,14142],{"class":226},"\u002F\u002F印出結果：2023-10-26\n",[122,14144,14145],{"class":222,"line":880},[122,14146,264],{"emptyLinePlaceholder":263},[122,14148,14149],{"class":222,"line":7632},[122,14150,14005],{"class":226},[122,14152,14153],{"class":222,"line":7638},[122,14154,14155],{"class":226}," * 獲取昨天的日期\n",[122,14157,14158],{"class":222,"line":7648},[122,14159,14015],{"class":226},[122,14161,14162],{"class":222,"line":7662},[122,14163,264],{"emptyLinePlaceholder":263},[122,14165,14166,14168,14170,14172,14175,14177,14179,14181,14183,14185],{"class":222,"line":7667},[122,14167,4232],{"class":241},[122,14169,14022],{"class":241},[122,14171,13857],{"class":632},[122,14173,14174],{"class":233},"yesterday",[122,14176,14068],{"class":639},[122,14178,4080],{"class":632},[122,14180,14073],{"class":233},[122,14182,4013],{"class":639},[122,14184,14078],{"class":237},[122,14186,4024],{"class":639},[122,14188,14189],{"class":222,"line":7673},[122,14190,264],{"emptyLinePlaceholder":263},[122,14192,14193],{"class":222,"line":7686},[122,14194,14195],{"class":226},"\u002F\u002F印出結果： 2023-10-24\n",[122,14197,14198],{"class":222,"line":7697},[122,14199,264],{"emptyLinePlaceholder":263},[122,14201,14202],{"class":222,"line":7708},[122,14203,14005],{"class":226},[122,14205,14206],{"class":222,"line":9624},[122,14207,14208],{"class":226}," * 將年份增加\u002F減少 `$value`\n",[122,14210,14211],{"class":222,"line":9656},[122,14212,14015],{"class":226},[122,14214,14215],{"class":222,"line":9667},[122,14216,264],{"emptyLinePlaceholder":263},[122,14218,14219,14221,14223,14225,14227,14229,14231,14234,14236,14238,14240,14242,14244,14246,14249],{"class":222,"line":9678},[122,14220,4232],{"class":241},[122,14222,14022],{"class":241},[122,14224,13857],{"class":632},[122,14226,13860],{"class":233},[122,14228,14068],{"class":639},[122,14230,4080],{"class":632},[122,14232,14233],{"class":233},"addYear",[122,14235,4013],{"class":639},[122,14237,4021],{"class":241},[122,14239,3161],{"class":639},[122,14241,4080],{"class":632},[122,14243,14073],{"class":233},[122,14245,4013],{"class":639},[122,14247,14248],{"class":237},"\"Y-m-d H:i:s\"",[122,14250,4024],{"class":639},[122,14252,14253,14255,14258],{"class":222,"line":9689},[122,14254,4232],{"class":241},[122,14256,14257],{"class":237}," \" \u002F \"",[122,14259,4249],{"class":639},[122,14261,14262,14264,14266,14268,14270,14272,14274,14277,14279,14281,14283,14285,14287,14289,14291],{"class":222,"line":9700},[122,14263,4232],{"class":241},[122,14265,14022],{"class":241},[122,14267,13857],{"class":632},[122,14269,13860],{"class":233},[122,14271,14068],{"class":639},[122,14273,4080],{"class":632},[122,14275,14276],{"class":233},"subYear",[122,14278,4013],{"class":639},[122,14280,4021],{"class":241},[122,14282,3161],{"class":639},[122,14284,4080],{"class":632},[122,14286,14073],{"class":233},[122,14288,4013],{"class":639},[122,14290,14248],{"class":237},[122,14292,4024],{"class":639},[122,14294,14295],{"class":222,"line":9711},[122,14296,264],{"emptyLinePlaceholder":263},[122,14298,14299],{"class":222,"line":9723},[122,14300,14301],{"class":226},"\u002F\u002F印出結果： 2024-10-25 07:30:52 \u002F 2022-10-25 07:30:52\n",[122,14303,14304],{"class":222,"line":9728},[122,14305,264],{"emptyLinePlaceholder":263},[122,14307,14308],{"class":222,"line":9733},[122,14309,14005],{"class":226},[122,14311,14312],{"class":222,"line":9740},[122,14313,14314],{"class":226}," * 將季度增加\u002F減少 `$value`\n",[122,14316,14317],{"class":222,"line":9751},[122,14318,14015],{"class":226},[122,14320,14321],{"class":222,"line":9776},[122,14322,264],{"emptyLinePlaceholder":263},[122,14324,14325,14327,14329,14331,14333,14335,14337,14340,14342,14344,14346,14348,14350,14352,14354],{"class":222,"line":9781},[122,14326,4232],{"class":241},[122,14328,14022],{"class":241},[122,14330,13857],{"class":632},[122,14332,13860],{"class":233},[122,14334,14068],{"class":639},[122,14336,4080],{"class":632},[122,14338,14339],{"class":233},"addQuarter",[122,14341,4013],{"class":639},[122,14343,4021],{"class":241},[122,14345,3161],{"class":639},[122,14347,4080],{"class":632},[122,14349,14073],{"class":233},[122,14351,4013],{"class":639},[122,14353,14248],{"class":237},[122,14355,4024],{"class":639},[122,14357,14358,14360,14362],{"class":222,"line":9786},[122,14359,4232],{"class":241},[122,14361,14257],{"class":237},[122,14363,4249],{"class":639},[122,14365,14366,14368,14370,14372,14374,14376,14378,14381,14383,14385,14387,14389,14391,14393,14395],{"class":222,"line":9793},[122,14367,4232],{"class":241},[122,14369,14022],{"class":241},[122,14371,13857],{"class":632},[122,14373,13860],{"class":233},[122,14375,14068],{"class":639},[122,14377,4080],{"class":632},[122,14379,14380],{"class":233},"subQuarter",[122,14382,4013],{"class":639},[122,14384,4021],{"class":241},[122,14386,3161],{"class":639},[122,14388,4080],{"class":632},[122,14390,14073],{"class":233},[122,14392,4013],{"class":639},[122,14394,14248],{"class":237},[122,14396,4024],{"class":639},[122,14398,14399],{"class":222,"line":9806},[122,14400,264],{"emptyLinePlaceholder":263},[122,14402,14403],{"class":222,"line":9811},[122,14404,14405],{"class":226},"\u002F\u002F印出結果：2024-01-25 07:31:57 \u002F 2023-07-25 07:31:57\n",[122,14407,14408],{"class":222,"line":9816},[122,14409,264],{"emptyLinePlaceholder":263},[122,14411,14412],{"class":222,"line":9821},[122,14413,14005],{"class":226},[122,14415,14416],{"class":222,"line":9831},[122,14417,14418],{"class":226}," * 將月份增加\u002F減少 `$value`\n",[122,14420,14421],{"class":222,"line":9872},[122,14422,14015],{"class":226},[122,14424,14425,14427,14429,14431,14433,14435,14437,14440,14442,14444,14446,14448,14450,14452,14454],{"class":222,"line":9883},[122,14426,4232],{"class":241},[122,14428,14022],{"class":241},[122,14430,13857],{"class":632},[122,14432,13860],{"class":233},[122,14434,14068],{"class":639},[122,14436,4080],{"class":632},[122,14438,14439],{"class":233},"subMonth",[122,14441,4013],{"class":639},[122,14443,4021],{"class":241},[122,14445,3161],{"class":639},[122,14447,4080],{"class":632},[122,14449,14073],{"class":233},[122,14451,4013],{"class":639},[122,14453,14248],{"class":237},[122,14455,4024],{"class":639},[122,14457,14458,14460,14462],{"class":222,"line":9894},[122,14459,4232],{"class":241},[122,14461,14257],{"class":237},[122,14463,4249],{"class":639},[122,14465,14466,14468,14470,14472,14474,14476,14478,14481,14483,14485,14487,14489,14491,14493,14495],{"class":222,"line":9905},[122,14467,4232],{"class":241},[122,14469,14022],{"class":241},[122,14471,13857],{"class":632},[122,14473,13860],{"class":233},[122,14475,14068],{"class":639},[122,14477,4080],{"class":632},[122,14479,14480],{"class":233},"addMonth",[122,14482,4013],{"class":639},[122,14484,4021],{"class":241},[122,14486,3161],{"class":639},[122,14488,4080],{"class":632},[122,14490,14073],{"class":233},[122,14492,4013],{"class":639},[122,14494,14248],{"class":237},[122,14496,4024],{"class":639},[122,14498,14499],{"class":222,"line":9916},[122,14500,264],{"emptyLinePlaceholder":263},[122,14502,14503],{"class":222,"line":9927},[122,14504,14505],{"class":226},"\u002F\u002F印出結果：2023-09-25 07:37:37 \u002F 2023-11-25 07:37:37\n",[122,14507,14508],{"class":222,"line":9938},[122,14509,264],{"emptyLinePlaceholder":263},[122,14511,14512],{"class":222,"line":9951},[122,14513,14005],{"class":226},[122,14515,14516],{"class":222,"line":9956},[122,14517,14518],{"class":226}," * 將天數增加\u002F減少 `$value`\n",[122,14520,14521],{"class":222,"line":9961},[122,14522,14015],{"class":226},[122,14524,14525,14527,14529,14531,14533,14535,14537,14540,14542,14544,14546,14548,14550,14552,14554],{"class":222,"line":9968},[122,14526,4232],{"class":241},[122,14528,14022],{"class":241},[122,14530,13857],{"class":632},[122,14532,13860],{"class":233},[122,14534,14068],{"class":639},[122,14536,4080],{"class":632},[122,14538,14539],{"class":233},"subDay",[122,14541,4013],{"class":639},[122,14543,4021],{"class":241},[122,14545,3161],{"class":639},[122,14547,4080],{"class":632},[122,14549,14073],{"class":233},[122,14551,4013],{"class":639},[122,14553,14248],{"class":237},[122,14555,4024],{"class":639},[122,14557,14558,14560,14562],{"class":222,"line":9979},[122,14559,4232],{"class":241},[122,14561,14257],{"class":237},[122,14563,4249],{"class":639},[122,14565,14566,14568,14570,14572,14574,14576,14578,14581,14583,14585,14587,14589,14591,14593,14595],{"class":222,"line":10004},[122,14567,4232],{"class":241},[122,14569,14022],{"class":241},[122,14571,13857],{"class":632},[122,14573,13860],{"class":233},[122,14575,14068],{"class":639},[122,14577,4080],{"class":632},[122,14579,14580],{"class":233},"addDay",[122,14582,4013],{"class":639},[122,14584,4021],{"class":241},[122,14586,3161],{"class":639},[122,14588,4080],{"class":632},[122,14590,14073],{"class":233},[122,14592,4013],{"class":639},[122,14594,14248],{"class":237},[122,14596,4024],{"class":639},[122,14598,14599],{"class":222,"line":10009},[122,14600,264],{"emptyLinePlaceholder":263},[122,14602,14603],{"class":222,"line":10014},[122,14604,14605],{"class":226},"\u002F\u002F印出結果：2023-10-24 07:38:45 \u002F 2023-10-26 07:38:45\n",[122,14607,14608],{"class":222,"line":10021},[122,14609,264],{"emptyLinePlaceholder":263},[122,14611,14612],{"class":222,"line":10034},[122,14613,14005],{"class":226},[122,14615,14616],{"class":222,"line":10039},[122,14617,14618],{"class":226}," * 將小時增加\u002F減少 `$value`\n",[122,14620,14621],{"class":222,"line":10044},[122,14622,14015],{"class":226},[122,14624,14625,14627,14629,14631,14633,14635,14637,14640,14642,14644,14646,14648,14650,14652,14654],{"class":222,"line":10049},[122,14626,4232],{"class":241},[122,14628,14022],{"class":241},[122,14630,13857],{"class":632},[122,14632,13860],{"class":233},[122,14634,14068],{"class":639},[122,14636,4080],{"class":632},[122,14638,14639],{"class":233},"subHour",[122,14641,4013],{"class":639},[122,14643,4021],{"class":241},[122,14645,3161],{"class":639},[122,14647,4080],{"class":632},[122,14649,14073],{"class":233},[122,14651,4013],{"class":639},[122,14653,14248],{"class":237},[122,14655,4024],{"class":639},[122,14657,14658,14660,14662],{"class":222,"line":10100},[122,14659,4232],{"class":241},[122,14661,14257],{"class":237},[122,14663,4249],{"class":639},[122,14665,14666,14668,14670,14672,14674,14676,14678,14681,14683,14685,14687,14689,14691,14693,14695],{"class":222,"line":10113},[122,14667,4232],{"class":241},[122,14669,14022],{"class":241},[122,14671,13857],{"class":632},[122,14673,13860],{"class":233},[122,14675,14068],{"class":639},[122,14677,4080],{"class":632},[122,14679,14680],{"class":233},"addHour",[122,14682,4013],{"class":639},[122,14684,4021],{"class":241},[122,14686,3161],{"class":639},[122,14688,4080],{"class":632},[122,14690,14073],{"class":233},[122,14692,4013],{"class":639},[122,14694,14248],{"class":237},[122,14696,4024],{"class":639},[122,14698,14699],{"class":222,"line":10125},[122,14700,264],{"emptyLinePlaceholder":263},[122,14702,14703],{"class":222,"line":10130},[122,14704,14705],{"class":226},"\u002F\u002F印出結果：2023-10-25 06:48:25 \u002F 2023-10-25 08:48:25\n",[122,14707,14708],{"class":222,"line":10141},[122,14709,264],{"emptyLinePlaceholder":263},[122,14711,14712],{"class":222,"line":10172},[122,14713,14005],{"class":226},[122,14715,14716],{"class":222,"line":10197},[122,14717,14718],{"class":226}," * 將秒數增加\u002F減少 `$value`\n",[122,14720,14721],{"class":222,"line":10218},[122,14722,14015],{"class":226},[122,14724,14725,14727,14729,14731,14733,14735,14737,14740,14742,14744,14746,14748,14750,14752,14754],{"class":222,"line":10242},[122,14726,4232],{"class":241},[122,14728,14022],{"class":241},[122,14730,13857],{"class":632},[122,14732,13860],{"class":233},[122,14734,14068],{"class":639},[122,14736,4080],{"class":632},[122,14738,14739],{"class":233},"subSecond",[122,14741,4013],{"class":639},[122,14743,4021],{"class":241},[122,14745,3161],{"class":639},[122,14747,4080],{"class":632},[122,14749,14073],{"class":233},[122,14751,4013],{"class":639},[122,14753,14248],{"class":237},[122,14755,4024],{"class":639},[122,14757,14758,14760,14762],{"class":222,"line":10265},[122,14759,4232],{"class":241},[122,14761,14257],{"class":237},[122,14763,4249],{"class":639},[122,14765,14766,14768,14770,14772,14774,14776,14778,14781,14783,14785,14787,14789,14791,14793,14795],{"class":222,"line":10292},[122,14767,4232],{"class":241},[122,14769,14022],{"class":241},[122,14771,13857],{"class":632},[122,14773,13860],{"class":233},[122,14775,14068],{"class":639},[122,14777,4080],{"class":632},[122,14779,14780],{"class":233},"addSecond",[122,14782,4013],{"class":639},[122,14784,4021],{"class":241},[122,14786,3161],{"class":639},[122,14788,4080],{"class":632},[122,14790,14073],{"class":233},[122,14792,4013],{"class":639},[122,14794,14248],{"class":237},[122,14796,4024],{"class":639},[122,14798,14799],{"class":222,"line":10307},[122,14800,264],{"emptyLinePlaceholder":263},[122,14802,14803],{"class":222,"line":10326},[122,14804,14805],{"class":226},"\u002F\u002F印出結果：2023-10-25 07:49:58 \u002F 2023-10-25 07:50:00\n",[54,14807,14808],{"id":14808},"比較時間",[156,14810,14811,14821,14829,14837,14845],{},[159,14812,14813,14816,14817,14820],{},[127,14814,14815],{},"eq($datetime)","：是否等於 ",[127,14818,14819],{},"$datetime","，回傳布林值",[159,14822,14823,14826,14827,14820],{},[127,14824,14825],{},"ne($datetime)","：是否不等於 ",[127,14828,14819],{},[159,14830,14831,14834,14835,14820],{},[127,14832,14833],{},"gt($datetime)","：是否大於 ",[127,14836,14819],{},[159,14838,14839,14842,14843,14820],{},[127,14840,14841],{},"lt($datetime)","：是否小於 ",[127,14844,14819],{},[159,14846,14847,14850,14851,193,14854,14857],{},[127,14848,14849],{},"between($startTime, $endTime)","：是否介於 ",[127,14852,14853],{},"$startTime",[127,14855,14856],{},"$endTime"," 之間，回傳布林值",[2667,14859,13060],{"id":14860},"範例-1",[212,14862,14864],{"className":3997,"code":14863,"language":3944,"meta":217,"style":217},"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",[127,14865,14866,14874,14878,14882,14887,14891,14922,14927,14955,14960,14964,14968,14973,14977,15006,15010,15038,15042,15046,15050,15055,15059,15088,15092,15120,15124,15128,15132,15137,15141,15170,15174,15202,15206,15210,15214,15219,15223,15261,15266,15312],{"__ignoreMap":217},[122,14867,14868,14870,14872],{"class":222,"line":223},[122,14869,13830],{"class":632},[122,14871,13833],{"class":241},[122,14873,4249],{"class":639},[122,14875,14876],{"class":222,"line":230},[122,14877,264],{"emptyLinePlaceholder":263},[122,14879,14880],{"class":222,"line":248},[122,14881,14005],{"class":226},[122,14883,14884],{"class":222,"line":260},[122,14885,14886],{"class":226}," * 比較兩個時間，是否相等\n",[122,14888,14889],{"class":222,"line":267},[122,14890,14015],{"class":226},[122,14892,14893,14896,14898,14900,14902,14904,14906,14908,14911,14913,14915,14917,14919],{"class":222,"line":273},[122,14894,14895],{"class":241},"var_dump",[122,14897,4013],{"class":639},[122,14899,13854],{"class":241},[122,14901,13857],{"class":632},[122,14903,14065],{"class":233},[122,14905,14068],{"class":639},[122,14907,4080],{"class":632},[122,14909,14910],{"class":233},"eq",[122,14912,4013],{"class":639},[122,14914,13854],{"class":241},[122,14916,13857],{"class":632},[122,14918,14065],{"class":233},[122,14920,14921],{"class":639},"()));\n",[122,14923,14924],{"class":222,"line":660},[122,14925,14926],{"class":226},"\u002F\u002F印出結果：bool(true)\n",[122,14928,14929,14931,14933,14935,14937,14939,14941,14943,14945,14947,14949,14951,14953],{"class":222,"line":672},[122,14930,14895],{"class":241},[122,14932,4013],{"class":639},[122,14934,13854],{"class":241},[122,14936,13857],{"class":632},[122,14938,14065],{"class":233},[122,14940,14068],{"class":639},[122,14942,4080],{"class":632},[122,14944,14910],{"class":233},[122,14946,4013],{"class":639},[122,14948,13854],{"class":241},[122,14950,13857],{"class":632},[122,14952,13860],{"class":233},[122,14954,14921],{"class":639},[122,14956,14957],{"class":222,"line":701},[122,14958,14959],{"class":226},"\u002F\u002F印出結果：bool(false)\n",[122,14961,14962],{"class":222,"line":706},[122,14963,264],{"emptyLinePlaceholder":263},[122,14965,14966],{"class":222,"line":712},[122,14967,14005],{"class":226},[122,14969,14970],{"class":222,"line":725},[122,14971,14972],{"class":226}," * 比較兩個時間，是否不相等\n",[122,14974,14975],{"class":222,"line":737},[122,14976,14015],{"class":226},[122,14978,14979,14981,14983,14985,14987,14989,14991,14993,14996,14998,15000,15002,15004],{"class":222,"line":758},[122,14980,14895],{"class":241},[122,14982,4013],{"class":639},[122,14984,13854],{"class":241},[122,14986,13857],{"class":632},[122,14988,14065],{"class":233},[122,14990,14068],{"class":639},[122,14992,4080],{"class":632},[122,14994,14995],{"class":233},"ne",[122,14997,4013],{"class":639},[122,14999,13854],{"class":241},[122,15001,13857],{"class":632},[122,15003,14065],{"class":233},[122,15005,14921],{"class":639},[122,15007,15008],{"class":222,"line":782},[122,15009,14959],{"class":226},[122,15011,15012,15014,15016,15018,15020,15022,15024,15026,15028,15030,15032,15034,15036],{"class":222,"line":787},[122,15013,14895],{"class":241},[122,15015,4013],{"class":639},[122,15017,13854],{"class":241},[122,15019,13857],{"class":632},[122,15021,14065],{"class":233},[122,15023,14068],{"class":639},[122,15025,4080],{"class":632},[122,15027,14995],{"class":233},[122,15029,4013],{"class":639},[122,15031,13854],{"class":241},[122,15033,13857],{"class":632},[122,15035,14121],{"class":233},[122,15037,14921],{"class":639},[122,15039,15040],{"class":222,"line":793},[122,15041,14926],{"class":226},[122,15043,15044],{"class":222,"line":807},[122,15045,264],{"emptyLinePlaceholder":263},[122,15047,15048],{"class":222,"line":823},[122,15049,14005],{"class":226},[122,15051,15052],{"class":222,"line":828},[122,15053,15054],{"class":226}," * 比較兩個時間，是否大於\n",[122,15056,15057],{"class":222,"line":834},[122,15058,14015],{"class":226},[122,15060,15061,15063,15065,15067,15069,15071,15073,15075,15078,15080,15082,15084,15086],{"class":222,"line":850},[122,15062,14895],{"class":241},[122,15064,4013],{"class":639},[122,15066,13854],{"class":241},[122,15068,13857],{"class":632},[122,15070,14121],{"class":233},[122,15072,14068],{"class":639},[122,15074,4080],{"class":632},[122,15076,15077],{"class":233},"gt",[122,15079,4013],{"class":639},[122,15081,13854],{"class":241},[122,15083,13857],{"class":632},[122,15085,13860],{"class":233},[122,15087,14921],{"class":639},[122,15089,15090],{"class":222,"line":864},[122,15091,14926],{"class":226},[122,15093,15094,15096,15098,15100,15102,15104,15106,15108,15110,15112,15114,15116,15118],{"class":222,"line":880},[122,15095,14895],{"class":241},[122,15097,4013],{"class":639},[122,15099,13854],{"class":241},[122,15101,13857],{"class":632},[122,15103,13860],{"class":233},[122,15105,14068],{"class":639},[122,15107,4080],{"class":632},[122,15109,15077],{"class":233},[122,15111,4013],{"class":639},[122,15113,13854],{"class":241},[122,15115,13857],{"class":632},[122,15117,14121],{"class":233},[122,15119,14921],{"class":639},[122,15121,15122],{"class":222,"line":7632},[122,15123,14959],{"class":226},[122,15125,15126],{"class":222,"line":7638},[122,15127,264],{"emptyLinePlaceholder":263},[122,15129,15130],{"class":222,"line":7648},[122,15131,14005],{"class":226},[122,15133,15134],{"class":222,"line":7662},[122,15135,15136],{"class":226}," * 比較兩個時間，是否小於\n",[122,15138,15139],{"class":222,"line":7667},[122,15140,14015],{"class":226},[122,15142,15143,15145,15147,15149,15151,15153,15155,15157,15160,15162,15164,15166,15168],{"class":222,"line":7673},[122,15144,14895],{"class":241},[122,15146,4013],{"class":639},[122,15148,13854],{"class":241},[122,15150,13857],{"class":632},[122,15152,13860],{"class":233},[122,15154,14068],{"class":639},[122,15156,4080],{"class":632},[122,15158,15159],{"class":233},"lt",[122,15161,4013],{"class":639},[122,15163,13854],{"class":241},[122,15165,13857],{"class":632},[122,15167,14121],{"class":233},[122,15169,14921],{"class":639},[122,15171,15172],{"class":222,"line":7686},[122,15173,14926],{"class":226},[122,15175,15176,15178,15180,15182,15184,15186,15188,15190,15192,15194,15196,15198,15200],{"class":222,"line":7697},[122,15177,14895],{"class":241},[122,15179,4013],{"class":639},[122,15181,13854],{"class":241},[122,15183,13857],{"class":632},[122,15185,14121],{"class":233},[122,15187,14068],{"class":639},[122,15189,4080],{"class":632},[122,15191,15159],{"class":233},[122,15193,4013],{"class":639},[122,15195,13854],{"class":241},[122,15197,13857],{"class":632},[122,15199,13860],{"class":233},[122,15201,14921],{"class":639},[122,15203,15204],{"class":222,"line":7708},[122,15205,14959],{"class":226},[122,15207,15208],{"class":222,"line":9624},[122,15209,264],{"emptyLinePlaceholder":263},[122,15211,15212],{"class":222,"line":9656},[122,15213,14005],{"class":226},[122,15215,15216],{"class":222,"line":9667},[122,15217,15218],{"class":226}," * 是否介於 `$startTime`、`$endTime` 之間\n",[122,15220,15221],{"class":222,"line":9678},[122,15222,14015],{"class":226},[122,15224,15225,15227,15229,15231,15233,15235,15237,15239,15242,15244,15246,15248,15250,15253,15255,15257,15259],{"class":222,"line":9689},[122,15226,14895],{"class":241},[122,15228,4013],{"class":639},[122,15230,13854],{"class":241},[122,15232,13857],{"class":632},[122,15234,13860],{"class":233},[122,15236,14068],{"class":639},[122,15238,4080],{"class":632},[122,15240,15241],{"class":233},"between",[122,15243,4013],{"class":639},[122,15245,13854],{"class":241},[122,15247,13857],{"class":632},[122,15249,14174],{"class":233},[122,15251,15252],{"class":639},"(), ",[122,15254,13854],{"class":241},[122,15256,13857],{"class":632},[122,15258,14121],{"class":233},[122,15260,14921],{"class":639},[122,15262,15263],{"class":222,"line":9700},[122,15264,15265],{"class":226},"\u002F\u002F 印出結果：bool(true)\n",[122,15267,15268,15270,15272,15274,15276,15278,15280,15282,15284,15286,15288,15290,15292,15294,15296,15298,15300,15302,15304,15306,15308,15310],{"class":222,"line":9711},[122,15269,14895],{"class":241},[122,15271,4013],{"class":639},[122,15273,13854],{"class":241},[122,15275,13857],{"class":632},[122,15277,13860],{"class":233},[122,15279,14068],{"class":639},[122,15281,4080],{"class":632},[122,15283,14580],{"class":233},[122,15285,4013],{"class":639},[122,15287,4504],{"class":241},[122,15289,3161],{"class":639},[122,15291,4080],{"class":632},[122,15293,15241],{"class":233},[122,15295,4013],{"class":639},[122,15297,13854],{"class":241},[122,15299,13857],{"class":632},[122,15301,14174],{"class":233},[122,15303,15252],{"class":639},[122,15305,13854],{"class":241},[122,15307,13857],{"class":632},[122,15309,14121],{"class":233},[122,15311,14921],{"class":639},[122,15313,15314],{"class":222,"line":9723},[122,15315,15316],{"class":226},"\u002F\u002F 印出結果：bool(false)\n",[1579,15318,15319],{},"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":217,"searchDepth":230,"depth":230,"links":15321},[15322,15323,15324,15327],{"id":3808,"depth":230,"text":3808},{"id":13866,"depth":230,"text":13866},{"id":13877,"depth":230,"text":13877,"children":15325},[15326],{"id":13060,"depth":248,"text":13060},{"id":14808,"depth":230,"text":14808,"children":15328},[15329],{"id":14860,"depth":248,"text":13060},"\u002Fimages\u002Farticles\u002F2023-10-04-php-carbon\u002Fcover.png",{},"\u002Farticles\u002F2023-10-04-php-carbon","2023-10-04 18:34:00",{"title":13775,"description":217},"articles\u002F2023-10-04-php-carbon","PHP語言在處理日期和時間時，Carbon 套件是一個非常有用的工具。Carbon 套件繼承了原生的 Datetime，並新增了許多語意化的行為，讓處理時間的難度降低許多。在這篇教學中，將會介紹 Carbon 套件的基本使用方法，以及如何在 PHP 中使用 Carbon 套件來處理日期和時間。",[3944],"Xh7cdroYoCQtQdwWDDM6GaqTsi98DBN_3I6O6Srqow4",{"id":15340,"title":15341,"body":15342,"category":5433,"description":217,"extension":1601,"image":15420,"meta":15421,"navigation":263,"path":15422,"pubDate":15333,"seo":15423,"status":263,"stem":15424,"summary":15425,"tags":15426,"__hash__":15428},"content\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id.md","如何取得 Telegram Bot 所有的 Chat ID",{"type":8,"value":15343,"toc":15413},[15344,15348,15351,15355,15362,15367,15370,15374,15377,15381,15388,15392,15401],[54,15345,15347],{"id":15346},"步驟1-創建-telegram-bot-並獲取-api-token","步驟1: 創建 Telegram Bot 並獲取 API Token",[15,15349,15350],{},"首先,我們需要透過 Telegram 的 @BotFather 創建一個新的 Bot,並獲取該 Bot 的 API Token。API Token 是一個類似於 \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\" 的字串,用於向 Telegram 的 API 服務器進行身份驗證。",[54,15352,15354],{"id":15353},"步驟2-使用-getupdates-方法獲取更新","步驟2: 使用 getUpdates 方法獲取更新",[15,15356,15357,15358],{},"接下來,我們可以在瀏覽器中訪問以下 URL,將 ",[15359,15360,15361],"token",{}," 替換為你的 API Token:",[15,15363,15364],{},[127,15365,15366],{},"https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002FgetUpdates",[15,15368,15369],{},"這將返回一個 JSON 格式的數據,包含了最近的更新。",[54,15371,15373],{"id":15372},"步驟3-從更新中提取-chat-id","步驟3: 從更新中提取 Chat ID",[15,15375,15376],{},"在返回的 JSON 數據中,查找 \"result\" 數組。每個元素代表一個更新,其中包含 \"message\" 或 \"channel_post\" 對象。在這些對象中,可以找到 \"chat\" 對象,其 \"id\" 字段就是該會話的 Chat ID。\n對於私人會話,Chat ID 為正整數。對於群組,Chat ID 為負數,需要在前面加 \"-100\"。",[54,15378,15380],{"id":15379},"步驟4-儲存所有-chat-id","步驟4: 儲存所有 Chat ID",[15,15382,15383,15384,15387],{},"遍歷所有更新的 \"chat\" 對象,獲取並儲存所有的 Chat ID。需要注意的是,",[127,15385,15386],{},"getUpdates"," 只能獲取最近的更新,如果要獲取所有的 Chat ID,可能需要多次調用該方法。",[54,15389,15391],{"id":15390},"在-php-語言中如何快速取得","在 PHP 語言中，如何快速取得",[15,15393,15394,15395,15400],{},"可使用 ",[24,15396,15399],{"href":15397,"rel":15398},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore",[28],"php-telegram-bot\u002Fcore"," 這個套件處理。",[15,15402,15403,15404,15407,15408],{},"透過 Webhook 方式，使用 ",[127,15405,15406],{},"getupdates"," 函式來取得 chat id, 可參考 ",[24,15409,15412],{"href":15410,"rel":15411},"https:\u002F\u002Fgithub.com\u002Fphp-telegram-bot\u002Fcore?tab=readme-ov-file#getupdates-installation",[28],"官方教學",{"title":217,"searchDepth":230,"depth":230,"links":15414},[15415,15416,15417,15418,15419],{"id":15346,"depth":230,"text":15347},{"id":15353,"depth":230,"text":15354},{"id":15372,"depth":230,"text":15373},{"id":15379,"depth":230,"text":15380},{"id":15390,"depth":230,"text":15391},"\u002Fimages\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id\u002Fcover.png",{},"\u002Farticles\u002F2024-05-01-telegram-bot-get-chat-id",{"title":15341,"description":217},"articles\u002F2024-05-01-telegram-bot-get-chat-id","在開發 Telegram Bot 時,有時候我們需要獲取所有與 Bot 互動過的 Chat ID,無論是私人對話還是群組對話。取得這些 Chat ID 對於發送廣播消息或管理會話非常有用。本文將詳細介紹如何透過 Telegram Bot API 獲取所有的 Chat ID。",[15427,3944],"Telegram","NGatZI0ync1nfpUr5-l0cWDQlW30EzCC3zULFpvSyyw",{"id":15430,"title":15431,"body":15432,"category":5433,"description":217,"extension":1601,"image":16305,"meta":16306,"navigation":263,"path":16307,"pubDate":16308,"seo":16309,"status":263,"stem":16310,"summary":16311,"tags":16312,"__hash__":16313},"content\u002Farticles\u002F2023-05-07-go-function.md","《Go 學習筆記6》函式",{"type":8,"value":15433,"toc":16301},[15434,15439,15442,15445,15506,15510,15638,15642,15663,15667,15715,15719,15847,15851,15860,15864,15869,15936,15940,16269,16273,16298],[45,15435,15436],{},[15,15437,15438],{},"這是自學 Go lang 的筆記，若內容有誤，請留言區提醒，我會儘快改正，謝謝",[15,15440,15441],{},"在 Go 語中，為了可以重復使用某個程式碼片段，我們使用函式 (function) 來進實作。而在 Go 語言中，function 可以輸入多個參數值，也可以回傳多個參數值",[15,15443,15444],{},"##無 return 函式",[212,15446,15450],{"className":15447,"code":15448,"language":15449,"meta":217,"style":217},"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",[127,15451,15452,15480,15485,15489,15493,15498],{"__ignoreMap":217},[122,15453,15454,15457,15460,15463,15466,15468,15471,15473,15475,15478],{"class":222,"line":223},[122,15455,15456],{"class":632},"func",[122,15458,15459],{"class":639}," 函式名 (",[122,15461,15462],{"class":9333},"參數1",[122,15464,15465],{"class":233}," 變數型態",[122,15467,4091],{"class":639},[122,15469,15470],{"class":9333},"參數2",[122,15472,15465],{"class":233},[122,15474,4091],{"class":639},[122,15476,15477],{"class":632},"...",[122,15479,4429],{"class":639},[122,15481,15482],{"class":222,"line":230},[122,15483,15484],{"class":226},"    \u002F\u002F執行程式片段\n",[122,15486,15487],{"class":222,"line":248},[122,15488,4526],{"class":639},[122,15490,15491],{"class":222,"line":260},[122,15492,264],{"emptyLinePlaceholder":263},[122,15494,15495],{"class":222,"line":267},[122,15496,15497],{"class":226},"\u002F\u002F呼叫方式\n",[122,15499,15500,15503],{"class":222,"line":273},[122,15501,15502],{"class":233},"函式名",[122,15504,15505],{"class":639},"(參數1, 參數2)\n",[15,15507,15508],{},[19,15509,13060],{},[212,15511,15513],{"className":15447,"code":15512,"language":15449,"meta":217,"style":217},"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",[127,15514,15515,15523,15535,15544,15561,15565,15569,15594,15615,15634],{"__ignoreMap":217},[122,15516,15517,15520],{"class":222,"line":223},[122,15518,15519],{"class":632},"package",[122,15521,15522],{"class":233}," main\n",[122,15524,15525,15528,15530,15533],{"class":222,"line":230},[122,15526,15527],{"class":632},"import",[122,15529,1978],{"class":237},[122,15531,15532],{"class":233},"fmt",[122,15534,1984],{"class":237},[122,15536,15537,15539,15542],{"class":222,"line":248},[122,15538,15456],{"class":632},[122,15540,15541],{"class":233}," main",[122,15543,9448],{"class":639},[122,15545,15546,15549,15551,15554,15556,15559],{"class":222,"line":260},[122,15547,15548],{"class":233},"    hello",[122,15550,4013],{"class":639},[122,15552,15553],{"class":237},"\"Allen\"",[122,15555,4091],{"class":639},[122,15557,15558],{"class":241},"23",[122,15560,2444],{"class":639},[122,15562,15563],{"class":222,"line":267},[122,15564,4526],{"class":639},[122,15566,15567],{"class":222,"line":273},[122,15568,264],{"emptyLinePlaceholder":263},[122,15570,15571,15573,15576,15578,15581,15584,15586,15589,15592],{"class":222,"line":660},[122,15572,15456],{"class":632},[122,15574,15575],{"class":233}," hello",[122,15577,4013],{"class":639},[122,15579,15580],{"class":9333},"name",[122,15582,15583],{"class":632}," string",[122,15585,4091],{"class":639},[122,15587,15588],{"class":9333},"age",[122,15590,15591],{"class":632}," int8",[122,15593,4429],{"class":639},[122,15595,15596,15599,15602,15604,15607,15610,15612],{"class":222,"line":672},[122,15597,15598],{"class":639},"    fmt.",[122,15600,15601],{"class":233},"Printf",[122,15603,4013],{"class":639},[122,15605,15606],{"class":237},"\"Hello ",[122,15608,15609],{"class":241},"%s\\r\\n",[122,15611,2085],{"class":237},[122,15613,15614],{"class":639},", name)\n",[122,15616,15617,15619,15621,15623,15626,15629,15631],{"class":222,"line":701},[122,15618,15598],{"class":639},[122,15620,15601],{"class":233},[122,15622,4013],{"class":639},[122,15624,15625],{"class":237},"\"年紀 ",[122,15627,15628],{"class":241},"%d\\r\\n",[122,15630,2085],{"class":237},[122,15632,15633],{"class":639},", age)\n",[122,15635,15636],{"class":222,"line":706},[122,15637,4526],{"class":639},[15,15639,15640],{},[19,15641,11114],{},[212,15643,15645],{"className":214,"code":15644,"language":216,"meta":217,"style":217},"Hello Allen\n年紀 23\n",[127,15646,15647,15655],{"__ignoreMap":217},[122,15648,15649,15652],{"class":222,"line":223},[122,15650,15651],{"class":233},"Hello",[122,15653,15654],{"class":237}," Allen\n",[122,15656,15657,15660],{"class":222,"line":230},[122,15658,15659],{"class":233},"年紀",[122,15661,15662],{"class":241}," 23\n",[54,15664,15666],{"id":15665},"return-函式","return 函式",[212,15668,15670],{"className":15447,"code":15669,"language":15449,"meta":217,"style":217},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) 回傳型態 {\n    \u002F\u002F執行程式片段\n    return 回傳值\n}\n",[127,15671,15672,15700,15704,15711],{"__ignoreMap":217},[122,15673,15674,15676,15679,15681,15683,15685,15687,15689,15691,15693,15695,15698],{"class":222,"line":223},[122,15675,15456],{"class":632},[122,15677,15678],{"class":639}," 函式名  (",[122,15680,15462],{"class":9333},[122,15682,15465],{"class":233},[122,15684,4091],{"class":639},[122,15686,15470],{"class":9333},[122,15688,15465],{"class":233},[122,15690,4091],{"class":639},[122,15692,15477],{"class":632},[122,15694,10573],{"class":639},[122,15696,15697],{"class":233},"回傳型態",[122,15699,9039],{"class":639},[122,15701,15702],{"class":222,"line":230},[122,15703,15484],{"class":226},[122,15705,15706,15708],{"class":222,"line":248},[122,15707,10413],{"class":632},[122,15709,15710],{"class":639}," 回傳值\n",[122,15712,15713],{"class":222,"line":260},[122,15714,4526],{"class":639},[15,15716,15717],{},[19,15718,13060],{},[212,15720,15722],{"className":15447,"code":15721,"language":15449,"meta":217,"style":217},"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",[127,15723,15724,15730,15740,15748,15774,15785,15789,15793,15826,15843],{"__ignoreMap":217},[122,15725,15726,15728],{"class":222,"line":223},[122,15727,15519],{"class":632},[122,15729,15522],{"class":233},[122,15731,15732,15734,15736,15738],{"class":222,"line":230},[122,15733,15527],{"class":632},[122,15735,1978],{"class":237},[122,15737,15532],{"class":233},[122,15739,1984],{"class":237},[122,15741,15742,15744,15746],{"class":222,"line":248},[122,15743,15456],{"class":632},[122,15745,15541],{"class":233},[122,15747,9448],{"class":639},[122,15749,15750,15753,15756,15759,15761,15763,15765,15767,15769,15772],{"class":222,"line":260},[122,15751,15752],{"class":639},"    total ",[122,15754,15755],{"class":632},":=",[122,15757,15758],{"class":233}," sum",[122,15760,4013],{"class":639},[122,15762,4994],{"class":241},[122,15764,4091],{"class":639},[122,15766,4504],{"class":241},[122,15768,4091],{"class":639},[122,15770,15771],{"class":241},"3",[122,15773,2444],{"class":639},[122,15775,15776,15779,15782],{"class":222,"line":267},[122,15777,15778],{"class":639},"    fmt.",[122,15780,15781],{"class":233},"Println",[122,15783,15784],{"class":639},"(total)\n",[122,15786,15787],{"class":222,"line":273},[122,15788,4526],{"class":639},[122,15790,15791],{"class":222,"line":660},[122,15792,264],{"emptyLinePlaceholder":263},[122,15794,15795,15797,15799,15801,15803,15806,15808,15810,15812,15814,15817,15819,15821,15824],{"class":222,"line":672},[122,15796,15456],{"class":632},[122,15798,15758],{"class":233},[122,15800,4013],{"class":639},[122,15802,9334],{"class":9333},[122,15804,15805],{"class":632}," int",[122,15807,4091],{"class":639},[122,15809,9339],{"class":9333},[122,15811,15805],{"class":632},[122,15813,4091],{"class":639},[122,15815,15816],{"class":9333},"z",[122,15818,15805],{"class":632},[122,15820,10573],{"class":639},[122,15822,15823],{"class":632},"int",[122,15825,9039],{"class":639},[122,15827,15828,15830,15833,15835,15838,15840],{"class":222,"line":701},[122,15829,10413],{"class":632},[122,15831,15832],{"class":639}," x ",[122,15834,377],{"class":632},[122,15836,15837],{"class":639}," y ",[122,15839,377],{"class":632},[122,15841,15842],{"class":639}," z\n",[122,15844,15845],{"class":222,"line":706},[122,15846,4526],{"class":639},[15,15848,15849],{},[19,15850,11114],{},[212,15852,15854],{"className":214,"code":15853,"language":216,"meta":217,"style":217},"9\n",[127,15855,15856],{"__ignoreMap":217},[122,15857,15858],{"class":222,"line":223},[122,15859,15853],{"class":233},[54,15861,15863],{"id":15862},"return-多個值","return 多個值",[15,15865,15866],{},[19,15867,15868],{},"格式",[212,15870,15872],{"className":15447,"code":15871,"language":15449,"meta":217,"style":217},"func 函式名  (參數1 變數型態, 參數2 變數型態, ...) (回傳型態1, 回傳型態2, 回傳型態3,...) {\n    \u002F\u002F執行程式片段1\n    return 回傳值1, 回傳值2, 回傳值3,...\n}\n",[127,15873,15874,15917,15922,15932],{"__ignoreMap":217},[122,15875,15876,15878,15880,15882,15884,15886,15888,15890,15892,15894,15897,15900,15902,15905,15907,15910,15913,15915],{"class":222,"line":223},[122,15877,15456],{"class":632},[122,15879,15678],{"class":639},[122,15881,15462],{"class":9333},[122,15883,15465],{"class":233},[122,15885,4091],{"class":639},[122,15887,15470],{"class":9333},[122,15889,15465],{"class":233},[122,15891,4091],{"class":639},[122,15893,15477],{"class":632},[122,15895,15896],{"class":639},") (",[122,15898,15899],{"class":233},"回傳型態1",[122,15901,4091],{"class":639},[122,15903,15904],{"class":233},"回傳型態2",[122,15906,4091],{"class":639},[122,15908,15909],{"class":233},"回傳型態3",[122,15911,15912],{"class":639},",",[122,15914,15477],{"class":632},[122,15916,4429],{"class":639},[122,15918,15919],{"class":222,"line":230},[122,15920,15921],{"class":226},"    \u002F\u002F執行程式片段1\n",[122,15923,15924,15926,15929],{"class":222,"line":248},[122,15925,10413],{"class":632},[122,15927,15928],{"class":639}," 回傳值1, 回傳值2, 回傳值3,",[122,15930,15931],{"class":632},"...\n",[122,15933,15934],{"class":222,"line":260},[122,15935,4526],{"class":639},[15,15937,15938],{},[19,15939,13060],{},[212,15941,15943],{"className":15447,"code":15942,"language":15449,"meta":217,"style":217},"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",[127,15944,15945,15951,15961,15965,15973,15984,15994,16004,16013,16022,16027,16039,16043,16056,16060,16077,16095,16114,16132,16136,16140,16144,16172,16194,16198,16202,16222,16235,16243,16253,16260,16265],{"__ignoreMap":217},[122,15946,15947,15949],{"class":222,"line":223},[122,15948,15519],{"class":632},[122,15950,15522],{"class":233},[122,15952,15953,15955,15957,15959],{"class":222,"line":230},[122,15954,15527],{"class":632},[122,15956,1978],{"class":237},[122,15958,15532],{"class":233},[122,15960,1984],{"class":237},[122,15962,15963],{"class":222,"line":248},[122,15964,264],{"emptyLinePlaceholder":263},[122,15966,15967,15969,15971],{"class":222,"line":260},[122,15968,15456],{"class":632},[122,15970,15541],{"class":233},[122,15972,9448],{"class":639},[122,15974,15975,15978,15981],{"class":222,"line":267},[122,15976,15977],{"class":632},"    var",[122,15979,15980],{"class":639}," name ",[122,15982,15983],{"class":632},"string\n",[122,15985,15986,15988,15991],{"class":222,"line":273},[122,15987,15977],{"class":632},[122,15989,15990],{"class":639}," sex ",[122,15992,15993],{"class":632},"bool\n",[122,15995,15996,15998,16001],{"class":222,"line":660},[122,15997,15977],{"class":632},[122,15999,16000],{"class":639}," height ",[122,16002,16003],{"class":632},"float32\n",[122,16005,16006,16008,16011],{"class":222,"line":672},[122,16007,15977],{"class":632},[122,16009,16010],{"class":639}," weight ",[122,16012,16003],{"class":632},[122,16014,16015,16017,16020],{"class":222,"line":701},[122,16016,15977],{"class":632},[122,16018,16019],{"class":639}," sexString ",[122,16021,15983],{"class":632},[122,16023,16024],{"class":222,"line":706},[122,16025,16026],{"class":639},"    \n",[122,16028,16029,16032,16034,16037],{"class":222,"line":712},[122,16030,16031],{"class":639},"    name, sex, height, weight ",[122,16033,2421],{"class":632},[122,16035,16036],{"class":233}," getPersonData",[122,16038,4658],{"class":639},[122,16040,16041],{"class":222,"line":725},[122,16042,264],{"emptyLinePlaceholder":263},[122,16044,16045,16048,16050,16053],{"class":222,"line":737},[122,16046,16047],{"class":639},"    sexString ",[122,16049,2421],{"class":632},[122,16051,16052],{"class":233}," getSexString",[122,16054,16055],{"class":639},"(sex)\n",[122,16057,16058],{"class":222,"line":758},[122,16059,264],{"emptyLinePlaceholder":263},[122,16061,16062,16064,16066,16068,16071,16073,16075],{"class":222,"line":782},[122,16063,15778],{"class":639},[122,16065,15601],{"class":233},[122,16067,4013],{"class":639},[122,16069,16070],{"class":237},"\"姓名：",[122,16072,15609],{"class":241},[122,16074,2085],{"class":237},[122,16076,15614],{"class":639},[122,16078,16079,16081,16083,16085,16088,16090,16092],{"class":222,"line":787},[122,16080,15778],{"class":639},[122,16082,15601],{"class":233},[122,16084,4013],{"class":639},[122,16086,16087],{"class":237},"\"性別：",[122,16089,15609],{"class":241},[122,16091,2085],{"class":237},[122,16093,16094],{"class":639},", sexString)\n",[122,16096,16097,16099,16101,16103,16106,16109,16111],{"class":222,"line":793},[122,16098,15778],{"class":639},[122,16100,15601],{"class":233},[122,16102,4013],{"class":639},[122,16104,16105],{"class":237},"\"身高：",[122,16107,16108],{"class":241},"%.2f\\r\\n",[122,16110,2085],{"class":237},[122,16112,16113],{"class":639},", height)\n",[122,16115,16116,16118,16120,16122,16125,16127,16129],{"class":222,"line":807},[122,16117,15778],{"class":639},[122,16119,15601],{"class":233},[122,16121,4013],{"class":639},[122,16123,16124],{"class":237},"\"體重：",[122,16126,16108],{"class":241},[122,16128,2085],{"class":237},[122,16130,16131],{"class":639},", weight)\n",[122,16133,16134],{"class":222,"line":823},[122,16135,4526],{"class":639},[122,16137,16138],{"class":222,"line":828},[122,16139,264],{"emptyLinePlaceholder":263},[122,16141,16142],{"class":222,"line":834},[122,16143,264],{"emptyLinePlaceholder":263},[122,16145,16146,16148,16150,16153,16156,16158,16161,16163,16166,16168,16170],{"class":222,"line":850},[122,16147,15456],{"class":632},[122,16149,16036],{"class":233},[122,16151,16152],{"class":639},"() (",[122,16154,16155],{"class":632},"string",[122,16157,4091],{"class":639},[122,16159,16160],{"class":632},"bool",[122,16162,4091],{"class":639},[122,16164,16165],{"class":632},"float32",[122,16167,4091],{"class":639},[122,16169,16165],{"class":632},[122,16171,4429],{"class":639},[122,16173,16174,16176,16179,16181,16184,16186,16189,16191],{"class":222,"line":864},[122,16175,10413],{"class":632},[122,16177,16178],{"class":237}," \"小明\"",[122,16180,4091],{"class":639},[122,16182,16183],{"class":241},"true",[122,16185,4091],{"class":639},[122,16187,16188],{"class":241},"175.0",[122,16190,4091],{"class":639},[122,16192,16193],{"class":241},"60.5\n",[122,16195,16196],{"class":222,"line":880},[122,16197,4526],{"class":639},[122,16199,16200],{"class":222,"line":7632},[122,16201,264],{"emptyLinePlaceholder":263},[122,16203,16204,16206,16208,16210,16213,16216,16218,16220],{"class":222,"line":7638},[122,16205,15456],{"class":632},[122,16207,16052],{"class":233},[122,16209,4013],{"class":639},[122,16211,16212],{"class":9333},"sex",[122,16214,16215],{"class":632}," bool",[122,16217,10573],{"class":639},[122,16219,16155],{"class":632},[122,16221,9039],{"class":639},[122,16223,16224,16226,16228,16231,16233],{"class":222,"line":7648},[122,16225,10949],{"class":632},[122,16227,15990],{"class":639},[122,16229,16230],{"class":632},"==",[122,16232,10941],{"class":241},[122,16234,9039],{"class":639},[122,16236,16237,16240],{"class":222,"line":7662},[122,16238,16239],{"class":632},"        return",[122,16241,16242],{"class":237}," \"男\"\n",[122,16244,16245,16248,16251],{"class":222,"line":7667},[122,16246,16247],{"class":639},"    } ",[122,16249,16250],{"class":632},"else",[122,16252,9039],{"class":639},[122,16254,16255,16257],{"class":222,"line":7673},[122,16256,16239],{"class":632},[122,16258,16259],{"class":237}," \"女\"\n",[122,16261,16262],{"class":222,"line":7686},[122,16263,16264],{"class":639},"    }\n",[122,16266,16267],{"class":222,"line":7697},[122,16268,4526],{"class":639},[15,16270,16271],{},[19,16272,11114],{},[212,16274,16276],{"className":214,"code":16275,"language":216,"meta":217,"style":217},"姓名：小明\n性別：男\n身高：175.00\n體重：60.50\n",[127,16277,16278,16283,16288,16293],{"__ignoreMap":217},[122,16279,16280],{"class":222,"line":223},[122,16281,16282],{"class":233},"姓名：小明\n",[122,16284,16285],{"class":222,"line":230},[122,16286,16287],{"class":233},"性別：男\n",[122,16289,16290],{"class":222,"line":248},[122,16291,16292],{"class":233},"身高：175.00\n",[122,16294,16295],{"class":222,"line":260},[122,16296,16297],{"class":233},"體重：60.50\n",[1579,16299,16300],{},"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":217,"searchDepth":230,"depth":230,"links":16302},[16303,16304],{"id":15665,"depth":230,"text":15666},{"id":15862,"depth":230,"text":15863},"\u002Fimages\u002Farticles\u002F2023-02-26-go-lang-setup\u002Fcover.png",{},"\u002Farticles\u002F2023-05-07-go-function","2023-04-07 22:34:00",{"title":15431,"description":217},"articles\u002F2023-05-07-go-function","這篇文章，會介紹 Go 語言中，function 的使用方式",[15449],"kPWUrG71WxLeaVN03IJAFQyE8rs9AzsGWm7HLFKYbUw",{"id":16315,"title":16316,"body":16317,"category":5433,"description":217,"extension":1601,"image":16305,"meta":19151,"navigation":263,"path":19152,"pubDate":19153,"seo":19154,"status":263,"stem":19155,"summary":19156,"tags":19157,"__hash__":19158},"content\u002Farticles\u002F2023-03-28-flow control.md","《Go 學習筆記5》流程控制",{"type":8,"value":16318,"toc":19142},[16319,16323,16327,16331,16384,16388,16586,16590,16611,16614,16617,16621,16675,16679,16931,16935,16944,16948,16953,16974,16978,17055,17058,17232,17236,18176,18179,18182,18405,18409,18466,18469,18472,18772,18776,18888,18892,18901,18904,18911,18937,18942,19073,19077,19136,19139],[45,16320,16321],{},[15,16322,15438],{},[54,16324,16326],{"id":16325},"if-判斷","if 判斷",[15,16328,16329],{},[19,16330,15868],{},[212,16332,16334],{"className":15447,"code":16333,"language":15449,"meta":217,"style":217},"if 條件1 {\n  \u002F\u002F若條件1成立，則執行此段程式\n} else if 條件2 {\n  \u002F\u002F若條件2成立，則執行此段程式\n} else {\n  \u002F\u002F若上述條件都位成立，則執行本段程式\n}\n",[127,16335,16336,16344,16349,16362,16367,16375,16380],{"__ignoreMap":217},[122,16337,16338,16341],{"class":222,"line":223},[122,16339,16340],{"class":632},"if",[122,16342,16343],{"class":639}," 條件1 {\n",[122,16345,16346],{"class":222,"line":230},[122,16347,16348],{"class":226},"  \u002F\u002F若條件1成立，則執行此段程式\n",[122,16350,16351,16354,16356,16359],{"class":222,"line":248},[122,16352,16353],{"class":639},"} ",[122,16355,16250],{"class":632},[122,16357,16358],{"class":632}," if",[122,16360,16361],{"class":639}," 條件2 {\n",[122,16363,16364],{"class":222,"line":260},[122,16365,16366],{"class":226},"  \u002F\u002F若條件2成立，則執行此段程式\n",[122,16368,16369,16371,16373],{"class":222,"line":267},[122,16370,16353],{"class":639},[122,16372,16250],{"class":632},[122,16374,9039],{"class":639},[122,16376,16377],{"class":222,"line":273},[122,16378,16379],{"class":226},"  \u002F\u002F若上述條件都位成立，則執行本段程式\n",[122,16381,16382],{"class":222,"line":660},[122,16383,4526],{"class":639},[15,16385,16386],{},[19,16387,13060],{},[212,16389,16391],{"className":15447,"code":16390,"language":15449,"meta":217,"style":217},"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",[127,16392,16393,16399,16403,16413,16417,16425,16429,16438,16452,16466,16470,16484,16510,16526,16548,16556,16578,16582],{"__ignoreMap":217},[122,16394,16395,16397],{"class":222,"line":223},[122,16396,15519],{"class":632},[122,16398,15522],{"class":233},[122,16400,16401],{"class":222,"line":230},[122,16402,264],{"emptyLinePlaceholder":263},[122,16404,16405,16407,16409,16411],{"class":222,"line":248},[122,16406,15527],{"class":632},[122,16408,1978],{"class":237},[122,16410,15532],{"class":233},[122,16412,1984],{"class":237},[122,16414,16415],{"class":222,"line":260},[122,16416,264],{"emptyLinePlaceholder":263},[122,16418,16419,16421,16423],{"class":222,"line":267},[122,16420,15456],{"class":632},[122,16422,15541],{"class":233},[122,16424,9448],{"class":639},[122,16426,16427],{"class":222,"line":273},[122,16428,264],{"emptyLinePlaceholder":263},[122,16430,16431,16433,16436],{"class":222,"line":660},[122,16432,15977],{"class":632},[122,16434,16435],{"class":639}," grade ",[122,16437,16003],{"class":632},[122,16439,16440,16442,16445,16447,16450],{"class":222,"line":672},[122,16441,15778],{"class":639},[122,16443,16444],{"class":233},"Print",[122,16446,4013],{"class":639},[122,16448,16449],{"class":237},"\"請輸入分數：\"",[122,16451,2444],{"class":639},[122,16453,16454,16456,16459,16461,16463],{"class":222,"line":701},[122,16455,15778],{"class":639},[122,16457,16458],{"class":233},"Scan",[122,16460,4013],{"class":639},[122,16462,12171],{"class":632},[122,16464,16465],{"class":639},"grade)\n",[122,16467,16468],{"class":222,"line":706},[122,16469,264],{"emptyLinePlaceholder":263},[122,16471,16472,16474,16476,16479,16482],{"class":222,"line":712},[122,16473,10949],{"class":632},[122,16475,16435],{"class":639},[122,16477,16478],{"class":632},">=",[122,16480,16481],{"class":241}," 80",[122,16483,9039],{"class":639},[122,16485,16486,16489,16491,16493,16496,16499,16502,16505,16507],{"class":222,"line":725},[122,16487,16488],{"class":639},"        fmt.",[122,16490,15601],{"class":233},[122,16492,4013],{"class":639},[122,16494,16495],{"class":237},"\"你的成績為：",[122,16497,16498],{"class":241},"%.2f",[122,16500,16501],{"class":237},"，成績不錯唷",[122,16503,16504],{"class":241},"\\r\\n",[122,16506,2085],{"class":237},[122,16508,16509],{"class":639},", grade)\n",[122,16511,16512,16514,16516,16518,16520,16522,16524],{"class":222,"line":737},[122,16513,16247],{"class":639},[122,16515,16250],{"class":632},[122,16517,16358],{"class":632},[122,16519,16435],{"class":639},[122,16521,16478],{"class":632},[122,16523,10081],{"class":241},[122,16525,9039],{"class":639},[122,16527,16528,16530,16532,16534,16537,16539,16542,16544,16546],{"class":222,"line":758},[122,16529,16488],{"class":639},[122,16531,15601],{"class":233},[122,16533,4013],{"class":639},[122,16535,16536],{"class":237},"\"您的成積為 ",[122,16538,16498],{"class":241},[122,16540,16541],{"class":237}," ，恭喜你及格了",[122,16543,16504],{"class":241},[122,16545,2085],{"class":237},[122,16547,16509],{"class":639},[122,16549,16550,16552,16554],{"class":222,"line":782},[122,16551,16247],{"class":639},[122,16553,16250],{"class":632},[122,16555,9039],{"class":639},[122,16557,16558,16560,16562,16564,16567,16569,16572,16574,16576],{"class":222,"line":787},[122,16559,16488],{"class":639},[122,16561,15601],{"class":233},[122,16563,4013],{"class":639},[122,16565,16566],{"class":237},"\"您的成績為 ",[122,16568,16498],{"class":241},[122,16570,16571],{"class":237}," ，不及格~再努力",[122,16573,16504],{"class":241},[122,16575,2085],{"class":237},[122,16577,16509],{"class":639},[122,16579,16580],{"class":222,"line":793},[122,16581,9436],{"class":639},[122,16583,16584],{"class":222,"line":807},[122,16585,4526],{"class":639},[15,16587,16588],{},[19,16589,11114],{},[212,16591,16593],{"className":214,"code":16592,"language":216,"meta":217,"style":217},"請輸入分數：59.99\n您的成績為 59.99 ，不及格~再努力\n",[127,16594,16595,16600],{"__ignoreMap":217},[122,16596,16597],{"class":222,"line":223},[122,16598,16599],{"class":233},"請輸入分數：59.99\n",[122,16601,16602,16605,16608],{"class":222,"line":230},[122,16603,16604],{"class":233},"您的成績為",[122,16606,16607],{"class":241}," 59.99",[122,16609,16610],{"class":237}," ，不及格~再努力\n",[54,16612,16613],{"id":16613},"switch",[15,16615,16616],{},"也是一個判斷語法，會依不用結執行該段程式",[15,16618,16619],{},[19,16620,15868],{},[212,16622,16624],{"className":15447,"code":16623,"language":15449,"meta":217,"style":217},"switch (判斷式) {\n    case value1:\n        \u002F\u002F程式片段1\n    case value2:\n        \u002F\u002F程式片段2\n    default:\n        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n}\n    \n",[127,16625,16626,16633,16641,16646,16653,16658,16666,16671],{"__ignoreMap":217},[122,16627,16628,16630],{"class":222,"line":223},[122,16629,16613],{"class":632},[122,16631,16632],{"class":639}," (判斷式) {\n",[122,16634,16635,16638],{"class":222,"line":230},[122,16636,16637],{"class":632},"    case",[122,16639,16640],{"class":639}," value1:\n",[122,16642,16643],{"class":222,"line":248},[122,16644,16645],{"class":226},"        \u002F\u002F程式片段1\n",[122,16647,16648,16650],{"class":222,"line":260},[122,16649,16637],{"class":632},[122,16651,16652],{"class":639}," value2:\n",[122,16654,16655],{"class":222,"line":267},[122,16656,16657],{"class":226},"        \u002F\u002F程式片段2\n",[122,16659,16660,16663],{"class":222,"line":273},[122,16661,16662],{"class":632},"    default",[122,16664,16665],{"class":639},":\n",[122,16667,16668],{"class":222,"line":660},[122,16669,16670],{"class":226},"        \u002F\u002F若所有條件都不符合，則執行這個程式片段\n",[122,16672,16673],{"class":222,"line":672},[122,16674,4526],{"class":639},[15,16676,16677],{},[19,16678,13060],{},[212,16680,16682],{"className":15447,"code":16681,"language":15449,"meta":217,"style":217},"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",[127,16683,16684,16690,16694,16701,16710,16719,16723,16727,16735,16750,16765,16773,16781,16794,16802,16815,16823,16836,16845,16858,16867,16880,16888,16901,16910,16923,16927],{"__ignoreMap":217},[122,16685,16686,16688],{"class":222,"line":223},[122,16687,15519],{"class":632},[122,16689,15522],{"class":233},[122,16691,16692],{"class":222,"line":230},[122,16693,264],{"emptyLinePlaceholder":263},[122,16695,16696,16698],{"class":222,"line":248},[122,16697,15527],{"class":632},[122,16699,16700],{"class":639}," (\n",[122,16702,16703,16706,16708],{"class":222,"line":260},[122,16704,16705],{"class":237},"    \"",[122,16707,15532],{"class":233},[122,16709,1984],{"class":237},[122,16711,16712,16714,16717],{"class":222,"line":267},[122,16713,16705],{"class":237},[122,16715,16716],{"class":233},"time",[122,16718,1984],{"class":237},[122,16720,16721],{"class":222,"line":273},[122,16722,2444],{"class":639},[122,16724,16725],{"class":222,"line":660},[122,16726,264],{"emptyLinePlaceholder":263},[122,16728,16729,16731,16733],{"class":222,"line":672},[122,16730,15456],{"class":632},[122,16732,15541],{"class":233},[122,16734,9448],{"class":639},[122,16736,16737,16740,16742,16745,16748],{"class":222,"line":701},[122,16738,16739],{"class":639},"    now ",[122,16741,15755],{"class":632},[122,16743,16744],{"class":639}," time.",[122,16746,16747],{"class":233},"Now",[122,16749,4658],{"class":639},[122,16751,16752,16755,16757,16760,16763],{"class":222,"line":706},[122,16753,16754],{"class":639},"    week ",[122,16756,15755],{"class":632},[122,16758,16759],{"class":639}," now.",[122,16761,16762],{"class":233},"Weekday",[122,16764,4658],{"class":639},[122,16766,16767,16770],{"class":222,"line":712},[122,16768,16769],{"class":632},"    switch",[122,16771,16772],{"class":639}," week {\n",[122,16774,16775,16777,16779],{"class":222,"line":725},[122,16776,16637],{"class":632},[122,16778,8359],{"class":241},[122,16780,16665],{"class":639},[122,16782,16783,16785,16787,16789,16792],{"class":222,"line":737},[122,16784,16488],{"class":639},[122,16786,15781],{"class":233},[122,16788,4013],{"class":639},[122,16790,16791],{"class":237},"\"星期日\"",[122,16793,2444],{"class":639},[122,16795,16796,16798,16800],{"class":222,"line":758},[122,16797,16637],{"class":632},[122,16799,4411],{"class":241},[122,16801,16665],{"class":639},[122,16803,16804,16806,16808,16810,16813],{"class":222,"line":782},[122,16805,16488],{"class":639},[122,16807,15781],{"class":233},[122,16809,4013],{"class":639},[122,16811,16812],{"class":237},"\"星期一\"",[122,16814,2444],{"class":639},[122,16816,16817,16819,16821],{"class":222,"line":787},[122,16818,16637],{"class":632},[122,16820,10068],{"class":241},[122,16822,16665],{"class":639},[122,16824,16825,16827,16829,16831,16834],{"class":222,"line":793},[122,16826,16488],{"class":639},[122,16828,15781],{"class":233},[122,16830,4013],{"class":639},[122,16832,16833],{"class":237},"\"星期二\"",[122,16835,2444],{"class":639},[122,16837,16838,16840,16843],{"class":222,"line":807},[122,16839,16637],{"class":632},[122,16841,16842],{"class":241}," 3",[122,16844,16665],{"class":639},[122,16846,16847,16849,16851,16853,16856],{"class":222,"line":823},[122,16848,16488],{"class":639},[122,16850,15781],{"class":233},[122,16852,4013],{"class":639},[122,16854,16855],{"class":237},"\"星期三\"",[122,16857,2444],{"class":639},[122,16859,16860,16862,16865],{"class":222,"line":828},[122,16861,16637],{"class":632},[122,16863,16864],{"class":241}," 4",[122,16866,16665],{"class":639},[122,16868,16869,16871,16873,16875,16878],{"class":222,"line":834},[122,16870,16488],{"class":639},[122,16872,15781],{"class":233},[122,16874,4013],{"class":639},[122,16876,16877],{"class":237},"\"星期四\"",[122,16879,2444],{"class":639},[122,16881,16882,16884,16886],{"class":222,"line":850},[122,16883,16637],{"class":632},[122,16885,9429],{"class":241},[122,16887,16665],{"class":639},[122,16889,16890,16892,16894,16896,16899],{"class":222,"line":864},[122,16891,16488],{"class":639},[122,16893,15781],{"class":233},[122,16895,4013],{"class":639},[122,16897,16898],{"class":237},"\"星期五\"",[122,16900,2444],{"class":639},[122,16902,16903,16905,16908],{"class":222,"line":880},[122,16904,16637],{"class":632},[122,16906,16907],{"class":241}," 6",[122,16909,16665],{"class":639},[122,16911,16912,16914,16916,16918,16921],{"class":222,"line":7632},[122,16913,16488],{"class":639},[122,16915,15781],{"class":233},[122,16917,4013],{"class":639},[122,16919,16920],{"class":237},"\"星期六\"",[122,16922,2444],{"class":639},[122,16924,16925],{"class":222,"line":7638},[122,16926,9436],{"class":639},[122,16928,16929],{"class":222,"line":7648},[122,16930,4526],{"class":639},[15,16932,16933],{},[19,16934,11114],{},[212,16936,16938],{"className":214,"code":16937,"language":216,"meta":217,"style":217},"星期二\n",[127,16939,16940],{"__ignoreMap":217},[122,16941,16942],{"class":222,"line":223},[122,16943,16937],{"class":233},[54,16945,16947],{"id":16946},"for-迴圈","for 迴圈",[15,16949,16950],{},[19,16951,16952],{},"基本格式",[212,16954,16956],{"className":15447,"code":16955,"language":15449,"meta":217,"style":217},"for 初始執行指令;布林判斷式;後執行指令 {\n    \u002F\u002F若布林判斷式為 true 則執行程式片段\n}\n",[127,16957,16958,16965,16970],{"__ignoreMap":217},[122,16959,16960,16962],{"class":222,"line":223},[122,16961,4403],{"class":632},[122,16963,16964],{"class":639}," 初始執行指令;布林判斷式;後執行指令 {\n",[122,16966,16967],{"class":222,"line":230},[122,16968,16969],{"class":226},"    \u002F\u002F若布林判斷式為 true 則執行程式片段\n",[122,16971,16972],{"class":222,"line":248},[122,16973,4526],{"class":639},[15,16975,16976],{},[19,16977,13060],{},[212,16979,16981],{"className":15447,"code":16980,"language":15449,"meta":217,"style":217},"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",[127,16982,16983,16989,16999,17007,17012,17038,17047,17051],{"__ignoreMap":217},[122,16984,16985,16987],{"class":222,"line":223},[122,16986,15519],{"class":632},[122,16988,15522],{"class":233},[122,16990,16991,16993,16995,16997],{"class":222,"line":230},[122,16992,15527],{"class":632},[122,16994,1978],{"class":237},[122,16996,15532],{"class":233},[122,16998,1984],{"class":237},[122,17000,17001,17003,17005],{"class":222,"line":248},[122,17002,15456],{"class":632},[122,17004,15541],{"class":233},[122,17006,9448],{"class":639},[122,17008,17009],{"class":222,"line":260},[122,17010,17011],{"class":226},"    \u002F\u002F for 循環的基本形式\n",[122,17013,17014,17017,17020,17022,17024,17027,17029,17031,17034,17036],{"class":222,"line":267},[122,17015,17016],{"class":632},"    for",[122,17018,17019],{"class":639}," i ",[122,17021,15755],{"class":632},[122,17023,8359],{"class":241},[122,17025,17026],{"class":639},"; i ",[122,17028,633],{"class":632},[122,17030,9429],{"class":241},[122,17032,17033],{"class":639},"; i",[122,17035,4426],{"class":632},[122,17037,9039],{"class":639},[122,17039,17040,17042,17044],{"class":222,"line":273},[122,17041,16488],{"class":639},[122,17043,15781],{"class":233},[122,17045,17046],{"class":639},"(i)\n",[122,17048,17049],{"class":222,"line":660},[122,17050,9436],{"class":639},[122,17052,17053],{"class":222,"line":672},[122,17054,4526],{"class":639},[15,17056,17057],{},"九九乘法",[212,17059,17061],{"className":15447,"code":17060,"language":15449,"meta":217,"style":217},"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",[127,17062,17063,17069,17079,17083,17091,17100,17108,17133,17158,17177,17207,17211,17224,17228],{"__ignoreMap":217},[122,17064,17065,17067],{"class":222,"line":223},[122,17066,15519],{"class":632},[122,17068,15522],{"class":233},[122,17070,17071,17073,17075,17077],{"class":222,"line":230},[122,17072,15527],{"class":632},[122,17074,1978],{"class":237},[122,17076,15532],{"class":233},[122,17078,1984],{"class":237},[122,17080,17081],{"class":222,"line":248},[122,17082,264],{"emptyLinePlaceholder":263},[122,17084,17085,17087,17089],{"class":222,"line":260},[122,17086,15456],{"class":632},[122,17088,15541],{"class":233},[122,17090,9448],{"class":639},[122,17092,17093,17095,17097],{"class":222,"line":267},[122,17094,15977],{"class":632},[122,17096,15832],{"class":639},[122,17098,17099],{"class":632},"int\n",[122,17101,17102,17104,17106],{"class":222,"line":273},[122,17103,15977],{"class":632},[122,17105,15837],{"class":639},[122,17107,17099],{"class":632},[122,17109,17110,17112,17114,17116,17118,17121,17123,17126,17129,17131],{"class":222,"line":660},[122,17111,17016],{"class":632},[122,17113,15832],{"class":639},[122,17115,2421],{"class":632},[122,17117,10068],{"class":241},[122,17119,17120],{"class":639},"; x ",[122,17122,4417],{"class":632},[122,17124,17125],{"class":241}," 9",[122,17127,17128],{"class":639},"; x",[122,17130,4426],{"class":632},[122,17132,9039],{"class":639},[122,17134,17135,17138,17140,17142,17144,17147,17149,17151,17154,17156],{"class":222,"line":672},[122,17136,17137],{"class":632},"        for",[122,17139,15837],{"class":639},[122,17141,2421],{"class":632},[122,17143,4411],{"class":241},[122,17145,17146],{"class":639},"; y ",[122,17148,4417],{"class":632},[122,17150,17125],{"class":241},[122,17152,17153],{"class":639},"; y",[122,17155,4426],{"class":632},[122,17157,9039],{"class":639},[122,17159,17160,17163,17166,17168,17170,17172,17174],{"class":222,"line":701},[122,17161,17162],{"class":632},"            var",[122,17164,17165],{"class":639}," z ",[122,17167,15823],{"class":632},[122,17169,1909],{"class":632},[122,17171,15832],{"class":639},[122,17173,10281],{"class":632},[122,17175,17176],{"class":639}," y\n",[122,17178,17179,17182,17184,17186,17188,17191,17194,17196,17199,17202,17204],{"class":222,"line":706},[122,17180,17181],{"class":639},"            fmt.",[122,17183,15601],{"class":233},[122,17185,4013],{"class":639},[122,17187,2085],{"class":237},[122,17189,17190],{"class":241},"%d",[122,17192,17193],{"class":237}," X ",[122,17195,17190],{"class":241},[122,17197,17198],{"class":237}," = ",[122,17200,17201],{"class":241},"%d\\n",[122,17203,2085],{"class":237},[122,17205,17206],{"class":639},", x, y, z)\n",[122,17208,17209],{"class":222,"line":712},[122,17210,9554],{"class":639},[122,17212,17213,17215,17217,17219,17222],{"class":222,"line":725},[122,17214,16488],{"class":639},[122,17216,15781],{"class":233},[122,17218,4013],{"class":639},[122,17220,17221],{"class":237},"\"==============\"",[122,17223,2444],{"class":639},[122,17225,17226],{"class":222,"line":737},[122,17227,9436],{"class":639},[122,17229,17230],{"class":222,"line":758},[122,17231,4526],{"class":639},[15,17233,17234],{},[19,17235,11114],{},[212,17237,17239],{"className":214,"code":17238,"language":216,"meta":217,"style":217},"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",[127,17240,17241,17255,17268,17281,17294,17307,17320,17334,17348,17361,17366,17378,17390,17403,17415,17428,17440,17453,17466,17479,17483,17495,17507,17519,17531,17544,17556,17569,17582,17595,17599,17611,17623,17635,17647,17660,17673,17686,17699,17712,17716,17729,17741,17753,17765,17777,17789,17802,17815,17828,17832,17844,17856,17868,17880,17892,17904,17917,17930,17943,17947,17960,17972,17984,17996,18008,18020,18032,18045,18058,18062,18075,18087,18099,18111,18123,18135,18147,18159,18172],{"__ignoreMap":217},[122,17242,17243,17245,17248,17250,17252],{"class":222,"line":223},[122,17244,4504],{"class":233},[122,17246,17247],{"class":237}," X",[122,17249,4411],{"class":241},[122,17251,1909],{"class":237},[122,17253,17254],{"class":241}," 2\n",[122,17256,17257,17259,17261,17263,17265],{"class":222,"line":230},[122,17258,4504],{"class":233},[122,17260,17247],{"class":237},[122,17262,10068],{"class":241},[122,17264,1909],{"class":237},[122,17266,17267],{"class":241}," 4\n",[122,17269,17270,17272,17274,17276,17278],{"class":222,"line":248},[122,17271,4504],{"class":233},[122,17273,17247],{"class":237},[122,17275,16842],{"class":241},[122,17277,1909],{"class":237},[122,17279,17280],{"class":241}," 6\n",[122,17282,17283,17285,17287,17289,17291],{"class":222,"line":260},[122,17284,4504],{"class":233},[122,17286,17247],{"class":237},[122,17288,16864],{"class":241},[122,17290,1909],{"class":237},[122,17292,17293],{"class":241}," 8\n",[122,17295,17296,17298,17300,17302,17304],{"class":222,"line":267},[122,17297,4504],{"class":233},[122,17299,17247],{"class":237},[122,17301,9429],{"class":241},[122,17303,1909],{"class":237},[122,17305,17306],{"class":241}," 10\n",[122,17308,17309,17311,17313,17315,17317],{"class":222,"line":273},[122,17310,4504],{"class":233},[122,17312,17247],{"class":237},[122,17314,16907],{"class":241},[122,17316,1909],{"class":237},[122,17318,17319],{"class":241}," 12\n",[122,17321,17322,17324,17326,17329,17331],{"class":222,"line":660},[122,17323,4504],{"class":233},[122,17325,17247],{"class":237},[122,17327,17328],{"class":241}," 7",[122,17330,1909],{"class":237},[122,17332,17333],{"class":241}," 14\n",[122,17335,17336,17338,17340,17343,17345],{"class":222,"line":672},[122,17337,4504],{"class":233},[122,17339,17247],{"class":237},[122,17341,17342],{"class":241}," 8",[122,17344,1909],{"class":237},[122,17346,17347],{"class":241}," 16\n",[122,17349,17350,17352,17354,17356,17358],{"class":222,"line":701},[122,17351,4504],{"class":233},[122,17353,17247],{"class":237},[122,17355,17125],{"class":241},[122,17357,1909],{"class":237},[122,17359,17360],{"class":241}," 18\n",[122,17362,17363],{"class":222,"line":706},[122,17364,17365],{"class":237},"==============\n",[122,17367,17368,17370,17372,17374,17376],{"class":222,"line":712},[122,17369,15771],{"class":233},[122,17371,17247],{"class":237},[122,17373,4411],{"class":241},[122,17375,1909],{"class":237},[122,17377,5813],{"class":241},[122,17379,17380,17382,17384,17386,17388],{"class":222,"line":725},[122,17381,15771],{"class":233},[122,17383,17247],{"class":237},[122,17385,10068],{"class":241},[122,17387,1909],{"class":237},[122,17389,17280],{"class":241},[122,17391,17392,17394,17396,17398,17400],{"class":222,"line":737},[122,17393,15771],{"class":233},[122,17395,17247],{"class":237},[122,17397,16842],{"class":241},[122,17399,1909],{"class":237},[122,17401,17402],{"class":241}," 9\n",[122,17404,17405,17407,17409,17411,17413],{"class":222,"line":758},[122,17406,15771],{"class":233},[122,17408,17247],{"class":237},[122,17410,16864],{"class":241},[122,17412,1909],{"class":237},[122,17414,17319],{"class":241},[122,17416,17417,17419,17421,17423,17425],{"class":222,"line":782},[122,17418,15771],{"class":233},[122,17420,17247],{"class":237},[122,17422,9429],{"class":241},[122,17424,1909],{"class":237},[122,17426,17427],{"class":241}," 15\n",[122,17429,17430,17432,17434,17436,17438],{"class":222,"line":787},[122,17431,15771],{"class":233},[122,17433,17247],{"class":237},[122,17435,16907],{"class":241},[122,17437,1909],{"class":237},[122,17439,17360],{"class":241},[122,17441,17442,17444,17446,17448,17450],{"class":222,"line":793},[122,17443,15771],{"class":233},[122,17445,17247],{"class":237},[122,17447,17328],{"class":241},[122,17449,1909],{"class":237},[122,17451,17452],{"class":241}," 21\n",[122,17454,17455,17457,17459,17461,17463],{"class":222,"line":807},[122,17456,15771],{"class":233},[122,17458,17247],{"class":237},[122,17460,17342],{"class":241},[122,17462,1909],{"class":237},[122,17464,17465],{"class":241}," 24\n",[122,17467,17468,17470,17472,17474,17476],{"class":222,"line":823},[122,17469,15771],{"class":233},[122,17471,17247],{"class":237},[122,17473,17125],{"class":241},[122,17475,1909],{"class":237},[122,17477,17478],{"class":241}," 27\n",[122,17480,17481],{"class":222,"line":828},[122,17482,17365],{"class":237},[122,17484,17485,17487,17489,17491,17493],{"class":222,"line":834},[122,17486,4994],{"class":233},[122,17488,17247],{"class":237},[122,17490,4411],{"class":241},[122,17492,1909],{"class":237},[122,17494,17267],{"class":241},[122,17496,17497,17499,17501,17503,17505],{"class":222,"line":850},[122,17498,4994],{"class":233},[122,17500,17247],{"class":237},[122,17502,10068],{"class":241},[122,17504,1909],{"class":237},[122,17506,17293],{"class":241},[122,17508,17509,17511,17513,17515,17517],{"class":222,"line":864},[122,17510,4994],{"class":233},[122,17512,17247],{"class":237},[122,17514,16842],{"class":241},[122,17516,1909],{"class":237},[122,17518,17319],{"class":241},[122,17520,17521,17523,17525,17527,17529],{"class":222,"line":880},[122,17522,4994],{"class":233},[122,17524,17247],{"class":237},[122,17526,16864],{"class":241},[122,17528,1909],{"class":237},[122,17530,17347],{"class":241},[122,17532,17533,17535,17537,17539,17541],{"class":222,"line":7632},[122,17534,4994],{"class":233},[122,17536,17247],{"class":237},[122,17538,9429],{"class":241},[122,17540,1909],{"class":237},[122,17542,17543],{"class":241}," 20\n",[122,17545,17546,17548,17550,17552,17554],{"class":222,"line":7638},[122,17547,4994],{"class":233},[122,17549,17247],{"class":237},[122,17551,16907],{"class":241},[122,17553,1909],{"class":237},[122,17555,17465],{"class":241},[122,17557,17558,17560,17562,17564,17566],{"class":222,"line":7648},[122,17559,4994],{"class":233},[122,17561,17247],{"class":237},[122,17563,17328],{"class":241},[122,17565,1909],{"class":237},[122,17567,17568],{"class":241}," 28\n",[122,17570,17571,17573,17575,17577,17579],{"class":222,"line":7662},[122,17572,4994],{"class":233},[122,17574,17247],{"class":237},[122,17576,17342],{"class":241},[122,17578,1909],{"class":237},[122,17580,17581],{"class":241}," 32\n",[122,17583,17584,17586,17588,17590,17592],{"class":222,"line":7667},[122,17585,4994],{"class":233},[122,17587,17247],{"class":237},[122,17589,17125],{"class":241},[122,17591,1909],{"class":237},[122,17593,17594],{"class":241}," 36\n",[122,17596,17597],{"class":222,"line":7673},[122,17598,17365],{"class":237},[122,17600,17601,17603,17605,17607,17609],{"class":222,"line":7686},[122,17602,4187],{"class":233},[122,17604,17247],{"class":237},[122,17606,4411],{"class":241},[122,17608,1909],{"class":237},[122,17610,5747],{"class":241},[122,17612,17613,17615,17617,17619,17621],{"class":222,"line":7697},[122,17614,4187],{"class":233},[122,17616,17247],{"class":237},[122,17618,10068],{"class":241},[122,17620,1909],{"class":237},[122,17622,17306],{"class":241},[122,17624,17625,17627,17629,17631,17633],{"class":222,"line":7708},[122,17626,4187],{"class":233},[122,17628,17247],{"class":237},[122,17630,16842],{"class":241},[122,17632,1909],{"class":237},[122,17634,17427],{"class":241},[122,17636,17637,17639,17641,17643,17645],{"class":222,"line":9624},[122,17638,4187],{"class":233},[122,17640,17247],{"class":237},[122,17642,16864],{"class":241},[122,17644,1909],{"class":237},[122,17646,17543],{"class":241},[122,17648,17649,17651,17653,17655,17657],{"class":222,"line":9656},[122,17650,4187],{"class":233},[122,17652,17247],{"class":237},[122,17654,9429],{"class":241},[122,17656,1909],{"class":237},[122,17658,17659],{"class":241}," 25\n",[122,17661,17662,17664,17666,17668,17670],{"class":222,"line":9667},[122,17663,4187],{"class":233},[122,17665,17247],{"class":237},[122,17667,16907],{"class":241},[122,17669,1909],{"class":237},[122,17671,17672],{"class":241}," 30\n",[122,17674,17675,17677,17679,17681,17683],{"class":222,"line":9678},[122,17676,4187],{"class":233},[122,17678,17247],{"class":237},[122,17680,17328],{"class":241},[122,17682,1909],{"class":237},[122,17684,17685],{"class":241}," 35\n",[122,17687,17688,17690,17692,17694,17696],{"class":222,"line":9689},[122,17689,4187],{"class":233},[122,17691,17247],{"class":237},[122,17693,17342],{"class":241},[122,17695,1909],{"class":237},[122,17697,17698],{"class":241}," 40\n",[122,17700,17701,17703,17705,17707,17709],{"class":222,"line":9700},[122,17702,4187],{"class":233},[122,17704,17247],{"class":237},[122,17706,17125],{"class":241},[122,17708,1909],{"class":237},[122,17710,17711],{"class":241}," 45\n",[122,17713,17714],{"class":222,"line":9711},[122,17715,17365],{"class":237},[122,17717,17718,17721,17723,17725,17727],{"class":222,"line":9723},[122,17719,17720],{"class":233},"6",[122,17722,17247],{"class":237},[122,17724,4411],{"class":241},[122,17726,1909],{"class":237},[122,17728,17280],{"class":241},[122,17730,17731,17733,17735,17737,17739],{"class":222,"line":9728},[122,17732,17720],{"class":233},[122,17734,17247],{"class":237},[122,17736,10068],{"class":241},[122,17738,1909],{"class":237},[122,17740,17319],{"class":241},[122,17742,17743,17745,17747,17749,17751],{"class":222,"line":9733},[122,17744,17720],{"class":233},[122,17746,17247],{"class":237},[122,17748,16842],{"class":241},[122,17750,1909],{"class":237},[122,17752,17360],{"class":241},[122,17754,17755,17757,17759,17761,17763],{"class":222,"line":9740},[122,17756,17720],{"class":233},[122,17758,17247],{"class":237},[122,17760,16864],{"class":241},[122,17762,1909],{"class":237},[122,17764,17465],{"class":241},[122,17766,17767,17769,17771,17773,17775],{"class":222,"line":9751},[122,17768,17720],{"class":233},[122,17770,17247],{"class":237},[122,17772,9429],{"class":241},[122,17774,1909],{"class":237},[122,17776,17672],{"class":241},[122,17778,17779,17781,17783,17785,17787],{"class":222,"line":9776},[122,17780,17720],{"class":233},[122,17782,17247],{"class":237},[122,17784,16907],{"class":241},[122,17786,1909],{"class":237},[122,17788,17594],{"class":241},[122,17790,17791,17793,17795,17797,17799],{"class":222,"line":9781},[122,17792,17720],{"class":233},[122,17794,17247],{"class":237},[122,17796,17328],{"class":241},[122,17798,1909],{"class":237},[122,17800,17801],{"class":241}," 42\n",[122,17803,17804,17806,17808,17810,17812],{"class":222,"line":9786},[122,17805,17720],{"class":233},[122,17807,17247],{"class":237},[122,17809,17342],{"class":241},[122,17811,1909],{"class":237},[122,17813,17814],{"class":241}," 48\n",[122,17816,17817,17819,17821,17823,17825],{"class":222,"line":9793},[122,17818,17720],{"class":233},[122,17820,17247],{"class":237},[122,17822,17125],{"class":241},[122,17824,1909],{"class":237},[122,17826,17827],{"class":241}," 54\n",[122,17829,17830],{"class":222,"line":9806},[122,17831,17365],{"class":237},[122,17833,17834,17836,17838,17840,17842],{"class":222,"line":9811},[122,17835,11010],{"class":233},[122,17837,17247],{"class":237},[122,17839,4411],{"class":241},[122,17841,1909],{"class":237},[122,17843,5672],{"class":241},[122,17845,17846,17848,17850,17852,17854],{"class":222,"line":9816},[122,17847,11010],{"class":233},[122,17849,17247],{"class":237},[122,17851,10068],{"class":241},[122,17853,1909],{"class":237},[122,17855,17333],{"class":241},[122,17857,17858,17860,17862,17864,17866],{"class":222,"line":9821},[122,17859,11010],{"class":233},[122,17861,17247],{"class":237},[122,17863,16842],{"class":241},[122,17865,1909],{"class":237},[122,17867,17452],{"class":241},[122,17869,17870,17872,17874,17876,17878],{"class":222,"line":9831},[122,17871,11010],{"class":233},[122,17873,17247],{"class":237},[122,17875,16864],{"class":241},[122,17877,1909],{"class":237},[122,17879,17568],{"class":241},[122,17881,17882,17884,17886,17888,17890],{"class":222,"line":9872},[122,17883,11010],{"class":233},[122,17885,17247],{"class":237},[122,17887,9429],{"class":241},[122,17889,1909],{"class":237},[122,17891,17685],{"class":241},[122,17893,17894,17896,17898,17900,17902],{"class":222,"line":9883},[122,17895,11010],{"class":233},[122,17897,17247],{"class":237},[122,17899,16907],{"class":241},[122,17901,1909],{"class":237},[122,17903,17801],{"class":241},[122,17905,17906,17908,17910,17912,17914],{"class":222,"line":9894},[122,17907,11010],{"class":233},[122,17909,17247],{"class":237},[122,17911,17328],{"class":241},[122,17913,1909],{"class":237},[122,17915,17916],{"class":241}," 49\n",[122,17918,17919,17921,17923,17925,17927],{"class":222,"line":9905},[122,17920,11010],{"class":233},[122,17922,17247],{"class":237},[122,17924,17342],{"class":241},[122,17926,1909],{"class":237},[122,17928,17929],{"class":241}," 56\n",[122,17931,17932,17934,17936,17938,17940],{"class":222,"line":9916},[122,17933,11010],{"class":233},[122,17935,17247],{"class":237},[122,17937,17125],{"class":241},[122,17939,1909],{"class":237},[122,17941,17942],{"class":241}," 63\n",[122,17944,17945],{"class":222,"line":9927},[122,17946,17365],{"class":237},[122,17948,17949,17952,17954,17956,17958],{"class":222,"line":9938},[122,17950,17951],{"class":233},"8",[122,17953,17247],{"class":237},[122,17955,4411],{"class":241},[122,17957,1909],{"class":237},[122,17959,17293],{"class":241},[122,17961,17962,17964,17966,17968,17970],{"class":222,"line":9951},[122,17963,17951],{"class":233},[122,17965,17247],{"class":237},[122,17967,10068],{"class":241},[122,17969,1909],{"class":237},[122,17971,17347],{"class":241},[122,17973,17974,17976,17978,17980,17982],{"class":222,"line":9956},[122,17975,17951],{"class":233},[122,17977,17247],{"class":237},[122,17979,16842],{"class":241},[122,17981,1909],{"class":237},[122,17983,17465],{"class":241},[122,17985,17986,17988,17990,17992,17994],{"class":222,"line":9961},[122,17987,17951],{"class":233},[122,17989,17247],{"class":237},[122,17991,16864],{"class":241},[122,17993,1909],{"class":237},[122,17995,17581],{"class":241},[122,17997,17998,18000,18002,18004,18006],{"class":222,"line":9968},[122,17999,17951],{"class":233},[122,18001,17247],{"class":237},[122,18003,9429],{"class":241},[122,18005,1909],{"class":237},[122,18007,17698],{"class":241},[122,18009,18010,18012,18014,18016,18018],{"class":222,"line":9979},[122,18011,17951],{"class":233},[122,18013,17247],{"class":237},[122,18015,16907],{"class":241},[122,18017,1909],{"class":237},[122,18019,17814],{"class":241},[122,18021,18022,18024,18026,18028,18030],{"class":222,"line":10004},[122,18023,17951],{"class":233},[122,18025,17247],{"class":237},[122,18027,17328],{"class":241},[122,18029,1909],{"class":237},[122,18031,17929],{"class":241},[122,18033,18034,18036,18038,18040,18042],{"class":222,"line":10009},[122,18035,17951],{"class":233},[122,18037,17247],{"class":237},[122,18039,17342],{"class":241},[122,18041,1909],{"class":237},[122,18043,18044],{"class":241}," 64\n",[122,18046,18047,18049,18051,18053,18055],{"class":222,"line":10014},[122,18048,17951],{"class":233},[122,18050,17247],{"class":237},[122,18052,17125],{"class":241},[122,18054,1909],{"class":237},[122,18056,18057],{"class":241}," 72\n",[122,18059,18060],{"class":222,"line":10021},[122,18061,17365],{"class":237},[122,18063,18064,18067,18069,18071,18073],{"class":222,"line":10034},[122,18065,18066],{"class":233},"9",[122,18068,17247],{"class":237},[122,18070,4411],{"class":241},[122,18072,1909],{"class":237},[122,18074,17402],{"class":241},[122,18076,18077,18079,18081,18083,18085],{"class":222,"line":10039},[122,18078,18066],{"class":233},[122,18080,17247],{"class":237},[122,18082,10068],{"class":241},[122,18084,1909],{"class":237},[122,18086,17360],{"class":241},[122,18088,18089,18091,18093,18095,18097],{"class":222,"line":10044},[122,18090,18066],{"class":233},[122,18092,17247],{"class":237},[122,18094,16842],{"class":241},[122,18096,1909],{"class":237},[122,18098,17478],{"class":241},[122,18100,18101,18103,18105,18107,18109],{"class":222,"line":10049},[122,18102,18066],{"class":233},[122,18104,17247],{"class":237},[122,18106,16864],{"class":241},[122,18108,1909],{"class":237},[122,18110,17594],{"class":241},[122,18112,18113,18115,18117,18119,18121],{"class":222,"line":10100},[122,18114,18066],{"class":233},[122,18116,17247],{"class":237},[122,18118,9429],{"class":241},[122,18120,1909],{"class":237},[122,18122,17711],{"class":241},[122,18124,18125,18127,18129,18131,18133],{"class":222,"line":10113},[122,18126,18066],{"class":233},[122,18128,17247],{"class":237},[122,18130,16907],{"class":241},[122,18132,1909],{"class":237},[122,18134,17827],{"class":241},[122,18136,18137,18139,18141,18143,18145],{"class":222,"line":10125},[122,18138,18066],{"class":233},[122,18140,17247],{"class":237},[122,18142,17328],{"class":241},[122,18144,1909],{"class":237},[122,18146,17942],{"class":241},[122,18148,18149,18151,18153,18155,18157],{"class":222,"line":10130},[122,18150,18066],{"class":233},[122,18152,17247],{"class":237},[122,18154,17342],{"class":241},[122,18156,1909],{"class":237},[122,18158,18057],{"class":241},[122,18160,18161,18163,18165,18167,18169],{"class":222,"line":10141},[122,18162,18066],{"class":233},[122,18164,17247],{"class":237},[122,18166,17125],{"class":241},[122,18168,1909],{"class":237},[122,18170,18171],{"class":241}," 81\n",[122,18173,18174],{"class":222,"line":10172},[122,18175,17365],{"class":237},[2667,18177,18178],{"id":18178},"break",[15,18180,18181],{},"用於跳出整個迴圈，結束迴圈的執行",[212,18183,18185],{"className":15447,"code":18184,"language":15449,"meta":217,"style":217},"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",[127,18186,18187,18193,18197,18203,18211,18220,18228,18232,18236,18244,18248,18257,18261,18285,18289,18316,18320,18335,18339,18358,18362,18375,18380,18384,18388,18397,18401],{"__ignoreMap":217},[122,18188,18189,18191],{"class":222,"line":223},[122,18190,15519],{"class":632},[122,18192,15522],{"class":233},[122,18194,18195],{"class":222,"line":230},[122,18196,264],{"emptyLinePlaceholder":263},[122,18198,18199,18201],{"class":222,"line":248},[122,18200,15527],{"class":632},[122,18202,16700],{"class":639},[122,18204,18205,18207,18209],{"class":222,"line":260},[122,18206,16705],{"class":237},[122,18208,15532],{"class":233},[122,18210,1984],{"class":237},[122,18212,18213,18215,18218],{"class":222,"line":267},[122,18214,16705],{"class":237},[122,18216,18217],{"class":233},"math\u002Frand",[122,18219,1984],{"class":237},[122,18221,18222,18224,18226],{"class":222,"line":273},[122,18223,16705],{"class":237},[122,18225,16716],{"class":233},[122,18227,1984],{"class":237},[122,18229,18230],{"class":222,"line":660},[122,18231,2444],{"class":639},[122,18233,18234],{"class":222,"line":672},[122,18235,264],{"emptyLinePlaceholder":263},[122,18237,18238,18240,18242],{"class":222,"line":701},[122,18239,15456],{"class":632},[122,18241,15541],{"class":233},[122,18243,9448],{"class":639},[122,18245,18246],{"class":222,"line":706},[122,18247,264],{"emptyLinePlaceholder":263},[122,18249,18250,18252,18255],{"class":222,"line":712},[122,18251,15977],{"class":632},[122,18253,18254],{"class":639}," index ",[122,18256,17099],{"class":632},[122,18258,18259],{"class":222,"line":725},[122,18260,264],{"emptyLinePlaceholder":263},[122,18262,18263,18265,18267,18269,18271,18274,18276,18278,18281,18283],{"class":222,"line":737},[122,18264,17016],{"class":632},[122,18266,18254],{"class":639},[122,18268,2421],{"class":632},[122,18270,8359],{"class":241},[122,18272,18273],{"class":639},"; index ",[122,18275,633],{"class":632},[122,18277,8223],{"class":241},[122,18279,18280],{"class":639},"; index",[122,18282,4426],{"class":632},[122,18284,9039],{"class":639},[122,18286,18287],{"class":222,"line":758},[122,18288,264],{"emptyLinePlaceholder":263},[122,18290,18291,18294,18296,18299,18302,18305,18307,18310,18313],{"class":222,"line":782},[122,18292,18293],{"class":639},"        seed ",[122,18295,15755],{"class":632},[122,18297,18298],{"class":639}," rand.",[122,18300,18301],{"class":233},"NewSource",[122,18303,18304],{"class":639},"(time.",[122,18306,16747],{"class":233},[122,18308,18309],{"class":639},"().",[122,18311,18312],{"class":233},"UnixNano",[122,18314,18315],{"class":639},"())\n",[122,18317,18318],{"class":222,"line":787},[122,18319,264],{"emptyLinePlaceholder":263},[122,18321,18322,18325,18327,18329,18332],{"class":222,"line":793},[122,18323,18324],{"class":639},"        rNum ",[122,18326,15755],{"class":632},[122,18328,18298],{"class":639},[122,18330,18331],{"class":233},"New",[122,18333,18334],{"class":639},"(seed)\n",[122,18336,18337],{"class":222,"line":807},[122,18338,264],{"emptyLinePlaceholder":263},[122,18340,18341,18344,18346,18349,18352,18354,18356],{"class":222,"line":823},[122,18342,18343],{"class":639},"        num ",[122,18345,15755],{"class":632},[122,18347,18348],{"class":639}," rNum.",[122,18350,18351],{"class":233},"Intn",[122,18353,4013],{"class":639},[122,18355,4518],{"class":241},[122,18357,2444],{"class":639},[122,18359,18360],{"class":222,"line":828},[122,18361,264],{"emptyLinePlaceholder":263},[122,18363,18364,18366,18369,18371,18373],{"class":222,"line":834},[122,18365,9512],{"class":632},[122,18367,18368],{"class":639}," num ",[122,18370,643],{"class":632},[122,18372,10081],{"class":241},[122,18374,9039],{"class":639},[122,18376,18377],{"class":222,"line":850},[122,18378,18379],{"class":632},"            break\n",[122,18381,18382],{"class":222,"line":864},[122,18383,9554],{"class":639},[122,18385,18386],{"class":222,"line":880},[122,18387,264],{"emptyLinePlaceholder":263},[122,18389,18390,18392,18394],{"class":222,"line":7632},[122,18391,16488],{"class":639},[122,18393,15781],{"class":233},[122,18395,18396],{"class":639},"(index, num)\n",[122,18398,18399],{"class":222,"line":7638},[122,18400,9436],{"class":639},[122,18402,18403],{"class":222,"line":7648},[122,18404,4526],{"class":639},[15,18406,18407],{},[19,18408,11114],{},[212,18410,18412],{"className":214,"code":18411,"language":216,"meta":217,"style":217},"0 26\n1 19\n2 59\n3 45\n4 14\n5 25\n6 50\n7 14\n",[127,18413,18414,18421,18428,18435,18441,18447,18453,18460],{"__ignoreMap":217},[122,18415,18416,18418],{"class":222,"line":223},[122,18417,4452],{"class":233},[122,18419,18420],{"class":241}," 26\n",[122,18422,18423,18425],{"class":222,"line":230},[122,18424,4021],{"class":233},[122,18426,18427],{"class":241}," 19\n",[122,18429,18430,18432],{"class":222,"line":248},[122,18431,4504],{"class":233},[122,18433,18434],{"class":241}," 59\n",[122,18436,18437,18439],{"class":222,"line":260},[122,18438,15771],{"class":233},[122,18440,17711],{"class":241},[122,18442,18443,18445],{"class":222,"line":267},[122,18444,4994],{"class":233},[122,18446,17333],{"class":241},[122,18448,18449,18451],{"class":222,"line":273},[122,18450,4187],{"class":233},[122,18452,17659],{"class":241},[122,18454,18455,18457],{"class":222,"line":660},[122,18456,17720],{"class":233},[122,18458,18459],{"class":241}," 50\n",[122,18461,18462,18464],{"class":222,"line":672},[122,18463,11010],{"class":233},[122,18465,17333],{"class":241},[2667,18467,18468],{"id":18468},"continue",[15,18470,18471],{},"用於跳過當前迴圈的剩餘部分，直接進入下一次迴圈的執行",[212,18473,18475],{"className":15447,"code":18474,"language":15449,"meta":217,"style":217},"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",[127,18476,18477,18483,18487,18493,18501,18509,18517,18521,18525,18531,18547,18561,18575,18579,18583,18591,18599,18621,18641,18653,18669,18673,18685,18716,18721,18725,18729,18760,18764,18768],{"__ignoreMap":217},[122,18478,18479,18481],{"class":222,"line":223},[122,18480,15519],{"class":632},[122,18482,15522],{"class":233},[122,18484,18485],{"class":222,"line":230},[122,18486,264],{"emptyLinePlaceholder":263},[122,18488,18489,18491],{"class":222,"line":248},[122,18490,15527],{"class":632},[122,18492,16700],{"class":639},[122,18494,18495,18497,18499],{"class":222,"line":260},[122,18496,16705],{"class":237},[122,18498,15532],{"class":233},[122,18500,1984],{"class":237},[122,18502,18503,18505,18507],{"class":222,"line":267},[122,18504,16705],{"class":237},[122,18506,18217],{"class":233},[122,18508,1984],{"class":237},[122,18510,18511,18513,18515],{"class":222,"line":273},[122,18512,16705],{"class":237},[122,18514,16716],{"class":233},[122,18516,1984],{"class":237},[122,18518,18519],{"class":222,"line":660},[122,18520,2444],{"class":639},[122,18522,18523],{"class":222,"line":672},[122,18524,264],{"emptyLinePlaceholder":263},[122,18526,18527,18529],{"class":222,"line":701},[122,18528,9219],{"class":632},[122,18530,16700],{"class":639},[122,18532,18533,18536,18539,18541,18544],{"class":222,"line":706},[122,18534,18535],{"class":241},"    RED",[122,18537,18538],{"class":632},"   =",[122,18540,1978],{"class":237},[122,18542,18543],{"class":241},"\\x1b",[122,18545,18546],{"class":237},"[31m\"\n",[122,18548,18549,18552,18554,18556,18558],{"class":222,"line":712},[122,18550,18551],{"class":241},"    GREEN",[122,18553,1909],{"class":632},[122,18555,1978],{"class":237},[122,18557,18543],{"class":241},[122,18559,18560],{"class":237},"[32m\"\n",[122,18562,18563,18566,18568,18570,18572],{"class":222,"line":725},[122,18564,18565],{"class":241},"    RESET",[122,18567,1909],{"class":632},[122,18569,1978],{"class":237},[122,18571,18543],{"class":241},[122,18573,18574],{"class":237},"[0m\"\n",[122,18576,18577],{"class":222,"line":737},[122,18578,2444],{"class":639},[122,18580,18581],{"class":222,"line":758},[122,18582,264],{"emptyLinePlaceholder":263},[122,18584,18585,18587,18589],{"class":222,"line":782},[122,18586,15456],{"class":632},[122,18588,15541],{"class":233},[122,18590,9448],{"class":639},[122,18592,18593,18595,18597],{"class":222,"line":787},[122,18594,15977],{"class":632},[122,18596,18254],{"class":639},[122,18598,17099],{"class":632},[122,18600,18601,18603,18605,18607,18609,18611,18613,18615,18617,18619],{"class":222,"line":793},[122,18602,17016],{"class":632},[122,18604,18254],{"class":639},[122,18606,2421],{"class":632},[122,18608,8359],{"class":241},[122,18610,18273],{"class":639},[122,18612,633],{"class":632},[122,18614,8223],{"class":241},[122,18616,18280],{"class":639},[122,18618,4426],{"class":632},[122,18620,9039],{"class":639},[122,18622,18623,18625,18627,18629,18631,18633,18635,18637,18639],{"class":222,"line":807},[122,18624,18293],{"class":639},[122,18626,15755],{"class":632},[122,18628,18298],{"class":639},[122,18630,18301],{"class":233},[122,18632,18304],{"class":639},[122,18634,16747],{"class":233},[122,18636,18309],{"class":639},[122,18638,18312],{"class":233},[122,18640,18315],{"class":639},[122,18642,18643,18645,18647,18649,18651],{"class":222,"line":823},[122,18644,18324],{"class":639},[122,18646,15755],{"class":632},[122,18648,18298],{"class":639},[122,18650,18331],{"class":233},[122,18652,18334],{"class":639},[122,18654,18655,18657,18659,18661,18663,18665,18667],{"class":222,"line":828},[122,18656,18343],{"class":639},[122,18658,15755],{"class":632},[122,18660,18348],{"class":639},[122,18662,18351],{"class":233},[122,18664,4013],{"class":639},[122,18666,4518],{"class":241},[122,18668,2444],{"class":639},[122,18670,18671],{"class":222,"line":834},[122,18672,264],{"emptyLinePlaceholder":263},[122,18674,18675,18677,18679,18681,18683],{"class":222,"line":850},[122,18676,9512],{"class":632},[122,18678,18368],{"class":639},[122,18680,633],{"class":632},[122,18682,10081],{"class":241},[122,18684,9039],{"class":639},[122,18686,18687,18689,18691,18693,18695,18697,18700,18702,18705,18708,18711,18713],{"class":222,"line":864},[122,18688,17181],{"class":639},[122,18690,15601],{"class":233},[122,18692,4013],{"class":639},[122,18694,2085],{"class":237},[122,18696,17190],{"class":241},[122,18698,18699],{"class":237}," 號學生的分數為 ",[122,18701,17190],{"class":241},[122,18703,18704],{"class":241}," %s",[122,18706,18707],{"class":237},"不及格",[122,18709,18710],{"class":241},"%s\\n",[122,18712,2085],{"class":237},[122,18714,18715],{"class":639},", index, num, RED, RESET)\n",[122,18717,18718],{"class":222,"line":880},[122,18719,18720],{"class":632},"            continue\n",[122,18722,18723],{"class":222,"line":7632},[122,18724,9554],{"class":639},[122,18726,18727],{"class":222,"line":7638},[122,18728,264],{"emptyLinePlaceholder":263},[122,18730,18731,18733,18735,18737,18739,18741,18743,18745,18747,18750,18753,18755,18757],{"class":222,"line":7648},[122,18732,16488],{"class":639},[122,18734,15601],{"class":233},[122,18736,4013],{"class":639},[122,18738,2085],{"class":237},[122,18740,17190],{"class":241},[122,18742,18699],{"class":237},[122,18744,17190],{"class":241},[122,18746,11184],{"class":237},[122,18748,18749],{"class":241},"%s",[122,18751,18752],{"class":237},"恭喜級格了",[122,18754,18710],{"class":241},[122,18756,2085],{"class":237},[122,18758,18759],{"class":639},", index, num, GREEN, RESET)\n",[122,18761,18762],{"class":222,"line":7662},[122,18763,9436],{"class":639},[122,18765,18766],{"class":222,"line":7667},[122,18767,264],{"emptyLinePlaceholder":263},[122,18769,18770],{"class":222,"line":7673},[122,18771,4526],{"class":639},[15,18773,18774],{},[19,18775,11114],{},[212,18777,18779],{"className":214,"code":18778,"language":216,"meta":217,"style":217},"0 號學生的分數為 38 不及格\n1 號學生的分數為 26 不及格\n2 號學生的分數為 21 不及格\n3 號學生的分數為 37 不及格\n4 號學生的分數為 58 不及格\n5 號學生的分數為 40 不及格\n6 號學生的分數為 44 不及格\n7 號學生的分數為 64，恭喜級格了\n8 號學生的分數為 93，恭喜級格了\n9 號學生的分數為 0 不及格\n",[127,18780,18781,18794,18805,18816,18827,18838,18849,18860,18869,18878],{"__ignoreMap":217},[122,18782,18783,18785,18788,18791],{"class":222,"line":223},[122,18784,4452],{"class":233},[122,18786,18787],{"class":237}," 號學生的分數為",[122,18789,18790],{"class":241}," 38",[122,18792,18793],{"class":237}," 不及格\n",[122,18795,18796,18798,18800,18803],{"class":222,"line":230},[122,18797,4021],{"class":233},[122,18799,18787],{"class":237},[122,18801,18802],{"class":241}," 26",[122,18804,18793],{"class":237},[122,18806,18807,18809,18811,18814],{"class":222,"line":248},[122,18808,4504],{"class":233},[122,18810,18787],{"class":237},[122,18812,18813],{"class":241}," 21",[122,18815,18793],{"class":237},[122,18817,18818,18820,18822,18825],{"class":222,"line":260},[122,18819,15771],{"class":233},[122,18821,18787],{"class":237},[122,18823,18824],{"class":241}," 37",[122,18826,18793],{"class":237},[122,18828,18829,18831,18833,18836],{"class":222,"line":267},[122,18830,4994],{"class":233},[122,18832,18787],{"class":237},[122,18834,18835],{"class":241}," 58",[122,18837,18793],{"class":237},[122,18839,18840,18842,18844,18847],{"class":222,"line":273},[122,18841,4187],{"class":233},[122,18843,18787],{"class":237},[122,18845,18846],{"class":241}," 40",[122,18848,18793],{"class":237},[122,18850,18851,18853,18855,18858],{"class":222,"line":660},[122,18852,17720],{"class":233},[122,18854,18787],{"class":237},[122,18856,18857],{"class":241}," 44",[122,18859,18793],{"class":237},[122,18861,18862,18864,18866],{"class":222,"line":672},[122,18863,11010],{"class":233},[122,18865,18787],{"class":237},[122,18867,18868],{"class":237}," 64，恭喜級格了\n",[122,18870,18871,18873,18875],{"class":222,"line":701},[122,18872,17951],{"class":233},[122,18874,18787],{"class":237},[122,18876,18877],{"class":237}," 93，恭喜級格了\n",[122,18879,18880,18882,18884,18886],{"class":222,"line":706},[122,18881,18066],{"class":233},[122,18883,18787],{"class":237},[122,18885,8359],{"class":241},[122,18887,18793],{"class":237},[15,18889,18890],{},[19,18891,3399],{},[15,18893,18894,18895,18897,18898,18900],{},"從上面範例結果，可以了解 ",[127,18896,18178],{}," 只是達成條件，就會跳開整個迴圈，而 ",[127,18899,18468],{},"，只會跳過此次迴圈。",[54,18902,18903],{"id":18903},"goto",[15,18905,18906,18908,18909],{},[127,18907,18903],{}," 程式執行時，無條件跳至某行執行，為確保程式邏輯清晰，程式碼易於維護，不建義使用 ",[127,18910,18903],{},[212,18912,18914],{"className":15447,"code":18913,"language":15449,"meta":217,"style":217},"go label\n\nlabel:\n  \u002F\u002F程式片段\n",[127,18915,18916,18923,18927,18932],{"__ignoreMap":217},[122,18917,18918,18920],{"class":222,"line":223},[122,18919,15449],{"class":632},[122,18921,18922],{"class":639}," label\n",[122,18924,18925],{"class":222,"line":230},[122,18926,264],{"emptyLinePlaceholder":263},[122,18928,18929],{"class":222,"line":248},[122,18930,18931],{"class":639},"label:\n",[122,18933,18934],{"class":222,"line":260},[122,18935,18936],{"class":226},"  \u002F\u002F程式片段\n",[15,18938,18939],{},[19,18940,18941],{},"範例程式",[212,18943,18945],{"className":15447,"code":18944,"language":15449,"meta":217,"style":217},"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",[127,18946,18947,18953,18957,18967,18971,18979,18983,18993,18999,19007,19015,19019,19031,19039,19043,19047,19051,19056,19069],{"__ignoreMap":217},[122,18948,18949,18951],{"class":222,"line":223},[122,18950,15519],{"class":632},[122,18952,15522],{"class":233},[122,18954,18955],{"class":222,"line":230},[122,18956,264],{"emptyLinePlaceholder":263},[122,18958,18959,18961,18963,18965],{"class":222,"line":248},[122,18960,15527],{"class":632},[122,18962,1978],{"class":237},[122,18964,15532],{"class":233},[122,18966,1984],{"class":237},[122,18968,18969],{"class":222,"line":260},[122,18970,264],{"emptyLinePlaceholder":263},[122,18972,18973,18975,18977],{"class":222,"line":267},[122,18974,15456],{"class":632},[122,18976,15541],{"class":233},[122,18978,9448],{"class":639},[122,18980,18981],{"class":222,"line":273},[122,18982,264],{"emptyLinePlaceholder":263},[122,18984,18985,18988,18990],{"class":222,"line":660},[122,18986,18987],{"class":639},"    i ",[122,18989,15755],{"class":632},[122,18991,18992],{"class":241}," 0\n",[122,18994,18995,18997],{"class":222,"line":672},[122,18996,17016],{"class":632},[122,18998,9039],{"class":639},[122,19000,19001,19004],{"class":222,"line":701},[122,19002,19003],{"class":639},"        i",[122,19005,19006],{"class":632},"++\n",[122,19008,19009,19011,19013],{"class":222,"line":706},[122,19010,16488],{"class":639},[122,19012,15781],{"class":233},[122,19014,17046],{"class":639},[122,19016,19017],{"class":222,"line":712},[122,19018,264],{"emptyLinePlaceholder":263},[122,19020,19021,19023,19025,19027,19029],{"class":222,"line":725},[122,19022,9512],{"class":632},[122,19024,17019],{"class":639},[122,19026,16478],{"class":632},[122,19028,8223],{"class":241},[122,19030,9039],{"class":639},[122,19032,19033,19036],{"class":222,"line":737},[122,19034,19035],{"class":632},"            goto",[122,19037,19038],{"class":639}," Here\n",[122,19040,19041],{"class":222,"line":758},[122,19042,9554],{"class":639},[122,19044,19045],{"class":222,"line":782},[122,19046,9436],{"class":639},[122,19048,19049],{"class":222,"line":787},[122,19050,264],{"emptyLinePlaceholder":263},[122,19052,19053],{"class":222,"line":793},[122,19054,19055],{"class":639},"Here:\n",[122,19057,19058,19060,19062,19064,19067],{"class":222,"line":807},[122,19059,15778],{"class":639},[122,19061,15781],{"class":233},[122,19063,4013],{"class":639},[122,19065,19066],{"class":237},"\"程式結束\"",[122,19068,2444],{"class":639},[122,19070,19071],{"class":222,"line":823},[122,19072,4526],{"class":639},[15,19074,19075],{},[19,19076,11114],{},[212,19078,19080],{"className":214,"code":19079,"language":216,"meta":217,"style":217},"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n和式結束\n",[127,19081,19082,19087,19092,19097,19102,19107,19112,19117,19122,19126,19131],{"__ignoreMap":217},[122,19083,19084],{"class":222,"line":223},[122,19085,19086],{"class":233},"1\n",[122,19088,19089],{"class":222,"line":230},[122,19090,19091],{"class":233},"2\n",[122,19093,19094],{"class":222,"line":248},[122,19095,19096],{"class":233},"3\n",[122,19098,19099],{"class":222,"line":260},[122,19100,19101],{"class":233},"4\n",[122,19103,19104],{"class":222,"line":267},[122,19105,19106],{"class":233},"5\n",[122,19108,19109],{"class":222,"line":273},[122,19110,19111],{"class":233},"6\n",[122,19113,19114],{"class":222,"line":660},[122,19115,19116],{"class":233},"7\n",[122,19118,19119],{"class":222,"line":672},[122,19120,19121],{"class":233},"8\n",[122,19123,19124],{"class":222,"line":701},[122,19125,15853],{"class":233},[122,19127,19128],{"class":222,"line":706},[122,19129,19130],{"class":233},"10\n",[122,19132,19133],{"class":222,"line":712},[122,19134,19135],{"class":233},"和式結束\n",[15,19137,19138],{},"以上是 go 語言中，常用的流程控制，若有遺漏或說明錯誤可以在下留言討論。",[1579,19140,19141],{},"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":217,"searchDepth":230,"depth":230,"links":19143},[19144,19145,19146,19150],{"id":16325,"depth":230,"text":16326},{"id":16613,"depth":230,"text":16613},{"id":16946,"depth":230,"text":16947,"children":19147},[19148,19149],{"id":18178,"depth":248,"text":18178},{"id":18468,"depth":248,"text":18468},{"id":18903,"depth":230,"text":18903},{},"\u002Farticles\u002F2023-03-28-flow-control","2023-03-28 17:34:00",{"title":16316,"description":217},"articles\u002F2023-03-28-flow control","這篇文章，會介紹 Go 語言中，常用的流程控制，包含 if、switch、for 等流程控制",[15449],"PX_VcjowVs0VcmxH_B9vEPuEHEYzfHxwTQKLCqRsmjU",{"id":19160,"title":19161,"body":19162,"category":5433,"description":217,"extension":1601,"image":16305,"meta":19911,"navigation":263,"path":19912,"pubDate":19913,"seo":19914,"status":263,"stem":19915,"summary":19916,"tags":19917,"__hash__":19918},"content\u002Farticles\u002F2023-03-07-go-print.md","《Go 學習筆記4》基本輸入輸出",{"type":8,"value":19163,"toc":19907},[19164,19168,19171,19191,19195,19426,19430,19483,19487,19520,19523,19537,19541,19839,19843,19904],[45,19165,19166],{},[15,19167,15438],{},[54,19169,19170],{"id":19170},"輸出",[156,19172,19173,19179,19185],{},[159,19174,19175,19178],{},[127,19176,19177],{},"print(data, data, data)","：輸出資料但不換行",[159,19180,19181,19184],{},[127,19182,19183],{},"Println(data, data, data)","：輸出資料並換行",[159,19186,19187,19190],{},[127,19188,19189],{},"Printf(\"{format}\", data)","：依照格式輸出內容",[15,19192,19193],{},[19,19194,18941],{},[212,19196,19198],{"className":15447,"code":19197,"language":15449,"meta":217,"style":217},"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",[127,19199,19200,19206,19210,19220,19224,19232,19236,19250,19254,19267,19271,19284,19288,19309,19313,19335,19339,19361,19365,19393,19397,19418,19422],{"__ignoreMap":217},[122,19201,19202,19204],{"class":222,"line":223},[122,19203,15519],{"class":632},[122,19205,15522],{"class":233},[122,19207,19208],{"class":222,"line":230},[122,19209,264],{"emptyLinePlaceholder":263},[122,19211,19212,19214,19216,19218],{"class":222,"line":248},[122,19213,15527],{"class":632},[122,19215,1978],{"class":237},[122,19217,15532],{"class":233},[122,19219,1984],{"class":237},[122,19221,19222],{"class":222,"line":260},[122,19223,264],{"emptyLinePlaceholder":263},[122,19225,19226,19228,19230],{"class":222,"line":267},[122,19227,15456],{"class":632},[122,19229,15541],{"class":233},[122,19231,9448],{"class":639},[122,19233,19234],{"class":222,"line":273},[122,19235,264],{"emptyLinePlaceholder":263},[122,19237,19238,19241,19243,19245,19248],{"class":222,"line":660},[122,19239,19240],{"class":639},"  fmt.",[122,19242,16444],{"class":233},[122,19244,4013],{"class":639},[122,19246,19247],{"class":237},"\"我是一行字串\"",[122,19249,2444],{"class":639},[122,19251,19252],{"class":222,"line":672},[122,19253,264],{"emptyLinePlaceholder":263},[122,19255,19256,19258,19260,19262,19265],{"class":222,"line":701},[122,19257,19240],{"class":639},[122,19259,15781],{"class":233},[122,19261,4013],{"class":639},[122,19263,19264],{"class":237},"\"我會換行\"",[122,19266,2444],{"class":639},[122,19268,19269],{"class":222,"line":706},[122,19270,264],{"emptyLinePlaceholder":263},[122,19272,19273,19275,19277,19279,19282],{"class":222,"line":712},[122,19274,19240],{"class":639},[122,19276,15781],{"class":233},[122,19278,4013],{"class":639},[122,19280,19281],{"class":237},"\"你看見換行了嗎\"",[122,19283,2444],{"class":639},[122,19285,19286],{"class":222,"line":725},[122,19287,264],{"emptyLinePlaceholder":263},[122,19289,19290,19292,19294,19296,19299,19301,19303,19305,19307],{"class":222,"line":737},[122,19291,19240],{"class":639},[122,19293,15601],{"class":233},[122,19295,4013],{"class":639},[122,19297,19298],{"class":237},"\"這是一個整數： ",[122,19300,15628],{"class":241},[122,19302,2085],{"class":237},[122,19304,4091],{"class":639},[122,19306,4187],{"class":241},[122,19308,2444],{"class":639},[122,19310,19311],{"class":222,"line":758},[122,19312,264],{"emptyLinePlaceholder":263},[122,19314,19315,19317,19319,19321,19324,19326,19328,19330,19333],{"class":222,"line":782},[122,19316,19240],{"class":639},[122,19318,15601],{"class":233},[122,19320,4013],{"class":639},[122,19322,19323],{"class":237},"\"這是一浮點數： ",[122,19325,16108],{"class":241},[122,19327,2085],{"class":237},[122,19329,4091],{"class":639},[122,19331,19332],{"class":241},"0.344",[122,19334,2444],{"class":639},[122,19336,19337],{"class":222,"line":787},[122,19338,264],{"emptyLinePlaceholder":263},[122,19340,19341,19343,19345,19347,19350,19353,19355,19357,19359],{"class":222,"line":793},[122,19342,19240],{"class":639},[122,19344,15601],{"class":233},[122,19346,4013],{"class":639},[122,19348,19349],{"class":237},"\"這是一個布林值： ",[122,19351,19352],{"class":241},"%t\\r\\n",[122,19354,2085],{"class":237},[122,19356,4091],{"class":639},[122,19358,16183],{"class":241},[122,19360,2444],{"class":639},[122,19362,19363],{"class":222,"line":807},[122,19364,264],{"emptyLinePlaceholder":263},[122,19366,19367,19369,19371,19373,19376,19379,19381,19383,19386,19389,19391],{"class":222,"line":823},[122,19368,19240],{"class":639},[122,19370,15601],{"class":233},[122,19372,4013],{"class":639},[122,19374,19375],{"class":237},"\"這是一個字元： ",[122,19377,19378],{"class":241},"%c\\r\\n",[122,19380,2085],{"class":237},[122,19382,4091],{"class":639},[122,19384,19385],{"class":237},"'",[122,19387,19388],{"class":241},"j",[122,19390,19385],{"class":237},[122,19392,2444],{"class":639},[122,19394,19395],{"class":222,"line":828},[122,19396,264],{"emptyLinePlaceholder":263},[122,19398,19399,19401,19403,19405,19408,19410,19412,19414,19416],{"class":222,"line":834},[122,19400,19240],{"class":639},[122,19402,15601],{"class":233},[122,19404,4013],{"class":639},[122,19406,19407],{"class":237},"\"這是一個字串： ",[122,19409,15609],{"class":241},[122,19411,2085],{"class":237},[122,19413,4091],{"class":639},[122,19415,15553],{"class":237},[122,19417,2444],{"class":639},[122,19419,19420],{"class":222,"line":850},[122,19421,264],{"emptyLinePlaceholder":263},[122,19423,19424],{"class":222,"line":864},[122,19425,4526],{"class":639},[15,19427,19428],{},[19,19429,11114],{},[212,19431,19433],{"className":214,"code":19432,"language":216,"meta":217,"style":217},"我是一行字串我會換行\n你看見換行了嗎\n這是一個整數： 5\n這是一浮點數： 0.34\n這是一個布林值： true\n這是一個字元： j\n這是一個字串： Allen\n",[127,19434,19435,19440,19445,19452,19460,19468,19476],{"__ignoreMap":217},[122,19436,19437],{"class":222,"line":223},[122,19438,19439],{"class":233},"我是一行字串我會換行\n",[122,19441,19442],{"class":222,"line":230},[122,19443,19444],{"class":233},"你看見換行了嗎\n",[122,19446,19447,19450],{"class":222,"line":248},[122,19448,19449],{"class":233},"這是一個整數：",[122,19451,5747],{"class":241},[122,19453,19454,19457],{"class":222,"line":260},[122,19455,19456],{"class":233},"這是一浮點數：",[122,19458,19459],{"class":241}," 0.34\n",[122,19461,19462,19465],{"class":222,"line":267},[122,19463,19464],{"class":233},"這是一個布林值：",[122,19466,19467],{"class":241}," true\n",[122,19469,19470,19473],{"class":222,"line":273},[122,19471,19472],{"class":233},"這是一個字元：",[122,19474,19475],{"class":237}," j\n",[122,19477,19478,19481],{"class":222,"line":660},[122,19479,19480],{"class":233},"這是一個字串：",[122,19482,15654],{"class":237},[15,19484,19485],{},[19,19486,3399],{},[353,19488,19489,19495],{},[159,19490,19491,19492,19494],{},"其中浮點數 ",[127,19493,16498],{}," 表示取到小數點第二位",[159,19496,19497,6726,19499,19501,19502],{},[127,19498,16504],{},[127,19500,4244],{}," 都是換行的控制字元\n",[353,19503,19504,19509],{},[159,19505,19506,19508],{},[127,19507,4244],{},"：在 Unix 系統中，此控制字元，表示換到下一行的開頭，在 Windows 系統中，只會進行換行",[159,19510,19511,19513,19514,19517,19518],{},[127,19512,16504],{},"：在 Windows，",[127,19515,19516],{},"\\r"," 代表 Enter 鍵，所以我們需要換到下一行的開頭時，我們必需用 ",[127,19519,16504],{},[54,19521,19522],{"id":19522},"輸入",[156,19524,19525,19531],{},[159,19526,19527,19530],{},[127,19528,19529],{},"scan(&x)","：會讀取整行輸入，並將輸入內容軟成字串型態",[159,19532,19533,19536],{},[127,19534,19535],{},"scanf(\"%d %.2f\", &x)","：可以指定輸入格式，並可一次輸入多個參數",[15,19538,19539],{},[19,19540,18941],{},[212,19542,19544],{"className":15447,"code":19543,"language":15449,"meta":217,"style":217},"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",[127,19545,19546,19552,19556,19566,19570,19578,19582,19590,19594,19604,19608,19616,19620,19628,19632,19645,19659,19672,19694,19707,19737,19741,19753,19766,19778,19782,19795,19831,19835],{"__ignoreMap":217},[122,19547,19548,19550],{"class":222,"line":223},[122,19549,15519],{"class":632},[122,19551,15522],{"class":233},[122,19553,19554],{"class":222,"line":230},[122,19555,264],{"emptyLinePlaceholder":263},[122,19557,19558,19560,19562,19564],{"class":222,"line":248},[122,19559,15527],{"class":632},[122,19561,1978],{"class":237},[122,19563,15532],{"class":233},[122,19565,1984],{"class":237},[122,19567,19568],{"class":222,"line":260},[122,19569,264],{"emptyLinePlaceholder":263},[122,19571,19572,19574,19576],{"class":222,"line":267},[122,19573,15456],{"class":632},[122,19575,15541],{"class":233},[122,19577,9448],{"class":639},[122,19579,19580],{"class":222,"line":273},[122,19581,264],{"emptyLinePlaceholder":263},[122,19583,19584,19586,19588],{"class":222,"line":660},[122,19585,15977],{"class":632},[122,19587,15980],{"class":639},[122,19589,15983],{"class":632},[122,19591,19592],{"class":222,"line":672},[122,19593,264],{"emptyLinePlaceholder":263},[122,19595,19596,19598,19601],{"class":222,"line":701},[122,19597,15977],{"class":632},[122,19599,19600],{"class":639}," age ",[122,19602,19603],{"class":632},"int8\n",[122,19605,19606],{"class":222,"line":706},[122,19607,264],{"emptyLinePlaceholder":263},[122,19609,19610,19612,19614],{"class":222,"line":712},[122,19611,15977],{"class":632},[122,19613,16000],{"class":639},[122,19615,16003],{"class":632},[122,19617,19618],{"class":222,"line":725},[122,19619,264],{"emptyLinePlaceholder":263},[122,19621,19622,19624,19626],{"class":222,"line":737},[122,19623,15977],{"class":632},[122,19625,16010],{"class":639},[122,19627,16003],{"class":632},[122,19629,19630],{"class":222,"line":758},[122,19631,264],{"emptyLinePlaceholder":263},[122,19633,19634,19636,19638,19640,19643],{"class":222,"line":782},[122,19635,15778],{"class":639},[122,19637,16444],{"class":233},[122,19639,4013],{"class":639},[122,19641,19642],{"class":237},"\"請輸入您的姓名：\"",[122,19644,2444],{"class":639},[122,19646,19647,19649,19652,19654,19656],{"class":222,"line":787},[122,19648,15778],{"class":639},[122,19650,19651],{"class":233},"Scanln",[122,19653,4013],{"class":639},[122,19655,12171],{"class":632},[122,19657,19658],{"class":639},"name)\n",[122,19660,19661,19663,19665,19667,19670],{"class":222,"line":793},[122,19662,15778],{"class":639},[122,19664,16444],{"class":233},[122,19666,4013],{"class":639},[122,19668,19669],{"class":237},"\"請輸入你的年紀：\"",[122,19671,2444],{"class":639},[122,19673,19674,19676,19679,19681,19683,19685,19687,19689,19691],{"class":222,"line":807},[122,19675,15778],{"class":639},[122,19677,19678],{"class":233},"Scanf",[122,19680,4013],{"class":639},[122,19682,2085],{"class":237},[122,19684,17190],{"class":241},[122,19686,2085],{"class":237},[122,19688,4091],{"class":639},[122,19690,12171],{"class":632},[122,19692,19693],{"class":639},"age)\n",[122,19695,19696,19698,19700,19702,19705],{"class":222,"line":823},[122,19697,15778],{"class":639},[122,19699,16444],{"class":233},[122,19701,4013],{"class":639},[122,19703,19704],{"class":237},"\"請輸入你的身高和體重：\"",[122,19706,2444],{"class":639},[122,19708,19709,19711,19713,19715,19717,19720,19723,19725,19727,19729,19732,19734],{"class":222,"line":828},[122,19710,15778],{"class":639},[122,19712,19678],{"class":233},[122,19714,4013],{"class":639},[122,19716,2085],{"class":237},[122,19718,19719],{"class":241},"%f",[122,19721,19722],{"class":241}," %f",[122,19724,2085],{"class":237},[122,19726,4091],{"class":639},[122,19728,12171],{"class":632},[122,19730,19731],{"class":639},"height, ",[122,19733,12171],{"class":632},[122,19735,19736],{"class":639},"weight)\n",[122,19738,19739],{"class":222,"line":834},[122,19740,264],{"emptyLinePlaceholder":263},[122,19742,19743,19746,19748,19750],{"class":222,"line":850},[122,19744,19745],{"class":639},"    age ",[122,19747,2421],{"class":632},[122,19749,15591],{"class":632},[122,19751,19752],{"class":639},"(age)\n",[122,19754,19755,19758,19760,19763],{"class":222,"line":864},[122,19756,19757],{"class":639},"    height ",[122,19759,2421],{"class":632},[122,19761,19762],{"class":632}," float32",[122,19764,19765],{"class":639},"(height)\n",[122,19767,19768,19771,19773,19775],{"class":222,"line":880},[122,19769,19770],{"class":639},"    weight ",[122,19772,2421],{"class":632},[122,19774,19762],{"class":632},[122,19776,19777],{"class":639},"(weight)\n",[122,19779,19780],{"class":222,"line":7632},[122,19781,264],{"emptyLinePlaceholder":263},[122,19783,19784,19786,19788,19790,19793],{"class":222,"line":7638},[122,19785,15778],{"class":639},[122,19787,15781],{"class":233},[122,19789,4013],{"class":639},[122,19791,19792],{"class":237},"\"====您輸入的內容如下=====\"",[122,19794,2444],{"class":639},[122,19796,19797,19799,19801,19803,19806,19808,19811,19814,19816,19819,19821,19824,19826,19828],{"class":222,"line":7648},[122,19798,15778],{"class":639},[122,19800,15601],{"class":233},[122,19802,4013],{"class":639},[122,19804,19805],{"class":237},"\"您的大名是： ",[122,19807,18749],{"class":241},[122,19809,19810],{"class":241}," \\r\\n",[122,19812,19813],{"class":237},"您的年齡： ",[122,19815,15628],{"class":241},[122,19817,19818],{"class":237},"您的身高： ",[122,19820,16108],{"class":241},[122,19822,19823],{"class":237},"您的體重：",[122,19825,16108],{"class":241},[122,19827,2085],{"class":237},[122,19829,19830],{"class":639},", name, age, height, weight)\n",[122,19832,19833],{"class":222,"line":7662},[122,19834,264],{"emptyLinePlaceholder":263},[122,19836,19837],{"class":222,"line":7667},[122,19838,4526],{"class":639},[15,19840,19841],{},[19,19842,11114],{},[212,19844,19846],{"className":214,"code":19845,"language":216,"meta":217,"style":217},"請輸入您的姓名：Allen\n請輸入你的年紀：25\n請輸入你的身高和體重：175 70 \n====您輸入的內容如下=====\n您的大名是： Allen \n您的年齡： 25\n您的身高： 175.00\n您的體重：70.00\n",[127,19847,19848,19853,19858,19869,19874,19884,19891,19899],{"__ignoreMap":217},[122,19849,19850],{"class":222,"line":223},[122,19851,19852],{"class":233},"請輸入您的姓名：Allen\n",[122,19854,19855],{"class":222,"line":230},[122,19856,19857],{"class":233},"請輸入你的年紀：25\n",[122,19859,19860,19863,19866],{"class":222,"line":248},[122,19861,19862],{"class":233},"請輸入你的身高和體重：175",[122,19864,19865],{"class":241}," 70",[122,19867,19868],{"class":639}," \n",[122,19870,19871],{"class":222,"line":260},[122,19872,19873],{"class":237},"====您輸入的內容如下=====\n",[122,19875,19876,19879,19882],{"class":222,"line":267},[122,19877,19878],{"class":233},"您的大名是：",[122,19880,19881],{"class":237}," Allen",[122,19883,19868],{"class":639},[122,19885,19886,19889],{"class":222,"line":273},[122,19887,19888],{"class":233},"您的年齡：",[122,19890,17659],{"class":241},[122,19892,19893,19896],{"class":222,"line":660},[122,19894,19895],{"class":233},"您的身高：",[122,19897,19898],{"class":241}," 175.00\n",[122,19900,19901],{"class":222,"line":672},[122,19902,19903],{"class":233},"您的體重：70.00\n",[1579,19905,19906],{},"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":217,"searchDepth":230,"depth":230,"links":19908},[19909,19910],{"id":19170,"depth":230,"text":19170},{"id":19522,"depth":230,"text":19522},{},"\u002Farticles\u002F2023-03-07-go-print","2023-03-07 23:26:00",{"title":19161,"description":217},"articles\u002F2023-03-07-go-print","在 Go lang 中，會使用 `fmt` 這個套件，來處理基本的輸入輸出",[15449],"qed74xM3e9OGLUD8A3VRr5d374RcyCdF1WljBm5JUi0",{"id":19920,"title":19921,"body":19922,"category":5433,"description":217,"extension":1601,"image":16305,"meta":20464,"navigation":263,"path":20465,"pubDate":20466,"seo":20467,"status":263,"stem":20468,"summary":20469,"tags":20470,"__hash__":20471},"content\u002Farticles\u002F2023-03-01-go-lang-variable.md","《Go 學習筆記2》 變數型態",{"type":8,"value":19923,"toc":20453},[19924,19928,19931,19940,19984,19989,20021,20024,20038,20042,20100,20103,20243,20246,20258,20261,20268,20271,20279,20300,20303,20311,20314,20322,20431,20435,20450],[45,19925,19926],{},[15,19927,15438],{},[54,19929,19930],{"id":19930},"變數宣告",[15,19932,19933,19934,8458,19937,19939],{},"在 Go lang 變數宣告，可使用 ",[127,19935,19936],{},"var",[127,19938,15755],{}," 兩個關鍵字，進行變數宣告。",[212,19941,19943],{"className":15447,"code":19942,"language":15449,"meta":217,"style":217},"var x int =  10\nvar y float32 = 3.1412\nvar z string = \"Hello World\"\n",[127,19944,19945,19958,19971],{"__ignoreMap":217},[122,19946,19947,19949,19951,19953,19955],{"class":222,"line":223},[122,19948,19936],{"class":632},[122,19950,15832],{"class":639},[122,19952,15823],{"class":632},[122,19954,1909],{"class":632},[122,19956,19957],{"class":241},"  10\n",[122,19959,19960,19962,19964,19966,19968],{"class":222,"line":230},[122,19961,19936],{"class":632},[122,19963,15837],{"class":639},[122,19965,16165],{"class":632},[122,19967,1909],{"class":632},[122,19969,19970],{"class":241}," 3.1412\n",[122,19972,19973,19975,19977,19979,19981],{"class":222,"line":248},[122,19974,19936],{"class":632},[122,19976,17165],{"class":639},[122,19978,16155],{"class":632},[122,19980,1909],{"class":632},[122,19982,19983],{"class":237}," \"Hello World\"\n",[15,19985,7927,19986,19988],{},[127,19987,15755],{}," 符號變數宣告時，可以省略型態，系統會自動推斷變數的型態",[212,19990,19992],{"className":15447,"code":19991,"language":15449,"meta":217,"style":217},"x := 10\ny := 3.1412\nz := \"Hello World\"\n",[127,19993,19994,20003,20012],{"__ignoreMap":217},[122,19995,19996,19999,20001],{"class":222,"line":223},[122,19997,19998],{"class":639},"x ",[122,20000,15755],{"class":632},[122,20002,17306],{"class":241},[122,20004,20005,20008,20010],{"class":222,"line":230},[122,20006,20007],{"class":639},"y ",[122,20009,15755],{"class":632},[122,20011,19970],{"class":241},[122,20013,20014,20017,20019],{"class":222,"line":248},[122,20015,20016],{"class":639},"z ",[122,20018,15755],{"class":632},[122,20020,19983],{"class":237},[15,20022,20023],{},"多變數宣告",[212,20025,20027],{"className":15447,"code":20026,"language":15449,"meta":217,"style":217},"var x, y, z int\n",[127,20028,20029],{"__ignoreMap":217},[122,20030,20031,20033,20036],{"class":222,"line":223},[122,20032,19936],{"class":632},[122,20034,20035],{"class":639}," x, y, z ",[122,20037,17099],{"class":632},[54,20039,20041],{"id":20040},"go-語言的變數型態包括","Go 語言的變數型態包括:",[156,20043,20044,20076,20084,20095],{},[159,20045,20046,20047,4091,20049,4091,20052,4091,20055,4091,20058,4091,20061,4091,20064,4091,20067,4091,20070,4091,20073],{},"整數類型: ",[127,20048,15823],{},[127,20050,20051],{},"int8",[127,20053,20054],{},"int16",[127,20056,20057],{},"int32",[127,20059,20060],{},"int64",[127,20062,20063],{},"uint",[127,20065,20066],{},"uint8",[127,20068,20069],{},"uint16",[127,20071,20072],{},"uint32",[127,20074,20075],{},"uint64",[159,20077,20078,20079,4091,20081],{},"浮點數類型: ",[127,20080,16165],{},[127,20082,20083],{},"float64",[159,20085,20086,20087,4091,20089,4091,20092],{},"字符類型: ",[127,20088,16155],{},[127,20090,20091],{},"rune",[127,20093,20094],{},"byte",[159,20096,20097,20098],{},"布林類型: ",[127,20099,16160],{},[2667,20101,20102],{"id":20102},"整數型態",[353,20104,20105,20175],{},[159,20106,20107,20109,20110],{},[127,20108,15823],{}," ： 是帶有符號的整數，可表示正數與負數\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",[62,20111,20112,20124],{},[65,20113,20114],{},[68,20115,20116,20118,20121],{},[71,20117,7739],{},[71,20119,20120],{},"大小",[71,20122,20123],{},"範圍",[81,20125,20126,20136,20146,20156,20166],{},[68,20127,20128,20130,20133],{},[86,20129,20051],{},[86,20131,20132],{},"8 bits",[86,20134,20135],{},"-128 ~ 127",[68,20137,20138,20140,20143],{},[86,20139,20054],{},[86,20141,20142],{},"16bits",[86,20144,20145],{},"-2^15 ~ 2^15-1",[68,20147,20148,20150,20153],{},[86,20149,20057],{},[86,20151,20152],{},"32bits",[86,20154,20155],{},"-2^31 ~ 2^31-1",[68,20157,20158,20160,20163],{},[86,20159,20060],{},[86,20161,20162],{},"64bits",[86,20164,20165],{},"-2^63 ~ 2^63-1",[68,20167,20168,20170,20173],{},[86,20169,15823],{},[86,20171,20172],{},"取決於平台",[86,20174,20172],{},[159,20176,20177,20180,20181],{},[127,20178,20179],{},"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",[62,20182,20183,20193],{},[65,20184,20185],{},[68,20186,20187,20189,20191],{},[71,20188,7739],{},[71,20190,20120],{},[71,20192,20123],{},[81,20194,20195,20205,20215,20225,20235],{},[68,20196,20197,20200,20202],{},[86,20198,20199],{},"unit8",[86,20201,20132],{},[86,20203,20204],{},"0 ~ 255",[68,20206,20207,20210,20212],{},[86,20208,20209],{},"unit16",[86,20211,20142],{},[86,20213,20214],{},"0 ~ 2^16 - 1",[68,20216,20217,20220,20222],{},[86,20218,20219],{},"unit32",[86,20221,20152],{},[86,20223,20224],{},"0 ~ 2^31 -1",[68,20226,20227,20230,20232],{},[86,20228,20229],{},"unit64",[86,20231,20162],{},[86,20233,20234],{},"0~ 2^63 -1",[68,20236,20237,20239,20241],{},[86,20238,20179],{},[86,20240,20172],{},[86,20242,20172],{},[2667,20244,20245],{"id":20245},"浮點數型態",[353,20247,20248,20253],{},[159,20249,20250,20252],{},[127,20251,16165],{},"：在記憶體佔用 32 位元，並以單精度浮點數格式儲存",[159,20254,20255,20257],{},[127,20256,20083],{},"：在記憶體佔用 64 位元，並以倍精度浮點數格式儲存",[2667,20259,20260],{"id":20260},"字串",[15,20262,20263,20264,20267],{},"在 Go lang 中，可以使用雙引號來宣告如 ",[127,20265,20266],{},"\"Hello World\""," 也可以使用反引號來宣告 `hello World`",[2667,20269,20270],{"id":20270},"字元",[15,20272,20273,20274,8458,20276,20278],{},"在 Go lang 中，以 ",[127,20275,20094],{},[127,20277,20091],{}," 來表示字元的變數型態",[156,20280,20281,20289],{},[159,20282,20283,20285,20286,20288],{},[127,20284,20094],{},"：是 ",[127,20287,20199],{}," 的別名，用來表示一個 8 bits 無符號正整數。它常用來表示 ASCII 碼或 UTF-8 編碼的字元。",[159,20290,20291,20285,20293,20295,20296,20299],{},[127,20292,20091],{},[127,20294,20057],{}," 的別名，用來表示一個 ",[127,20297,20298],{},"Unicode"," 碼點。它常用來表示 UTF-32 編碼的字元。",[2667,20301,20302],{"id":20302},"布林值",[15,20304,20305,20306,6726,20308],{},"Go lang 是以 bool 來宣告，其實為 ",[127,20307,16183],{},[127,20309,20310],{},"false",[54,20312,20313],{"id":20313},"型態轉換",[15,20315,20316,20317,8458,20319,20321],{},"由於 Go lang 是強型別語言，所以它不允許表達式中混合不同型態的變數。例如，我們不同直接將 ",[127,20318,20051],{},[127,20320,16165],{}," 進行相加。要解決此問題，我們必需將變數型態，改成同一種變數型態，才能進行運算。",[212,20323,20325],{"className":15447,"code":20324,"language":15449,"meta":217,"style":217},"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",[127,20326,20327,20333,20337,20347,20351,20359,20363,20375,20379,20391,20395,20414,20418,20427],{"__ignoreMap":217},[122,20328,20329,20331],{"class":222,"line":223},[122,20330,15519],{"class":632},[122,20332,15522],{"class":233},[122,20334,20335],{"class":222,"line":230},[122,20336,264],{"emptyLinePlaceholder":263},[122,20338,20339,20341,20343,20345],{"class":222,"line":248},[122,20340,15527],{"class":632},[122,20342,1978],{"class":237},[122,20344,15532],{"class":233},[122,20346,1984],{"class":237},[122,20348,20349],{"class":222,"line":260},[122,20350,264],{"emptyLinePlaceholder":263},[122,20352,20353,20355,20357],{"class":222,"line":267},[122,20354,15456],{"class":632},[122,20356,15541],{"class":233},[122,20358,9448],{"class":639},[122,20360,20361],{"class":222,"line":273},[122,20362,264],{"emptyLinePlaceholder":263},[122,20364,20365,20367,20369,20371,20373],{"class":222,"line":660},[122,20366,15977],{"class":632},[122,20368,15832],{"class":639},[122,20370,15823],{"class":632},[122,20372,1909],{"class":632},[122,20374,17306],{"class":241},[122,20376,20377],{"class":222,"line":672},[122,20378,16026],{"class":639},[122,20380,20381,20383,20385,20387,20389],{"class":222,"line":701},[122,20382,15977],{"class":632},[122,20384,15837],{"class":639},[122,20386,16165],{"class":632},[122,20388,1909],{"class":632},[122,20390,19970],{"class":241},[122,20392,20393],{"class":222,"line":706},[122,20394,16026],{"class":639},[122,20396,20397,20399,20401,20403,20405,20407,20410,20412],{"class":222,"line":712},[122,20398,15977],{"class":632},[122,20400,17165],{"class":639},[122,20402,16165],{"class":632},[122,20404,1909],{"class":632},[122,20406,19762],{"class":632},[122,20408,20409],{"class":639},"(x) ",[122,20411,377],{"class":632},[122,20413,17176],{"class":639},[122,20415,20416],{"class":222,"line":725},[122,20417,16026],{"class":639},[122,20419,20420,20422,20424],{"class":222,"line":737},[122,20421,15778],{"class":639},[122,20423,15781],{"class":233},[122,20425,20426],{"class":639},"(x, y, z)\n",[122,20428,20429],{"class":222,"line":758},[122,20430,4526],{"class":639},[15,20432,20433],{},[19,20434,11114],{},[212,20436,20438],{"className":214,"code":20437,"language":216,"meta":217,"style":217},"10 3.1412 13.1412\n",[127,20439,20440],{"__ignoreMap":217},[122,20441,20442,20444,20447],{"class":222,"line":223},[122,20443,4206],{"class":233},[122,20445,20446],{"class":241}," 3.1412",[122,20448,20449],{"class":241}," 13.1412\n",[1579,20451,20452],{},"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":217,"searchDepth":230,"depth":230,"links":20454},[20455,20456,20463],{"id":19930,"depth":230,"text":19930},{"id":20040,"depth":230,"text":20041,"children":20457},[20458,20459,20460,20461,20462],{"id":20102,"depth":248,"text":20102},{"id":20245,"depth":248,"text":20245},{"id":20260,"depth":248,"text":20260},{"id":20270,"depth":248,"text":20270},{"id":20302,"depth":248,"text":20302},{"id":20313,"depth":230,"text":20313},{},"\u002Farticles\u002F2023-03-01-go-lang-variable","2023-03-01 21:09:00",{"title":19921,"description":217},"articles\u002F2023-03-01-go-lang-variable","Go語言變數的使用",[15449],"DB-nKle0k_0j3qTQYeUi6BcZelDX2AsafhQIlZhDKi4",{"id":20473,"title":20474,"body":20475,"category":5433,"description":217,"extension":1601,"image":16305,"meta":20677,"navigation":263,"path":20678,"pubDate":20679,"seo":20680,"status":263,"stem":20681,"summary":20682,"tags":20683,"__hash__":20684},"content\u002Farticles\u002F2023-02-27-hello-world.md","《Go 學習筆記2》不免俗的 Ｈello World",{"type":8,"value":20476,"toc":20669},[20477,20481,20484,20497,20500,20507,20520,20523,20526,20585,20623,20626,20640,20643,20652,20654,20666],[45,20478,20479],{},[15,20480,15438],{},[54,20482,20483],{"id":20483},"建立專案目錄",[212,20485,20487],{"className":214,"code":20486,"language":216,"meta":217,"style":217},"mkdir go-test\n",[127,20488,20489],{"__ignoreMap":217},[122,20490,20491,20494],{"class":222,"line":223},[122,20492,20493],{"class":233},"mkdir",[122,20495,20496],{"class":237}," go-test\n",[54,20498,20499],{"id":20499},"建立程式檔",[15,20501,20502,20503,20506],{},"Go lang 的程式檔，會以 ",[127,20504,20505],{},"*.go"," 為副檔名",[212,20508,20510],{"className":214,"code":20509,"language":216,"meta":217,"style":217},"touch hello.go\n",[127,20511,20512],{"__ignoreMap":217},[122,20513,20514,20517],{"class":222,"line":223},[122,20515,20516],{"class":233},"touch",[122,20518,20519],{"class":237}," hello.go\n",[54,20521,20522],{"id":20522},"編輯程式碼",[15,20524,20525],{},"以文字編輯器或IDE開啟，輸入下列程式碼",[212,20527,20529],{"className":15447,"code":20528,"language":15449,"meta":217,"style":217},"\u002F**\n這是注解\n***\u002F\npackage main\nimport \"fmt\"\nfunc main() {\n    fmt.Println(\"Hello World\")\n}\n",[127,20530,20531,20535,20540,20545,20551,20561,20569,20581],{"__ignoreMap":217},[122,20532,20533],{"class":222,"line":223},[122,20534,14005],{"class":226},[122,20536,20537],{"class":222,"line":230},[122,20538,20539],{"class":226},"這是注解\n",[122,20541,20542],{"class":222,"line":248},[122,20543,20544],{"class":226},"***\u002F\n",[122,20546,20547,20549],{"class":222,"line":260},[122,20548,15519],{"class":632},[122,20550,15522],{"class":233},[122,20552,20553,20555,20557,20559],{"class":222,"line":267},[122,20554,15527],{"class":632},[122,20556,1978],{"class":237},[122,20558,15532],{"class":233},[122,20560,1984],{"class":237},[122,20562,20563,20565,20567],{"class":222,"line":273},[122,20564,15456],{"class":632},[122,20566,15541],{"class":233},[122,20568,9448],{"class":639},[122,20570,20571,20573,20575,20577,20579],{"class":222,"line":660},[122,20572,15778],{"class":639},[122,20574,15781],{"class":233},[122,20576,4013],{"class":639},[122,20578,20266],{"class":237},[122,20580,2444],{"class":639},[122,20582,20583],{"class":222,"line":672},[122,20584,4526],{"class":639},[156,20586,20587,20593,20599,20606,20617],{},[159,20588,20589,20592],{},[127,20590,20591],{},"\u002F**\u002F","：為多行註解",[159,20594,20595,20598],{},[127,20596,20597],{},"\u002F\u002F"," ：為單行注解",[159,20600,20601,20602,20605],{},"package：是 Go lang 來定義 namespace 的方式，可以用來避免與第三方套件名稱衝突，若所開發為應用程式，則用 ",[127,20603,20604],{},"main","，若開發的為函式庫，則由開發者自行命名。",[159,20607,20608,20610,20611,20613,20614,20616],{},[127,20609,15527],{}," ：引入函式庫用，包含 Go lang 的標準函式庫或是第三方開發的函式庫，都可以用 ",[127,20612,15527],{}," 引入，而範例中 ",[127,20615,15532],{}," 為 Go lang 的基本輸入輸出的函式庫",[159,20618,20619,20622],{},[127,20620,20621],{},"func main","：為主程式進入點，程式執行時，會先執行該段程式",[54,20624,20625],{"id":20625},"進行編譯",[212,20627,20629],{"className":214,"code":20628,"language":216,"meta":217,"style":217},"go build hello.go\n",[127,20630,20631],{"__ignoreMap":217},[122,20632,20633,20635,20638],{"class":222,"line":223},[122,20634,15449],{"class":233},[122,20636,20637],{"class":237}," build",[122,20639,20519],{"class":237},[54,20641,20642],{"id":20642},"執行程式",[212,20644,20646],{"className":214,"code":20645,"language":216,"meta":217,"style":217},".\u002Fhello\n",[127,20647,20648],{"__ignoreMap":217},[122,20649,20650],{"class":222,"line":223},[122,20651,20645],{"class":233},[54,20653,11114],{"id":11114},[212,20655,20657],{"className":214,"code":20656,"language":216,"meta":217,"style":217},"Hello world\n",[127,20658,20659],{"__ignoreMap":217},[122,20660,20661,20663],{"class":222,"line":223},[122,20662,15651],{"class":233},[122,20664,20665],{"class":237}," world\n",[1579,20667,20668],{},"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":217,"searchDepth":230,"depth":230,"links":20670},[20671,20672,20673,20674,20675,20676],{"id":20483,"depth":230,"text":20483},{"id":20499,"depth":230,"text":20499},{"id":20522,"depth":230,"text":20522},{"id":20625,"depth":230,"text":20625},{"id":20642,"depth":230,"text":20642},{"id":11114,"depth":230,"text":11114},{},"\u002Farticles\u002F2023-02-27-hello-world","2023-02-27 22:28:00",{"title":20474,"description":217},"articles\u002F2023-02-27-hello-world","Go語言一些基本操作",[15449],"AGAAFRb7gZGddzu0isU-2bKBkb4OTw3OC0QkXbImczw",{"id":20686,"title":20687,"body":20688,"category":5433,"description":217,"extension":1601,"image":16305,"meta":20994,"navigation":263,"path":20995,"pubDate":20996,"seo":20997,"status":263,"stem":20998,"summary":20999,"tags":21000,"__hash__":21001},"content\u002Farticles\u002F2023-02-26-go-lang-setup.md","《Go 學習筆記1》開發環境建置",{"type":8,"value":20689,"toc":20986},[20690,20694,20697,20701,20707,20710,20716,20722,20725,20728,20732,20741,20755,20759,20768,20782,20786,20791,20795,20821,20830,20835,20876,20885,20903,20908,20943,20946,20949,20961,20965,20983],[45,20691,20692],{},[15,20693,15438],{},[15,20695,20696],{},"先從安裝開發環境",[54,20698,20700],{"id":20699},"go-語言官網","Go 語言官網",[15,20702,20703],{},[24,20704,20705],{"href":20705,"rel":20706},"https:\u002F\u002Fgo.dev\u002F",[28],[54,20708,20709],{"id":20709},"官網下載頁",[15,20711,20712],{},[24,20713,20714],{"href":20714,"rel":20715},"https:\u002F\u002Fgo.dev\u002Fdl\u002F",[28],[15,20717,20718],{},[2494,20719],{"alt":20720,"src":20721},"alt Go語言下載","\u002Farticles\u002F2023-02-26-go-lang-setup\u002FPasted-image-20230124103550.png",[15,20723,20724],{},"基本上 Windows 和 MacOS 只要下載相對應的的版本，然後依安裝精靈，一步一步安裝裝即可。",[15,20726,20727],{},"也可以用指令安裝",[54,20729,20731],{"id":20730},"windows-指令安裝","Windows 指令安裝",[15,20733,20734,20735,20740],{},"在 Windows 環境下，要透過指令安裝，可以用安裝 ",[24,20736,20739],{"href":20737,"rel":20738},"https:\u002F\u002Fchocolatey.org\u002F",[28],"chocolate"," 後，以下面指令安裝",[212,20742,20744],{"className":214,"code":20743,"language":216,"meta":217,"style":217},"choco install golang\n",[127,20745,20746],{"__ignoreMap":217},[122,20747,20748,20750,20752],{"class":222,"line":223},[122,20749,6916],{"class":233},[122,20751,238],{"class":237},[122,20753,20754],{"class":237}," golang\n",[54,20756,20758],{"id":20757},"macos-指令安裝","MacOS 指令安裝",[15,20760,20761,20762,20767],{},"在 MacOS 環境下，則可透過 ",[24,20763,20766],{"href":20764,"rel":20765},"https:\u002F\u002Fbrew.sh\u002Findex_zh-tw",[28],"Homebrew"," 這個套件管理工具，進行安裝，指令如下：",[212,20769,20771],{"className":214,"code":20770,"language":216,"meta":217,"style":217},"brew install go\n",[127,20772,20773],{"__ignoreMap":217},[122,20774,20775,20777,20779],{"class":222,"line":223},[122,20776,234],{"class":233},[122,20778,238],{"class":237},[122,20780,20781],{"class":237}," go\n",[54,20783,20785],{"id":20784},"linux-指令安裝","Linux 指令安裝",[15,20787,20788],{},[19,20789,20790],{},"一般 Linux",[353,20792,20793],{},[159,20794,13405],{},[212,20796,20798],{"className":214,"code":20797,"language":216,"meta":217,"style":217},"wget https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo\u003C版本號>linux-amd64.tar.gz\n",[127,20799,20800],{"__ignoreMap":217},[122,20801,20802,20805,20808,20810,20813,20816,20818],{"class":222,"line":223},[122,20803,20804],{"class":233},"wget",[122,20806,20807],{"class":237}," https:\u002F\u002Fdl.google.com\u002Fgo\u002Fgo",[122,20809,633],{"class":632},[122,20811,20812],{"class":237},"版本",[122,20814,20815],{"class":639},"號",[122,20817,643],{"class":632},[122,20819,20820],{"class":237},"linux-amd64.tar.gz\n",[156,20822,20823],{},[159,20824,20825,20826,20829],{},"版本號：可至 ",[24,20827,20709],{"href":20714,"rel":20828},[28]," 查詢可安裝的版本號",[353,20831,20832],{"start":230},[159,20833,20834],{},"解壓縮",[212,20836,20838],{"className":214,"code":20837,"language":216,"meta":217,"style":217},"   sudo tar -xvf go\u003C版本號>linux-amd64.tar.gz\n   sudo mv go \u002Fusr\u002Flocal\n",[127,20839,20840,20864],{"__ignoreMap":217},[122,20841,20842,20845,20848,20851,20854,20856,20858,20860,20862],{"class":222,"line":223},[122,20843,20844],{"class":233},"   sudo",[122,20846,20847],{"class":237}," tar",[122,20849,20850],{"class":241}," -xvf",[122,20852,20853],{"class":237}," go",[122,20855,633],{"class":632},[122,20857,20812],{"class":237},[122,20859,20815],{"class":639},[122,20861,643],{"class":632},[122,20863,20820],{"class":237},[122,20865,20866,20868,20871,20873],{"class":222,"line":230},[122,20867,20844],{"class":233},[122,20869,20870],{"class":237}," mv",[122,20872,20853],{"class":237},[122,20874,20875],{"class":237}," \u002Fusr\u002Flocal\n",[353,20877,20878],{"start":248},[159,20879,20880,20881,20884],{},"設定環境變數\n在 ",[127,20882,20883],{},"~\u002F.profile"," 最後一行加上",[212,20886,20888],{"className":214,"code":20887,"language":216,"meta":217,"style":217},"   export PATH=$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[127,20889,20890],{"__ignoreMap":217},[122,20891,20892,20895,20898,20900],{"class":222,"line":223},[122,20893,20894],{"class":632},"   export",[122,20896,20897],{"class":639}," PATH",[122,20899,2421],{"class":632},[122,20901,20902],{"class":639},"$PATH:\u002Fusr\u002Flocal\u002Fgo\u002Fbin\n",[15,20904,20905],{},[19,20906,20907],{},"Ubuntu 指令安裝",[212,20909,20911],{"className":214,"code":20910,"language":216,"meta":217,"style":217},"sudo add-apt-repository ppa:longsleep\u002Fgolang-backports\nsudo apt update\nsudo apt install golang-go\n",[127,20912,20913,20923,20932],{"__ignoreMap":217},[122,20914,20915,20917,20920],{"class":222,"line":223},[122,20916,3097],{"class":233},[122,20918,20919],{"class":237}," add-apt-repository",[122,20921,20922],{"class":237}," ppa:longsleep\u002Fgolang-backports\n",[122,20924,20925,20927,20929],{"class":222,"line":230},[122,20926,3097],{"class":233},[122,20928,3100],{"class":237},[122,20930,20931],{"class":237}," update\n",[122,20933,20934,20936,20938,20940],{"class":222,"line":248},[122,20935,3097],{"class":233},[122,20937,3100],{"class":237},[122,20939,238],{"class":237},[122,20941,20942],{"class":237}," golang-go\n",[54,20944,20945],{"id":20945},"安裝環境測試",[15,20947,20948],{},"使用下列指令，即可知道安裝環境是否成功，亦可知曉安裝版本號",[212,20950,20952],{"className":214,"code":20951,"language":216,"meta":217,"style":217},"go version\n",[127,20953,20954],{"__ignoreMap":217},[122,20955,20956,20958],{"class":222,"line":223},[122,20957,15449],{"class":233},[122,20959,20960],{"class":237}," version\n",[15,20962,20963],{},[19,20964,11114],{},[212,20966,20968],{"className":214,"code":20967,"language":216,"meta":217,"style":217},"go version go1.20.1 darwin\u002Farm64\n",[127,20969,20970],{"__ignoreMap":217},[122,20971,20972,20974,20977,20980],{"class":222,"line":223},[122,20973,15449],{"class":233},[122,20975,20976],{"class":237}," version",[122,20978,20979],{"class":237}," go1.20.1",[122,20981,20982],{"class":237}," darwin\u002Farm64\n",[1579,20984,20985],{},"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":217,"searchDepth":230,"depth":230,"links":20987},[20988,20989,20990,20991,20992,20993],{"id":20699,"depth":230,"text":20700},{"id":20709,"depth":230,"text":20709},{"id":20730,"depth":230,"text":20731},{"id":20757,"depth":230,"text":20758},{"id":20784,"depth":230,"text":20785},{"id":20945,"depth":230,"text":20945},{},"\u002Farticles\u002F2023-02-26-go-lang-setup","2023-02-26 22:07:00",{"title":20687,"description":217},"articles\u002F2023-02-26-go-lang-setup","Go語言開發環境建置",[15449],"1MsaGwXGPaKjHByWDr40lLNGtsFtegUMCMt7bttsgQ8",{"id":21003,"title":21004,"body":21005,"category":13316,"description":21372,"extension":1601,"image":21373,"meta":21374,"navigation":263,"path":21375,"pubDate":21376,"seo":21377,"status":263,"stem":21378,"summary":21379,"tags":21380,"__hash__":21382},"content\u002Farticles\u002F2023-01-17-docker-postgresql-import-export.md","Docker 裡的 Postgresql 的匯入與匯出",{"type":8,"value":21006,"toc":21368},[21007,21016,21019,21026,21033,21036,21110,21142,21145,21151,21157,21160,21229,21251,21258,21260,21335,21365],[15,21008,21009,21010,21015],{},"我們可以用 ",[24,21011,21014],{"href":21012,"rel":21013},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fadminer",[28],"Adminer"," 這個資料庫管理工具，來進行匯入匯出，但檔案太大時，用 Adminer 就會顯得力不從心，而我們另外一個選擇，就是透過指令匯入匯出 SQL 檔。",[54,21017,21018],{"id":21018},"匯入",[15,21020,21021,21022,21025],{},"要將 SQL 檔案匯入到 Docker 內的 PostgreSQL 資料庫，您可以使用 ",[127,21023,21024],{},"docker exec","指令來執行 SQL 檔案。首先，確保您已經在 Docker 內運行 PostgreSQL 資料庫，並且已經知道資料庫的容器名稱。",[15,21027,21028,21029,21032],{},"而 Postgresql 要匯入 SQL 檔時，我們會使用 ",[127,21030,21031],{},"psql"," 這個指令",[15,21034,21035],{},"完整指令與參數如下：",[212,21037,21039],{"className":214,"code":21038,"language":216,"meta":217,"style":217},"docker exec -i \u003Ccontainer_name> psql -U \u003Cusername> -d \u003Cdatabase_name> -n \u003Cschema_name> \u003C \u003Csql_file>.sql\n",[127,21040,21041],{"__ignoreMap":217},[122,21042,21043,21045,21048,21050,21052,21055,21057,21059,21062,21065,21067,21070,21072,21074,21076,21078,21081,21083,21085,21087,21089,21092,21094,21096,21098,21100,21103,21105,21107],{"class":222,"line":223},[122,21044,12409],{"class":233},[122,21046,21047],{"class":237}," exec",[122,21049,8056],{"class":241},[122,21051,1083],{"class":632},[122,21053,21054],{"class":237},"container_nam",[122,21056,10924],{"class":639},[122,21058,643],{"class":632},[122,21060,21061],{"class":237}," psql",[122,21063,21064],{"class":241}," -U",[122,21066,1083],{"class":632},[122,21068,21069],{"class":237},"usernam",[122,21071,10924],{"class":639},[122,21073,643],{"class":632},[122,21075,13589],{"class":241},[122,21077,1083],{"class":632},[122,21079,21080],{"class":237},"database_nam",[122,21082,10924],{"class":639},[122,21084,643],{"class":632},[122,21086,11397],{"class":241},[122,21088,1083],{"class":632},[122,21090,21091],{"class":237},"schema_nam",[122,21093,10924],{"class":639},[122,21095,643],{"class":632},[122,21097,1083],{"class":632},[122,21099,1083],{"class":632},[122,21101,21102],{"class":237},"sql_fil",[122,21104,10924],{"class":639},[122,21106,643],{"class":632},[122,21108,21109],{"class":237},".sql\n",[156,21111,21112,21118,21124,21130,21136],{},[159,21113,21114,21117],{},[127,21115,21116],{},"container_name","：PostgreSQL 容器的名稱",[159,21119,21120,21123],{},[127,21121,21122],{},"username","：資料庫中使用的使用者名稱",[159,21125,21126,21129],{},[127,21127,21128],{},"database_name","： 資料庫名稱",[159,21131,21132,21135],{},[127,21133,21134],{},"schema_name","：要匯入 SQL 檔案的 schema 名稱",[159,21137,21138,21141],{},[127,21139,21140],{},"sql_file","：SQL 檔案 路徑",[54,21143,21144],{"id":21144},"匯出",[15,21146,21147,21148,21150],{},"要將 Docker 裡 Postgresql 服務器中的資料匯出時，我們一樣要使用 ",[127,21149,21024],{}," 這個指令，一樣我們先確認 Docker 內的 Postgresql 資料庫是正常運作。",[15,21152,21153,21154,21032],{},"而 Postgresql 要匯出 SQL 檔時，我們會使用 ",[127,21155,21156],{},"pg_dump",[15,21158,21159],{},"完整指令如下：",[212,21161,21163],{"className":214,"code":21162,"language":216,"meta":217,"style":217},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> > \u003Csql_path>.sql\n",[127,21164,21165],{"__ignoreMap":217},[122,21166,21167,21169,21171,21173,21175,21177,21179,21181,21184,21186,21188,21190,21192,21194,21196,21198,21200,21202,21204,21206,21208,21210,21212,21214,21217,21219,21222,21225,21227],{"class":222,"line":223},[122,21168,12409],{"class":233},[122,21170,21047],{"class":237},[122,21172,8056],{"class":241},[122,21174,1083],{"class":632},[122,21176,21054],{"class":237},[122,21178,10924],{"class":639},[122,21180,643],{"class":632},[122,21182,21183],{"class":237}," pg_dump",[122,21185,21064],{"class":241},[122,21187,1083],{"class":632},[122,21189,21069],{"class":237},[122,21191,10924],{"class":639},[122,21193,643],{"class":632},[122,21195,13589],{"class":241},[122,21197,1083],{"class":632},[122,21199,21069],{"class":237},[122,21201,10924],{"class":639},[122,21203,643],{"class":632},[122,21205,11397],{"class":241},[122,21207,1083],{"class":632},[122,21209,21091],{"class":237},[122,21211,10924],{"class":639},[122,21213,643],{"class":632},[122,21215,21216],{"class":632}," >",[122,21218,1083],{"class":632},[122,21220,21221],{"class":237},"sql_pat",[122,21223,21224],{"class":639},"h",[122,21226,643],{"class":632},[122,21228,21109],{"class":237},[156,21230,21231,21235,21239,21243,21247],{},[159,21232,21233,21117],{},[127,21234,21116],{},[159,21236,21237,21123],{},[127,21238,21122],{},[159,21240,21241,21129],{},[127,21242,21128],{},[159,21244,21245,21135],{},[127,21246,21134],{},[159,21248,21249,21141],{},[127,21250,21140],{},[15,21252,21253,21254,21257],{},"而我們也可以在匯出時，直接匯出 gzip 壓縮檔，只要我們加上 ",[127,21255,21256],{},"pipe line gzip"," 的指令即可",[15,21259,21159],{},[212,21261,21263],{"className":214,"code":21262,"language":216,"meta":217,"style":217},"docker exec -i \u003Ccontainer_name> pg_dump -U \u003Cusername> -d \u003Cusername> -n \u003Cschema_name> | gzip -9 > \u003Czip_path>.sql.gz\n",[127,21264,21265],{"__ignoreMap":217},[122,21266,21267,21269,21271,21273,21275,21277,21279,21281,21283,21285,21287,21289,21291,21293,21295,21297,21299,21301,21303,21305,21307,21309,21311,21313,21315,21318,21321,21323,21325,21328,21330,21332],{"class":222,"line":223},[122,21268,12409],{"class":233},[122,21270,21047],{"class":237},[122,21272,8056],{"class":241},[122,21274,1083],{"class":632},[122,21276,21054],{"class":237},[122,21278,10924],{"class":639},[122,21280,643],{"class":632},[122,21282,21183],{"class":237},[122,21284,21064],{"class":241},[122,21286,1083],{"class":632},[122,21288,21069],{"class":237},[122,21290,10924],{"class":639},[122,21292,643],{"class":632},[122,21294,13589],{"class":241},[122,21296,1083],{"class":632},[122,21298,21069],{"class":237},[122,21300,10924],{"class":639},[122,21302,643],{"class":632},[122,21304,11397],{"class":241},[122,21306,1083],{"class":632},[122,21308,21091],{"class":237},[122,21310,10924],{"class":639},[122,21312,643],{"class":632},[122,21314,3315],{"class":632},[122,21316,21317],{"class":233}," gzip",[122,21319,21320],{"class":241}," -9",[122,21322,21216],{"class":632},[122,21324,1083],{"class":632},[122,21326,21327],{"class":237},"zip_pat",[122,21329,21224],{"class":639},[122,21331,643],{"class":632},[122,21333,21334],{"class":237},".sql.gz\n",[156,21336,21337,21341,21345,21349,21353,21359],{},[159,21338,21339,21117],{},[127,21340,21116],{},[159,21342,21343,21123],{},[127,21344,21122],{},[159,21346,21347,21129],{},[127,21348,21128],{},[159,21350,21351,21135],{},[127,21352,21134],{},[159,21354,21355,21358],{},[127,21356,21357],{},"zip_path"," ：壓縮檔路徑",[159,21360,21361,21364],{},[127,21362,21363],{},"-9","：為壓縮等級，範圍為 0~9，其中 0 為不壓縮僅打包，9 為最高壓縮等級，這裡也可以不指定壓縮等級，它則會以預設 6 來進行壓縮",[1579,21366,21367],{},"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":217,"searchDepth":230,"depth":230,"links":21369},[21370,21371],{"id":21018,"depth":230,"text":21018},{"id":21144,"depth":230,"text":21144},"我們可以用 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":21004,"description":21372},"articles\u002F2023-01-17-docker-postgresql-import-export","在 Docker 的環境，如何匯入匯出 Postgresql",[21381,12410],"PostgreSQL","jNGUE7713QOJ1uS2wd7Q70oQzHSviRpYIk8u2R8U67Y",{"id":21384,"title":21385,"body":21386,"category":21796,"description":217,"extension":1601,"image":21797,"meta":21798,"navigation":263,"path":21799,"pubDate":21800,"seo":21801,"status":263,"stem":21802,"summary":21803,"tags":21804,"__hash__":21805},"content\u002Farticles\u002F2022-05-28-front-end-tool.md","2022 前端常用的套件與工具",{"type":8,"value":21387,"toc":21785},[21388,21391,21394,21397,21405,21408,21427,21437,21440,21525,21528,21542,21544,21547,21550,21555,21571,21576,21589,21594,21648,21651,21665,21671,21674,21677,21688,21691,21697,21701,21704,21710,21714,21717,21723,21727,21730,21747,21753,21756,21760,21763,21769,21773,21776,21782],[54,21389,21390],{"id":21390},"nvm",[15,21392,21393],{},"NVM 是 Node Version Manager 的縮寫，主要功能就可以快速切換 Node.js 版本。",[15,21395,21396],{},"使用場景：",[353,21398,21399,21402],{},[159,21400,21401],{},"維護多個不同時期所開發專案",[159,21403,21404],{},"編譯老舊專案",[15,21406,21407],{},"Linux \u002F MacOS 安裝方式",[212,21409,21411],{"className":214,"code":21410,"language":216,"meta":217,"style":217},"curl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh | bash\n",[127,21412,21413],{"__ignoreMap":217},[122,21414,21415,21417,21420,21423,21425],{"class":222,"line":223},[122,21416,3127],{"class":233},[122,21418,21419],{"class":241}," -o-",[122,21421,21422],{"class":237}," https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.1\u002Finstall.sh",[122,21424,3315],{"class":632},[122,21426,6460],{"class":233},[15,21428,21429,21430,21433,21434],{},"在終端機設定檔 bash 環境下編輯 ",[127,21431,21432],{},"~\u002F.bashrc"," 或 zsh 環境下編輯 ",[127,21435,21436],{},"~\u002F.zshrc",[15,21438,21439],{},"在文件內加入以下設定：",[212,21441,21443],{"className":214,"code":21442,"language":216,"meta":217,"style":217},"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",[127,21444,21445,21494],{"__ignoreMap":217},[122,21446,21447,21450,21453,21455,21458,21461,21463,21466,21469,21471,21474,21477,21480,21483,21486,21488,21491],{"class":222,"line":223},[122,21448,21449],{"class":632},"export",[122,21451,21452],{"class":639}," NVM_DIR",[122,21454,2421],{"class":632},[122,21456,21457],{"class":237},"\"$([ ",[122,21459,21460],{"class":632},"-z",[122,21462,1897],{"class":237},[122,21464,21465],{"class":639},"XDG_CONFIG_HOME-",[122,21467,21468],{"class":237},"}\" ] && ",[122,21470,13844],{"class":241},[122,21472,21473],{"class":237}," %s \"${",[122,21475,21476],{"class":639},"HOME",[122,21478,21479],{"class":237},"}\u002F.nvm\" ",[122,21481,21482],{"class":632},"||",[122,21484,21485],{"class":241}," printf",[122,21487,21473],{"class":237},[122,21489,21490],{"class":639},"XDG_CONFIG_HOME",[122,21492,21493],{"class":237},"}\u002Fnvm\")\"\n",[122,21495,21496,21499,21502,21504,21507,21510,21513,21516,21518,21520,21522],{"class":222,"line":230},[122,21497,21498],{"class":639},"[ ",[122,21500,21501],{"class":632},"-s",[122,21503,1978],{"class":237},[122,21505,21506],{"class":639},"$NVM_DIR",[122,21508,21509],{"class":237},"\u002Fnvm.sh\"",[122,21511,21512],{"class":639}," ] && ",[122,21514,21515],{"class":233},"\\.",[122,21517,1978],{"class":237},[122,21519,21506],{"class":639},[122,21521,21509],{"class":237},[122,21523,21524],{"class":226}," # This loads nvm\n",[15,21526,21527],{},"然後執行下面指令",[156,21529,21530,21536],{},[159,21531,21532,21533],{},"bash：",[127,21534,21535],{},"source ~\u002F.bashrc",[159,21537,21538,21539],{},"zsh: ",[127,21540,21541],{},"source ~\u002F.zshrc",[54,21543,7038],{"id":7038},[15,21545,21546],{},"是 Facebook 所開發的前端工具，是 Node.js 的套件管理，算是 npm 的替代品，優點是速度較快。",[15,21548,21549],{},"安裝方式：",[15,21551,21552],{},[19,21553,21554],{},"使用 npm 安裝",[212,21556,21558],{"className":214,"code":21557,"language":216,"meta":217,"style":217},"npm install -g yarn\n",[127,21559,21560],{"__ignoreMap":217},[122,21561,21562,21564,21566,21568],{"class":222,"line":223},[122,21563,6953],{"class":233},[122,21565,238],{"class":237},[122,21567,6958],{"class":241},[122,21569,21570],{"class":237}," yarn\n",[15,21572,21573],{},[19,21574,21575],{},"MacOS安裝",[212,21577,21579],{"className":214,"code":21578,"language":216,"meta":217,"style":217},"brew install yarn\n",[127,21580,21581],{"__ignoreMap":217},[122,21582,21583,21585,21587],{"class":222,"line":223},[122,21584,234],{"class":233},[122,21586,238],{"class":237},[122,21588,21570],{"class":237},[15,21590,21591],{},[19,21592,21593],{},"Ubuntu安裝",[212,21595,21597],{"className":214,"code":21596,"language":216,"meta":217,"style":217},"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",[127,21598,21599,21623,21627],{"__ignoreMap":217},[122,21600,21601,21603,21606,21609,21611,21614,21617,21619,21621],{"class":222,"line":223},[122,21602,3127],{"class":233},[122,21604,21605],{"class":241}," -sS",[122,21607,21608],{"class":237}," https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg",[122,21610,3315],{"class":632},[122,21612,21613],{"class":233}," sudo",[122,21615,21616],{"class":237}," apt-key",[122,21618,1814],{"class":237},[122,21620,8213],{"class":237},[122,21622,5727],{"class":639},[122,21624,21625],{"class":222,"line":230},[122,21626,264],{"emptyLinePlaceholder":263},[122,21628,21629,21631,21634,21637,21640,21642,21644,21646],{"class":222,"line":248},[122,21630,3097],{"class":233},[122,21632,21633],{"class":237}," apt-get",[122,21635,21636],{"class":237}," update",[122,21638,21639],{"class":639}," && ",[122,21641,3097],{"class":233},[122,21643,21633],{"class":237},[122,21645,238],{"class":237},[122,21647,21570],{"class":237},[54,21649,13339],{"id":21650},"nuxtjs",[15,21652,21653,21654,193,21657,21660,21661,21664],{},"是一個混合式 Vue 框架，支援 ",[19,21655,21656],{},"服務器渲染(SSR)",[19,21658,21659],{},"生成靜態頁面","或是",[19,21662,21663],{},"單頁應用程式(SPA)","，並優化了SEO，也支援 TypeScript。",[15,21666,12337,21667],{},[24,21668,21669],{"href":21669,"rel":21670},"https:\u002F\u002Fnuxtjs.org\u002F",[28],[54,21672,21673],{"id":21673},"tailwindcss",[15,21675,21676],{},"是一個近期相當流行的 Utility Framework，也是我近期最用的 UI 構建工具，其特色包含：",[353,21678,21679,21682,21685],{},[159,21680,21681],{},"快速上手",[159,21683,21684],{},"快速建置",[159,21686,21687],{},"高度客製化",[15,21689,21690],{},"因為以上特色，真得讓人一用就愛上了。",[15,21692,12337,21693],{},[24,21694,21695],{"href":21695,"rel":21696},"https:\u002F\u002Ftailwindcss.com\u002F",[28],[54,21698,21700],{"id":21699},"bootstrap","Bootstrap",[15,21702,21703],{},"相當知名且老牌的 UI component Framework，可以快速透過各種組件的組合建立 Web App，不過其實近期的專案，我已很少用到 Bootstrap 了。",[15,21705,12337,21706],{},[24,21707,21708],{"href":21708,"rel":21709},"https:\u002F\u002Fgetbootstrap.com\u002F",[28],[54,21711,21713],{"id":21712},"element-ui","element UI",[15,21715,21716],{},"這是我也滿喜歡的一個 UI component Framework，相對於 Bootstrap 它的組件更加豐富，特別適合拿來做管理介面。",[15,21718,12337,21719],{},[24,21720,21721],{"href":21721,"rel":21722},"https:\u002F\u002Felement.eleme.io\u002F",[28],[54,21724,21726],{"id":21725},"momentjs","Moment.js",[15,21728,21729],{},"是一個專門處理日期與時間的Library，功能包含了：",[353,21731,21732,21735,21738,21741,21744],{},[159,21733,21734],{},"日期時間格式化",[159,21736,21737],{},"日期時間相減運算",[159,21739,21740],{},"相對時間時間",[159,21742,21743],{},"時區轉換",[159,21745,21746],{},"支持多語系",[15,21748,12337,21749],{},[24,21750,21751],{"href":21751,"rel":21752},"https:\u002F\u002Fmomentjs.com\u002F",[28],[15,21754,21755],{},"對於日期時間的處理，Moment.js 幾乎都可以滿足",[54,21757,21759],{"id":21758},"lodash","Lodash",[15,21761,21762],{},"在用 javascript 做資料處理，Lodash 可以幫我們省去很多時間。",[15,21764,12337,21765],{},[24,21766,21767],{"href":21767,"rel":21768},"https:\u002F\u002Flodash.com\u002F",[28],[54,21770,21772],{"id":21771},"apache-echarts","Apache ECharts",[15,21774,21775],{},"這是一個開源的繪圖工具，當做數據分析時，需要圖表統計時，ECharts 是不錯的選擇",[15,21777,12337,21778],{},[24,21779,21780],{"href":21780,"rel":21781},"https:\u002F\u002Fecharts.apache.org\u002F",[28],[1579,21783,21784],{},"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":217,"searchDepth":230,"depth":230,"links":21786},[21787,21788,21789,21790,21791,21792,21793,21794,21795],{"id":21390,"depth":230,"text":21390},{"id":7038,"depth":230,"text":7038},{"id":21650,"depth":230,"text":13339},{"id":21673,"depth":230,"text":21673},{"id":21699,"depth":230,"text":21700},{"id":21712,"depth":230,"text":21713},{"id":21725,"depth":230,"text":21726},{"id":21758,"depth":230,"text":21759},{"id":21771,"depth":230,"text":21772},"frontend","\u002Fimages\u002Farticles\u002F2022-06-03-frontend-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-05-28-front-end-tool","2022-05-28 11:00:00",{"title":21385,"description":217},"articles\u002F2022-05-28-front-end-tool","這裡收集了我開發前端時，常用的套件與工具",[9212,8772,9030],"aULNoAsXNxW4_qR3-D3eYMi5LPuZ1DlIjYcmbq496Kw",{"id":21807,"title":21808,"body":21809,"category":3748,"description":217,"extension":1601,"image":21917,"meta":21918,"navigation":263,"path":21919,"pubDate":21920,"seo":21921,"status":263,"stem":21922,"summary":21923,"tags":21924,"__hash__":21925},"content\u002Farticles\u002F2022-04-27-develop-tool.md","開發環境工具介紹-環境篇",{"type":8,"value":21810,"toc":21908},[21811,21813,21816,21822,21826,21829,21836,21840,21843,21849,21851,21854,21860,21863,21866,21873,21875,21878,21885,21889,21900],[54,21812,12410],{"id":12409},[15,21814,21815],{},"有別於傳統虛擬機以作業系統為中心，Docker 則是以應用程式為中心，在達成虛擬化，並不需要完整載入完整的 Guest OS，而只要啟用應用層級程式及相關函式，因此其優勢，不需完整安裝 Guest OS 節省硬碟資源，另外啟用速度快，也是其最大優勢。",[15,21817,12337,21818],{},[24,21819,21821],{"href":12418,"rel":21820},[28],"Home - Docker",[54,21823,21825],{"id":21824},"laradock","Laradock",[15,21827,21828],{},"這應該在 Docker 上最完整的 PHP 開發環境。支持各版本 PHP 切換，支援主流資料庫，如 MySQL、Postgres、MariaDB及各種常用伺服器服務。",[15,21830,21831,21832],{},"官網： ",[24,21833,21834],{"href":21834,"rel":21835},"https:\u002F\u002Flaradock.io\u002F",[28],[54,21837,21839],{"id":21838},"visual-studio-code","Visual Studio Code",[15,21841,21842],{},"微軟開發的開源文字編器，相當受社群歡迎，支援 Windows、MacOS、Linux 三大主流作業系統。另外有各種插件可使用，功能不輸需要付費的IDE。",[15,21844,12337,21845],{},[24,21846,21848],{"href":12340,"rel":21847},[28],"Visual Studio Code - Code Editing. Redefined",[54,21850,12371],{"id":12370},[15,21852,21853],{},"相當知名的 Rest API 測試工具，支援各種API認證、常用的 http method，及常用 Http 的 Authorizing",[15,21855,12337,21856],{},[24,21857,21859],{"href":12379,"rel":21858},[28],"Postman API Platform | Sign Up for Free",[54,21861,21862],{"id":11430},"Git",[15,21864,21865],{},"是一個免費且開源的版控軟體，是目前最主流的版控軟體，支援MacOS、Ｗindows、Linux多平台",[15,21867,12337,21868],{},[24,21869,21872],{"href":21870,"rel":21871},"https:\u002F\u002Fgit-scm.com\u002F",[28],"Git (git-scm.com)",[54,21874,12384],{"id":12383},[15,21876,21877],{},"Git 知名的原始碼代管服務平台，所發行 Git GUI 免費軟體，目前提供 Windows 和 MacOS，介面相當友善， 對 Git 的功能支援的相當完整，很適合 Git 初心者使用。",[15,21879,12337,21880],{},[24,21881,21884],{"href":21882,"rel":21883},"https:\u002F\u002Fdesktop.github.com\u002F",[28],"GitHub Desktop | Simple collaboration from your desktop",[54,21886,21888],{"id":21887},"zsh-command-line-oh-my-zsh","zsh Command Line + oh my zsh",[15,21890,21891,21892,8458,21894,21896,21897,21899],{},"開發網站時常要用到 Command Line，雖然 ",[127,21893,6793],{},[127,21895,3061],{}," 都支援 ",[127,21898,216],{},"，但更喜歡 zsh + oh my zsh 各種插件，針對 git 優化，指令提醒功能，甚致可以顯示CPU、記憶體使用量等潮到爆的功能，你也可自訂佈景，讓你的 Command Line 呈現簡約風格。",[15,21901,21902,21903],{},"官綱：",[24,21904,21907],{"href":21905,"rel":21906},"https:\u002F\u002Fohmyz.sh\u002F",[28],"Oh My zsh官網",{"title":217,"searchDepth":230,"depth":230,"links":21909},[21910,21911,21912,21913,21914,21915,21916],{"id":12409,"depth":230,"text":12410},{"id":21824,"depth":230,"text":21825},{"id":21838,"depth":230,"text":21839},{"id":12370,"depth":230,"text":12371},{"id":11430,"depth":230,"text":21862},{"id":12383,"depth":230,"text":12384},{"id":21887,"depth":230,"text":21888},"\u002Fimages\u002Farticles\u002F2022-04-27-develop-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-27-develop-tool","2022-04-27 12:00:00",{"title":21808,"description":217},"articles\u002F2022-04-27-develop-tool","記錄自已在網站開發時，常用的工具",[3748],"vI9Ah-vhtRDUUlZPJuEb9VQPYrnvz4BqrjLqFerjxAY",{"id":21927,"title":21928,"body":21929,"category":3748,"description":217,"extension":1601,"image":22285,"meta":22286,"navigation":263,"path":22287,"pubDate":22288,"seo":22289,"status":263,"stem":22290,"summary":22291,"tags":22292,"__hash__":22293},"content\u002Farticles\u002F2022-04-10-mac-os-tool.md","大推！MacOS 上好用軟體集",{"type":8,"value":21930,"toc":22267},[21931,21935,21951,21957,21959,21979,21982,21992,21997,21999,22006,22032,22039,22042,22057,22059,22062,22079,22082,22088,22095,22099,22102,22108,22110,22116,22122,22124,22134,22139,22141,22144,22149,22153,22156,22162,22168,22170,22186,22188,22191,22196,22198,22201,22206,22210,22213,22216,22221,22225,22228,22233,22235,22238,22243,22245,22248,22253,22255,22258,22264],[54,21932,21934],{"id":21933},"homebrew","HomeBrew",[15,21936,21937,21938,21941,21942,21945,21946,21941,21949],{},"MacOS 上的套件管理，類似 ",[19,21939,21940],{},"Ubuntu"," 上的 ",[127,21943,21944],{},"apt"," 或是 ",[19,21947,21948],{},"CentOS",[127,21950,3871],{},[15,21952,12337,21953],{},[24,21954,21955],{"href":21955,"rel":21956},"https:\u002F\u002Fbrew.sh",[28],[15,21958,21549],{},[212,21960,21962],{"className":214,"code":21961,"language":216,"meta":217,"style":217},"\u002Fbin\u002Fbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[127,21963,21964],{"__ignoreMap":217},[122,21965,21966,21968,21970,21972,21974,21976],{"class":222,"line":223},[122,21967,3118],{"class":233},[122,21969,3121],{"class":241},[122,21971,3124],{"class":237},[122,21973,3127],{"class":233},[122,21975,3130],{"class":241},[122,21977,21978],{"class":237}," https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n",[54,21980,21981],{"id":12344},"iTerm2",[15,21983,21984,21985,21987,21988,21991],{},"雖然MacOS有內建terminal，但 ",[127,21986,21981],{},"更加強大，再加上 ",[127,21989,21990],{},"zsh","，真得是開發者必裝軟體",[15,21993,12337,21994],{},[24,21995,12353],{"href":12353,"rel":21996},[28],[54,21998,12642],{"id":12641},[15,22000,22001,22002,22005],{},"好用且",[19,22003,22004],{},"免費開源","的硬體監測軟體，可即時監測以下硬體資訊",[353,22007,22008,22011,22014,22017,22020,22023,22026,22029],{},[159,22009,22010],{},"CPU",[159,22012,22013],{},"RAM",[159,22015,22016],{},"GPU",[159,22018,22019],{},"DISK",[159,22021,22022],{},"溫度",[159,22024,22025],{},"網路使用狀況",[159,22027,22028],{},"電池",[159,22030,22031],{},"藍芽",[15,22033,22034,22035],{},"下載位置： ",[24,22036,22037],{"href":22037,"rel":22038},"https:\u002F\u002Fgithub.com\u002Fexelban\u002Fstats\u002Freleases",[28],[15,22040,22041],{},"HomeBrew 安裝",[212,22043,22045],{"className":214,"code":22044,"language":216,"meta":217,"style":217},"brew install --cask stats\n",[127,22046,22047],{"__ignoreMap":217},[122,22048,22049,22051,22053,22055],{"class":222,"line":223},[122,22050,234],{"class":233},[122,22052,238],{"class":237},[122,22054,242],{"class":241},[122,22056,5585],{"class":237},[54,22058,12694],{"id":12693},[15,22060,22061],{},"是 MacOS 上相當好的螢幕截圖，功能如下：",[353,22063,22064,22067,22070,22073,22076],{},[159,22065,22066],{},"區域截圖",[159,22068,22069],{},"視窗截圖",[159,22071,22072],{},"捲動截圖 (截圖網頁時，超好用 👍)",[159,22074,22075],{},"截圖標示 (可標示矩形、圓形、直線、鉛筆、馬賽克、文字、序號、高亮區塊等)",[159,22077,22078],{},"釘選螢幕 (可在截圖後，將圖片釘在螢幕上)",[15,22080,22081],{},"另外也可付費解鎖更完整的功能",[15,22083,21831,22084],{},[24,22085,22086],{"href":22086,"rel":22087},"http:\u002F\u002Fxnipapp.com\u002F",[28],[15,22089,22090,22091],{},"App Store：",[24,22092,22093],{"href":22093,"rel":22094},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fxnip\u002Fid1221250572?mt=12",[28],[54,22096,22098],{"id":22097},"couleurs","Couleurs",[15,22100,22101],{},"這是一款簡單免費的螢幕選色器，操作上相當直覺。",[15,22103,21831,22104],{},[24,22105,22106],{"href":22106,"rel":22107},"https:\u002F\u002Fcouleursapp.com\u002F",[28],[54,22109,12707],{"id":12706},[15,22111,22112,22113,22115],{},"Apple 觸控板真得很好用，但當你改用滑鼠時，就會讓你感到非常悲劇，那悲催的卡頓感，真得讓人很崩潰，而 ",[19,22114,12707],{}," 就可以改善，滑鼠在MacOS上的使用體驗。",[15,22117,12337,22118],{},[24,22119,22120],{"href":22120,"rel":22121},"https:\u002F\u002Fmos.caldis.me\u002F",[28],[54,22123,6387],{"id":12629},[15,22125,22126,22127,22130,22131,22133],{},"MacOS 在軟體解除安裝，一般是進到 ",[19,22128,22129],{},"應用程式"," 目錄程式中，直接刪除軟體即可，但必竟每個軟體設計都不同，常常刪除不乾淨，而 ",[127,22132,6387],{}," 就可以很好的解決此問題。",[15,22135,12337,22136],{},[24,22137,12637],{"href":12637,"rel":22138},[28],[54,22140,12566],{"id":12565},[15,22142,22143],{},"MacOS上強大好用的影音播放器，支援大部分的影音格式播放，不用在額外安裝各種編碼器，這個播放器一個搞定。",[15,22145,12337,22146],{},[24,22147,12574],{"href":12574,"rel":22148},[28],[54,22150,22152],{"id":22151},"hidden-bar","Hidden Bar",[15,22154,22155],{},"當裝愈來愈多常駐軟體，就會發現上方系統列的ICON愈來愈多，而這個軟體可以暫時隱藏ICON，要用到時可隨時展開",[15,22157,22034,22158],{},[24,22159,22160],{"href":22160,"rel":22161},"https:\u002F\u002Fgithub.com\u002Fdwarvesf\u002Fhidden\u002Freleases",[28],[15,22163,22090,22164],{},[24,22165,22166],{"href":22166,"rel":22167},"https:\u002F\u002Fapps.apple.com\u002Ftw\u002Fapp\u002Fhidden-bar\u002F",[28],[15,22169,22041],{},[212,22171,22173],{"className":214,"code":22172,"language":216,"meta":217,"style":217},"brew install --cask hiddenbar\n",[127,22174,22175],{"__ignoreMap":217},[122,22176,22177,22179,22181,22183],{"class":222,"line":223},[122,22178,234],{"class":233},[122,22180,238],{"class":237},[122,22182,242],{"class":241},[122,22184,22185],{"class":237}," hiddenbar\n",[54,22187,21839],{"id":21838},[15,22189,22190],{},"目前在程式開發上，站長使用的程式碼編輯器，擁有各類插件，可以加快開發速度。",[15,22192,12337,22193],{},[24,22194,12340],{"href":12340,"rel":22195},[28],[54,22197,12397],{"id":12396},[15,22199,22200],{},"雖雖 vscode 很強大，但有時讓人覺得有點肥大，若只是臨時要編輯文字檔，我會用這款輕量編輯器",[15,22202,12337,22203],{},[24,22204,12405],{"href":12405,"rel":22205},[28],[54,22207,22209],{"id":22208},"keka-壓縮軟體","KeKa 壓縮軟體",[15,22211,22212],{},"這是 MacOS 我用過最好用的壓縮軟體，支援多種壓縮格式，密碼保護，分片壓縮等功能，其中最棒是可「排除 MacOS 資源檔」檔的功能。",[15,22214,22215],{},"在以往直接在 MacOS 打包壓縮的檔案，在 Windows 環境下打開，總會多出一些讓使用者迷惑的檔案，而這個功能就會幫忙先排除這檔案。",[15,22217,12337,22218],{},[24,22219,12596],{"href":12596,"rel":22220},[28],[54,22222,22224],{"id":22223},"shottr","Shottr",[15,22226,22227],{},"另一款螢幕截圖軟體，除了一般截圖功能、馬賽克、OCR、釘圖、螢幕選色器 等功能。",[15,22229,12337,22230],{},[24,22231,12689],{"href":12689,"rel":22232},[28],[54,22234,12733],{"id":12732},[15,22236,22237],{},"MacOS 對於外接螢幕，相當不友善，無法用熱健去控制外接螢幕的亮度和音量，而 BetterDisplay 則可以解決這些問題。",[15,22239,12337,22240],{},[24,22241,12741],{"href":12741,"rel":22242},[28],[54,22244,12358],{"id":12357},[15,22246,22247],{},"支援 M1 晶片的虛擬機，除了以接近本機的速度在Apple Silicon上運行ARM64操作系統，在英特爾 Mac 上，x86\u002Fx64 作業系統可以虛擬化。",[15,22249,12901,22250],{},[24,22251,12366],{"href":12366,"rel":22252},[28],[54,22254,12655],{"id":12654},[15,22256,22257],{},"一款能大幅提升你工作效率的 Mac 軟體，可以取代 Spotlight，且功能更加狂大。",[15,22259,12901,22260],{},[24,22261,22262],{"href":22262,"rel":22263},"https:\u002F\u002Fwww.raycast.com\u002F",[28],[1579,22265,22266],{},"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":217,"searchDepth":230,"depth":230,"links":22268},[22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284],{"id":21933,"depth":230,"text":21934},{"id":12344,"depth":230,"text":21981},{"id":12641,"depth":230,"text":12642},{"id":12693,"depth":230,"text":12694},{"id":22097,"depth":230,"text":22098},{"id":12706,"depth":230,"text":12707},{"id":12629,"depth":230,"text":6387},{"id":12565,"depth":230,"text":12566},{"id":22151,"depth":230,"text":22152},{"id":21838,"depth":230,"text":21839},{"id":12396,"depth":230,"text":12397},{"id":22208,"depth":230,"text":22209},{"id":22223,"depth":230,"text":22224},{"id":12732,"depth":230,"text":12733},{"id":12357,"depth":230,"text":12358},{"id":12654,"depth":230,"text":12655},"\u002Fimages\u002Farticles\u002F2022-04-10-mas-os-tool\u002Fcover.png",{},"\u002Farticles\u002F2022-04-10-mac-os-tool","2022-04-10 12:00:00",{"title":21928,"description":217},"articles\u002F2022-04-10-mac-os-tool","這裡收集了，站長在 MacOS 上常用的軟體",[6793,3748],"LdwPGKbfWnAayVtGNscPJXvm97oroNn4Ipb5HjBSj7E",{"id":22295,"title":22296,"body":22297,"category":5433,"description":217,"extension":1601,"image":22746,"meta":22747,"navigation":263,"path":22748,"pubDate":22749,"seo":22750,"status":263,"stem":22751,"summary":22752,"tags":22753,"__hash__":22754},"content\u002Farticles\u002F2022-03-26-php-zip.md","PHP 產生壓縮檔",{"type":8,"value":22298,"toc":22741},[22299,22302,22310,22316,22342,22345,22350,22411,22417,22420,22434,22439,22456,22459,22467,22472,22489,22491,22504,22509,22526,22528,22542,22547,22564,22566,22574,22579,22596,22598,22606,22611,22628,22630,22644,22649,22665,22668,22672,22722,22726,22739],[54,22300,22301],{"id":22301},"需求",[156,22303,22304,22307],{},[159,22305,22306],{},"php5.2 以上版本",[159,22308,22309],{},"安裝 zip 庫",[15,22311,22312,22313,22315],{},"以 ",[127,22314,21940],{}," 為例：",[212,22317,22319],{"className":214,"code":22318,"language":216,"meta":217,"style":217},"sudo apt update\nsudo apt install -y php7.4-zip\n",[127,22320,22321,22329],{"__ignoreMap":217},[122,22322,22323,22325,22327],{"class":222,"line":223},[122,22324,3097],{"class":233},[122,22326,3100],{"class":237},[122,22328,20931],{"class":237},[122,22330,22331,22333,22335,22337,22339],{"class":222,"line":230},[122,22332,3097],{"class":233},[122,22334,3100],{"class":237},[122,22336,238],{"class":237},[122,22338,3835],{"class":241},[122,22340,22341],{"class":237}," php7.4-zip\n",[54,22343,22344],{"id":22344},"壓縮範例程式",[15,22346,22347],{},[19,22348,22349],{},"產生壓縮檔",[212,22351,22353],{"className":3997,"code":22352,"language":3944,"meta":217,"style":217},"\u003C?php\n\u002F\u002Fnew ZipArchive 物件\n$zip = new ZipArchive;\n\n$zip->open('new.zip', ZipArchive::CREATE);\n\n",[127,22354,22355,22362,22367,22381,22385],{"__ignoreMap":217},[122,22356,22357,22359],{"class":222,"line":223},[122,22358,4005],{"class":632},[122,22360,22361],{"class":241},"php\n",[122,22363,22364],{"class":222,"line":230},[122,22365,22366],{"class":226},"\u002F\u002Fnew ZipArchive 物件\n",[122,22368,22369,22372,22374,22376,22379],{"class":222,"line":248},[122,22370,22371],{"class":639},"$zip ",[122,22373,2421],{"class":632},[122,22375,4038],{"class":632},[122,22377,22378],{"class":241}," ZipArchive",[122,22380,4249],{"class":639},[122,22382,22383],{"class":222,"line":260},[122,22384,264],{"emptyLinePlaceholder":263},[122,22386,22387,22390,22392,22395,22397,22400,22402,22405,22407,22409],{"class":222,"line":267},[122,22388,22389],{"class":639},"$zip",[122,22391,4080],{"class":632},[122,22393,22394],{"class":233},"open",[122,22396,4013],{"class":639},[122,22398,22399],{"class":237},"'new.zip'",[122,22401,4091],{"class":639},[122,22403,22404],{"class":241},"ZipArchive",[122,22406,13857],{"class":632},[122,22408,13072],{"class":241},[122,22410,4024],{"class":639},[15,22412,1829,22413,22416],{},[127,22414,22415],{},"$zip->open()"," 第一參數為要產壓縮檔路徑",[15,22418,22419],{},"第二參數為產生檔案的模式",[353,22421,22422,22428],{},[159,22423,22424,22427],{},[127,22425,22426],{},"ZipArchive::CREATE","：產生新檔案",[159,22429,22430,22433],{},[127,22431,22432],{},"ZipArchive::OVERWRITE",": 若壓縮檔存在，則覆蓋檔案",[15,22435,22436],{},[19,22437,22438],{},"加入一個空資料夾",[212,22440,22442],{"className":3997,"code":22441,"language":3944,"meta":217,"style":217},"$zip->addEmptyDir($dirname);\n",[127,22443,22444],{"__ignoreMap":217},[122,22445,22446,22448,22450,22453],{"class":222,"line":223},[122,22447,22389],{"class":639},[122,22449,4080],{"class":632},[122,22451,22452],{"class":233},"addEmptyDir",[122,22454,22455],{"class":639},"($dirname);\n",[15,22457,22458],{},"參數說明",[353,22460,22461],{},[159,22462,22463,22466],{},[127,22464,22465],{},"$dirname"," 資料夾名稱",[15,22468,22469],{},[19,22470,22471],{},"將檔案加入壓縮檔",[212,22473,22475],{"className":3997,"code":22474,"language":3944,"meta":217,"style":217},"$zip->addaddFile($filePath, $newFileName);\n",[127,22476,22477],{"__ignoreMap":217},[122,22478,22479,22481,22483,22486],{"class":222,"line":223},[122,22480,22389],{"class":639},[122,22482,4080],{"class":632},[122,22484,22485],{"class":233},"addaddFile",[122,22487,22488],{"class":639},"($filePath, $newFileName);\n",[15,22490,22458],{},[353,22492,22493,22498],{},[159,22494,22495,22497],{},[127,22496,4238],{}," 為檔案路徑",[159,22499,22500,22503],{},[127,22501,22502],{},"$newFileName"," 重新命名 (選填)",[15,22505,22506],{},[19,22507,22508],{},"將字串加入文字檔並壓縮",[212,22510,22512],{"className":3997,"code":22511,"language":3944,"meta":217,"style":217},"$zip->addFromString($filename, $content);\n",[127,22513,22514],{"__ignoreMap":217},[122,22515,22516,22518,22520,22523],{"class":222,"line":223},[122,22517,22389],{"class":639},[122,22519,4080],{"class":632},[122,22521,22522],{"class":233},"addFromString",[122,22524,22525],{"class":639},"($filename, $content);\n",[15,22527,22458],{},[353,22529,22530,22536],{},[159,22531,22532,22535],{},[127,22533,22534],{},"$filename"," 檔案名稱",[159,22537,22538,22541],{},[127,22539,22540],{},"$content"," 文字內容",[15,22543,22544],{},[19,22545,22546],{},"依索引刪除檔案",[212,22548,22550],{"className":3997,"code":22549,"language":3944,"meta":217,"style":217},"$zip->deleteIndex($index);\n",[127,22551,22552],{"__ignoreMap":217},[122,22553,22554,22556,22558,22561],{"class":222,"line":223},[122,22555,22389],{"class":639},[122,22557,4080],{"class":632},[122,22559,22560],{"class":233},"deleteIndex",[122,22562,22563],{"class":639},"($index);\n",[15,22565,22458],{},[353,22567,22568],{},[159,22569,22570,22573],{},[127,22571,22572],{},"$index"," 刪除索引的檔案",[15,22575,22576],{},[19,22577,22578],{},"依檔名刪除檔案",[212,22580,22582],{"className":3997,"code":22581,"language":3944,"meta":217,"style":217},"$zip->deleteName($name);\n",[127,22583,22584],{"__ignoreMap":217},[122,22585,22586,22588,22590,22593],{"class":222,"line":223},[122,22587,22389],{"class":639},[122,22589,4080],{"class":632},[122,22591,22592],{"class":233},"deleteName",[122,22594,22595],{"class":639},"($name);\n",[15,22597,22458],{},[353,22599,22600],{},[159,22601,22602,22605],{},[127,22603,22604],{},"$name"," 刪除檔案名稱",[15,22607,22608],{},[19,22609,22610],{},"更改檔名",[212,22612,22614],{"className":3997,"code":22613,"language":3944,"meta":217,"style":217},"$zip->renameName($oldName, $newName);\n",[127,22615,22616],{"__ignoreMap":217},[122,22617,22618,22620,22622,22625],{"class":222,"line":223},[122,22619,22389],{"class":639},[122,22621,4080],{"class":632},[122,22623,22624],{"class":233},"renameName",[122,22626,22627],{"class":639},"($oldName, $newName);\n",[15,22629,22458],{},[353,22631,22632,22638],{},[159,22633,22634,22637],{},[127,22635,22636],{},"$oldName"," 原本檔名",[159,22639,22640,22643],{},[127,22641,22642],{},"$newName"," 新檔名",[15,22645,22646],{},[19,22647,22648],{},"關閉壓縮檔",[212,22650,22652],{"className":3997,"code":22651,"language":3944,"meta":217,"style":217},"$zip->close();\n",[127,22653,22654],{"__ignoreMap":217},[122,22655,22656,22658,22660,22663],{"class":222,"line":223},[122,22657,22389],{"class":639},[122,22659,4080],{"class":632},[122,22661,22662],{"class":233},"close",[122,22664,4223],{"class":639},[54,22666,22667],{"id":22667},"解壓縮程式",[15,22669,22670],{},[19,22671,18941],{},[212,22673,22675],{"className":3997,"code":22674,"language":3944,"meta":217,"style":217},"$zip = new ZipArchive;\n$zip->open($zipFile);\n$zip->extractTo($filePath);\n$zip->close();\n",[127,22676,22677,22689,22700,22712],{"__ignoreMap":217},[122,22678,22679,22681,22683,22685,22687],{"class":222,"line":223},[122,22680,22371],{"class":639},[122,22682,2421],{"class":632},[122,22684,4038],{"class":632},[122,22686,22378],{"class":241},[122,22688,4249],{"class":639},[122,22690,22691,22693,22695,22697],{"class":222,"line":230},[122,22692,22389],{"class":639},[122,22694,4080],{"class":632},[122,22696,22394],{"class":233},[122,22698,22699],{"class":639},"($zipFile);\n",[122,22701,22702,22704,22706,22709],{"class":222,"line":248},[122,22703,22389],{"class":639},[122,22705,4080],{"class":632},[122,22707,22708],{"class":233},"extractTo",[122,22710,22711],{"class":639},"($filePath);\n",[122,22713,22714,22716,22718,22720],{"class":222,"line":260},[122,22715,22389],{"class":639},[122,22717,4080],{"class":632},[122,22719,22662],{"class":233},[122,22721,4223],{"class":639},[15,22723,22724],{},[19,22725,22458],{},[353,22727,22728,22734],{},[159,22729,22730,22733],{},[127,22731,22732],{},"$zipFile"," 壓縮檔位置",[159,22735,22736,22738],{},[127,22737,4238],{}," 解壓縮檔路徑",[1579,22740,12093],{},{"title":217,"searchDepth":230,"depth":230,"links":22742},[22743,22744,22745],{"id":22301,"depth":230,"text":22301},{"id":22344,"depth":230,"text":22344},{"id":22667,"depth":230,"text":22667},"\u002Fimages\u002Farticles\u002F2022-03-26-php-zip\u002Fcover.png",{},"\u002Farticles\u002F2022-03-26-php-zip","2022-03-26 11:00:00",{"title":22296,"description":217},"articles\u002F2022-03-26-php-zip","在某些需求，如要讓使用者下載多個檔案時，我們可以打包成一個檔案供用戶下載，或是檔案太大，可以壓縮檔案已減少頻寛。",[3944],"axPiVBtvCJExqY5-9kjtwpxNVXxvivHDhw3IsOl0YXs",[22756],{"title":6,"pubDate":1605,"path":1604,"summary":1608,"tags":22757,"image":1602,"category":1599},[1610,1611,1612,1613,1614],1793603539535]