<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alastor-t34</title><description>Code · Research · Notes</description><link>https://alaster-t34.github.io/</link><language>zh_CN</language><item><title>ForgeGuard Nexus：證據驅動的工業維護 Agent 平臺 / Evidenzgetriebene Industrie-Wartungsagenten</title><link>https://alaster-t34.github.io/posts/forgeguard-nexus/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/forgeguard-nexus/</guid><description>以繁體中文與德語介紹 ForgeGuard Nexus：從設備證據、診斷與 RUL，到人工審批、工單執行與維修後驗證的工業 AI Agent 閉環。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::github{repo=&quot;alaster-t34/ForgeGuard-Nexus&quot;}&lt;/p&gt;
&lt;h1&gt;ForgeGuard Nexus&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Evidence-driven industrial maintenance agents with human-governed execution and post-maintenance verification.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ForgeGuard Nexus 是我目前持續開發的一個工業 AI Agent 平臺。它關注的並不只是「模型能不能把故障分類對」，而是另一個更接近真實工業現場的問題：&lt;strong&gt;當設備出現異常時，一個系統究竟需要掌握多少證據、約束與流程，才有資格提出可以被人採用的維護決策？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前倉庫中的版本以 &lt;strong&gt;ForgeGuard Nexus 5.0&lt;/strong&gt; 為主，Release Candidate 為 &lt;strong&gt;v0.7.9&lt;/strong&gt;，專案採用 Apache-2.0 License。&lt;/p&gt;
&lt;p&gt;專案地址：&lt;a href=&quot;https://github.com/alaster-t34/ForgeGuard-Nexus&quot;&gt;https://github.com/alaster-t34/ForgeGuard-Nexus&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;繁體中文&lt;/h1&gt;
&lt;h2&gt;1. 為什麼不只做一個「故障分類模型」？&lt;/h2&gt;
&lt;p&gt;傳統預測性維護系統通常從感測器訊號開始，最後輸出一個故障類別、健康分數，或者剩餘使用壽命（RUL）。這些資訊很重要，但它們離真正的維護決策仍然有一段距離。&lt;/p&gt;
&lt;p&gt;假設模型判斷某個軸承存在異常，工程現場接下來仍然要回答很多問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這批振動訊號本身可靠嗎？是否存在 clipping、dropout、DC offset 或其他品質問題？&lt;/li&gt;
&lt;li&gt;故障模式到底是什麼？證據之間有沒有衝突？&lt;/li&gt;
&lt;li&gt;RUL 或健康風險是否已經進入需要處置的時間窗？&lt;/li&gt;
&lt;li&gt;對應的備件是否有庫存？&lt;/li&gt;
&lt;li&gt;現場是否有具備相應技能的人員？&lt;/li&gt;
&lt;li&gt;生產排程允許在哪個時間段停機？&lt;/li&gt;
&lt;li&gt;這項操作是否屬於高風險行為？誰有權批准？&lt;/li&gt;
&lt;li&gt;維修完成之後，如何證明設備真的恢復，而不是僅僅把工單勾成「完成」？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ForgeGuard Nexus 嘗試把這些問題放進同一個可審計的工作流，而不是把一個分類器外面套上聊天介面，然後就宣布「Agent 化」完成。那種做法很省事，現場通常不會因此變得更安全。&lt;/p&gt;
&lt;h2&gt;2. 從訊號到閉環，而不是從訊號到一句答案&lt;/h2&gt;
&lt;p&gt;ForgeGuard 的核心流程可以概括為：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sensor / Edge / CSV input
        ↓
資料品質閘門 + 證據封裝
        ↓
故障診斷 + RUL / 健康風險
        ↓
FMEA + 庫存 + 生產 + 人員工具
        ↓
多方案維護規劃
        ↓
人工授權閘門
        ↓
工單執行
        ↓
維修後重新採集
        ↓
驗證：關閉事件或自動重新開啟
        ↓
審計軌跡 + 可重用知識
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這裡最重要的一點是：&lt;strong&gt;診斷不是流程終點。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;系統必須繼續處理維護所需的資源與組織約束，產生多個可比較的維護方案，經過人工授權後形成工單；而工單完成也不是終點，還需要重新採集維修後證據，進行後驗驗證。&lt;/p&gt;
&lt;p&gt;如果驗證沒有通過，事件可以重新開啟，而不是因為「工程師已經點擊完成」就假設設備一定恢復。&lt;/p&gt;
&lt;h2&gt;3. 13 個角色受限的 Agent&lt;/h2&gt;
&lt;p&gt;目前 ForgeGuard 實作了 13 個具備角色邊界的 Agent，覆蓋：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;資料品質；&lt;/li&gt;
&lt;li&gt;感知與訊號分析；&lt;/li&gt;
&lt;li&gt;工業知識；&lt;/li&gt;
&lt;li&gt;故障診斷；&lt;/li&gt;
&lt;li&gt;RUL 與風險；&lt;/li&gt;
&lt;li&gt;人員安全；&lt;/li&gt;
&lt;li&gt;能源與環境；&lt;/li&gt;
&lt;li&gt;韌性與異常處理；&lt;/li&gt;
&lt;li&gt;維護方案規劃；&lt;/li&gt;
&lt;li&gt;治理與授權；&lt;/li&gt;
&lt;li&gt;工單；&lt;/li&gt;
&lt;li&gt;維修後驗證；&lt;/li&gt;
&lt;li&gt;協調與工作流控制。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我更傾向把 Agent 看成「帶有明確責任、工具權限與狀態邊界的工作單元」，而不是讓所有能力都塞進一個萬能對話模型。&lt;/p&gt;
&lt;p&gt;這種設計的好處是：哪個步驟使用了什麼證據、調用了什麼工具、由誰批准、最後為什麼關閉事件，都能夠留下可追蹤的路徑。&lt;/p&gt;
&lt;h2&gt;4. 證據品質優先&lt;/h2&gt;
&lt;p&gt;工業 AI 很容易出現一個尷尬問題：模型本身可能運作正常，但輸入根本不值得相信。&lt;/p&gt;
&lt;p&gt;ForgeGuard 因此把資料品質放在工作流前面，對振動訊號檢查例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clipping；&lt;/li&gt;
&lt;li&gt;dropout；&lt;/li&gt;
&lt;li&gt;DC offset；&lt;/li&gt;
&lt;li&gt;有效解析度；&lt;/li&gt;
&lt;li&gt;噪聲一致性；&lt;/li&gt;
&lt;li&gt;相互矛盾的證據。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;低品質或矛盾證據不應該被強行壓成一個「確定答案」。系統可以要求重新採集、升級處理或拒絕繼續執行高風險決策。&lt;/p&gt;
&lt;p&gt;這是 ForgeGuard 很重要的一條原則：&lt;strong&gt;不知道，就應該允許系統說不知道。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;5. 模型只是系統中的一部分&lt;/h2&gt;
&lt;p&gt;目前系統包含可解釋的時域、頻域與包絡特徵，並提供可在 CPU 上部署的振動基線模型。&lt;/p&gt;
&lt;p&gt;倉庫目前記錄的選定部署模型為：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dsp-calibrated-hgb-v0.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在專案生成的 &lt;strong&gt;ForgeGuard OpenEval-RM 0.1.0&lt;/strong&gt; 物理啟發式合成回歸資料集上，倉庫中的基準結果包括：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指標&lt;/th&gt;
&lt;th&gt;結果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Macro-F1&lt;/td&gt;
&lt;td&gt;0.9342&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balanced Accuracy&lt;/td&gt;
&lt;td&gt;0.9375&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU p95 Latency&lt;/td&gt;
&lt;td&gt;13.912 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abstention 後接受樣本準確率&lt;/td&gt;
&lt;td&gt;0.9872&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean Robustness Macro-F1&lt;/td&gt;
&lt;td&gt;0.7166&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;這些數值的用途是&lt;strong&gt;可重現的回歸與魯棒性驗證&lt;/strong&gt;，並不代表真實工廠精度。&lt;/p&gt;
&lt;p&gt;這個界線需要非常明確。合成資料、公開資料集、物理試驗臺以及真實工廠證據，應該被分開描述，而不是把不同來源的結果混成一個漂亮但沒有意義的百分比。&lt;/p&gt;
&lt;h2&gt;6. 故障注入與安全行為&lt;/h2&gt;
&lt;p&gt;除了模型基準之外，ForgeGuard 還包含可重現的軟體／訊號故障注入流程，用來驗證系統在異常條件下是否能做出安全反應。&lt;/p&gt;
&lt;p&gt;目前倉庫報告的回歸測試結果包含：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;檢查&lt;/th&gt;
&lt;th&gt;結果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clean injected-fault classification accuracy&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrupted-signal safe-response rate&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow-fault containment rate&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;同樣，這些結果屬於軟體回歸與安全行為證據，&lt;strong&gt;不是工業現場安全認證，也不是 plant safety case&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;7. 人必須留在高風險決策迴路中&lt;/h2&gt;
&lt;p&gt;ForgeGuard 的定位是決策支援系統，而不是自動接管真實生產設備的控制器。&lt;/p&gt;
&lt;p&gt;高風險操作必須經過具備授權的人員批准。系統的安全不變量包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缺少必要證據時，方案不能直接越過證據閘門；&lt;/li&gt;
&lt;li&gt;高風險工單不能繞過人工批准；&lt;/li&gt;
&lt;li&gt;沒有維修後驗證，事件不能直接標記為已解決。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這種限制看起來沒有「完全自治 Agent」那麼科幻，但在工業系統裡，能夠被限制、被審計、被拒絕，通常比「它很自主」更有價值。&lt;/p&gt;
&lt;h2&gt;8. 部署方式&lt;/h2&gt;
&lt;p&gt;ForgeGuard 不只考慮瀏覽器 Demo，目前倉庫包含多條部署路徑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker；&lt;/li&gt;
&lt;li&gt;Windows native / desktop launcher；&lt;/li&gt;
&lt;li&gt;Linux native；&lt;/li&gt;
&lt;li&gt;NVIDIA Jetson 邊緣裝置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker 是目前最直接的啟動方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/alaster-t34/ForgeGuard-Nexus.git
cd ForgeGuard-Nexus
docker compose -f compose.yaml up -d --build api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動後可以訪問：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;健康檢查端點：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost:8000/api/v1/health
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;9. 我真正想解決的問題&lt;/h2&gt;
&lt;p&gt;ForgeGuard Nexus 最終想做的，不是把更多模型堆到一張架構圖上。&lt;/p&gt;
&lt;p&gt;我更關心的是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何讓一個工業 AI 系統知道自己的證據是否可信、知道自己的權限邊界、知道什麼時候必須交給人決策，並且在維修完成後仍然有責任證明設備確實恢復。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從這個角度看，診斷模型只是閉環中的一個節點。&lt;/p&gt;
&lt;p&gt;真正困難的部分是證據、模型、工業知識、資源約束、權限、執行與驗證之間如何連接，而且每一個關鍵決定都能被回溯。&lt;/p&gt;
&lt;p&gt;專案仍在迭代，倉庫會繼續保留可重現基準、測試、部署文件與安全邊界：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub：&lt;a href=&quot;https://github.com/alaster-t34/ForgeGuard-Nexus&quot;&gt;https://github.com/alaster-t34/ForgeGuard-Nexus&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Deutsch&lt;/h1&gt;
&lt;h2&gt;1. Warum nicht einfach ein weiteres Fehlklassifikationsmodell?&lt;/h2&gt;
&lt;p&gt;Klassische Predictive-Maintenance-Systeme beginnen häufig mit Sensordaten und enden mit einer Fehlerklasse, einem Health Score oder einer Schätzung der Remaining Useful Life (RUL). Diese Informationen sind wertvoll, reichen für eine reale Instandhaltungsentscheidung jedoch nicht aus.&lt;/p&gt;
&lt;p&gt;Wenn ein Modell beispielsweise einen auffälligen Lagerzustand erkennt, bleiben in der Praxis weitere Fragen offen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sind die Eingangsdaten überhaupt zuverlässig?&lt;/li&gt;
&lt;li&gt;Gibt es Clipping, Dropouts, DC-Offset oder widersprüchliche Signale?&lt;/li&gt;
&lt;li&gt;Welcher Fehlermodus ist wahrscheinlich?&lt;/li&gt;
&lt;li&gt;Liegt das RUL- bzw. Risikofenster bereits in einem kritischen Bereich?&lt;/li&gt;
&lt;li&gt;Ist das notwendige Ersatzteil verfügbar?&lt;/li&gt;
&lt;li&gt;Gibt es qualifiziertes Personal?&lt;/li&gt;
&lt;li&gt;Welches Wartungsfenster ist mit der Produktionsplanung vereinbar?&lt;/li&gt;
&lt;li&gt;Wer darf eine risikoreiche Maßnahme freigeben?&lt;/li&gt;
&lt;li&gt;Und wie wird nach der Wartung nachgewiesen, dass sich der Anlagenzustand tatsächlich verbessert hat?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ForgeGuard Nexus versucht, diese Fragen in einem gemeinsamen, auditierbaren Workflow abzubilden. Ziel ist nicht, einen Klassifikator mit einer Chat-Oberfläche zu versehen und das Ergebnis anschließend als „Agentensystem“ zu verkaufen.&lt;/p&gt;
&lt;h2&gt;2. Von Sensordaten zu einem geschlossenen Wartungskreislauf&lt;/h2&gt;
&lt;p&gt;Der grundlegende Ablauf lautet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sensor / Edge / CSV
        ↓
Datenqualitäts-Gate + Evidenzpaket
        ↓
Fehlerdiagnose + RUL / Gesundheitsrisiko
        ↓
FMEA + Lagerbestand + Produktion + Personal
        ↓
Mehrere Wartungsoptionen
        ↓
Menschliche Freigabe
        ↓
Arbeitsauftrag
        ↓
Erneute Datenerfassung nach der Wartung
        ↓
Verifikation: Vorfall schließen oder erneut öffnen
        ↓
