[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-rust-forum-week-25-turns-ideas-into-shipping-work-zh":3,"article-related-rust-forum-week-25-turns-ideas-into-shipping-work-zh":30,"series-tools-1e47b8fc-1eab-4342-83bd-a270d59a41f9":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"1e47b8fc-1eab-4342-83bd-a270d59a41f9","rust-forum-week-25-turns-ideas-into-shipping-work-zh","Rust 論壇週報把想法變交付","\u003Cp data-speakable=\"summary\">我把這篇 \u003Ca href=\"\u002Ftag\u002Frust\">Rust\u003C\u002Fa> 論壇週報拆成可直接抄的做法：測試生成器、隔離 GUI 狀態、整理錯誤 crate、還有把小\u003Ca href=\"\u002Fnews\u002Fopen-source-tools-vibe-coding-cybersecurity-zh\">工具\u003C\u002Fa>做成真的能用。\u003C\u002Fp>\u003Cp>我看 Rust 論壇每週進度串看了一陣子，這篇最對味。不是那種「我發了版，大家鼓掌」的貼文，而是很誠實地把卡住的地方攤開來：生成器要補測試、GUI 要跟 daemon 對話、錯誤 crate 想保留型別又不想把自己寫成一坨、還有一個只花幾小時的小 applet，結果反而真的有人會用。這種內容我最愛，因為它不像簡報，像是在承認：工具從來不是做完就好，是做得住才算數。\u003C\u002Fp>\u003Cp>我拆的是 Rust Programming Language Forum 的 \u003Ca href=\"https:\u002F\u002Fusers.rust-lang.org\u002Ft\u002Fwhats-everyone-working-on-this-week-25-2026\u002F140724\">What’s everyone working on this week (25\u002F2026)?\u003C\u002Fa>。這串沒有單一結論，反而更有料。你可以直接看到不同 Rust 專案怎麼脫困：加測試、把狀態切乾淨、少用 unsafe、把 IPC event 命名講清楚，還有別再假裝「小工具」不會長出真正的結構。\u003C\u002Fp>\u003Ch2>1) 生成器要先能驗證，不然你只是會吐檔案\u003C\u002Fh2>\u003Cblockquote>\"I'm continuing to work on xidl , a code generator for generate HTTP server and client code. I recently added BDD tests to xidl to ensure consistency across multi-language implementations.\"\u003C\u002Fblockquote>\u003Cp>翻譯一下就是：如果你的工具會輸出多種語言的程式碼，你就不能只靠肉眼看結果。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcathaysia\u002Fxidl\">xidl\u003C\u002Fa> 的作者 cathaysia 加了 BDD tests，重點不是「有測試很棒」，而是他已經碰到真正的失敗模式：不同語言實作開始慢慢長歪。A 語言的預設 header 跟 B 語言不一樣，A 的錯誤處理跟 B 的 retry 路徑不同，最後你以為自己在做 generator，其實是在養一台漂移機器。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781857111111-md5g.png\" alt=\"Rust 論壇週報把想法變交付\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我自己也踩過這種坑。第一版工具都很順，因為你只支援一個 target，還能手動看輸出。問題是使用者一旦要求第二個 runtime，整個專案就變形了。它不再只是「產生檔案」，而是「保證各 target 行為一致」。這時候如果沒有測試，你根本不知道哪個版本才是正確答案。\u003C\u002Fp>\u003Cp>BDD 在這裡特別適合，因為你不是在驗單一函式，而是在驗場景：同一份 schema 丟進去，server\u002Fclient artifacts 出來，而且跨 target 的行為要一致。這種測試很土，但很有效。比起堆一堆抽象，我寧願先看到三個會真的踩到的情境。\u003C\u002Fp>\u003Cp>實操寫法我會這樣做：\u003C\u002Fp>\u003Cul>\u003Cli>先挑真實 API 形狀做 fixture，不要只做理想範例。\u003C\u002Fli>\u003Cli>同一份 input，對所有支援 target 跑一遍。\u003C\u002Fli>\u003Cli>比對行為，不只比對檔案有沒有生成。\u003C\u002Fli>\u003Cli>先鎖住最容易分歧的地方：optional fields、streaming、auth、retries。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果你在做 generator，我寧可看見三個醜但完整的 BDD scenario，也不要看見五十個沒驗證的抽象層。scenario 會告訴我，你到底以為這工具在幹嘛。\u003C\u002Fp>\u003Ch2>2) 你以為是移植，其實是重寫加決策\u003C\u002Fh2>\u003Cblockquote>\"Translating a 1978 BASIC program to rust - Lunar Lander . The original is only 70 loc - the rust version is 3-4 times longer - not counting a genetic algorithm I'm adding to find optimal landing sequences.\"\u003C\u002Fblockquote>\u003Cp>這段很誠實，也很刺眼。原本 BASIC 只有 70 行，Rust 版本已經長到 3 到 4 倍，還沒算上作者要加的 genetic algorithm。這不是 Rust 膨脹，是現實本來就這樣。你一旦從「短短一段腳本」變成「型別清楚、可維護、可擴充」的版本，行數就會上去。你再加搜尋或最佳化，行數繼續上去。這不是壞事，這是代價。\u003C\u002Fp>\u003Cp>也就是說，移植從來不是純搬家。你是在翻譯原始行為，還要順手把原本藏在程式形狀裡的假設攤開。BASIC 版可能把很多東西寫死了，在 Rust 裡你得明確決定：單位怎麼定、狀態放哪、怎麼保證模擬可重現。這些都不是「額外工作」，這些就是把程式變成專案的那一段。\u003C\u002Fp>\u003Cp>我以前重寫過一個小型 physics toy，原始版本在 script 語言裡很快就能跑。搬到 Rust 之後，光是決定單位系統、狀態邊界、deterministic 行為，就花了不少時間。可是當我後面真的要加 search、tuning、比較不同策略時，這些結構全部都救了我。原本看起來像拖慢進度的東西，後來都變成可以繼續擴的骨架。\u003C\u002Fp>\u003Cp>我會這樣實操：\u003C\u002Fp>\u003Cul>\u003Cli>把「忠實移植」和「新增功能」切成兩個明確階段。\u003C\u002Fli>\u003Cli>保留原始行為的測試殼，不要直接拿新功能蓋過去。\u003C\u002Fli>\u003Cli>把新演算法獨立成 module，不要塞滿 helper function。\u003C\u002Fli>\u003Cli>先驗 correctness，再談優化搜尋路徑。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>所以我看這種專案時，不會問「怎麼比原本長這麼多」。我會問：你有沒有把原本隱藏的假設，變成現在看得懂、能改、能測的東西。\u003C\u002Fp>\u003Ch2>3) GUI 不是畫面問題，是事件路由問題\u003C\u002Fh2>\u003Cblockquote>\"Polishing ringdrop-gui , the Tauri v2 frontend for ringdrop daemon. This week: adapting to a new daemon IPC event ( FileProgress ) during directory transfers, and namespacing progress channels by blob hash so concurrent downloads are possible.\"\u003C\u002Fblockquote>\u003Cp>這段我一看就懂，因為這種 bug 很煩。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftauri-apps\u002Ftauri\">Tauri v2\u003C\u002Fa> 前端不是單純補 UI，而是要跟 daemon 的 IPC event 對齊。重點在新事件 \u003Ccode>FileProgress\u003C\u002Fcode>，還有把 progress channel 用 blob hash 做 namespace，這樣才能同時處理多個下載。這聽起來很小，但只要你做過多工下載，就知道不 namespace 的後果有多噁心：進度條互相污染、狀態被覆蓋、最後你根本不知道哪一筆在更新。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781857105857-mbxb.png\" alt=\"Rust 論壇週報把想法變交付\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>白話一點說，GUI state 其實就是 routing 問題。你如果沒替每個長任務配一個\u003Ca href=\"\u002Fnews\u002Fstate-street-launches-stablecoin-reserve-fund-zh\">穩定\u003C\u002Fa> ID，就等於假設一次只能有一件事在跑。這種假設通常只活到第一個真使用者出現。daemon 發出事件、frontend 收到事件，接下來不是「顯示一下就好」，而是要能精準對回對應工作項目。blob hash 這種 key 的價值就在這裡：它讓事件有身份，不會亂串。\u003C\u002Fp>\u003Cp>我以前做桌面工具也踩過一樣的坑。後端跑得比前端快，結果 UI 看起來像在抽風。不是 architecture 大錯，而是你把事件當廣播，沒把它當 scoped message。修法通常很無聊，但很有效：把 job、progress、error 全部綁在同一個 ID 上，然後別讓不同工作共用一個狀態槽。\u003C\u002Fp>\u003Cp>實操寫法我會這樣做：\u003C\u002Fp>\u003Cul>\u003Cli>每個長任務都給穩定 ID，不要靠陣列位置。\u003C\u002Fli>\u003Cli>progress、log、error 都用同一個 ID namespace。\u003C\u002Fli>\u003Cli>新 IPC event 先當 state transition，不要先當通知。\u003C\u002Fli>\u003Cli>先測兩個 concurrent jobs，再說你完成了。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這種東西最容易被低估。等你真的讓兩個下載同時跑起來，才會知道「把事件分清楚」不是優化，是保命。\u003C\u002Fp>\u003Ch2>4) 小工具能活下來，靠的是位置，不是雄心\u003C\u002Fh2>\u003Cblockquote>\"Theme mode applet for cosmic Hi, I made an applet for cosmic DE to switch between light and dark mode easily from the taskbar. Only a few hours work but I think it may be useful.\"\u003C\u002Fblockquote>\u003Cp>這個 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpop-os\u002Fcosmic\">COSMIC DE\u003C\u002Fa> applet 很樸素，但我覺得很對。從 taskbar 一鍵切 light\u002Fdark mode，功能小到不能再小，卻剛好打中一個重複動作。這種工具最常被錯估，因為大家總覺得價值要來自複雜度。其實不是。很多時候價值來自你把控制放在對的位置，讓使用者不用再去設定頁裡翻半天。\u003C\u002Fp>\u003Cp>也就是說，小 applet 的重點不是它有多厲害，而是它是不是貼著高頻動作。你每天都要切 theme，那就別把開關藏起來。你每次都要找三層選單，那這工具就算做得再漂亮也沒用。對使用者來說，省一次滑鼠移動，比多一個 fancy 功能實際太多了。\u003C\u002Fp>\u003Cp>我自己也做過這種小桌面 helper。寫的時候常常覺得：「這也太小了吧？」但真正上手之後才發現，interaction design 比 \u003Ca href=\"\u002Fnews\u002Fclaude-code-rust-native-terminal-interface-zh\">code\u003C\u002Fa> 本身重要。只要它在對的地方，使用者就會把它變成習慣。反過來說，UI 再花俏，只要多一個步驟，大家就懶得碰。\u003C\u002Fp>\u003Cp>我會這樣實操：\u003C\u002Fp>\u003Cul>\u003Cli>只挑一個高頻動作，先把它做到底。\u003C\u002Fli>\u003Cli>把 UI surface 壓到最小。\u003C\u002Fli>\u003Cli>讓 applet 重啟後不用重設。\u003C\u002Fli>\u003Cli>先 ship 可用版本，再慢慢加偏好設定。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果我是同事，我只會問一件事：這個東西是不是每天都幫我省時間？如果答案是 yes，它就不是 demo，它是工具。\u003C\u002Fp>\u003Ch2>5) Error crate 真正難的是：typed 和 erased 不能互相裝死\u003C\u002Fh2>\u003Cblockquote>\"Polishing erratic, my error handling crate . It composes nicely between type-erased errors and typed error states, and uses pointer tagging to eliminate allocations whenever possible. To reduce the number of unsafe , I plan to find (or write) something like GhostCell in the next couple of days to ensure vtable functions can only be invoked with the correct type-erased self .\"\u003C\u002Fblockquote>\u003Cp>這段很 Rust，也很像真的在解問題。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flan\u002Ferratic\">erratic\u003C\u002Fa> 這個 error handling crate 想同時支援 type-erased errors 和 typed error states，還想用 pointer tagging 盡量減少 allocation。這不是在炫技，而是在處理真實世界裡兩種不同的錯誤資料：一種要保留精準型別，讓呼叫端知道到底壞在哪；另一種要能擦掉型別細節，把 context 帶著走。只支援其中一種，通常都不夠。\u003C\u002Fp>\u003Cp>翻譯一下就是：錯誤處理不要假裝所有 error 都長一樣。真的系統裡，有些錯誤是 recoverable state，有些是傳遞型 context。你如果把它們混成一團，\u003Ca href=\"\u002Ftag\u002Fapi\">API\u003C\u002Fa> 會很順，但使用者會很痛。反過來，如果你把型別都保留到底，API 也可能變得難用到沒人想碰。這就是這類 crate 的難點：既要有結構，又不能把人逼瘋。\u003C\u002Fp>\u003Cp>我很在意作者提到 pointer tagging，因為這代表他不是只想把介面寫漂亮，還在看成本。allocation 不是每次都致命，但它會累積。只是 unsafe 也不能亂放。既然這個 crate 牽涉 type-erased self reference，那 invariant 就得很清楚，不然很容易寫出「看起來很安全、其實很危險」的東西。去參考 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fghostcell\u002Fghost-cell\">GhostCell\u003C\u002Fa> 這種模型是合理的，至少你在想的是如何把 identity 和 borrow 規則講清楚，而不是只靠註解撐場面。\u003C\u002Fp>\u003Cp>我之前被一個 error abstraction 搞過。happy path 很漂亮，失敗路徑卻完全看不懂。最後我學到的是：先決定哪些東西一定要 typed，哪些可以 erased，然後看使用者在邊界上到底需要什麼。只要 boundary 的語意不清楚，整個 crate 再優雅都沒用。\u003C\u002Fp>\u003Cp>實操寫法我會這樣做：\u003C\u002Fp>\u003Cul>\u003Cli>把可恢復的 typed state，和傳遞用的 erased error 分開設計。\u003C\u002Fli>\u003Cli>先量成本，再決定要不要為 allocation 做優化。\u003C\u002Fli>\u003Cli>unsafe 只留一個很小的 boundary，還要寫清楚 invariant。\u003C\u002Fli>\u003Cli>同時寫「簡單錯誤」和「複雜 state machine」兩種 example。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果一個 error crate 連自己的例子都講不清楚，我不會信。它如果能同時講懂兩種世界，我才會開始認真看。\u003C\u002Fp>\u003Ch2>6) Agent framework 最怕假裝自己很穩，所以先把混亂納進來\u003C\u002Fh2>\u003Cblockquote>\"I've recently come up with a new idea to optimize my own agent framework : integrate chaos engineering into the agent system. That should be really exciting.\"\u003C\u002Fblockquote>\u003Cp>這個提案我看了停一下。把 chaos engineering 放進 \u003Ca href=\"\u002Ftag\u002Fagent\">agent\u003C\u002Fa> framework，聽起來不是瘋，就是很懂。可能兩個都有。因為 agent 系統本來就不是純函式，它依賴 tools、prompts、retries、memory、外部服務，任何一個地方抖一下，整條 pipeline 都可能開始亂猜。你如果只測順風局，就會把自己的系統想得太穩。\u003C\u002Fp>\u003Cp>白話講，chaos engineering 的意思就是：別等真實故障來打臉，先自己丟一點受控失敗進去，看它怎麼壞。放到 agent 系統裡，可以是 tool response 延遲、context 被截斷、輸出格式壞掉、partial state corruption，甚至是某一步直接掉包。這些都不是理論題，是實際會發生的事。\u003C\u002Fp>\u003Cp>我碰過不少 agent-ish 的流程，表面上每一步都能跑，真到某個 dependency 抽風時，整個系統就開始 improvising。偶爾這種 improvisation 有用，但更多時候只是 silent drift。把 failure injection 直接放進 framework，可以逼你正視：這套系統到底有沒有 recovery policy，還是只是靠運氣。\u003C\u002Fp>\u003Cp>但我也會很小心。chaos 只有在可觀測、可重現、可回放時才有價值。你要知道故障是在哪裡注入的、agent 怎麼回應、最後怎麼恢復。不然你不是在測 resilience，你是在製造更多 debug 噪音。\u003C\u002Fp>\u003Cp>實操寫法我會這樣做：\u003C\u002Fp>\u003Cul>\u003Cli>一次只注入一種 failure mode。\u003C\u002Fli>\u003Cli>把注入點和 recovery path 都記錄下來。\u003C\u002Fli>\u003Cli>觀察 agent 是 retry、卡住，還是自己掰一個答案。\u003C\u002Fli>\u003Cli>讓 chaos layer 預設可關，而且測試時要 deterministic。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果框架能撐過受控混亂，它才比較像真的能上線。撐不過，那就別急著把它包裝成智慧系統。\u003C\u002Fp>\u003Ch2>可抄的模板\u003C\u002Fh2>\u003Cpre>\u003Ccode># Rust weekly progress note template for shipping work\n\n## What I worked on\n- [Project name]\n- [One sentence on the current goal]\n\n## What changed this week\n- [Concrete change #1]\n- [Concrete change #2]\n- [Concrete change #3]\n\n## What broke or felt off\n- [Bug, design issue, or friction point]\n- [Why it happened]\n- [What I changed to address it]\n\n## What I’m testing now\n- [Test type: BDD, unit, integration, manual]\n- [Scenario or behavior being verified]\n- [Edge cases that still worry me]\n\n## How I’m handling state and identity\n- [How events\u002Fjobs\u002Frecords are keyed]\n- [How concurrency is isolated]\n- [How I avoid mixing unrelated work]\n\n## What I’m keeping small\n- [One thing I refused to overbuild]\n- [One API or UI surface kept narrow]\n- [One unsafe or complex boundary kept tiny]\n\n## Next step\n- [The next concrete action]\n- [The risk I want to answer]\n- [The minimal version I’ll ship]\n\n## One-line summary\nI’m building [thing] by [approach], and this week I learned [specific lesson].\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>這篇的原始來源是 Rust Forum thread：\u003Ca href=\"https:\u002F\u002Fusers.rust-lang.org\u002Ft\u002Fwhats-everyone-working-on-this-week-25-2026\u002F140724\">https:\u002F\u002Fusers.rust-lang.org\u002Ft\u002Fwhats-everyone-working-on-this-week-25-2026\u002F140724\u003C\u002Fa>。上面拆法是我根據原文整理出的工作方法，模板是我另外整理成可直接抄的版本。\u003C\u002Fp>","我把 Rust 論壇 week 25 拆成可抄的方法：怎麼用測試、命名、狀態隔離和小模板，把粗想法變成能交付的工具。","users.rust-lang.org","https:\u002F\u002Fusers.rust-lang.org\u002Ft\u002Fwhats-everyone-working-on-this-week-25-2026\u002F140724",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781857111111-md5g.png","tools","zh","c7baab44-71c8-4905-9a7d-a54a98e6cc45",[17,18,19,20,21],"Rust","BDD tests","Tauri","error handling","agent framework",[23,24,25],"生成器不要只看輸出，要用跨 target 的行為測試鎖住一致性。","GUI 的核心不是畫面，而是事件、ID 和並發狀態的路由。","小工具、error crate、agent framework 的共同點，都是先把邊界和身份講清楚。",0,"2026-06-19T08:18:04.893117+00:00","2026-06-19T08:18:04.865+00:00","269e8a66-8555-4fa6-80c1-90390e524b04",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":17,"slug":33},"rust",{"id":15,"slug":35,"title":36,"language":37},"rust-forum-week-25-turns-ideas-into-shipping-work-en","Rust forum week 25 turns ideas into shipping work","en",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"d2a143b9-efa1-4ffd-adcb-7a315ae6344e","renesas-acquires-altium-pcb-design-tool-update-zh","瑞萨全资收购 Altium，PCB 教程更新","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781859766720-ow6s.png","2026-06-19T09:02:23.113145+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"300d082a-4df5-4a26-8b5b-7dff73dd0da3","claude-code-rust-native-terminal-interface-zh","Claude Code Rust 把終端機變輕了","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781854439295-lkeg.png","2026-06-19T07:33:29.722095+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"819930d2-f83c-42e1-be18-fc65eb212184","open-source-tools-vibe-coding-cybersecurity-zh","開源工具把 vibe coding 變安全","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781852614083-gnj4.png","2026-06-19T07:03:08.602553+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"60a23c5e-d9df-4186-a30e-5d2c123a0ed6","model-triage-coding-tests-cost-win-zh","模型分流把測試成本壓下來","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781840895287-vp1r.png","2026-06-19T03:47:51.801299+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"79548e00-424f-482a-81c2-4a64d29e011c","fine-tuning-llms-locally-sft-lora-dpo-zh","本地微調 LLM：SFT、LoRA、DPO","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781839069344-gzrv.png","2026-06-19T03:17:21.792772+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"fa5c39c9-8213-4432-a19d-fd67f085fdca","vercel-eve-agents-as-directories-zh","把 agents 變成目錄","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781828288993-qss6.png","2026-06-19T00:17:45.298522+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]