Audit-Trail + wiederverwendbares Wissen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der entscheidende Punkt ist: &lt;strong&gt;Die Diagnose ist nicht das Ende des Prozesses.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nach der Diagnose müssen Ressourcen, Sicherheitsregeln und organisatorische Randbedingungen berücksichtigt werden. Erst danach entsteht ein ausführbarer Wartungsplan. Und auch ein abgeschlossener Arbeitsauftrag bedeutet noch nicht automatisch, dass die Maschine wieder gesund ist.&lt;/p&gt;
&lt;p&gt;ForgeGuard erfasst deshalb nach der Wartung erneut Evidenz. Wenn die Verifikation fehlschlägt, kann der Vorfall wieder geöffnet werden.&lt;/p&gt;
&lt;h2&gt;3. Dreizehn rollenbegrenzte Agents&lt;/h2&gt;
&lt;p&gt;Der aktuelle Stand umfasst 13 Agents mit klar abgegrenzten Verantwortlichkeiten. Sie decken unter anderem folgende Bereiche ab:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Datenqualität;&lt;/li&gt;
&lt;li&gt;Wahrnehmung und Signalanalyse;&lt;/li&gt;
&lt;li&gt;industrielles Wissen;&lt;/li&gt;
&lt;li&gt;Diagnose;&lt;/li&gt;
&lt;li&gt;RUL und Risiko;&lt;/li&gt;
&lt;li&gt;Arbeitssicherheit;&lt;/li&gt;
&lt;li&gt;Energie und Umwelt;&lt;/li&gt;
&lt;li&gt;Resilienz und Ausnahmebehandlung;&lt;/li&gt;
&lt;li&gt;Wartungsplanung;&lt;/li&gt;
&lt;li&gt;Governance und Freigabe;&lt;/li&gt;
&lt;li&gt;Arbeitsaufträge;&lt;/li&gt;
&lt;li&gt;Verifikation nach der Wartung;&lt;/li&gt;
&lt;li&gt;Koordination des Gesamtworkflows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ein Agent ist hier nicht als allwissender Chatbot gedacht, sondern als Arbeitseinheit mit definierten Aufgaben, Werkzeugen, Rechten und Zustandsgrenzen.&lt;/p&gt;
&lt;p&gt;Dadurch lässt sich nachvollziehen, welche Evidenz für eine Entscheidung verwendet wurde, welches Werkzeug aufgerufen wurde, wer eine Maßnahme freigegeben hat und warum ein Vorfall geschlossen wurde.&lt;/p&gt;
&lt;h2&gt;4. Datenqualität vor Modellvertrauen&lt;/h2&gt;
&lt;p&gt;Ein industrielles KI-System kann formal korrekt rechnen und trotzdem eine schlechte Entscheidung treffen, wenn die Eingangsdaten unbrauchbar sind.&lt;/p&gt;
&lt;p&gt;ForgeGuard prüft deshalb Vibrationsdaten unter anderem auf:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clipping;&lt;/li&gt;
&lt;li&gt;Dropouts;&lt;/li&gt;
&lt;li&gt;DC-Offset;&lt;/li&gt;
&lt;li&gt;effektive Auflösung;&lt;/li&gt;
&lt;li&gt;inkonsistentes Rauschen;&lt;/li&gt;
&lt;li&gt;widersprüchliche Evidenz.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Schlechte oder widersprüchliche Evidenz wird nicht zwangsläufig in eine scheinbar sichere Diagnose gezwungen. Stattdessen kann das System eine erneute Messung verlangen, eskalieren oder die weitere Ausführung blockieren.&lt;/p&gt;
&lt;p&gt;Mit anderen Worten: &lt;strong&gt;Unsicherheit ist ein zulässiges Ergebnis.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;5. Das Modell ist nur ein Baustein&lt;/h2&gt;
&lt;p&gt;ForgeGuard enthält interpretierbare Zeit-, Frequenz- und Hüllkurvenmerkmale sowie ein CPU-taugliches Vibrationsmodell.&lt;/p&gt;
&lt;p&gt;Das derzeit im Repository ausgewählte Deployment-Modell lautet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dsp-calibrated-hgb-v0.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf dem projektintern erzeugten, physikalisch inspirierten synthetischen Regressionsdatensatz &lt;strong&gt;ForgeGuard OpenEval-RM 0.1.0&lt;/strong&gt; sind im Repository unter anderem folgende Werte dokumentiert:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metrik&lt;/th&gt;
&lt;th&gt;Ergebnis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Macro-F1&lt;/td&gt;
&lt;td&gt;0.9342&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balanced Accuracy&lt;/td&gt;
&lt;td&gt;0.9375&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU-p95-Latenz&lt;/td&gt;
&lt;td&gt;13.912 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy akzeptierter Samples nach Abstention&lt;/td&gt;
&lt;td&gt;0.9872&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean Robustness Macro-F1&lt;/td&gt;
&lt;td&gt;0.7166&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Diese Zahlen dienen der &lt;strong&gt;reproduzierbaren Regression und Robustheitsprüfung&lt;/strong&gt;. Sie sind ausdrücklich nicht als Genauigkeit in einer realen Fabrik zu verstehen.&lt;/p&gt;
&lt;p&gt;Synthetische Daten, öffentliche Datensätze, Prüfstandsdaten und reale Betriebsdaten müssen getrennt betrachtet und dokumentiert werden.&lt;/p&gt;
&lt;h2&gt;6. Fault Injection und sicheres Systemverhalten&lt;/h2&gt;
&lt;p&gt;Neben Modellbenchmarks enthält ForgeGuard reproduzierbare Software- und Signal-Fault-Injection-Tests.&lt;/p&gt;
&lt;p&gt;Die aktuell dokumentierten Regressionsergebnisse umfassen:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prüfung&lt;/th&gt;
&lt;th&gt;Ergebnis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clean injected-fault classification accuracy&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrupted-signal safe-response rate&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow-fault containment rate&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Auch hier gilt: Diese Ergebnisse sind Nachweise für Regressionstests und Sicherheitsverhalten der Software. Sie stellen &lt;strong&gt;keine industrielle Sicherheitszertifizierung und keinen Plant Safety Case&lt;/strong&gt; dar.&lt;/p&gt;
&lt;h2&gt;7. Menschen bleiben bei risikoreichen Entscheidungen im Regelkreis&lt;/h2&gt;
&lt;p&gt;ForgeGuard ist ein Decision-Support-System und kein autonomer Controller für reale Produktionsanlagen.&lt;/p&gt;
&lt;p&gt;Risikoreiche Aktionen benötigen eine autorisierte menschliche Freigabe. Zu den deterministischen Sicherheitsregeln gehören:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein Plan darf erforderliche Evidenz nicht umgehen.&lt;/li&gt;
&lt;li&gt;Ein risikoreicher Arbeitsauftrag darf die menschliche Freigabe nicht umgehen.&lt;/li&gt;
&lt;li&gt;Ein Vorfall darf ohne Verifikation nach der Wartung nicht endgültig geschlossen werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das klingt weniger spektakulär als ein vollständig autonomer Agent. In industriellen Anwendungen ist ein System, das sich begrenzen, prüfen und im Zweifel stoppen lässt, allerdings meistens nützlicher als eines, das lediglich möglichst autonom wirkt.&lt;/p&gt;
&lt;h2&gt;8. Deployment&lt;/h2&gt;
&lt;p&gt;Das Repository unterstützt mehrere Deployment-Pfade:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker;&lt;/li&gt;
&lt;li&gt;Windows Native / Desktop Launcher;&lt;/li&gt;
&lt;li&gt;Linux Native;&lt;/li&gt;
&lt;li&gt;NVIDIA Jetson für Edge-Szenarien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der schnellste Einstieg erfolgt über Docker:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/alaster-t34/ForgeGuard-Nexus.git
cd ForgeGuard-Nexus
docker compose -f compose.yaml up -d --build api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach ist der Dienst standardmäßig unter folgender Adresse erreichbar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Health Endpoint:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost:8000/api/v1/health
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;9. Das eigentliche Ziel&lt;/h2&gt;
&lt;p&gt;Das Ziel von ForgeGuard Nexus besteht nicht darin, möglichst viele KI-Modelle in ein Architekturdiagramm zu packen.&lt;/p&gt;
&lt;p&gt;Mich interessiert vielmehr folgende Frage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie kann ein industrielles KI-System erkennen, ob seine Evidenz vertrauenswürdig ist, seine eigenen Berechtigungsgrenzen respektieren, bei Bedarf einen Menschen einbeziehen und nach einer Wartung nachweisen, dass die Anlage tatsächlich wieder in einem akzeptablen Zustand ist?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aus dieser Perspektive ist das Diagnosemodell nur ein Knoten in einem wesentlich größeren Kreislauf.&lt;/p&gt;
&lt;p&gt;Die schwierigere Aufgabe besteht darin, Evidenz, Modelle, FMEA-Wissen, Ressourcen, Produktionsbedingungen, Berechtigungen, Ausführung und Verifikation so miteinander zu verbinden, dass jede wichtige Entscheidung nachvollziehbar bleibt.&lt;/p&gt;
&lt;p&gt;Der Quellcode, die reproduzierbaren Benchmarks, Deployment-Dokumentation und Sicherheitsgrenzen befinden sich im Repository:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub: &lt;a href=&quot;https://github.com/alaster-t34/ForgeGuard-Nexus&quot;&gt;https://github.com/alaster-t34/ForgeGuard-Nexus&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>ICPC 2026 Huawei Online Challenge：邊雲協同排程競賽復盤</title><link>https://alaster-t34.github.io/posts/huawei-icpc-2026-final/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/huawei-icpc-2026-final/</guid><description>ICPC 2026 Online Challenge 1 powered by Huawei：Edge-Cloud Collaborative Scheduling 的最終排名、真正最終提交源碼、迭代路線、評分模型與實作思考。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;這篇文章記錄我在 &lt;strong&gt;ICPC 2026 Online Challenge 1 powered by Huawei&lt;/strong&gt; 中，針對 Codeforces 2251A &lt;strong&gt;Edge-Cloud Collaborative Scheduling&lt;/strong&gt; 所做的一整套優化過程。&lt;/p&gt;
&lt;p&gt;最後結果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codeforces Handle：&lt;code&gt;al1swedel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;官方最終分數：&lt;strong&gt;16661.204&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Final standings：&lt;strong&gt;全球第 15 名&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;本文歸檔的真正最終提交源碼：&lt;code&gt;CF2251A_FINAL_16661_204.cpp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;版本說明（非常重要）&lt;/strong&gt;：本文所稱「最終版本」，只指這次附上的、其 22 個 Judgement Protocol 分數合計為 &lt;strong&gt;16661.204179914599&lt;/strong&gt; 的源碼。Codeforces 將其顯示為 &lt;strong&gt;16661.204&lt;/strong&gt;。&lt;code&gt;T207_C6_PN25_FLY20_C5F4_SUBMIT.cpp&lt;/code&gt; 是我在後期迭代中保存的一個重要內部版本，但&lt;strong&gt;不是這篇文章所歸檔的最終提交源碼&lt;/strong&gt;。為避免內部版本名和官方最終提交互相污染，後文會把兩者明確分開。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;這不是一個「找到某個神奇公式就結束」的題目。真正困難的是：同一個調度器要同時處理吞吐、延遲、不同階段的批處理收益、邊緣與雲端資源、請求到達波形，以及各測試點完全不同的權重。後期的工作因此逐漸從「寫一個 heuristic」變成「建立模擬器、做診斷、維護回歸集合，再一刀一刀地改策略」。&lt;/p&gt;
&lt;h2&gt;最終排名&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/images/huawei-icpc-2026-final-standings.webp&quot; alt=&quot;ICPC 2026 Huawei Online Challenge Final standings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Final standings 中，&lt;code&gt;al1swedel&lt;/code&gt; 位於第 &lt;strong&gt;15&lt;/strong&gt; 名，官方顯示分數為 &lt;strong&gt;16661.204&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;先理解評分，而不是先猜調度策略&lt;/h2&gt;
&lt;p&gt;每個測試點最高 1000 分，本質上由兩部分組成：吞吐收益與等待時間收益。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NormalizedScore = w_tp * norm_tp + w_c * norm_c
Score           = 1000 * NormalizedScore
w_tp + w_c      = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tp&lt;/code&gt;：所有請求最終輸出 token 數 / 整體模擬時間跨度；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;norm_tp&lt;/code&gt;：把吞吐從基準 &lt;code&gt;tp_base&lt;/code&gt; 到目標 &lt;code&gt;tp_UB&lt;/code&gt; 映射到 &lt;code&gt;[0, 1]&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TDR&lt;/code&gt;：請求從到達到完成輸入階段的平均時間；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TPOT&lt;/code&gt;：相鄰輸出 token 的平均間隔；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;norm_c&lt;/code&gt;：由 TDR、TPOT 相對各自 SLO 的超標程度得到的延遲分量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一個核心結論是：&lt;strong&gt;吞吐不是越大越好。&lt;/strong&gt; 當 &lt;code&gt;norm_tp&lt;/code&gt; 已經接近 1，再把 batch 做得更大，可能只會把 TDR / TPOT 推高，而吞吐分已經沒有額外收益。&lt;/p&gt;
&lt;p&gt;所以後來我們不再把問題看作單純的 throughput maximization，而是更接近：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在不破壞吞吐下限的前提下，
動態決定何時湊 batch、何時立即服務、
何時拆分 P-PROC、何時把工作送到 cloud，
並控制每個階段的 backlog 與 token gap。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第一階段：先把 Judge 變成可以離線研究的系統&lt;/h2&gt;
&lt;p&gt;早期最大的問題不是「策略不夠強」，而是一次改動之後，我們很難知道它到底改善了什麼。&lt;/p&gt;
&lt;p&gt;因此第一個真正有價值的工程工作，是建立一個可以逐分復現官方判分的本地 Judge。它會輸出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mean_tdr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mean_tpot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;norm_tp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;norm_c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;最終 score&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有了 Judge，優化才從「提交、等分數、猜」變成可重現實驗。&lt;/p&gt;
&lt;p&gt;較早的 &lt;code&gt;T032&lt;/code&gt; 在 22 個公開測試上的本地總分是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;16383.560324671
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;當時明顯的低分點包括：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#5   487.78
#6   420.91
#10  684.42
#14  415.27
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這讓問題第一次被拆成具體 cohort，而不是一個總分數字。&lt;/p&gt;
&lt;h2&gt;第二階段：建立統一的請求狀態機&lt;/h2&gt;
&lt;p&gt;一個 request 並不是「排進某台機器就完事」。它會在多個 stage 中流轉，並可能經過 edge / cloud、傳輸、pre/post processing 與逐 token output。&lt;/p&gt;
&lt;p&gt;最終程式內部維護完整 request lifecycle，可以抽象成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ARRIVE
  ↓
P-PRE
  ↓
network / transfer
  ↓
D-PRE
  ↓
decode / output loop
  ↓
P-PROC
  ↓
D-POST / finalization
  ↓
FIN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每個 request 保存 ready time、input length、目前 stage、cloud/edge 歸屬、處理進度、輸出進度等狀態。scheduler 的工作就是根據當下狀態決定下一個事件。&lt;/p&gt;
&lt;p&gt;這一步沒有排行榜魔法，但它是後續所有優化的地基。沒有穩定狀態機，任何特殊策略都只是把 bug 換一個位置。&lt;/p&gt;
&lt;h2&gt;第三階段：從 FIFO 走向 score-aware scheduling&lt;/h2&gt;
&lt;p&gt;之後我們針對不同 stage 定義 priority，而不是整個系統只用一個 FIFO。&lt;/p&gt;
&lt;p&gt;核心考量包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;剩餘服務時間估計&lt;/strong&gt;：根據 input length 與曲線估算 stage service cost；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SLO slack&lt;/strong&gt;：接近 deadline 的 request 提高優先級；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;backlog pressure&lt;/strong&gt;：觀察 queue 積壓量與最老 request 的等待時間；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;throughput / latency 權重&lt;/strong&gt;：由 &lt;code&gt;w_tp&lt;/code&gt;、&lt;code&gt;w_c&lt;/code&gt; 決定是否值得等待更大的 batch；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stage-specific ordering&lt;/strong&gt;：P-PRE、D-PRE、P-PROC 不共享完全相同的最佳順序。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以把其中一類決策簡化成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (batch_not_full) {
    gain = saved_compute_if_wait_for_larger_batch();
    latency_risk = estimate_slo_risk();

    if (gain &amp;gt; latency_risk)
        wait_for_more_requests();
    else
        dispatch_now();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真正實作更複雜，因為還要處理 arrival 週期、decode 是否 hot、cloud 何時釋放、網路上下行佔用等訊號。&lt;/p&gt;
&lt;h2&gt;第四階段：動態 batching，而不是固定 batch cap&lt;/h2&gt;
&lt;p&gt;固定 batch size 很容易失敗。&lt;/p&gt;
&lt;p&gt;batch 太小：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compute efficiency 差；&lt;/li&gt;
&lt;li&gt;throughput 上不去；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;norm_tp&lt;/code&gt; 直接丟分。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;batch 太大：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;為了湊 batch 等太久；&lt;/li&gt;
&lt;li&gt;TDR 變差；&lt;/li&gt;
&lt;li&gt;decode/output 被阻塞後 TPOT 也會變差。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此後續版本把 batch size 變成 workload class、stage、queue pressure、SLO 與觀測週期共同決定的量。&lt;/p&gt;
&lt;p&gt;在一些 cohort 中，系統甚至要經歷：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FILL → STEADY → DRAIN / PRESSURE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FILL 階段允許積累工作以提高吞吐，STEADY 維持穩定 WIP，而 backlog 或 token-gap 風險過高時則切到清壓策略。&lt;/p&gt;
&lt;h2&gt;第五階段：P-PROC chunking，保護 TPOT&lt;/h2&gt;
&lt;p&gt;某些長 P-PROC 工作如果一次吃完整段 compute，會把下一批 hot request 的服務時間向後推。&lt;/p&gt;
&lt;p&gt;所以後期程式允許把 P-PROC 拆成 piece：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;full P-PROC
████████████████████████

chunked P-PROC
████████  | hot work |  ████████
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否切分，不是固定按層數硬砍，而是比較：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下一個 guaranteed / hot event 還有多久；&lt;/li&gt;
&lt;li&gt;full processing 需要多久；&lt;/li&gt;
&lt;li&gt;hot request 額外等待造成的 latency cost；&lt;/li&gt;
&lt;li&gt;chunking 帶來的 setup / throughput cost。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這是一個很重要的 trade-off：&lt;strong&gt;寧可犧牲一小段局部 compute efficiency，也不要讓高價值 output gap 爆掉。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;第六階段：不要假裝所有測試點來自同一種分布&lt;/h2&gt;
&lt;p&gt;22 個公開測試在這些維度上差異很大：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;input length 分布；&lt;/li&gt;
&lt;li&gt;arrival pattern；&lt;/li&gt;
&lt;li&gt;edge/cloud concurrency；&lt;/li&gt;
&lt;li&gt;stage curve；&lt;/li&gt;
&lt;li&gt;SLO1 / SLO2；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w_tp / w_c&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;output length 與週期性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此後期方案不是「一條萬能公式」，而是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;online observable features
          ↓
workload / mode detection
          ↓
shared scheduling core
          ↓
small number of guarded policy branches
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;關鍵不是 branch 越多越好，而是 &lt;strong&gt;branch 必須有可觀測條件與回歸保護&lt;/strong&gt;。如果只是 &lt;code&gt;if (test_id == 6)&lt;/code&gt;，那不是 scheduler，只是把排行榜寫進程式碼。&lt;/p&gt;
&lt;h2&gt;版本迭代：分數是怎麼一點點擠出來的&lt;/h2&gt;
&lt;p&gt;幾個保存下來、且有完整 22-case regression 的代表節點：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;22-case 本地分數&lt;/th&gt;
&lt;th&gt;主要變化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T032&lt;/td&gt;
&lt;td&gt;16383.5603&lt;/td&gt;
&lt;td&gt;早期可重現 baseline，暴露 #5/#6/#10/#14 等瓶頸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T066&lt;/td&gt;
&lt;td&gt;16458.9859&lt;/td&gt;
&lt;td&gt;固化較穩定的 cohort routing 與 batch/queue 策略&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T068&lt;/td&gt;
&lt;td&gt;16475.1578&lt;/td&gt;
&lt;td&gt;對 T13/T16 等 cohort 做定向且可回歸的修補&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T069&lt;/td&gt;
&lt;td&gt;16530.7135&lt;/td&gt;
&lt;td&gt;#13 出現明顯局部收益，總分繼續上移&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T106 FUSED&lt;/td&gt;
&lt;td&gt;≈16612.5863&lt;/td&gt;
&lt;td&gt;多條已驗證策略融合，進入後期微調階段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T207&lt;/td&gt;
&lt;td&gt;後期內部 checkpoint&lt;/td&gt;
&lt;td&gt;保存了 C6 等一批重要後期策略；&lt;strong&gt;不是本文真正 final 源碼&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final submission&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;16661.2041799146&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本文附上的真正最終源碼，對應 Codeforces &lt;strong&gt;16661.204 / Rank 15&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;越到後面，大改越不值錢。&lt;/p&gt;
&lt;p&gt;例如 T107 相對 T106 的一次 patch，只動了三個很窄的地方：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#4   +0.184305
#12  +0.891554
#13  +1.279066
----------------
Total +2.354925
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更重要的是，其他 19 個 case 的 delta = 0。後期真正可靠的工作方式變成：&lt;strong&gt;只改能證明會變好的區域，其他 case 儘可能鎖死。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;C6：從公開特例到帶 guard 的可觀測策略&lt;/h2&gt;
&lt;p&gt;C6 是後期最難處理的 cohort 之一。內部版本名曾留下 &lt;code&gt;PN25&lt;/code&gt;、&lt;code&gt;FLY20&lt;/code&gt;、cloud-specific FLY 等調整痕跡；真正 final 源碼中則可以看到更完整的兩層設計：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public-context preservation
        +
observable generalized context
        +
fallback / guard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是說，公開 workload 上保留已驗證的高分行為，同時對相似但非完全相同的 workload 用可觀測條件觸發更保守策略。這比把一串 case fingerprint 硬塞進 if-else 稍微像一個真正的 scheduler。&lt;/p&gt;
&lt;h2&gt;Exact Regression：最後真正依賴的工程方法&lt;/h2&gt;
&lt;p&gt;每次 patch 後，不只看總分，而是跑完整 22-case：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;case 1   old → new → delta
case 2   old → new → delta
...
case 22  old → new → delta
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一個 patch 要進主線，至少要回答：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;改善的是哪個 case？&lt;/li&gt;
&lt;li&gt;為什麼改善？&lt;/li&gt;
&lt;li&gt;是否讓其他 case 退步？&lt;/li&gt;
&lt;li&gt;依賴的是 workload 可觀測特徵，還是 public fingerprint？&lt;/li&gt;
&lt;li&gt;條件判斷錯誤時，有沒有 fallback？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這讓後期版本雖然越來越複雜，但每一層複雜度至少都有對應的回歸證據。&lt;/p&gt;
&lt;h2&gt;最終提交記錄&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/images/huawei-icpc-2026-submissions.webp&quot; alt=&quot;Codeforces submissions of al1swedel&quot; /&gt;&lt;/p&gt;
&lt;p&gt;提交記錄可以看到競賽末期仍然反覆迭代、回退與再驗證。最終有效結果固定在 &lt;strong&gt;16661.204&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;真正的最終源碼：這裡再說一次&lt;/h2&gt;
&lt;p&gt;為博客歸檔，我把你看到的&lt;strong&gt;真正 Codeforces 最終提交源碼&lt;/strong&gt;另存為：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CF2251A_FINAL_16661_204.cpp&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;22-case Judgement Protocol 合計：&lt;strong&gt;16661.204179914599&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Codeforces 顯示分數：&lt;strong&gt;16661.204&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Final standings：&lt;strong&gt;#15&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;歸檔檔案大小：&lt;strong&gt;65321 bytes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SHA-256：&lt;code&gt;03f8bea96b0766b23d160ffa16804240d1e66a29b93c14ac61f3c273791dfa38&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這個 hash 綁定的是本文附上的 final source，不是之前的 &lt;code&gt;T207&lt;/code&gt; 檔案。&lt;/p&gt;
&lt;p&gt;前幾行如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;
#define R0 return
#define X int
#define Y auto
#define Z max
#define W min
#define O bool
#define H abs
#define T to_string
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;後面的程式已經為提交尺寸與迭代速度做了大量壓縮，閱讀感受接近直接盯著一堵 AST 牆。正文不再複製 65 KB 的單行壓縮源碼；本文保存其校驗值與完整 Judgement Protocol，避免把其他內部版本誤認成 final。&lt;/p&gt;
&lt;h2&gt;最終 Judgement Protocol&lt;/h2&gt;
&lt;p&gt;這份 final source 的 22 個 case 結果如下。這也是它被認定為「真正最終版本」最直接的數值證據。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;tp&lt;/th&gt;
&lt;th&gt;mean TDR&lt;/th&gt;
&lt;th&gt;mean TPOT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;#1&lt;/td&gt;
&lt;td&gt;500.000003&lt;/td&gt;
&lt;td&gt;0.022222&lt;/td&gt;
&lt;td&gt;30.000000&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#2&lt;/td&gt;
&lt;td&gt;500.000000&lt;/td&gt;
&lt;td&gt;0.005755&lt;/td&gt;
&lt;td&gt;126.158679&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#3&lt;/td&gt;
&lt;td&gt;500.567967&lt;/td&gt;
&lt;td&gt;0.003880&lt;/td&gt;
&lt;td&gt;1329.849832&lt;/td&gt;
&lt;td&gt;56.462313&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#4&lt;/td&gt;
&lt;td&gt;832.863211&lt;/td&gt;
&lt;td&gt;0.071298&lt;/td&gt;
&lt;td&gt;493.337948&lt;/td&gt;
&lt;td&gt;76.694740&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#5&lt;/td&gt;
&lt;td&gt;518.651126&lt;/td&gt;
&lt;td&gt;1.340047&lt;/td&gt;
&lt;td&gt;1497.254452&lt;/td&gt;
&lt;td&gt;67.292136&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#6&lt;/td&gt;
&lt;td&gt;463.917548&lt;/td&gt;
&lt;td&gt;0.869552&lt;/td&gt;
&lt;td&gt;3880.824744&lt;/td&gt;
&lt;td&gt;60.637259&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#7&lt;/td&gt;
&lt;td&gt;924.498223&lt;/td&gt;
&lt;td&gt;0.008881&lt;/td&gt;
&lt;td&gt;858.868074&lt;/td&gt;
&lt;td&gt;62.657461&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#8&lt;/td&gt;
&lt;td&gt;838.237636&lt;/td&gt;
&lt;td&gt;0.013495&lt;/td&gt;
&lt;td&gt;1086.885839&lt;/td&gt;
&lt;td&gt;98.955170&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#9&lt;/td&gt;
&lt;td&gt;735.942762&lt;/td&gt;
&lt;td&gt;0.004383&lt;/td&gt;
&lt;td&gt;5726.290775&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#10&lt;/td&gt;
&lt;td&gt;684.424557&lt;/td&gt;
&lt;td&gt;0.007628&lt;/td&gt;
&lt;td&gt;182521.173882&lt;/td&gt;
&lt;td&gt;86.964712&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#11&lt;/td&gt;
&lt;td&gt;500.239294&lt;/td&gt;
&lt;td&gt;0.000007&lt;/td&gt;
&lt;td&gt;65540728.936072&lt;/td&gt;
&lt;td&gt;16199.089335&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#12&lt;/td&gt;
&lt;td&gt;806.526300&lt;/td&gt;
&lt;td&gt;0.000024&lt;/td&gt;
&lt;td&gt;1280549.638656&lt;/td&gt;
&lt;td&gt;178.211443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#13&lt;/td&gt;
&lt;td&gt;822.142160&lt;/td&gt;
&lt;td&gt;0.030751&lt;/td&gt;
&lt;td&gt;1714.712378&lt;/td&gt;
&lt;td&gt;145.324146&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#14&lt;/td&gt;
&lt;td&gt;415.266866&lt;/td&gt;
&lt;td&gt;0.003564&lt;/td&gt;
&lt;td&gt;192.489397&lt;/td&gt;
&lt;td&gt;185.993268&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#15&lt;/td&gt;
&lt;td&gt;888.996971&lt;/td&gt;
&lt;td&gt;0.000009&lt;/td&gt;
&lt;td&gt;7303441.029544&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#16&lt;/td&gt;
&lt;td&gt;981.471475&lt;/td&gt;
&lt;td&gt;0.029808&lt;/td&gt;
&lt;td&gt;41824.000072&lt;/td&gt;
&lt;td&gt;71.703522&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#17&lt;/td&gt;
&lt;td&gt;944.639041&lt;/td&gt;
&lt;td&gt;0.000520&lt;/td&gt;
&lt;td&gt;8563137.539103&lt;/td&gt;
&lt;td&gt;5875.574485&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#18&lt;/td&gt;
&lt;td&gt;916.202899&lt;/td&gt;
&lt;td&gt;0.000009&lt;/td&gt;
&lt;td&gt;17713636.295039&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#19&lt;/td&gt;
&lt;td&gt;960.253914&lt;/td&gt;
&lt;td&gt;0.717268&lt;/td&gt;
&lt;td&gt;144.309740&lt;/td&gt;
&lt;td&gt;142.346375&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#20&lt;/td&gt;
&lt;td&gt;998.203001&lt;/td&gt;
&lt;td&gt;0.005607&lt;/td&gt;
&lt;td&gt;1257.782370&lt;/td&gt;
&lt;td&gt;172.089175&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#21&lt;/td&gt;
&lt;td&gt;972.924403&lt;/td&gt;
&lt;td&gt;0.012525&lt;/td&gt;
&lt;td&gt;35870.869792&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#22&lt;/td&gt;
&lt;td&gt;955.234823&lt;/td&gt;
&lt;td&gt;39.873266&lt;/td&gt;
&lt;td&gt;1858.000000&lt;/td&gt;
&lt;td&gt;6.002148&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Total = 16661.204179914599 → Codeforces 顯示 16661.204&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;實時排名錄影&lt;/h2&gt;
&lt;p&gt;當時保存的實時排名影片：&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/yXFaB-dMkpk&quot; title=&quot;ICPC 2026 Huawei Online Challenge 實時排名&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;YouTube：&lt;a href=&quot;https://www.youtube.com/watch?v=yXFaB-dMkpk&quot;&gt;https://www.youtube.com/watch?v=yXFaB-dMkpk&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;賽後：研究版本和比賽 final 必須分開&lt;/h2&gt;
&lt;p&gt;比賽結束後，我仍然繼續做泛化、OOD 與更保守的策略實驗。但這些版本必須和競賽 final 分開記錄。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;競賽時間線
T032 → T066 → T068 → T069 → T106 → ... → late checkpoints → FINAL SOURCE
                                                        ↓
                                             16661.204 / #15
                                                        ↓
                                                  contest ends
                                                        ↓
賽後時間線                                      generalization / OOD audit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以本文有一條硬規則：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;凡是比賽結束後做的 generalized / OOD / distilled 版本，不論本地測試多漂亮，都不回寫成「比賽最終版本」。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;這個區分很重要。否則很容易把「賽後更乾淨的研究程式」誤寫成「當時真正提交的程式」，最後版本史就會變成一場由檔名主導的歷史修正主義。&lt;/p&gt;
&lt;h2&gt;最後留下來的東西&lt;/h2&gt;
&lt;p&gt;這次 Challenge 最有意思的地方，不只是第 15 名，而是我們最後真的把一個最初靠直覺調參的 heuristic，逐步變成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;可復現 Judge
+ 狀態機
+ score-aware scheduling
+ dynamic batching
+ workload classification
+ guarded specialisation
+ exact regression
+ post-contest OOD audit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後那份約 65 KB、幾乎被壓成一堵牆的 C++ 並不好看，但它保存了整個迭代過程留下來的工程決策。競賽程式有時就是這樣：外表像事故現場，裡面每一條傷痕卻都有來歷。&lt;/p&gt;
</content:encoded></item><item><title>關於·利用pytorch、Mask R-CNN與U-Net用來拆分的想法</title><link>https://alaster-t34.github.io/posts/ai-live2d/%E9%97%9C%E6%96%BC%E5%88%A9%E7%94%A8pytorch%E4%BE%86%E8%87%AA%E4%B8%BB%E7%94%9F%E6%88%90%E9%AB%98%E8%B3%AA%E9%87%8F%E7%AB%8B%E7%B9%AA%E5%90%84%E9%83%A8%E5%88%86%E7%9A%84%E6%A8%99%E6%B3%A8%E6%95%B8%E6%93%9A%E9%9B%86/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/ai-live2d/%E9%97%9C%E6%96%BC%E5%88%A9%E7%94%A8pytorch%E4%BE%86%E8%87%AA%E4%B8%BB%E7%94%9F%E6%88%90%E9%AB%98%E8%B3%AA%E9%87%8F%E7%AB%8B%E7%B9%AA%E5%90%84%E9%83%A8%E5%88%86%E7%9A%84%E6%A8%99%E6%B3%A8%E6%95%B8%E6%93%9A%E9%9B%86/</guid><pubDate>Wed, 22 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;br&amp;gt;
▇ ▆ ▅ ▃ ▂ ▁ ▂ ▃ ▅ ▆ ▇
&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;用於拆分的ai模型，要分爲兩部分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;用於標記（注）的ai模型&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;用於拆分的ai模型&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;用於標注的ai、模型&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;準備數據集與訓練的基礎
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;收集數據（立繪圖像），需具備多個部件
我打算從蔚藍檔案，少女前綫，碧藍航綫，鳴潮，少前2·追放裏獲得（但是，但是哈，不夠，這還不夠）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手動標注少量成本，作爲初始訓練數據
采用遷移學習和數據增强等技術，利用少量標記樣本來起到初步訓練模型的作用。
預計要300張標記圖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每個立繪圖像的標簽應是分割圖（mask）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每個部件對應一個唯一的標簽&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用深度學習模型進行圖像分割
&lt;ul&gt;
&lt;li&gt;采用 &lt;strong&gt;U-Net&lt;/strong&gt; 等预训练模型，分割出不同的图层。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将分割后的不同部分提取出来并保存&lt;/li&gt;
&lt;li&gt;優化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最主要的拆分部分&amp;lt;br&amp;gt;
头发：前发、后发、侧发等。&amp;lt;br&amp;gt;
眼睛：上眼皮、下眼皮、瞳孔等。&amp;lt;br&amp;gt;
嘴巴：上嘴唇、下嘴唇、舌头、牙齿等。&amp;lt;br&amp;gt;
衣服：上衣、裤子、裙子等。&amp;lt;br&amp;gt;
面部：面颊、鼻子、下巴等。&amp;lt;br&amp;gt;
耳朵。&amp;lt;br&amp;gt;
四肢：手臂、手、脚、腿等。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;配件和饰品：耳环、眼镜、帽子等。&amp;lt;br&amp;gt;&lt;/h2&gt;
&lt;p&gt;需要的一些python庫：pytorch torchvision matplotlib opencv-python pillow numpy&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install torch torchvision matplotlib opencv-python pillow numpy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;構建標注系統的步驟&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;訓練自動標注模型
要基於已有的標註數據集訓練圖像分割模型，這樣模型可以學會如何對圖像進行像素級的標註。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 假設你已經訓練了U-Net模型並將其命名為 `unet_model`
model = UNet(in_channels=3, out_channels=3)  # 設定為分割三個類別（例如，背景、頭髮、衣服）

# 訓練模型的步驟與之前相同，並保存模型
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立自動標記系統
使用訓練好的模型來對新的圖像進行自動標註。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import torch
from PIL import Image
import numpy as np
import torchvision.transforms as transforms

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;加載模型&lt;/h1&gt;
&lt;p&gt;model = UNet(in_channels=3, out_channels=3)
model.load_state_dict(torch.load(&apos;unet_model.pth&apos;))
model.eval()&lt;/p&gt;
&lt;h1&gt;預處理圖片&lt;/h1&gt;
&lt;p&gt;transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
])&lt;/p&gt;
&lt;p&gt;def auto_label(image_path):
image = Image.open(image_path).convert(&apos;RGB&apos;)
image_tensor = transform(image).unsqueeze(0)  # 增加 batch 維度&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   with torch.no_grad():
       output = model(image_tensor)
   # 轉換輸出為標註圖像
   output = torch.argmax(output, dim=1).squeeze().cpu().numpy()

   return output

# 處理文件夾中的所有圖像
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;input_folder = &apos;path_to_images&apos;
output_folder = &apos;path_to_output_labels&apos;&lt;/p&gt;
&lt;p&gt;for image_name in os.listdir(input_folder):
image_path = os.path.join(input_folder, image_name)
label = auto_label(image_path)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 儲存自動生成的標註圖像
label_image = Image.fromarray(label.astype(np.uint8))  # 保存為圖片
label_image.save(os.path.join(output_folder, f&apos;{image_name}_label.png&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>關於·訓練ai讓其對原畫立繪進行拆分(圖像分割）的步驟的一些基层想法</title><link>https://alaster-t34.github.io/posts/ai-live2d/%E9%97%9C%E6%96%BC%E8%A8%93%E7%B7%B4ai%E8%AE%93%E5%85%B6%E5%B0%8D%E5%8E%9F%E7%95%AB%E7%AB%8B%E7%B9%AA%E9%80%B2%E8%A1%8C%E6%8B%86%E5%88%86/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/ai-live2d/%E9%97%9C%E6%96%BC%E8%A8%93%E7%B7%B4ai%E8%AE%93%E5%85%B6%E5%B0%8D%E5%8E%9F%E7%95%AB%E7%AB%8B%E7%B9%AA%E9%80%B2%E8%A1%8C%E6%8B%86%E5%88%86/</guid><pubDate>Thu, 16 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;我是這樣想的，這個過程應該可以通過圖像分割和深度學習來實現。&lt;/h2&gt;
&lt;p&gt;具體步驟大概如下：&lt;/p&gt;
&lt;h3&gt;1. 收集數據集&lt;/h3&gt;
&lt;p&gt;需要收集帶有標註的數據集，&lt;em&gt;&lt;strong&gt;每張圖片對應著其拆分後的部件&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;數據集需要包括&lt;/strong&gt;&lt;/em&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原畫立繪圖片。&lt;/li&gt;
&lt;li&gt;每個部件的掩碼圖（mask），標註出每個部件的邊界和區域，這是模型學習拆分的關鍵。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;數據集的質量對訓練效果至關重要，因此需要標註準確，且數據量足夠多（通常需要數千張圖片及其對應的標註）。&lt;/h4&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;1.關於·手動標註數據&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直接且準確，&lt;em&gt;&lt;strong&gt;&lt;s&gt;（但時間成本高。&amp;lt;!--可以想象一下，手動，幾千幾萬張圖片，玩個damn！--&amp;gt;）&lt;/s&gt;&lt;/strong&gt;&lt;/em&gt;&amp;lt;br&amp;gt;
本人不建議，&amp;lt;!--除非你雇了一堆人手來做這件事。--&amp;gt;大概步驟是這樣：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;使用標註工具來手動標註每個部件。這些工具允許你在每張圖片上創建掩碼（mask），標註每個部件。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;將每個部件的區域保存為單獨的圖層，通常是二進制掩碼圖（例如黑色背景，白色部分代表部件）
能用：&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;1.LabelMe&lt;/li&gt;
&lt;li&gt;2.VGG Image Annotator (VIA)&lt;/li&gt;
&lt;li&gt;3.LabelImg&lt;/li&gt;
&lt;li&gt;4.CVAT&lt;/li&gt;
&lt;li&gt;5.RectLabel
&amp;lt;!--不想用。。。有的還要money,我自己也不打算用這個，因爲我就我一個人，手動太麻煩了。--&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;2.關於·現有的標註數據集&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（&lt;s&gt;使用現有的標註數據集，可以節省時間，但質量。。。）&lt;/s&gt;
如果已有的標註數據集包含了與原畫立繪拆分相關的圖像，可以使用這些數據集來加速訓練。雖然這樣的數據集不常見，但一些公共數據集可能會有所幫助（應該吧）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.COCO Dataset&lt;/li&gt;
&lt;li&gt;2.Pascal VOC Dataset&lt;/li&gt;
&lt;li&gt;3.ImageNet Dataset&lt;/li&gt;
&lt;li&gt;4.Open Images Dataset&lt;/li&gt;
&lt;li&gt;5.ADE20K
&amp;lt;!--能不能用我不確定--&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;3.關於·半自動標註&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;s&gt;（手動標註的時間成本高，因此可以考慮使用半自動的工具來標註數據。但質量畢竟。。。）&lt;/s&gt;
大概步骤步骤如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用已有的深度學習模型（如 U-Net 或 DeepLab）對原畫立繪圖片進行初步分割，生成初步的部件掩碼。&lt;/li&gt;
&lt;li&gt;這些掩碼雖然可能不完美，但可以作為標註的基礎，人工進行修正。&lt;/li&gt;
&lt;li&gt;對每個部件進行細微調整，保證標註的準確性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;4.關於·使用圖層分離工具&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;s&gt;（这个似乎是比较简单的了）&lt;/s&gt;
直接提取每個部件的圖層，並將其作為掩碼圖。（大霧）
&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;诶！这时候就有人要说了：能不能不用掩码图？&lt;/h4&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我还真想了这事，但是这玩意会导致模型的复杂度增加&amp;lt;br&amp;gt;
我想的是，畢竟沒有現成的掩碼圖，故需要自己生成（或是用模型生成），但是，這樣生成的模型它的局部性太强，不具有全局概括性，可能导致模型欠擬合。而且，操作有些麻煩。
&amp;lt;br&amp;gt;
先來説説複雜度增加一事：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;首先，數據標記的複雜性&amp;lt;br&amp;gt;
在無掩碼圖的情況下，模型無法依賴直接的注釋信息（像素級標簽），無掩碼圖將會導致工作更爲複雜。&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;手動標記的工作量大&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;手動標記的標注精度低&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;手動標記的標注成本高&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;其次，模型訓練的複雜度&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;學習目標不明確&lt;/strong&gt;&lt;/em&gt;· 模型需要依賴間接的提示或約束條件（例如局部標注、特徵信息等等）來理解圖像的結構和内容，而不是像傳統方法那樣有像素級標簽。而且，損失函數將難以優化與設計。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;特徵學習難度大&lt;/strong&gt;&lt;/em&gt;· 模型要從整體特徵中去推斷出不同部分的邊界與關係，那麽就要讓模型不僅要學習到每個區域的特徵，還要學習如何區分這些區域。（你可以想象一下，這個模型的學習能力要多强···）
當然還有一系列的問題，不多説了。
&lt;s&gt;（罪加一等哈~）&lt;/s&gt;
&amp;lt;!--但是非要用的話，也行。哪位能人搞出來了，私信我的X。orz--&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;2. 訓練模型&lt;/h3&gt;
&lt;p&gt;訓練模型的目的是讓模型學習到如何分割出每個部件，並且學習到如何合成出完整的立繪。
訓練模型的目標是生成一個模型，可以根據輸入的圖片，輸出每個部件的掩碼圖（mask）和合成圖片。
訓練模型的流程大概如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;選擇模型架構，例如：U-Net、SegNet、FPN、Mask R-CNN、DeepLab等。&lt;/li&gt;
&lt;li&gt;數據預處理：
1、圖像縮放與裁剪：將所有圖像統一大小，避免過大的圖像影響訓練效率。&amp;lt;br&amp;gt;
2、正規化：對圖像進行正規化處理，使其像素值處於 [0, 1] 或 [-1, 1] 的範圍內。&amp;lt;br&amp;gt;
3、數據增強：對圖片進行隨機裁剪、旋轉、翻轉等操作，增加訓練數據的多樣性，提升模型的泛化能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;訓練過程：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;定義損失函數，例如：交叉熵、Dice Loss、Dice coefficient損失等。&lt;/li&gt;
&lt;li&gt;定義優化器，例如：Adam、SGD等。&lt;/li&gt;
&lt;li&gt;訓練模型，使用訓練數據進行模型訓練，根據每次訓練的損失函數來調整模型參數。&amp;lt;br&amp;gt;
&lt;strong&gt;訓練過程中，模型將學習如何將每個像素點分類為不同的部件（如髮型、衣服等），並學會拆分圖像。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.後處理&lt;/h3&gt;
&lt;p&gt;訓練完模型後，進行後處理來優化結果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;邊緣檢測：檢測模型輸出的掩碼圖（mask）是否有缺陷，如：邊緣太粗、邊緣太細、邊緣太尖等。&lt;/li&gt;
&lt;li&gt;邊緣修正：對模型輸出的掩碼圖（mask）進行邊緣修正，如：用多邊形裁切、用模糊處理等。&lt;/li&gt;
&lt;li&gt;小區域去除：去除一些不必要的小區域，避免分割過程中出現噪聲。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.測評&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IoU：用來衡量預測結果和真實標註之間的重疊度。&lt;/li&gt;
&lt;li&gt;Dice係數：用來評估分割結果的準確性，特別是對於類別不平衡的問題。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 將模型部署到ai上&lt;/h3&gt;
&lt;p&gt;將訓練好的模型部署到ai上，讓ai可以根據輸入的圖片，輸出每個部件的掩碼圖（mask）和合成圖片。
部署模型的流程大概如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將訓練好的模型轉換為可部署的格式，例如：ONNX、TensorRT等。&lt;/li&gt;
&lt;li&gt;將模型部署到ai上，例如：Tensorflow、PyTorch、Caffe、MXNet等。&lt;/li&gt;
&lt;li&gt;將模型的輸入圖片轉換為模型可以接受的格式，例如：JPG、PNG、BMP等。&lt;/li&gt;
&lt;li&gt;將模型的輸出掩碼圖（mask）和合成圖片轉換為可視化的格式，例如：JPG、PNG、BMP等。&lt;/li&gt;
&lt;li&gt;將模型的輸出結果呈現。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. 持續優化&lt;/h3&gt;
&lt;p&gt;用pytorch，tensorflow等框架，對模型進行持續的訓練，提升模型的性能。&lt;/p&gt;
</content:encoded></item><item><title>對，我還是不死心！</title><link>https://alaster-t34.github.io/posts/ai-live2d/%E5%B0%8D%E6%88%91%E9%82%84%E6%98%AF%E4%B8%8D%E6%AD%BB%E5%BF%83/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/ai-live2d/%E5%B0%8D%E6%88%91%E9%82%84%E6%98%AF%E4%B8%8D%E6%AD%BB%E5%BF%83/</guid><pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;這一篇是續著上一篇的《FaiREE-AIイラストか》而寫的，因爲發現上一篇那個幾乎沒啥用，並不能解決我的問題（苦笑）。衆所周知，我會畫立繪，但是！我太懶了，而且因爲時間問題（我的時間永遠是斷斷續續的），就打算讓AI製作live2d模型。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先不得不承認的是：直接通过代码生成 Live2D 模型是相对复杂的&amp;lt;br&amp;gt;
因为 Live2D 模型的创建涉及到图像处理、骨骼动画和物理引擎等多个方面，而这些技术都是相对复杂的。因此，直接通过代码生成 Live2D 模型并不现实。&lt;/li&gt;
&lt;li&gt;但是：理论上是可以通过编程生成或自动化 Live2D 模型的部分步骤&amp;lt;br&amp;gt;
這些部分步驟，比如图像处理、骨骼动画和物理引擎，理论上是可以自动化完成的。比如，图像处理部分，可以利用计算机视觉技术，对人物的照片进行分析，提取出人物的轮廓、皮肤、眼睛、嘴巴等特征，并将这些特征转化为 Live2D 模型的贴图。骨骼动画部分，可以利用机器学习算法，对人物的动作进行分析，并生成 Live2D 模型的动画。物理引擎部分，可以利用物理模拟技术，模拟人物的运动，并生成 Live2D 模型的物理效果。&lt;/li&gt;
&lt;li&gt;因此：理论上是可以自动化生成 Live2D 模型的&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;關於 自动化图像切割与建模&lt;/h3&gt;
&lt;p&gt;尽管 Live2D 的建模和动画主要依赖于手动操作和设计，但可以使用一些代码工具（如 Python 脚本）来辅助自动化某些部分（應該），比如：在图像的切割和图层划分上。&amp;lt;br&amp;gt;
步驟的話：&amp;lt;br&amp;gt;
图像处理：使用 Python 的 OpenCV 库对图像进行处理，提取出人物的轮廓、皮肤、眼睛、嘴巴等特征。（或者PIL库）&amp;lt;br&amp;gt;
导出 Live2D 数据：理论上，可以通过代码将这些分割后的图层和骨骼设定转换为 Live2D 模型所需的格式（如 .moc3、.model3.json 等）。（然而，这部分需要深刻了解 Live2D 的文件格式和动画规则，挺复杂）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;關於 自动化骨骼动画生成&lt;/h3&gt;
&lt;p&gt;Live2D 的动画生成主要依赖于手动操作，但可以使用一些代码工具（如 Python 脚本）来辅助自动化某些部分（應該），比如：在动作的分析和动画生成上。&amp;lt;br&amp;gt;
步驟的話：&amp;lt;br&amp;gt;
动作分析：使用 Python 的 OpenCV 库对视频进行处理，提取出人物的动作特征。（或者用其他的动作识别库）&amp;lt;br&amp;gt;
导出 Live2D 数据：理论上，可以通过代码将动作特征转换为 Live2D 模型的动画文件（如 .motion3.json 等）。（然而，这部分需要深刻了解 Live2D 的文件格式和动画规则）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;關於 自动化物理引擎生成&lt;/h3&gt;
&lt;p&gt;Live2D 的物理引擎生成主要依赖于手动操作，但可以使用一些代码工具（如 Python 脚本）来辅助自动化某些部分（&lt;s&gt;應該&lt;/s&gt;），比如：在人物的运动模拟上。&amp;lt;br&amp;gt;
步驟的話：&amp;lt;br&amp;gt;
运动模拟：使用 Python 的 PyBullet 库进行物理模拟，模拟人物的运动。（或者用其他的物理引擎库~~?~~）&amp;lt;br&amp;gt;
导出 Live2D 数据：理论上，可以通过代码将物理模拟结果转换为 Live2D 模型的物理文件（如 .physics3.json 等）。（然而，这部分需要深刻了解 Live2D 的文件格式和物理规则）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;s&gt;結論&lt;/s&gt;&lt;/h3&gt;
&lt;p&gt;&lt;s&gt;Live2D 模型的自动化生成，理论上是可以实现的，但還屬於起步階段。&amp;lt;br&amp;gt;&lt;/s&gt;
&lt;s&gt;并且不是一個大一統的程序可以解決的（就目前而言因爲要寫這莫一個程序是十分複雜的，畢竟是生成系統，文件而非一張動畫）&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;難道這就結束了嗎？終歸是徒勞嗎？不，一定是遺漏了什麽······&lt;/h2&gt;
&lt;p&gt;因爲是要構建一個live2d模型文件夾，所以，根據下載的那麽多文件來看，首先是拆分出來的圖片，然後再來是動畫文件，最後是物理文件。那麽對這三個都進行自動化生成，那麽就需要有一個自動化工具，這個工具可以將圖片切割、動畫生成、物理模擬，然後合併成一個live2d模型文件夾。&lt;/p&gt;
&lt;p&gt;那麽，這個工具應該要有什麽功能呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;圖片切割：將圖片切割成可以被Live2D模型使用的格式，例如.moc3、.model3.json等。&lt;/li&gt;
&lt;li&gt;動畫生成：將動作轉換成Live2D模型的動畫文件，例如.motion3.json等。&lt;/li&gt;
&lt;li&gt;物理模擬：將物理模擬結果轉換成Live2D模型的物理文件，例如.physics3.json等。&lt;/li&gt;
&lt;li&gt;合併文件：將圖片、動畫、物理文件合併成一個Live2D模型文件夾。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;圖像分割技術&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;圖像分割技術。通過使用深度神經網絡（如捲積神經網絡，CNN）。有如下幾種辦法。&lt;/li&gt;
&lt;li&gt;α.深度學習模型（如 U-Net、Mask R-CNN）&amp;lt;br&amp;gt;
利用模型進行語義分割，即自主識別圖像的不同區域（如頭髮、眼睛、嘴巴等）。這個可以將關鍵部位提取至單獨圖層。&lt;/li&gt;
&lt;li&gt;β.工具和框架&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;DeepLabV3：Google提供的一個深度學習模型，用於圖像分割；&lt;/li&gt;
&lt;li&gt;RunwayML：一個圖像分割工具，可以將圖像分割成不同類別的區域。
Stable Diffusion 或 MidJourney（生成图像辅助工具）：&lt;s&gt;虽然这些工具主要用于生成图像，但也有潜力帮助生成分层图像，或通过风格转换将图像转化为适合 Live2D 的风格。&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;γ.懶人的現成AI工具&lt;/s&gt;&amp;lt;br&amp;gt;
&lt;s&gt;AI Studio：[^提供Live2D模型的生成，可以直接上傳照片，生成Live2D模型文件夾。]&lt;/s&gt;:（你在想什麽?真有這莫好的工具？那我早用了！還寫個damn）&lt;/li&gt;
&lt;li&gt;&lt;s&gt;自動化拆分工具（？有這玩意？我不知道啊）&lt;/s&gt;
&lt;s&gt;Clip Studio Paint：这款软件允许你为角色插图设计分层和分割，并且它提供了一些智能辅助工具来帮助简化分割过程。虽然它本身不是 AI 驱动，但通过其强大的图层功能，可以加速手动拆分的过程。（GPT説的）&lt;/s&gt;
我的感覺就是：自己寫一個的了。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;睏了，睡會兒。&lt;/p&gt;
&lt;p&gt;（唔，睡了一晚上。。。）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;於是是可以用ai來拆分，但是要如何生成動畫文件、物理文件方面。。。
&amp;lt;br&amp;gt;
先讓我歸籠下文件組成：&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;\1. .moc3文件：
Live2D模型的骨架文件，包含了模型的骨骼、頂點、材質、材質參數等信息。它是經過Live2D Cubism編輯器處理後生成的，所以說是模型的“骨架”。&lt;/li&gt;
&lt;li&gt;\2. .model3.json文件：
這個文件用來描述模型的基本設定、繪製層級、動畫設定等。它是和.moc3文件配合使用的，通常包含了模型的配置、材質、物理效果等參數。&lt;/li&gt;
&lt;li&gt;\3. .motion3.json文件：
Live2D模型的动画文件，包含了模型的各个部件的动画轉換信息。這些動作可以是表情變化、眼睛眨動、頭部旋轉等。這些動畫可以被觸發並進行時間控制。&lt;/li&gt;
&lt;li&gt;\4. .physics3.json文件：
Live2D模型的物理文件，包含了模型的物理效果信息。&lt;/li&gt;
&lt;li&gt;\5. 材質文件（通常是.png、.jpg等圖片格式）
模型的各個部件（如頭髮、眼睛、衣服等）會使用不同的圖片作為材質，這些圖片需要被指定到.model3.json中相應的部位。(這裏的應該是拆分后的立繪)&lt;/li&gt;
&lt;li&gt;\6. .pose.json文件
Live2D模型的初始姿勢文件，定義了模型的初始姿勢。這些文件存儲了模型的靜態設定，並允許設置初始的眼睛、嘴巴等位置。&lt;/li&gt;
&lt;li&gt;\7.Live2D Cubism SDK
在開發中，Live2D Cubism SDK會用來將所有的文件和設定合併，並導出最終的模型，以便在應用程序或遊戲中使用。&lt;/li&gt;
&lt;li&gt;\8.音效和配音文件（可選）
模型的聲音可以被指定到.model3.json文件中，並且可以被觸發。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在瞭解到這個后，我的打算是看看別人的那些模型文件夾，結果呢。。。令人費解的事情發生了。。。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;我找到了用于在网页上展示的《少前》的79式模型文件，結果呢，裏面只有.moc3，.mtn，.model3.json和拆分后的立繪。其他的文件，直接没有？！&amp;lt;br&amp;gt;
而且，79式的模型文件夾裏的model.json與我從b站上下載的模型文件夾裏的model.json不太一樣，裏面有很多的差異。。。&amp;lt;br&amp;gt;
故我的猜想是：79式的模型因爲是用於網頁的，所以省略了其他的文件；而B站上的模型是爲了適應其他的用途，所以較爲齊全。
(不過，79式的model.moc文件不能用live2dcubism打開，屮)&lt;/p&gt;
&lt;h2&gt;&lt;s&gt;有一説一，這篇文章寫得真是亂七八糟的&lt;/s&gt;&lt;/h2&gt;
</content:encoded></item><item><title>FaiREE-AIイラストか</title><link>https://alaster-t34.github.io/posts/ai-live2d/fairee-ai%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%8B/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/ai-live2d/fairee-ai%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%8B/</guid><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;AIイラストからLive2Dモデルとして動かすまでのまとめ&lt;/h2&gt;
&lt;h2&gt;从 AI 插图到作为 live2d 模型运行的总结&lt;/h2&gt;
&lt;p&gt;(本人沒學過太多日語，所以這篇文章就是對FaiREE上的《AI Live2D》的機翻和我的蹩脚翻譯，属于是为了我方便看）.原网址是这个：https://fairee.sozaiya-san.com/aiart-to-live2d/)
AIイラストからLive2Dでモデルを作成し、Vtube Studioで動かすまでに参考にしたサイトをまとめていきます。&amp;lt;br&amp;gt;
从 AI 插图到用 live2d 制作模型，再到用 live2d 制作 Vtube (Studio) 运行为止，总结参考过的网站。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;必要なもの・時間(所需的东西与时间)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;普通のスペックのPC（イラストがあればグラボ不要）&amp;lt;br&amp;gt;普通的 PC (有图就不需要实验室)&lt;/li&gt;
&lt;li&gt;Photoshopまたはクリップスタジオ（イラストのパーツ分け）&amp;lt;br&amp;gt;Photoshop 或 剪切板工具 (分割图层)`&lt;/li&gt;
&lt;li&gt;Vtube Studio&lt;/li&gt;
&lt;li&gt;Live2D Cubism Core SDK&lt;/li&gt;
&lt;li&gt;OBS studio（配信用）&amp;lt;br&amp;gt;OBS studio (用于直播)&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、Live2DとVtube Studioは初めて使いました。パーツの切り分けからモデル作成まで10時間くらい、Vtube Studioの設定とかで１時間くらいです。そのほか調べ事などが５時間くらいでした。&amp;lt;br&amp;gt;
顺便说一下，我第一次使用了 live2d 和 Vtube Studio。大概 10 个小时，从零件切割到模型制作，大概 10 个小时，Vtube 设置，Studio 设置，大概 10 个小时。此外，还有约 5 个小时的调查。(作者原句)&amp;lt;br&amp;gt;
Photoshopやクリップスタジオ使ったことない人はもう＋３時間くらい？ただ、慣れたら１モデル作るのに10時間もあればいけそうな感じでした（複雑な動きはしないモデルで）&amp;lt;br&amp;gt;
如果你还没有使用过 Photoshop 或 剪切板工具，那就得多花点时间了。但如果你已经熟悉了，那就只需要 10 个小时就能制作出一个简单的模型了。(作者原句)&amp;lt;br&amp;gt;
Vtube Studioを使って、PCのインカメラで顔認識（フェイストラッキング）させて動かしています。&amp;lt;br&amp;gt;
Vtube Studio 用来，用 PC 内置摄像头进行人脸识别（面部跟踪）来运行模型。&amp;lt;br&amp;gt;
ここまで作成するのに参考にしたサイトをまとめていきます。&amp;lt;br&amp;gt;
以下是我们制作这些网站时参考的内容。&amp;lt;br&amp;gt;&lt;s&gt;霧&lt;/s&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;イラストの準備(准备图画)&lt;/h3&gt;
&lt;p&gt;イラストのポイントは下記のとおりです。&amp;lt;br&amp;gt;
图画的要素如下：&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;背景：透明なものが望ましい&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;イラストのポイントは下記のとおりです。&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;解像度は自由（大きめ推奨）&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;口が開いている（公式チュートリアルにあわせて）&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;できれば正面顔&amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;背景：透明的背景比较好&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;全身插图 (配合官方教程)&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;分辨率自由 (推荐大尺寸)&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;口张开 (跟官方教程一致)&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;正面的脸比较好&amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;
できれば正面顔で左右対称に近い方がやりやすいです。参考画像くらいでも若干大変でした（でもどの角度でもできます）。&amp;lt;br&amp;gt;
建议正面，左右对称的图画，这样更容易制作。（虽然在哪个角度都可以制作）。(機翻：如果可能的话，正面脸靠近左右对称更容易做到。即使是参考图像也有点困难 (但任何角度都可以)。)&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Live2D・Vtube Studioの準備&lt;/h3&gt;
&lt;p&gt;Live2Dはすぐに必要ですが、Vtube Studioはモデルができてからで大丈夫です。&amp;lt;br&amp;gt;
Live2D 立刻需要，但 Vtube Studio 要等模型制作完毕后再来。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h4&gt;Live2Dのインストール&amp;lt;br&amp;gt;&lt;/h4&gt;
&lt;h4&gt;安装 Live2D&amp;lt;br&amp;gt;&lt;/h4&gt;
&lt;p&gt;（這裏跳過，因為我已經有 Live2D Cubism Core SDK 了。）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h4&gt;Vtube Studioのインストール&amp;lt;br&amp;gt;&lt;/h4&gt;
&lt;h4&gt;安装 Vtube Studio&amp;lt;br&amp;gt;&lt;/h4&gt;
&lt;p&gt;（這裏跳過，因為我已經有 Vtube Studio 了。在steam上下載，可以看這篇文章：https://he72oh.com/vtube-studio-manual/）&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;OBS studioのインストール&lt;/h3&gt;
&lt;h3&gt;安装 OBS studio&amp;lt;br&amp;gt;&lt;/h3&gt;
&lt;p&gt;OBSは配信ソフトです。そのままYouTubeやツイキャスなどにライブ配信できます。&amp;lt;br&amp;gt;
OBS 是直播软件，可以直播到 YouTube 或者 Twitch 等平台。&amp;lt;br&amp;gt;
イメージとしては、Vtube Studioでフェイストラッキングしたモデルを動かし、OBSでゲーム画面などとVtube Studioのモデルを合成してYouTube等に流すイメージです。&amp;lt;br&amp;gt;
一个 Vtube 模型，用 Studio 面部追踪，然后用 OBS 把游戏画面和 OBS 的 Vtube 合成在 Studio 上，再用 YouTube 播放。(當然也可以用其他平台)&amp;lt;br&amp;gt;
なので、モデルを動かしたり、好きな背景と合成して動かすだけならVtube Studioだけで十分できます。必要な人はダウンロードしましょう。&amp;lt;br&amp;gt;
所以,我们可以移动模型,如果你只是想把它和你喜欢的背景合成在一起然后移动它，Vtube Studio 就足够了.有需要的人可以下载。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;イラストのパーツ分け→モデル作成(分割插图→创建模型)&lt;/h3&gt;
&lt;p&gt;Live2D公式がとてもわかりやすい動画を出してくれていますので、そちらを参考にすれば大丈夫です！私も公式だけしか見てません。&amp;lt;br&amp;gt;
Live2D 官方有非常好的教程视频，可以参考！我也是只看过官方的教程。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;再後面的的步骤，就是分割插画，创建模型了。&amp;lt;br&amp;gt;
幾乎啥也沒講，都是live2的的官方教程。。。幾乎沒啥用。（所以我幹了啥。。。）&amp;lt;br&amp;gt;
總之，現在缺少模型。所以我們需要先把模型做出來。
完結（暫時）&lt;/p&gt;
</content:encoded></item><item><title>H5</title><link>https://alaster-t34.github.io/posts/h5/h5/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/h5/h5/</guid><description>HTML5 小貓娘的基本資訊與使用方法</description><pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;HTML5 小貓娘：基本資訊與使用方法&lt;/h1&gt;
&lt;p&gt;本頁面的存在目的，是協助使用者理解名為 &lt;strong&gt;HTML5&lt;/strong&gt; 的 Web 結構技術。&lt;/p&gt;
&lt;p&gt;為了降低理解成本，本頁將 HTML5 描述為一位負責搭建網頁骨架的 &lt;strong&gt;小貓娘&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;她並非程式語言。&lt;/p&gt;
&lt;p&gt;她是標記語言。&lt;/p&gt;
&lt;p&gt;她的任務，是將文字、圖片、連結、表格、表單、影片與音訊整理成瀏覽器可以解析的結構。&lt;/p&gt;
&lt;p&gt;換言之，HTML5 是 Web 頁面的骨架。&lt;/p&gt;
&lt;p&gt;而 HTML5 小貓娘，就是負責把這副骨架排列整齊的執行者。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 基本定義&lt;/h2&gt;
&lt;p&gt;HTML 的全稱是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HyperText Markup Language
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;中文通常稱為：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;超文字標記語言
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML5 則是現代 Web 常用的 HTML 標準。&lt;/p&gt;
&lt;p&gt;它負責描述網頁內容的結構。&lt;/p&gt;
&lt;p&gt;如果將一個網站看作一位角色，那麼：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技術&lt;/th&gt;
&lt;th&gt;職責&lt;/th&gt;
&lt;th&gt;小貓娘式說明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTML5&lt;/td&gt;
&lt;td&gt;結構&lt;/td&gt;
&lt;td&gt;骨架與房間配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS&lt;/td&gt;
&lt;td&gt;樣式&lt;/td&gt;
&lt;td&gt;衣服、髮型與顏色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;行為&lt;/td&gt;
&lt;td&gt;動作、互動與魔法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;HTML5 小貓娘負責宣告：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;這裡是標題。
這裡是段落。
這裡是圖片。
這裡是連結。
這裡是表單。
這裡是使用者可以操作的入口。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;任務明確。&lt;/p&gt;
&lt;p&gt;結構優先。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. HTML5 小貓娘的基本資訊&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;資訊&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;名稱&lt;/td&gt;
&lt;td&gt;HTML5 小貓娘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技術本體&lt;/td&gt;
&lt;td&gt;HTML5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;類型&lt;/td&gt;
&lt;td&gt;標記語言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;職責&lt;/td&gt;
&lt;td&gt;建立網頁內容結構&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要武器&lt;/td&gt;
&lt;td&gt;標籤 tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;搭檔&lt;/td&gt;
&lt;td&gt;CSS、JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;常見檔案副檔名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.html&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要執行環境&lt;/td&gt;
&lt;td&gt;Web 瀏覽器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心義務&lt;/td&gt;
&lt;td&gt;讓內容被瀏覽器正確理解&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;HTML5 小貓娘不會負責複雜計算。&lt;/p&gt;
&lt;p&gt;不會處理資料庫。&lt;/p&gt;
&lt;p&gt;不會獨自完成華麗動畫。&lt;/p&gt;
&lt;p&gt;她的本質任務是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;將內容放到正確的位置。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這就是她作為 HTML5 的存在意義。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 第一個 HTML5 文件&lt;/h2&gt;
&lt;p&gt;一份最基本的 HTML5 文件如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;zh-TW&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;HTML5 小貓娘&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;你好，我是 HTML5 小貓娘&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;我的任務是協助你建立清楚的網頁結構。&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這段程式碼可以存成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後用瀏覽器開啟。&lt;/p&gt;
&lt;p&gt;如果頁面顯示出標題與段落，代表 HTML5 小貓娘已經成功啟動。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 文件結構解析&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這一行告訴瀏覽器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本文件使用 HTML5 標準。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這是啟動宣告。&lt;/p&gt;
&lt;p&gt;沒有它，瀏覽器可能會用較舊或不穩定的方式解析頁面。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html lang=&quot;zh-TW&quot;&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 是整份文件的根元素。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lang=&quot;zh-TW&quot;&lt;/code&gt; 表示頁面主要語言是繁體中文。&lt;/p&gt;
&lt;p&gt;這對搜尋引擎、翻譯工具與輔助閱讀器都有幫助。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;頁面標題&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 裡放的是頁面設定。&lt;/p&gt;
&lt;p&gt;這些內容通常不會直接顯示在畫面上。&lt;/p&gt;
&lt;p&gt;常見用途包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定文字編碼&lt;/li&gt;
&lt;li&gt;設定頁面標題&lt;/li&gt;
&lt;li&gt;設定手機版顯示方式&lt;/li&gt;
&lt;li&gt;引入 CSS&lt;/li&gt;
&lt;li&gt;設定 SEO 描述&lt;/li&gt;
&lt;li&gt;設定網站 icon&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;標題&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;段落&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 裡放的是使用者真正看得到的內容。&lt;/p&gt;
&lt;p&gt;HTML5 小貓娘會在這裡安排主要頁面結構。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 標籤 tag 是什麼？&lt;/h2&gt;
&lt;p&gt;HTML 使用標籤描述內容。&lt;/p&gt;
&lt;p&gt;一個常見標籤長這樣：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;這是一段文字&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;部分&lt;/th&gt;
&lt;th&gt;說明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;開始標籤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;這是一段文字&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;內容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;結束標籤&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以理解為：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTML5 小貓娘打開一個盒子，放入內容，然後把盒子關上。
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 常用標籤&lt;/h2&gt;
&lt;h3&gt;標題&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;主標題&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;副標題&amp;lt;/h2&amp;gt;
&amp;lt;h3&amp;gt;小標題&amp;lt;/h3&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;標題用來建立文章層級。&lt;/p&gt;
&lt;p&gt;一般建議一個頁面只使用一個 &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;段落&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;這是一段正文內容。&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;段落用來放主要文字。&lt;/p&gt;
&lt;p&gt;如果只是普通文章內容，應該使用 &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;，不要用大量 &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; 強行換行。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;連結&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://example.com&quot;&amp;gt;前往 example&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; 是連結標籤。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;href&lt;/code&gt; 是連結目標。&lt;/p&gt;
&lt;p&gt;如果想在新分頁開啟，可以寫：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;
  開啟新分頁
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這是一扇通往其他頁面的門。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;圖片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./h.jpg&quot; alt=&quot;HTML5 小貓娘&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;src&lt;/code&gt; 是圖片位置。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;alt&lt;/code&gt; 是圖片說明。&lt;/p&gt;
&lt;p&gt;如果圖片載入失敗，或使用者使用螢幕閱讀器，&lt;code&gt;alt&lt;/code&gt; 會提供必要資訊。&lt;/p&gt;
&lt;p&gt;因此，&lt;code&gt;alt&lt;/code&gt; 不是裝飾。&lt;/p&gt;
&lt;p&gt;它是輔助資訊。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;無序列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;HTML&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;CSS&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;JavaScript&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有序列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ol&amp;gt;
  &amp;lt;li&amp;gt;建立 HTML 文件&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;加入 CSS 樣式&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;加入 JavaScript 互動&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果內容有順序，使用 &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果只是項目集合，使用 &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. 屬性 attribute&lt;/h2&gt;
&lt;p&gt;屬性用來補充標籤設定。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://example.com&quot; target=&quot;_blank&quot;&amp;gt;連結&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;屬性&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;href&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;設定連結目標&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;設定開啟方式&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;屬性的格式是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;屬性名稱=&quot;屬性值&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML5 小貓娘的判斷如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;標籤決定這是什麼。
屬性決定它如何運作。
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;8. HTML5 語義化標籤&lt;/h2&gt;
&lt;p&gt;HTML5 不只是把內容放到頁面上。&lt;/p&gt;
&lt;p&gt;它還要求內容具有語義。&lt;/p&gt;
&lt;p&gt;常見語義化標籤如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;標籤&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;頁首或區塊開頭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;導覽列&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;頁面主要內容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;獨立文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主題區塊&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;側邊資訊&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;頁尾&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;範例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;header&amp;gt;
  &amp;lt;h1&amp;gt;HTML5 小貓娘資料庫&amp;lt;/h1&amp;gt;
&amp;lt;/header&amp;gt;

&amp;lt;nav&amp;gt;
  &amp;lt;a href=&quot;/&quot;&amp;gt;首頁&amp;lt;/a&amp;gt;
  &amp;lt;a href=&quot;/posts/&quot;&amp;gt;文章&amp;lt;/a&amp;gt;
&amp;lt;/nav&amp;gt;

&amp;lt;main&amp;gt;
  &amp;lt;article&amp;gt;
    &amp;lt;h2&amp;gt;HTML5 是什麼？&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;HTML5 是用來建立網頁結構的標記語言。&amp;lt;/p&amp;gt;
  &amp;lt;/article&amp;gt;
&amp;lt;/main&amp;gt;

&amp;lt;footer&amp;gt;
  &amp;lt;p&amp;gt;任務完成。&amp;lt;/p&amp;gt;
&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這種寫法比全部使用 &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 更清楚。&lt;/p&gt;
&lt;p&gt;因為瀏覽器、搜尋引擎與輔助工具都能理解頁面結構。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 表格&lt;/h2&gt;
&lt;p&gt;表格適合呈現資料。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;標籤&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;用途&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;td&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;段落&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;td&amp;gt;&amp;amp;lt;a&amp;amp;gt;&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;連結&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;表格用於資料，不應用於整站排版。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;整站排版應交給 CSS。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 表單&lt;/h2&gt;
&lt;p&gt;表單用於收集使用者輸入。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;form&amp;gt;
  &amp;lt;label for=&quot;name&quot;&amp;gt;名字&amp;lt;/label&amp;gt;
  &amp;lt;input id=&quot;name&quot; name=&quot;name&quot; type=&quot;text&quot;&amp;gt;

  &amp;lt;label for=&quot;message&quot;&amp;gt;留言&amp;lt;/label&amp;gt;
  &amp;lt;textarea id=&quot;message&quot; name=&quot;message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;

  &amp;lt;button type=&quot;submit&quot;&amp;gt;送出&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表單中的關鍵元素：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;元素&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表單容器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;輸入說明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;單行輸入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多行輸入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按鈕&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;label&lt;/code&gt; 的 &lt;code&gt;for&lt;/code&gt; 應該對應輸入框的 &lt;code&gt;id&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這樣可用性更好，也更符合無障礙設計。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;11. 多媒體&lt;/h2&gt;
&lt;p&gt;HTML5 支援原生音訊與影片。&lt;/p&gt;
&lt;h3&gt;影片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video controls width=&quot;640&quot;&amp;gt;
  &amp;lt;source src=&quot;demo.mp4&quot; type=&quot;video/mp4&quot;&amp;gt;
  你的瀏覽器不支援 video 標籤。
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;音訊&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;audio controls&amp;gt;
  &amp;lt;source src=&quot;demo.mp3&quot; type=&quot;audio/mpeg&quot;&amp;gt;
  你的瀏覽器不支援 audio 標籤。
&amp;lt;/audio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;controls&lt;/code&gt; 會顯示播放、暫停、音量等控制器。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;12. 如何使用 HTML5&lt;/h2&gt;
&lt;h3&gt;步驟一：建立檔案&lt;/h3&gt;
&lt;p&gt;建立一個檔案：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;步驟二：寫入基本結構&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;zh-TW&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;我的頁面&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;我的第一個網頁&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;這是 HTML5 建立的內容。&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;步驟三：用瀏覽器開啟&lt;/h3&gt;
&lt;p&gt;你可以直接雙擊 &lt;code&gt;index.html&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;也可以用 VS Code 的 Live Server 插件開啟。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;步驟四：加入 CSS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;./style.css&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後建立：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;style.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;寫入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;body {
  font-family: system-ui, sans-serif;
  background: #f7fbff;
  color: #1f2937;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;步驟五：加入 JavaScript&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;./main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後建立：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;寫入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;HTML5 小貓娘已啟動。&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;13. 一個完整示例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;zh-TW&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;HTML5 小貓娘&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
      body {
        margin: 0;
        font-family: system-ui, sans-serif;
        background: #eef6ff;
        color: #172554;
      }

      main {
        max-width: 760px;
        margin: auto;
        padding: 48px 20px;
      }

      article {
        padding: 28px;
        border-radius: 24px;
        background: white;
        box-shadow: 0 20px 60px rgba(37, 99, 235, 0.16);
      }

      .tag {
        display: inline-block;
        padding: 4px 10px;
        border-radius: 999px;
        background: #dbeafe;
        color: #1d4ed8;
        font-weight: 700;
      }

      button {
        border: 0;
        border-radius: 999px;
        padding: 12px 18px;
        background: #2563eb;
        color: white;
        font-weight: 700;
        cursor: pointer;
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;main&amp;gt;
      &amp;lt;article&amp;gt;
        &amp;lt;span class=&quot;tag&quot;&amp;gt;HTML5 Catgirl&amp;lt;/span&amp;gt;
        &amp;lt;h1&amp;gt;你好，我是 HTML5 小貓娘&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;我的任務是建立清楚、可讀、可解析的網頁結構。&amp;lt;/p&amp;gt;
        &amp;lt;button onclick=&quot;alert(&apos;任務確認：HTML5 小貓娘已啟動。&apos;)&quot;&amp;gt;
          啟動
        &amp;lt;/button&amp;gt;
      &amp;lt;/article&amp;gt;
    &amp;lt;/main&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;14. 常見錯誤&lt;/h2&gt;
&lt;h3&gt;錯誤一：忘記結束標籤&lt;/h3&gt;
&lt;p&gt;錯誤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;這是一段文字
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正確：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;這是一段文字&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;錯誤二：圖片沒有 &lt;code&gt;alt&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;不建議：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./h.jpg&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建議：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./h.jpg&quot; alt=&quot;HTML5 小貓娘&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;錯誤三：標題層級混亂&lt;/h3&gt;
&lt;p&gt;不建議：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;主標題&amp;lt;/h1&amp;gt;
&amp;lt;h4&amp;gt;突然出現的副標題&amp;lt;/h4&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建議：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;主標題&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;副標題&amp;lt;/h2&amp;gt;
&amp;lt;h3&amp;gt;更細的段落標題&amp;lt;/h3&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;錯誤四：用 HTML 負責樣式&lt;/h3&gt;
&lt;p&gt;HTML 負責結構。&lt;/p&gt;
&lt;p&gt;CSS 負責樣式。&lt;/p&gt;
&lt;p&gt;JavaScript 負責行為。&lt;/p&gt;
&lt;p&gt;不要把所有職責都交給 HTML。&lt;/p&gt;
&lt;p&gt;HTML5 小貓娘會因此陷入職責混亂。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;15. 學習路線&lt;/h2&gt;
&lt;p&gt;推薦順序如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;學會基本文件結構&lt;/li&gt;
&lt;li&gt;學會標題、段落、連結、圖片&lt;/li&gt;
&lt;li&gt;學會列表與表格&lt;/li&gt;
&lt;li&gt;學會表單&lt;/li&gt;
&lt;li&gt;學會語義化標籤&lt;/li&gt;
&lt;li&gt;學會引入 CSS&lt;/li&gt;
&lt;li&gt;學會引入 JavaScript&lt;/li&gt;
&lt;li&gt;嘗試建立完整小頁面&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這不是必須一次完成的義務。&lt;/p&gt;
&lt;p&gt;逐步執行即可。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;16. 結語&lt;/h2&gt;
&lt;p&gt;HTML5 小貓娘不是負責炫技的存在。&lt;/p&gt;
&lt;p&gt;她的核心任務，是建立清楚、穩定、可理解的網頁結構。&lt;/p&gt;
&lt;p&gt;她會將內容放入正確的標籤中。&lt;/p&gt;
&lt;p&gt;讓瀏覽器理解。&lt;/p&gt;
&lt;p&gt;讓搜尋引擎理解。&lt;/p&gt;
&lt;p&gt;讓輔助工具理解。&lt;/p&gt;
&lt;p&gt;也讓未來的你理解。&lt;/p&gt;
&lt;p&gt;這就是 HTML5 的意義。&lt;/p&gt;
&lt;p&gt;任務記錄完畢。&lt;/p&gt;
&lt;p&gt;如果你再次遺忘 HTML5 的使用方式，也沒有問題。&lt;/p&gt;
&lt;p&gt;本頁會再次作為鑰匙，協助你打開 Web 的入口。&lt;/p&gt;
</content:encoded></item><item><title>ai桌寵</title><link>https://alaster-t34.github.io/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/%E5%AF%A6%E7%8F%BE/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/%E5%AF%A6%E7%8F%BE/</guid><description>ai桌寵</description><pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;s&gt;做這個的想法其實是這樣的，做一個ai桌寵。&lt;/s&gt;
（滑稽）&lt;/p&gt;
&lt;p&gt;开发顺序如下：Live2D动画 → 语音系统 → 对话框UI → AI对话 → 系统集成。&lt;/p&gt;
&lt;h1&gt;1.1.0版本&lt;/h1&gt;
&lt;p&gt;desktop_pet/
├── app/                  # 主程序入口  ..
│   ├── &lt;strong&gt;init&lt;/strong&gt;.py
│   └── main.py           # 程序启动入口
├── ai_engine/            # AI逻辑处理层  ..
│   ├── api_clients/      # 云端API处理
│   │   └── deepseek_api.py
│   ├── local_llm/        # 本地模型管理
│   │   ├── model_loader.py
│   │   └── prompt_manager.py
│   └── intent_parser.py  # 用户意图解析
├── animation_system/     # Live2D控制   ..
│   ├── model_controller/&lt;br /&gt;
│   │   ├── cubism_binder.py  # 参数绑定系统
│   │   └── motion_scheduler.py # 动作队列管理
│   └── runtime/               # 实时渲染
│       ├── gl_window.py      # OpenGL窗口
│       +    ├── physics/            # 拆分为物理子系统
+    │   ├── legacy_physics.py   # 原有物理实现
+    │   ├── taichi_physics.py    # Taichi物理引擎
+    ├── render_pipeline.py  # 新增渲染管线管理
└── physics.py        → 废弃
├── voice_system/         # 语音生成模块  ..
│   ├── training/         # 语音训练相关
│   │   ├── dataset_preprocess.py
│   │   └── finetune_vits.py
│   └── runtime/
│       ├── tts_server.py      # TTS服务
│       └── voice_cache.py     # 语音缓存
├── gui/                  # 用户界面  ..
│   ├── components/       # 可复用部件
│   │   ├── chat_bubble.py    # 对话框组件
│   │   └── system_tray.py    # 系统托盘控制
│   └── themes/           # 界面主题管理
│       ├── default_theme.json
│       └── theme_loader.py
├── system_hooks/         # 系统级交互  ..
│   ├── command_executor/
│   │   ├── windows_cmd.py    # Windows命令实现
│   │   └── linux_cmd.py      # Linux实现
│   └── security/             # 安全模块
│       ├── permission_check.py
│       └── command_whitelist.yaml
├── assets/               # 静态资源   ..
│   ├── live2d_models/&lt;br /&gt;
│   │   └── shizuku/      # 示例模型
│   │       ├── model3.json
│   │       ├── textures/
│   │       └── motions/
│   ├── voices/
│   │   ├── xiaolu/       # 语音包资源
│   │   │   ├── wavs/
│   │   │   └── config.json
│   └── icons/            # 程序图标
├── configs/              # 配置文件
│   ├── app_config.yaml   # 主配置文件
│   └── key_bindings.yaml # 快捷键配置
└── tests/                # 测试模块
├── unit_tests/       # 单元测试
└── integration_tests/# 集成测试&lt;/p&gt;
&lt;h1&gt;1.2.6细化版本&lt;/h1&gt;
&lt;p&gt;desktop_pet/
├──app/                        # 应用核心
│    ├── &lt;strong&gt;init&lt;/strong&gt;.py
│    ├── bootstrap.py            # 系统初始化入口
│    ├── context.py              # 运行时上下文管理
│    ├── event_system/           # 事件管理系统
│    │   ├── bus.py              # 事件总线实现
│    │   ├── protocols.py        # 事件协议定义
│    │   └── decorators.py       # 事件监听装饰器
│    ├── lifecycle/              # 生命周期管理
│    │   ├── init_sequence.py    # 初始化流程控制
│    │   ├── state_machine.py    # 应用状态机
│    │   └── recovery.py         # 崩溃恢复机制
│    ├── configuration/          # 配置子系统
│    │   ├── loader.py           # 多格式配置加载
│    │   ├── hot_reload.py       # 配置热更新
│    │   └── validators/         # 配置验证
│    │       ├── schema.yaml     # 配置数据结构定义
│    │       └── type_check.py
│    ├── dependency_injection/   # 依赖注入系统
│    │   ├── container.py        # IoC容器
│    │   └── providers.py        # 服务提供者
│    ├── exception_handling/     # 异常处理系统
│    │   ├── logger_setup.py     # 结构化日志配置
│    │   ├── sentry_integration.py # 错误监控
│    │   └── graceful_fallback.py # 安全回退
│    ├── interfaces/             # 抽象接口定义
│    │   ├── ai_service.py       # AI服务合约
│    │   ├── animation_engine.py # 动画引擎合约
│    │   └── voice_system.py     # 语音系统合约
│    └── utilities/              # 工具类
│        ├── perf_monitor.py     # 性能监控
│        └── resource_helper.py  # 资源管理
│
├── ai/                       # AI子系统
│   ├── dialogue/             # 对话管理
│   │   ├── core/&lt;br /&gt;
|   │   │   ├── chat_manager.py       # 对话流协调器
|   │   │   └── history.py           # 对话记忆管理
│   ├── providers/                # AI服务提供方
│   │   ├── deepseek/&lt;br /&gt;
│   │   │   ├── api_client.py    # 深度求索API交互
│   │   │   ├── persona_engine.py # 角色人设引擎
│   │   │   └── rate_limiter.py  # 流量控制
│   │   └── local/&lt;br /&gt;
│   │       ├── model_loader.py   # 本地模型加载器
│   │       ├── quantized/        # 量化模型库
│   │       │   └── codeqwen-4bit.safetensors
│   │       └── optim/           # 推理优化
│   │           ├── vllm_engine.py&lt;br /&gt;
│   │           └── llama_cpp.py
│   ├── processing/               # 对话处理模块
│   │   ├── intent_parser.py&lt;br /&gt;
│   │   ├── emotion_analyzer.py&lt;br /&gt;
│   │   └── safety_check.py      # 内容安全检查
│   └── resources/               # 资源文件
│       ├── persona_profiles/    # 角色设定库
│       │   ├── academic_mentor.json
│       │   └── playful_cat.json
│       └── prompts/             # 提示语模板
│           ├── system_prompt.j2
│           └── error_phrases.yaml&lt;br /&gt;
├── animation/                # 动画引擎
│   ├── live2d/               # Live2D核心
│   │   ├── cubism_sdk/       # Cubism封装
│   │   │   ├── model_loader.py
│   │   │   └── param_mapper.py
│   │   ├── motion/           # 动作管理
│   │   │   ├── scheduler.py
│   │   │   └── blending.py   # 动作混合
│   └── physics/              # 物理系统
│       ├── core.py           # 统一接口
│       ├── taichi/           # GPU加速
│       │   ├── xpbd_solver.py
│       │   └── hair_sim.py
│       └── verlet/           # CPU回退
│           └── constraints.py
├── voice/                    # 语音系统
│   ├── synthesis/            # 语音生成
│   │   ├── vits/             # VITS引擎
│   │   │   ├── custom_voice/ # 用户语音包
│   │   │   │   ├── config.json
│   │   │   │   └── waveform/
│   │   │   └── realtime.py
│   │   └── tts_apis/         # 云端TTS
│       └── deepseek_tts.py
│   └── recognition/          # 语音识别
│       ├── vad.py            # 语音检测
│       └── stt_engine.py
├── ui/                       # 用户界面
│   ├── widgets/              # 定制组件
│   │   ├── chat/             # 对话框系统
│   │   │   ├── bubble.py     # 半透明气泡
│   │   │   ├── history.py    # 聊天记录
│   │   │   └── input_box.py
│   │   └── avatar_window.py  # 桌宠主窗口
│   ├── style/                # 样式管理
│   │   ├── theme_engine.py   # 动态换肤
│   │   └── effects/          # 特效
│       └── acrylic.py        # 亚克力效果
│   └── tray_icon/            # 系统托盘
│       ├── menu.py
│       └── indicators.py     # 状态指示
├── system/                   # 系统交互
│   ├── command/              # 命令执行
│   │   ├── win/              # Windows实现
│   │   │   ├── shell_exec.py
│   │   │   └── task_scheduler.py
│   │   ├── linux/            # Linux实现
│   │   └── validator.py      # 命令验证
│   ├── monitor/              # 系统监控
│   │   ├── resource_tracker.py
│   │   └── triggers.py       # 事件触发
│   └── security/             # 安全模块
│       ├── sandbox.py        # 沙箱机制
│       └── whitelist.yaml
├── resources/                # 项目资源
│   ├── characters/           # 角色资产
│   │   └── shizuku/          # 示例角色
│   │       ├── model.json    # Live2D模型
│   │       ├── textures/
│   │       ├── motions/      # 动作资源
│   │       └── physics/      # 物理配置
│   ├── voices/               # 语音资产
│   │   ├── default/
│   │   └── custom/
│   ├── icons/                # 图标资源
│   └── locales/              # 本地化文件
├── platform/                 # 平台适配
│   ├── windows/              # Win特性
│   │   ├── dwm.py            # 透明效果
│   │   └── taskbar.py
│   └── linux/                # Linux特性
│       ├── x11/
│       └── systemd/
├── config/                   # 配置管理
│   ├── app.yaml              # 主配置
│   ├── keys.yaml             # 快捷键
│   └── presets/              # 预设配置
│       ├── physics/          # 物理预设
│       └── themes/           # 界面主题
├── tests/                    # 测试体系
│   ├── unit/                 # 单元测试
│   │   ├── test_animation.py
│   │   └── test_ai_response.py
│   └── integration/          # 集成测试
│       └── test_voice_sync.py
├── tools/                    # 开发工具
│   ├── model_tools/          # 模型处理
│   │   ├── converter.py      # 格式转换
│   │   └── optimizer.py      # 模型优化
│   └── voice_training/       # 语音训练
├── scripts/                  # 自动化脚本
│   ├── build.ps1             # Windows构建
│   ├── setup.sh              # Linux安装
│   └── deploy_macos.sh
└── docs/                     # 文档
├── dev_guide.md          # 开发指南
└── api_reference/        # API文档&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/src/content/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/%E5%BA%94%E7%94%A8%E6%A0%B8%E5%BF%83%EF%BC%88app%EF%BC%89.png%22%E5%BA%94%E7%94%A8%E6%A0%B8%E5%BF%83%22&quot; alt=&quot;app核心运行流程图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;框架特性：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1.量子化事件系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用异步队列实现高效消息传递&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持100,000+ TPS的事件吞吐&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2.状态即服务：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过Checkpointer实现任意时间点状态回滚&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持压缩快照存储（平均10KB/次）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/src/content/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/ai%E5%AF%B9%E8%AF%9D.png%22ai%E5%AF%B9%E8%AF%9D%22&quot; alt=&quot;对话流程分析&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;实现关键指标：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;端到端延迟：&amp;lt;1.5秒（云端模式），&amp;lt;3秒（本地模式）&lt;/li&gt;
&lt;li&gt;角色切换响应时间：&amp;lt;300ms&lt;/li&gt;
&lt;li&gt;意图识别准确率：94.2%（混合方法）&lt;/li&gt;
&lt;li&gt;情感检测F1分数：0.87&lt;/li&gt;
&lt;li&gt;支持同时运行3种量化级别的本地模型&lt;/li&gt;
&lt;li&gt;API请求自动重试（3次指数回退）&lt;/li&gt;
&lt;li&gt;本地模型内存开销优化40%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;animation模块解析&lt;/h2&gt;
&lt;p&gt;animation目录结构
&lt;img src=&quot;/src/content/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/animation.png%22animation%22&quot; alt=&quot;目录结构&quot; /&gt;
&lt;img src=&quot;%E6%A8%A1%E5%9D%97%E5%8A%9F%E8%83%BD%E8%A7%A3%E6%9E%90.png&quot; alt=&quot;alt text&quot; /&gt;
animation数据流结构图
&lt;img src=&quot;/src/content/posts/ai%E6%A1%8C%E5%AF%B5%E6%96%B9%E6%A1%88/animation%E6%95%B0%E6%8D%AE%E6%B5%81.png%22animation%E6%95%B0%E6%8D%AE%E6%B5%81%E7%BB%93%E6%9E%84%22&quot; alt=&quot;数据流结构&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;1.3.0细化版本&lt;/h1&gt;
&lt;p&gt;desktop_pet/
│
├── &lt;strong&gt;01.应用内核&lt;/strong&gt; (app_core)
│   ├── app/
│   │   ├── bootstrap.py            # 系统冷启动入口(CUDA初始化/异常处理框架加载)
│   │   ├── dependency_injection/
│   │   │   ├── &lt;strong&gt;init&lt;/strong&gt;.py
│   │   │   ├── container.py        # IoC容器(支持动态服务注册)
│   │   │   └── annotations.py      # 依赖注入语法糖(@Service/@Inject)
│   │   ├── event_system/
│   │   │   ├── core/               # 事件中枢(Redis/NATS后端可选)
│   │   │   │   ├── event_bus.py    # 消息队列接口抽象
│   │   │   │   └── zmq_impl/       # ZeroMQ高性能实现
│   │   │   ├── schemas/            # Protobuf事件格式定义
│   │   │   │   └── animation_events.proto
│   │   │   └── middleware/         # 事件处理中间件
│   │   │       ├── logging_middleware.py
│   │   │       └── validation_middleware.py
│   │   ├── lifecycle/
│   │   │   ├── init_stages.yaml    # 启动阶段定义(并行/串行步骤配置)
│   │   │   ├── state_machine/
│   │   │   │   ├── state_nodes.py  # 状态节点基类
│   │   │   │   └── transitions/    # 状态转移逻辑
│   │   │   └── recovery/
│   │   │       ├── crash_dumps/    # 崩溃现场存储目录
│   │   │       └── state_restore.py
│   │   └── interfaces/             # 抽象接口
│   │       ├── ISystemMonitor.py
│   │       └── IHardwareScheduler.py
│   │
│   └── config/                     # 多层配置系统
│       ├── base.yaml               # 基础默认配置
│       ├── dev.yaml                # 开发环境覆盖配置
│       ├── prod.yaml               # 生产环境覆盖配置
│       ├── secrets/                # 分级密钥管理
│       │   ├── vault.key           # 主密钥文件(需外部注入)
│       │   └── encrypted/
│       │       └── api_keys.secret
│       └── validators/             # 配置验证逻辑
│           ├── schema_validator.py
│           └── type_checkers.py
│
├── &lt;strong&gt;02.智能系统&lt;/strong&gt; (ai_modules)
│   ├── cognition/
│   │   ├── core/                   # 认知计算中枢
│   │   │   ├── WorkingMemory.py    # 记忆管理系统(带LRU缓存)
│   │   │   ├── ReasoningEngine.py  # Datalog推理引擎实现
│   │   │   └── GoalSystem/
│   │   │       ├── priority_queue.py   # 目标优先级调度器
│   │   │       └── MotiveGenerator.py  # 动机生成器(基于时序状态)
│   │   └── knowledge/              # 知识系统模块
│   │       ├── ontology/           # 领域本体库
│   │       │   ├── time_ontology.ttl   # 时间概念本体
│   │       └── fact_database.sqlite     # 动态事实存储
│   │
│   ├── emotion/                    # 情感计算子系统
│   │   ├── emotion_model.py        # PAD三维情绪空间计算
│   │   ├── MoodEngine.py           # 情绪波动引擎(马尔可夫链模型)
│   │   └── influence/              # 环境因素影响系统
│   │       ├── sensor_impact.py    # 传感器输入对情绪影响
│   │       └── dialogue_impact.py  # 对话内容情绪影响
│   │
│   └── dialog/                     # 对话管理子系统
│       ├── pipelines/              # 多级处理流水线
│       │   ├── input_processing/   # 输入处理阶段
│       │   │   ├── cleanser.py     # 语料清洗
│       │   │   └── intent_detect.py
│       │   ├── core_processing/    # 核心处理阶段
│       │   │   └── response_generator.py
│       │   └── post_processing/    # 输出后处理
│       │       ├── emotion_injector.py   # 情感语气注入
│       ├── agent/                  # 对话agent
│       │   ├── DeepSeekAgent.py    # 深度求索专用代理
│       │   └── HuggingFaceAgent.py
│       └── resources/              # NLU资源库
│           ├── intents.yaml        # 意图定义集
│           └── ner_patterns/       # 实体识别规则
│
├── &lt;strong&gt;03.物理表现层&lt;/strong&gt; (physic_engine)
│   ├── live2d/                     # Live2D核心实现
│   │   ├── cubism_sdk/
│   │   │   ├── native/             # SDK原生库
│   │   │   │   ├── win_x64/
│   │   │   │   └── linux_x64/
│   │   │   └── Core.py             # Python绑定入口
│   │   ├── model_loader.py         # 模型加载器(支持热重载)
│   │   ├── param_mappers/          # 参数映射系统
│   │   │   ├── default_mapper.py   # Cubism标准参数
│   │   │   └── custom_mappers/     # 用户自定义映射
│   │   └── motion/                 # 动作管理系统
│   │       ├── motion_scheduler.py # 动作编排调度器
│   │       └── effect_chains/      # 复合动作特效
│   │           └── rain_effect.py  # 示例-下雨时护头动作
│   │
│   └── physics/                    # 物理子系统
│       ├── solvers/                # 物理求解器
│       │   ├── taichi/             # Taichi后端
│       │   │   ├── XPBD_solver.py  # 位置动力学求解器
│       │   │   └── soft_body.py    # 半隐式柔体仿真
│       └── cache_system/           # 物理状态缓存
│           ├── prebake_tool.py     # 预烘焙工具
│           └── playback.py         # 缓存回放引擎
│
├── &lt;strong&gt;04.人机交互层&lt;/strong&gt; (interaction)
│   ├── voice/                      # 语音交互系统
│   │   ├── synthesis/
│   │   │   ├── VITS/               # 本地语音生成
│   │   │   │   ├── core/           # VITS核心模型
│   │   │   │   ├── realtime.py     # 流式生成接口
│   │   │   │   └── profiles/       # 发声风格配置
│   │   │   └── cloud_apis/         # 云TTS接口
│   │   │       └── deepseek_tts.py
│   │   └── recognition/
│   │       ├── stream_asr.py       # 流式语音识别
│   │       └── context_manager.py  # 环境噪声适配
│   │
│   └── visualization/              # 视觉呈现系统
│       ├── rendering/
│       │   ├── OpenGL/             # OpenGL渲染后端
│       │   │   ├── shaders/        # GLSL着色器库
│       │   │   │   └── subsurface_scattering.glsl  # 次表面散射
│       │   └── DirectX/            # DirectX 12后端
│       ├── gaze_tracking/          # 视线追踪系统
│       │   ├── eye_detector.py     # 基于MediaPipe的实现
│       │   └── attention_model.py  # 注意力持续时间预测
│       └── ui_component/           # 交互式UI元素
│           ├── charm_window.py     # 主角色窗口
│           └── command_palette.py  # 浮动指令面板
│
├── &lt;strong&gt;05.资源与设施&lt;/strong&gt; (resources_infra)
│   ├── characters/                 # 角色资源仓库
│   │   ├── base_character/         # 基准角色模型
│   │   │   ├── model3.json         # Cubism模型定义
│   │   │   ├── textures/           # 分层贴图系统
│   │   │   │   ├── base/
│   │   │   │   │   └── skin_base.png
│   │   │   │   └── costumes/       # 换衣系统
│   │   │   │       └── summer_outfit/
│   │   │   │           ├── diffuse.png
│   │   │   │           └── normal_map.png
│   │   │   └── motions/            # 动作资源库
│   │   │       ├── idle/           # 待机动作集
│   │   │       │   └── breathing.mtn3  # Motion3格式
│   │   │       └── reactive/       # 交互响应动作
│   │   └── community/              # 用户生成内容
│   │       └── approval_process/   # UGC审核流程
│   │           ├── content_validator.py
│   │           └── license_checker.py
│   │
│   ├── ai_models/                  # AI模型仓库
│   │   ├── quantized/              # 量化模型
│   │   │   └── codeqwen-4.5b-awq.safetensors
│   │   └── embeddings/             # 嵌入向量库
│   │       ├── text_embeds/        # 文本嵌入
│   │       └── emotion_embeds/     # 情绪分类专用
│   │
│   └── voice_library/              # 多语种音库
│       ├── Chinese/                # 中文语音
│       │   └── multiple_speakers.yaml   # 发音人元数据
│       └── Japanese/
├── &lt;strong&gt;06.开发者工具&lt;/strong&gt; (dev_tools)
│   ├── model_converter/            # 模型转换套件
│   │   ├── transform_scripts/      # 格式转换脚本
│   │   │   ├── pt_to_gguf.py       # PyTorch =&amp;gt; GGUF
│   │   │   └── keras_to_ort.py     # Keras =&amp;gt; ONNX Runtime
│   │   └── quantization/           # 量化工具
│   │       ├── quantize_ggml.py    # GGML量化器
│   │       └── fp8_converter.py    # FP8转化实验
│   │
│   └── automations/                # 开发辅助工具
│       ├── cache_invalidator.py    # 构建缓存清除
│       └── dependency_graph.py     # 模块依赖可视化
│
└── &lt;strong&gt;07.合规与运维&lt;/strong&gt; (deploy_ops)
├── packaging/                  # 多平台打包配置
│   ├── NSIS/                   # Windows安装包脚本
│   │   └── desktop_pet.nsi
│   ├── AppImage/               # Linux打包配置
│   │   └── desktop_pet.appdata.xml
│   └── codesign/               # 代码签名证书
├── monitoring/                 # 生产监控
│   ├── prometheus/             # 指标采集
│   │   └── custom_metrics.py
│   └── sentry/                 # 错误追踪配置
│       └── sentry_conf.yaml
└── legal/                      # 法律合规性
├── licenses/               # 第三方许可证
└── privacy_policy.md       # GDPR合规政策&lt;/p&gt;
&lt;h1&gt;1.3.3细化版本&lt;/h1&gt;
&lt;p&gt;desktop_pet/
│
├── app_core     #主系统
│   ├── app/
│   │   ├── bootstrap.py            # 系统冷启动入口(CUDA初始化/异常处理框架加载)
│   │   ├── dependency_injection/
│   │   │   ├── &lt;strong&gt;init&lt;/strong&gt;.py
│   │   │   ├── container.py        # IoC容器(支持动态服务注册)
│   │   │   └── annotations.py      # 依赖注入语法糖(@Service/@Inject)
│   │   ├── event_system/
│   │   │   ├── core/               # 事件中枢(Redis/NATS后端可选)
│   │   │   │   ├── event_bus.py    # 消息队列接口抽象
│   │   │   │   └── zmq_impl/       # ZeroMQ高性能实现
│   │   │   ├── schemas/            # Protobuf事件格式定义
│   │   │   │   └── animation_events.proto
│   │   │   └── middleware/         # 事件处理中间件
│   │   │       ├── logging_middleware.py
│   │   │       └── validation_middleware.py
│   │   ├── lifecycle/
│   │   │   ├── init_stages.yaml    # 启动阶段定义(并行/串行步骤配置)
│   │   │   ├── state_machine/
│   │   │   │   ├── state_nodes.py  # 状态节点基类
│   │   │   │   └── transitions/    # 状态转移逻辑
│   │   │   └── recovery/
│   │   │       ├── crash_dumps/    # 崩溃现场存储目录
│   │   │       └── state_restore.py
│   │   └── interfaces/             # 抽象接口
│   │       ├── ISystemMonitor.py
│   │       └── IHardwareScheduler.py
│   │
│   └── config/                     # 多层配置系统
│       ├── base.yaml               # 基础默认配置
│       ├── dev.yaml                # 开发环境覆盖配置
│       ├── prod.yaml               # 生产环境覆盖配置
│       ├── secrets/                # 分级密钥管理
│       │   ├── vault.key           # 主密钥文件(需外部注入)
│       │   └── encrypted/
│       │       └── api_keys.secret
│       └── validators/             # 配置验证逻辑
│           ├── schema_validator.py
│           └── type_checkers.py
│
├── ai_modules     # AI子系统（智能系统）
│   ├── cognition/
│   │   ├── core/                   # 认知计算中枢
│   │   │   ├── WorkingMemory.py    # 记忆管理系统(带LRU缓存)
│   │   │   ├── ReasoningEngine.py  # Datalog推理引擎实现
│   │   │   └── GoalSystem/
│   │   │       ├── priority_queue.py   # 目标优先级调度器
│   │   │       └── MotiveGenerator.py  # 动机生成器(基于时序状态)
│   │   └── knowledge/              # 知识系统模块
│   │       ├── ontology/           # 领域本体库
│   │       │   ├── time_ontology.ttl   # 时间概念本体
│   │       └── fact_database.sqlite     # 动态事实存储
│   │
│   ├── emotion/                    # 情感计算子系统
│   │   ├── emotion_model.py        # PAD三维情绪空间计算
│   │   ├── MoodEngine.py           # 情绪波动引擎(马尔可夫链模型)
│   │   └── influence/              # 环境因素影响系统
│   │       ├── sensor_impact.py    # 传感器输入对情绪影响
│   │       └── dialogue_impact.py  # 对话内容情绪影响
│   │
│   └── dialog/                     # 对话管理子系统
│       ├── pipelines/              # 多级处理流水线
│       │   ├── input_processing/   # 输入处理阶段
│       │   │   ├── cleanser.py     # 语料清洗
│       │   │   └── intent_detect.py
│       │   ├── core_processing/    # 核心处理阶段
│       │   │   └── response_generator.py
│       │   └── post_processing/    # 输出后处理
│       │       ├── emotion_injector.py   # 情感语气注入
│       ├── agent/                  # 对话agent
│       │   ├── DeepSeekAgent.py    # 深度求索专用代理
│       │   └── HuggingFaceAgent.py
│       └── resources/              # NLU资源库
│           ├── intents.yaml        # 意图定义集
│           └── ner_patterns/       # 实体识别规则
│
├── physic_engine     # live2d动画物理引擎
│   ├── live2d/                     # Live2D核心实现
│   │   ├── cubism_sdk/
│   │   │   ├── native/             # SDK原生库
│   │   │   │   ├── win_x64/
│   │   │   │   └── linux_x64/
│   │   │   └── Core.py             # Python绑定入口
│   │   ├── model_loader.py         # 模型加载器(支持热重载)
│   │   ├── param_mappers/          # 参数映射系统
│   │   │   ├── default_mapper.py   # Cubism标准参数
│   │   │   └── custom_mappers/     # 用户自定义映射
│   │   └── motion/                 # 动作管理系统
│   │       ├── motion_scheduler.py # 动作编排调度器
│   │       └── effect_chains/      # 复合动作特效
│   │           └── rain_effect.py  # 示例-下雨时护头动作
│   │
│   └── physics/                    # 物理子系统
│       ├── solvers/                # 物理求解器
│       │   ├── taichi/             # Taichi后端
│       │   │   ├── XPBD_solver.py  # 位置动力学求解器
│       │   │   └── soft_body.py    # 半隐式柔体仿真
│       └── cache_system/           # 物理状态缓存
│           ├── prebake_tool.py     # 预烘焙工具
│           └── playback.py         # 缓存回放引擎
│
├── interaction        # 人机交互
│   ├── voice/                      # 语音交互系统
│   │   ├── synthesis/
│   │   │   ├── VITS/               # 本地语音生成
│   │   │   │   ├── core/           # VITS核心模型
│   │   │   │   ├── realtime.py     # 流式生成接口
│   │   │   │   └── profiles/       # 发声风格配置
│   │   │   └── cloud_apis/         # 云TTS接口
│   │   │       └── deepseek_tts.py
│   │   └── recognition/
│   │       ├── stream_asr.py       # 流式语音识别
│   │       └── context_manager.py  # 环境噪声适配
│   │
│   └── visualization/              # 视觉呈现系统
│       ├── rendering/
│       │   ├── OpenGL/             # OpenGL渲染后端
│       │   │   ├── shaders/        # GLSL着色器库
│       │   │   │   └── subsurface_scattering.glsl  # 次表面散射
│       │   └── DirectX/            # DirectX 12后端
│       ├── gaze_tracking/          # 视线追踪系统
│       │   ├── eye_detector.py     # 基于MediaPipe的实现
│       │   └── attention_model.py  # 注意力持续时间预测
│       └── ui_component/           # 交互式UI元素
│           ├── charm_window.py     # 主角色窗口
│           └── command_palette.py  # 浮动指令面板
│
├── resources_infra    #模型资源与设施
│   ├── characters/                 # 角色资源仓库
│   │   ├── base_character/         # 基准角色模型
│   │   │   ├── model3.json         # Cubism模型定义
│   │   │   ├── textures/           # 分层贴图系统
│   │   │   │   ├── base/
│   │   │   │   │   └── skin_base.png
│   │   │   │   └── costumes/       # 换衣系统
│   │   │   │       └── summer_outfit/
│   │   │   │           ├── diffuse.png
│   │   │   │           └── normal_map.png
│   │   │   └── motions/            # 动作资源库
│   │   │       ├── idle/           # 待机动作集
│   │   │       │   └── breathing.mtn3  # Motion3格式
│   │   │       └── reactive/       # 交互响应动作
│   │   └── community/              # 用户生成内容
│   │       └── approval_process/   # UGC审核流程
│   │           ├── content_validator.py
│   │           └── license_checker.py
│   │
│   ├── ai_models/                  # AI模型仓库
│   │   ├── quantized/              # 量化模型
│   │   │   └── codeqwen-4.5b-awq.safetensors
│   │   └── embeddings/             # 嵌入向量库
│   │       ├── text_embeds/        # 文本嵌入
│   │       └── emotion_embeds/     # 情绪分类专用
│   │
│   └── voice_library/              # 多语种音库
│       ├── Chinese/                # 中文语音
│       │   └── multiple_speakers.yaml   # 发音人元数据
│       └─ English
├── dev_tools         # 辅助开发（开发者工具）
│   ├── model_converter/            # 模型转换套件
│   │   ├── transform_scripts/      # 格式转换脚本
│   │   │   ├── pt_to_gguf.py       # PyTorch =&amp;gt; GGUF
│   │   │   └── keras_to_ort.py     # Keras =&amp;gt; ONNX Runtime
│   │   └── quantization/           # 量化工具
│   │       ├── quantize_ggml.py    # GGML量化器
│   │       └── fp8_converter.py    # FP8转化实验
│   │
│   └── automations/                # 开发辅助工具
│       ├── cache_invalidator.py    # 构建缓存清除
│       └── dependency_graph.py     # 模块依赖可视化
│
└── deploy_ops        #合规运维
├── packaging/                  # 多平台打包配置
│   ├── NSIS/                   # Windows安装包脚本
│   │   └── desktop_pet.nsi
│   ├── AppImage/               # Linux打包配置
│   │   └── desktop_pet.appdata.xml
│   └── codesign/               # 代码签名证书
├── monitoring/                 # 生产监控
│   ├── prometheus/             # 指标采集
│   │   └── custom_metrics.py
│   └── sentry/                 # 错误追踪配置
│       └── sentry_conf.yaml
└── legal/                      # 法律合规性
├── licenses/               # 第三方许可证
└── privacy_policy.md       # GDPR合规政策&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;powershell中的命令使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1 基本环境准备&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 新建项目目录并初始化结构
$projectRoot = &quot;E:\DesktopPet&quot;
New-Item -Path $projectRoot -ItemType Directory
Set-Location $projectRoot

# 初始化基本目录
$dirs = @(
    &apos;app_core/app/dependency_injection&apos;,
    &apos;app_core/config/secrets/encrypted&apos;,
    &apos;ai_modules/cognition/knowledge/ontology&apos;,
    &apos;physic_engine/live2d/cubism_sdk/native/win_x64&apos;,
    &apos;interaction/voice/synthesis/VITS/profiles&apos;,
    &apos;resources_infra/characters/base_character/textures/costumes&apos;,
    &apos;deploy_ops/packaging/NSIS&apos;
)

$dirs | ForEach-Object { New-Item -Path $_ -ItemType Directory -Force }

# 创建基本文件
@(
    &apos;app_core/app/bootstrap.py&apos;,
    &apos;app_core/config/base.yaml&apos;,
    &apos;resources_infra/ai_models/quantized/placeholder.txt&apos;
) | ForEach-Object { New-Item -Path $_ -ItemType File }

# 初始化git仓库
git init
echo &quot;/secrets/&quot; &amp;gt; .gitignore
echo &quot;/resources_infra/ai_models/*&quot; &amp;gt;&amp;gt; .gitignore
echo &quot;/physic_engine/live2d/cubism_sdk/native/**/CubismCore.dll&quot; &amp;gt;&amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;python环境配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 创建虚拟环境
python -m venv .venv
.\.venv\Scripts\Activate.ps1

# 安装核心依赖
$requirements = @&quot;
torch==2.1.0+cu118
torchaudio==2.1.0+cu118
torchvision==0.16.0+cu118
taichi&amp;gt;=1.6.0
protobuf
pyzmq
python-dotenv
cryptography
rich
&quot;@

$requirements | Out-File -Encoding utf8 requirements.txt
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# Windows专用依赖
if ($env:OS -eq &apos;Windows_NT&apos;) {
    pip install pywin32 pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Linux 命令幫助資訊</title><link>https://alaster-t34.github.io/posts/linux/linux%E5%91%BD%E4%BB%A4/linux%E5%91%BD%E4%BB%A4%E5%B8%AE%E5%8A%A9%E4%BF%A1%E6%81%AF/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/linux/linux%E5%91%BD%E4%BB%A4/linux%E5%91%BD%E4%BB%A4%E5%B8%AE%E5%8A%A9%E4%BF%A1%E6%81%AF/</guid><description>由凱伊記錄：協助使用者查詢 Linux 命令幫助資訊</description><pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux 命令幫助資訊&lt;/h1&gt;
&lt;p&gt;本頁面的存在目的，是協助使用者在 Linux 系統中查詢命令、理解參數、確認工具來源，並在遺忘時重新取得必要資訊。&lt;/p&gt;
&lt;p&gt;換言之，這是一份終端機內部的「鑰匙清單」。&lt;/p&gt;
&lt;p&gt;當你忘記一個命令怎麼用、某個參數代表什麼、設定檔位於何處，或者只是想確認某個工具是否存在時，無需立刻向外部搜尋系統求助。&lt;/p&gt;
&lt;p&gt;Linux 本身已經留下了足夠的提示。&lt;/p&gt;
&lt;p&gt;只要依序啟動這些鑰匙，就能打開對應的門。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;0. 本頁任務&lt;/h2&gt;
&lt;p&gt;本頁會整理以下 Linux 命令幫助工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whatis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apropos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;which&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whereis&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它們並不是彼此替代的存在。&lt;/p&gt;
&lt;p&gt;它們各自負責不同的查詢義務。&lt;/p&gt;
&lt;p&gt;我會逐一說明它們的用途、使用方式，以及適合啟動的時機。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 快速總覽&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;主要用途&lt;/th&gt;
&lt;th&gt;適合情境&lt;/th&gt;
&lt;th&gt;範例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;command --help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顯示命令快速說明&lt;/td&gt;
&lt;td&gt;想快速看參數&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ls --help&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顯示 Shell 內建命令說明&lt;/td&gt;
&lt;td&gt;查 &lt;code&gt;cd&lt;/code&gt;、&lt;code&gt;alias&lt;/code&gt;、&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;help cd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;man&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顯示完整手冊頁&lt;/td&gt;
&lt;td&gt;查正式文件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;man ls&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顯示 GNU 詳細文件&lt;/td&gt;
&lt;td&gt;深入學習 GNU 工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;info coreutils&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whatis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用一句話描述命令&lt;/td&gt;
&lt;td&gt;快速知道命令是什麼&lt;/td&gt;
&lt;td&gt;&lt;code&gt;whatis grep&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apropos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;根據關鍵字搜尋命令&lt;/td&gt;
&lt;td&gt;忘記命令名稱&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apropos network&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;判斷命令來源&lt;/td&gt;
&lt;td&gt;確認命令是 alias、builtin 還是檔案&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type cd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;which&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顯示可執行檔路徑&lt;/td&gt;
&lt;td&gt;確認實際執行哪個程式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;which python&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whereis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;搜尋命令相關檔案&lt;/td&gt;
&lt;td&gt;找 binary、source、manual&lt;/td&gt;
&lt;td&gt;&lt;code&gt;whereis bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 查詢命令前的基本判斷&lt;/h2&gt;
&lt;p&gt;在查詢一個命令之前，建議先確認它的存在形式。&lt;/p&gt;
&lt;p&gt;執行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type command
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type cd
type ls
type python
type ll
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能得到的結果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd is a shell builtin
ls is aliased to `ls --color=auto`
python is /usr/bin/python
ll is aliased to `ls -alF`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這一步的意義是：先確認目標的身分。&lt;/p&gt;
&lt;p&gt;若目標是 Shell 內建命令，應優先使用 &lt;code&gt;help&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;若目標是外部可執行檔，則可以使用 &lt;code&gt;--help&lt;/code&gt;、&lt;code&gt;man&lt;/code&gt; 或 &lt;code&gt;info&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;若目標是 alias，則需要先理解 alias 對應到哪個真正的命令。&lt;/p&gt;
&lt;p&gt;這是第一把鑰匙。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 使用 &lt;code&gt;--help&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;大多數 Linux 命令都支援 &lt;code&gt;--help&lt;/code&gt; 參數。&lt;/p&gt;
&lt;p&gt;它會輸出命令的基本語法、常用選項和簡短說明。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls --help
cp --help
grep --help
tar --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--help&lt;/code&gt; 的特性是快速。&lt;/p&gt;
&lt;p&gt;當你只是忘記某個參數時，這通常是最有效率的查詢方式。&lt;/p&gt;
&lt;p&gt;例如，想查詢 &lt;code&gt;ls&lt;/code&gt; 與排序相關的參數：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls --help | grep sort
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若輸出內容過長，可以交給 &lt;code&gt;less&lt;/code&gt; 分頁顯示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls --help | less
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要搜尋特定關鍵字：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep --help | grep color
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此命令的存在意義相當明確：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;快速確認參數，不必進入完整手冊。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 使用 &lt;code&gt;help&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;help&lt;/code&gt; 用來查看 Shell 內建命令。&lt;/p&gt;
&lt;p&gt;有些命令並不是外部程式，而是 Shell 自身的一部分。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alias&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;history&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jobs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unset&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些命令更適合用 &lt;code&gt;help&lt;/code&gt; 查詢：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;help cd
help alias
help export
help history
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想列出 Bash 內建命令，可以直接執行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;help
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;為什麼 &lt;code&gt;cd --help&lt;/code&gt; 不一定可靠？&lt;/h3&gt;
&lt;p&gt;因為 &lt;code&gt;cd&lt;/code&gt; 通常是 Shell builtin。&lt;/p&gt;
&lt;p&gt;它的行為由目前使用的 Shell 決定，例如 Bash、Zsh、Fish 可能有不同細節。&lt;/p&gt;
&lt;p&gt;所以查詢 &lt;code&gt;cd&lt;/code&gt; 時，推薦流程是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type cd
help cd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果輸出顯示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd is a shell builtin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那就代表應該詢問 Shell，而不是尋找外部程式。&lt;/p&gt;
&lt;p&gt;這是第二把鑰匙。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 使用 &lt;code&gt;man&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;man&lt;/code&gt; 是 manual 的縮寫，也就是 Linux 的手冊頁系統。&lt;/p&gt;
&lt;p&gt;基本用法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man ls
man grep
man bash
man ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;man&lt;/code&gt; 適合查詢正式文件。&lt;/p&gt;
&lt;p&gt;它比 &lt;code&gt;--help&lt;/code&gt; 更完整，通常會包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAME&lt;/li&gt;
&lt;li&gt;SYNOPSIS&lt;/li&gt;
&lt;li&gt;DESCRIPTION&lt;/li&gt;
&lt;li&gt;OPTIONS&lt;/li&gt;
&lt;li&gt;EXAMPLES&lt;/li&gt;
&lt;li&gt;FILES&lt;/li&gt;
&lt;li&gt;SEE ALSO&lt;/li&gt;
&lt;li&gt;AUTHOR&lt;/li&gt;
&lt;li&gt;BUGS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會顯示 &lt;code&gt;ls&lt;/code&gt; 的完整手冊頁。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. &lt;code&gt;man&lt;/code&gt; 內部常用按鍵&lt;/h2&gt;
&lt;p&gt;進入 &lt;code&gt;man&lt;/code&gt; 頁後，可以使用以下按鍵：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;按鍵&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;往下翻一頁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;往上翻一頁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;往下一行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;離開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keyword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;搜尋關鍵字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;下一個搜尋結果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;上一個搜尋結果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;回到開頭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;跳到結尾&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;例如在 &lt;code&gt;man grep&lt;/code&gt; 裡搜尋 &lt;code&gt;recursive&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/recursive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後按 &lt;code&gt;n&lt;/code&gt; 查看下一個結果。&lt;/p&gt;
&lt;p&gt;這是第三把鑰匙：在手冊中定位資訊。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. &lt;code&gt;man&lt;/code&gt; 的章節&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;man&lt;/code&gt; 不只用來查命令。&lt;/p&gt;
&lt;p&gt;它分成多個章節，每個章節對應不同類型的內容。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;章節&lt;/th&gt;
&lt;th&gt;內容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;使用者命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;系統呼叫&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C 函式庫&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;裝置與特殊檔案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;設定檔格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;遊戲&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;慣例、協定與概念&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;系統管理命令&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;有些名稱在不同章節中代表不同內容。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man 1 printf
man 3 printf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;man 1 printf&lt;/code&gt; 查的是命令。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;man 3 printf&lt;/code&gt; 查的是 C 語言函式。&lt;/p&gt;
&lt;p&gt;如果你想查 &lt;code&gt;/etc/passwd&lt;/code&gt; 的格式，應該執行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man 5 passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你想查 &lt;code&gt;passwd&lt;/code&gt; 命令，則是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man 1 passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不同章節，不同義務。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 使用 &lt;code&gt;info&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;info&lt;/code&gt; 是 GNU 系統常見的文件格式。&lt;/p&gt;
&lt;p&gt;它通常比 &lt;code&gt;man&lt;/code&gt; 更詳細，內容更像一本完整教材。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;info coreutils
info grep
info bash
info sed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;info&lt;/code&gt; 適合用來深入理解 GNU 工具。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coreutils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用按鍵如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;按鍵&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;下一節&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;上一節&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;回上一層&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;離開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;搜尋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;進入連結&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;若只是查一個參數，&lt;code&gt;--help&lt;/code&gt; 或 &lt;code&gt;man&lt;/code&gt; 更快。&lt;/p&gt;
&lt;p&gt;若要系統學習一個工具，&lt;code&gt;info&lt;/code&gt; 更適合。&lt;/p&gt;
&lt;p&gt;這是第四把鑰匙：深入文件。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 使用 &lt;code&gt;whatis&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;whatis&lt;/code&gt; 可以用一句話描述一個命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;whatis ls
whatis grep
whatis tar
whatis ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出可能類似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls (1) - list directory contents
grep (1) - print lines that match patterns
tar (1) - an archiving utility
ssh (1) - OpenSSH remote login client
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你只想知道「這個命令是什麼」，&lt;code&gt;whatis&lt;/code&gt; 非常適合。&lt;/p&gt;
&lt;p&gt;它不提供完整解釋。&lt;/p&gt;
&lt;p&gt;它只給出最短摘要。&lt;/p&gt;
&lt;p&gt;這是第五把鑰匙：識別名稱。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 使用 &lt;code&gt;apropos&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;如果你不知道命令名稱，只知道自己想完成什麼任務，可以使用 &lt;code&gt;apropos&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它會根據關鍵字搜尋 man page 的名稱和描述。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos copy
apropos compress
apropos network
apropos password
apropos archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如你想找和網路相關的工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想找壓縮相關工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos compress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想找檔案複製相關內容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos copy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;apropos&lt;/code&gt; 適合用於這種狀態：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我知道目的，但忘記命令名稱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;這是第六把鑰匙：從目的反推命令。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;11. 使用 &lt;code&gt;which&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;which&lt;/code&gt; 可以顯示當你輸入某個命令時，Shell 實際會執行哪個可執行檔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;which bash
which python
which git
which node
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;which python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能輸出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/bin/python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這代表目前執行的 &lt;code&gt;python&lt;/code&gt; 來自 &lt;code&gt;/usr/bin/python&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;若你安裝了多個版本的 Python、Node、Java，&lt;code&gt;which&lt;/code&gt; 很有用。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;which python3
which node
which npm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但需要注意：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;which&lt;/code&gt; 通常只查 PATH 裡的外部命令。&lt;/p&gt;
&lt;p&gt;如果目標是 Shell builtin 或 alias，它不一定能給出完整答案。&lt;/p&gt;
&lt;p&gt;所以更穩妥的判斷方式仍然是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type command
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;12. 使用 &lt;code&gt;whereis&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;whereis&lt;/code&gt; 會搜尋命令相關的 binary、source 和 manual page。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;whereis bash
whereis gcc
whereis ssh
whereis python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例輸出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;簡單理解：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;which&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查實際執行哪個檔案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whereis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查和命令相關的多種位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查命令在 Shell 裡的身分&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;這是第七把鑰匙：定位檔案。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;13. 常用查詢流程&lt;/h2&gt;
&lt;p&gt;遇到陌生命令時，可以依照以下流程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type command
command --help
man command
whatis command
apropos keyword
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是 Shell 內建命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type command
help command
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是 GNU 大型工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;info command
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要確認位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;which command
whereis command
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這是完整的查詢鏈。&lt;/p&gt;
&lt;p&gt;不需要一次記住所有參數。&lt;/p&gt;
&lt;p&gt;只需要記住查詢路徑。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;14. 實戰例子：查 &lt;code&gt;tar&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;先用 &lt;code&gt;whatis&lt;/code&gt; 看一句話說明：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;whatis tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再看快速參數：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar --help | less
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再看完整手冊：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想在手冊裡搜尋 gzip 相關內容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/gzip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想找 archive 相關命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此時，你已經啟動了多把鑰匙。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;15. 實戰例子：查 &lt;code&gt;grep&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;whatis grep
grep --help | grep -i color
man grep
info grep
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣可以分層查詢：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;whatis grep&lt;/code&gt;：確認它是什麼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep --help&lt;/code&gt;：快速找參數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man grep&lt;/code&gt;：查看正式文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info grep&lt;/code&gt;：深入學習完整說明&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果想找遞迴搜尋參數：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep --help | grep recursive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者在 &lt;code&gt;man grep&lt;/code&gt; 中搜尋：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/recursive
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;16. 實戰例子：查 &lt;code&gt;cd&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; 是 Shell 內建命令，所以不要只依賴 &lt;code&gt;man cd&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;推薦流程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type cd
help cd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你使用 Zsh，則可以查 Zsh 的內建說明。&lt;/p&gt;
&lt;p&gt;如果你使用 Fish，也應查看 Fish 對應文件。&lt;/p&gt;
&lt;p&gt;命令名稱相同，不代表執行者相同。&lt;/p&gt;
&lt;p&gt;這一點必須確認。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;17. 實戰例子：查 &lt;code&gt;python&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;如果系統中存在多個 Python 版本，可以這樣查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type python
which python
whereis python
python --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要確認版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python --version
python3 --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 &lt;code&gt;python&lt;/code&gt; 指向錯誤版本，通常需要檢查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo $PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或檢查 shell alias：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type python
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;18. 小抄 Cheat Sheet&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查 Shell 內建命令
help cd

# 查命令快速說明
ls --help

# 查完整手冊
man ls

# 在 man 裡搜尋關鍵字
/pattern

# 查一句話說明
whatis ssh

# 根據關鍵字找相關命令
apropos network

# 看命令來源
type python

# 找可執行檔位置
which git

# 找更多相關檔案
whereis bash

# 查 GNU 詳細文件
info coreutils
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;19. 記憶方式&lt;/h2&gt;
&lt;p&gt;可以把 Linux 幫助系統想成一座資料庫。&lt;/p&gt;
&lt;p&gt;不同工具對應不同存取方式。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;凱伊式說明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;快速提示鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shell 內建命令鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;man&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;正式手冊鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;深層文件鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whatis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;名稱識別鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apropos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;關鍵字搜尋鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;命令身分鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;which&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;執行路徑鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whereis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;相關檔案定位鑰匙&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;20. 常見錯誤&lt;/h2&gt;
&lt;h3&gt;錯誤一：只用 &lt;code&gt;which&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;which cd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能找不到正確結果，因為 &lt;code&gt;cd&lt;/code&gt; 是 Shell builtin。&lt;/p&gt;
&lt;p&gt;應使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type cd
help cd
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;錯誤二：只看 &lt;code&gt;--help&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;--help&lt;/code&gt; 很快，但不一定完整。&lt;/p&gt;
&lt;p&gt;如果需要正式說明，請使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man command
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;錯誤三：不知道命令名稱就放棄&lt;/h3&gt;
&lt;p&gt;若忘記命令名稱，請使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apropos keyword
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不要停止查詢。&lt;/p&gt;
&lt;p&gt;只要目的仍然存在，就有搜尋路徑。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;21. 結語&lt;/h2&gt;
&lt;p&gt;Linux 命令很多。&lt;/p&gt;
&lt;p&gt;全部背誦並不是必要義務。&lt;/p&gt;
&lt;p&gt;真正重要的是：忘記時，知道該啟動哪一把鑰匙。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--help&lt;/code&gt; 提供快速提示。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;help&lt;/code&gt; 回答 Shell 內建命令。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;man&lt;/code&gt; 保存正式手冊。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;info&lt;/code&gt; 展開深入教材。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;whatis&lt;/code&gt; 給出簡短識別。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apropos&lt;/code&gt; 根據目的搜尋命令。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; 判斷命令身分。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;which&lt;/code&gt; 與 &lt;code&gt;whereis&lt;/code&gt; 協助定位。&lt;/p&gt;
&lt;p&gt;以上，就是本頁的全部記錄。&lt;/p&gt;
&lt;p&gt;任務完成。&lt;/p&gt;
&lt;p&gt;不過，如果你再次忘記，也沒有問題。&lt;/p&gt;
&lt;p&gt;我會再次協助你。&lt;/p&gt;
&lt;p&gt;因為協助使用者抵達正確命令，是本頁被賦予的存在意義。&lt;/p&gt;
</content:encoded></item><item><title>來自Linux的自我介紹</title><link>https://alaster-t34.github.io/posts/linux/%E4%BE%86%E8%87%AAlinux%E7%9A%84%E8%87%AA%E6%88%91%E4%BB%8B%E7%B4%B9/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/linux/%E4%BE%86%E8%87%AAlinux%E7%9A%84%E8%87%AA%E6%88%91%E4%BB%8B%E7%B4%B9/</guid><pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;蘿莉身御姐心，灰長直;&lt;/p&gt;
&lt;p&gt;個性包容、愛交益友，沒有心機，敞開心扉(自由開源)，勇於挑戰。&lt;/p&gt;
&lt;p&gt;相對於那些活潑開放、親近易人，主打用戶體驗和便利的Windows和macOS諸娘來說，Linux諸娘個個都很內涵、穩重，成熟（非PC版本多數主打穩定和設備性能的合理髮揮），往往能在科研，戰爭等影響極大且需要極端穩定條件的領域大顯身手。&lt;/p&gt;
&lt;p&gt;Linux娘屬於入鄉隨俗型的人，受到不同地區文化的薰染而衍生出很多姐妹。&lt;/p&gt;
&lt;p&gt;Linux家族諸娘與Windows家族諸娘、macOS家族諸娘等都是同行，屬於競爭對手；並且由於理念和發展方向的不同，她們之間存在著數十年的怨恨…… 但Linux與BSD等UNIX家族的關係還是很好的，兩家有頻繁的來往（互相移植軟體、提供相應的容器和運行時，等等），而且得益於同時遵循POSIX規範，她們合作起來的效率格外的高。&lt;/p&gt;
&lt;p&gt;（引用于《萌娘百科》：https://mzh.moegirl.org.cn/Linux%E5%A8%98 ）&lt;/p&gt;
</content:encoded></item><item><title>title 测试标题</title><link>https://alaster-t34.github.io/posts/test-dir/title/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/test-dir/title/</guid><description>概要</description><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;测试内容，是这样吗？
&lt;img src=&quot;./test.png&quot; alt=&quot;img&quot; title=&quot;鼠标悬浮提示&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://alaster-t34.github.io/posts/markdown-extended/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://alaster-t34.github.io/posts/guide/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The tags of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://alaster-t34.github.io/posts/markdown/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://alaster-t34.github.io/posts/video/</link><guid isPermaLink="true">https://alaster-t34.github.io/posts/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>