<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[General Discussion | 综合讨论]]></title><description><![CDATA[A place to talk about whatever you want]]></description><link>http://forum.d2learn.org/category/2</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:39:04 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/category/2.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Jun 2026 14:54:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[現階段…如果我們反對使用LLM程式碼進行訓練，AGPL是唯一的選擇嗎？]]></title><description><![CDATA[<p dir="auto">從平台策略到模型水印：AI時代下超越AGPL的開源專案保護新路徑<br />
隨著大型語言模型（LLM）技術的快速發展，其對現有知識產權法體系，特別是開放原始碼軟體生態系統，構成了前所未有的挑戰。其中，利用公開可見的程式碼進行模型訓練所引發的版權爭議尤為突出。在此背景下，GNU Affero 通用公共授權條款（AGPL）常被視為一種強力的防禦工具，但其效果並非萬無一失。本報告旨在深入分析除 AGPL 之外，是否存在其他有效的法律或技術替代方案，以保護開源專案的權益。研究將整合多源資訊，從法律許可證的演進、平台策略的創新、數據潔淨化的技術實踐，到模型層面的前沿防禦技術，為開源專案、企業合規及政策倡議等不同應用場景提供一套全面且具備深度的分析與建議。</p>
<p dir="auto">法律框架的邊界：AGPL 及其替代許可證的適用性探討<br />
在應對大型語言模型利用開源程式碼訓練的挑戰時，許可證作為第一道防線，其選擇與策略佈局至關重要。儘管 AGPL 因其強制性傳播原則而受到廣泛關注，但深入分析顯示，任何單一的法律工具都難以獨立解決問題，必須結合其他法律與技術手段才能形成有效防護。首先，AGPL 的核心優勢在於其「強制性傳播」特性，這一點也延伸至其前身 GNU General Public License (GPL)。根據 GPL 和 AGPL 的規定，任何基於受其保護的程式碼衍生出的作品，都必須同樣以相同的許可證發布。這一原則理論上能夠阻止商業公司將基於 GPL 或 AGPL 授權代碼訓練而成的大型語言模型直接封閉起來，從而確保其部分功能或輸出內容保持開放。然而，這種防禦的有效性正受到來自多方面的質疑與挑戰。一個關鍵問題是，即使數據集聲稱只採用了「寬鬆」許可證的代碼，實際情況卻可能截然不同。一項對六個主流 LLM 訓練數據集的分析發現，這些數據集中包含了大量源自 GPL/AGPL 代碼庫的重複檔案。這揭示了僅依賴表面許可證聲明來確保數據清白的極大漏洞，也凸顯了數據清洗過程中的巨大複雜性與潛在風險。其次，AGPL 相較於 GPL 的一個顯著優勢是其擴展的觸發條件。AGPL 不僅要求分發修改後的原始碼，還明確規定了如果使用者通過網絡服務（SaaS）的方式提供基於該模型的服務，則必須向遠端用戶提供相應的源碼。這使得 AGPL 對於以 API 形式提供的大型語言模型更具約束力，因為它能更有效地防止商業公司繞過強制性傳播的要求。然而，即便如此，AGPL 仍無法解決開放式人工智慧生態系統的根本矛盾：一旦模型權重和原始碼釋出，其後續的無限複製、部署和修改便脫離了開發者的直接控制範圍。因此，AGPL 可以說是目前法律框架下最接近理想狀態的選項，但絕非完美的答案。面對 AGPL 的侷限性，學術界和業界探索了多種替代性的法律許可證，但大多數都遭遇了同樣的困境。例如，Open Responsible AI License (OpenRAIL) 被視為一種嘗試，它在寬鬆許可的基礎上加入了類似「強制性傳播」的使用限制。然而，一篇深刻的分析指出，這種依賴道德約束和有限執行能力的使用限制性許可證，在開放生態中極易失效。文章引用了一個案例，即 GPT-J 模型被一名獨立研究員廣泛濫用，用於在線上社區生成大量有害內容，而模型發布方卻因文化因素而未採取任何行動。這個例子生動地說明，對於一個已釋出的開放模型，缺乏有效的監控和執行機制，任何基於信任的限制都將形同虛設。此外，一些新的機器學習特定許可證試圖引入額外的限制，通常涉及倫理或行為準則。然而，這些許可證的有效性同樣建立在對最終模型使用的持續監控之上，這在去中心化的開放式模型環境中幾乎是不可能實現的。因此，單純依靠創新的法律條款來解決問題，很可能只是治標不治本。有效的法律策略必須超越單一許可證的思維，轉向更宏觀的平台策略和數據治理。總結而言，在法律層面，不存在一個能完美解決所有問題的「銀彈」式許可證。有效的策略必須是多層次的組合。除了繼續使用 GPL/AGPL 來保護新創建的開源專案外，更重要的是從平台和數據層面入手，通過策略性佈局來管理風險。這包括推動平台採納更嚴格的數據共享條款，以及支援和使用經過嚴格審核的「清白」數據集，從需求側驅動整個行業合規標準的提升。</p>
<p dir="auto">許可證類型：核心原則，對大型語言模型訓練的適用性，主要侷限性<br />
GPL / AGPL：強制性傳播，衍生作品需相同許可，AGPL 將 SaaS 服務納入管制範圍，理論上可防止模型完全封閉，AGPL 對 SaaS 模型更有效，訓練數據可能含有隱蔽的強制性傳播代碼，無法控制已釋出模型的後續使用<br />
寬鬆許可證：允許自由使用、修改和分發，無強制性傳播要求，易於被商業公司用於訓練大型語言模型，缺乏防禦力，缺乏對模型商業化的防禦機制，使開源貢獻可能被用於盈利目的<br />
使用限制許可證：在許可基礎上附加特定使用限制（如禁止某些用途），理論上可用於禁止不道德的使用，執行困難，無法監控和阻止已釋出模型的違規使用<br />
ML 特定許可證：專門為機器學習模型設計，可能包含行為限制，尚處於探索階段，實踐效果未知，同樣面臨無法監控和執行的困境，且法律地位不明確</p>
<p dir="auto">平台策略與數據潔淨化：從源頭控制到構建合規數據基礎<br />
在法律許可證本身存在固有侷限的背景下，從平台策略和數據潔淨化兩個維度切入，成為了更為務實和根本性的防禦路徑。這兩種方法的核心思想都是從源頭控制風險，而不是在問題發生後再進行追索。GitHub 的「豁免權」條款和「Common Pile」項目分別代表了這兩種思路的成功實踐。首先，平台級的策略性佈局能夠在數據流動的初始環節就設立防線。GitHub 作為全球最大的開源代碼託管平台，在其最新的服務條款中引入了一個極具啟發性的「豁免權」條款。該條款規定，任何貢獻者向公開儲存庫提交內容時，均視為放棄了任何禁止 GitHub 或第三方（特別是指開發商用人工智慧系統的公司）透過自動化方式訪問這些公開數據的權利。這是一個主動清除版權壁壘的策略，它將數據使用的風險轉嫁到了數據的原始創作者身上，同時為 GitHub 自身及其合作夥伴進行人工智慧模型訓練掃清了法律障礙。對於開源專案而言，這一條款帶來了深刻的警示：在貢獻代碼時，必須意識到這些代碼可能被用於訓練對其所有權構成威脅的商業模型。因此，開源社群需要重新審視協作協議，考慮在其中增加關於人工智慧訓練使用的特別條款，以保障貢獻者的權益。與此相對應的另一種策略是「拒絕加入」，即主動構建一個純粹由寬鬆許可或公有領域資料組成的、經過嚴格審查的數據集。面對許多主流數據集聲稱使用的是寬鬆許可的代碼，但事實上包含了大量 GPL/AGPL 代碼的混亂局面，這種策略旨在提供一個清晰、合法、透明的替代方案。最具代表性的成功案例便是「Common Pile」項目。這個數據集完全由合法獲取、合乎倫理的內容構成，其來源經過了嚴格的法律審核，包括諮詢法律顧問和排除邊緣案例。它的誕生不僅證明了高性能量子人工智慧模型可以不用侵入式的數據採集方式訓練出來，更是對「合理使用」等辯護理由的有力回擊。Common Pile 的成功，為整個行業樹立了一個合法、合倫理的競爭對手，其戰略意義在於將舉證責任從開源社區轉移到了那些使用模糊甚至侵權數據的公司身上。無論是平台策略還是數據潔淨化，其核心都指向了對訓練數據的嚴格治理。簡單的技術手段，如基於雜湊值的比對，已被證明非常容易被繞過，只需對代碼進行微小的格式調整即可逃脫檢測。因此，真正的數據潔淨化工作必須升級為一個結合了人工審核、靜態分析、語義相似度檢測和全生命週期風險評估的綜合流程。這意味著需要投入巨大的人力和技術資源來確保數據集的合法性。科技巨頭在其企業級人工智慧解決方案中強調訓練數據的差異化與合規性，也顯示出這已經成為高端市場的重要競爭力。對於希望保護自身知識產權的開源專案和企業而言，積極參與和支援像 Common Pile 這樣經過嚴格審核的「清潔數據運動」，從需求側驅動行業標準的提升，是一條不可或缺的道路。</p>
<p dir="auto">技術防禦前沿：模型水印與行為對齊的應用與侷限<br />
當法律條文的抽象約束面臨開放式AI模型不可控的現實時，技術手段提供了更直接、更具操作性的防禦與監控路徑。在眾多技術方案中，模型水印和模型隔離與行為對齊技術正從理論走向實踐，成為彌合法律訴訟與技術現實之間差距的關鍵橋樑。模型水印技術的核心思想是在模型內部或其輸出中嵌入不易察覺的統計信號，以便未來追溯模型的來源或識別其生成內容。這為權利人和執法機構提供了關鍵的「物證」，大大增強了在侵權訴訟中的立場。其應用價值主要體現在以下幾個方面：首先，對於版權侵權偵測，權利人可以通過水印來證明某段代碼確實源自其受保護的開源專案，從而有力地反駁對方關於「獨立創作」或「巧合」的辯解。其次，對於大型語言模型發行商而言，水印技術可以用於訓練數據的過濾。發行商可以在收集網絡數據進行二次訓練時，自動過濾掉自己模型之前產生的、帶有自身水印的內容，從而避免模型陷入「複製」和知識循環的陷阱。最後，水印還可以作為一種威懾手段，讓意圖濫用模型的行為人知道其行為是可追溯的。然而，水印技術也存在不容忽視的侷限性。一方面，其檢測機制往往需要知道源模型的具體細節，這在黑箱操作的場景下很難實現。另一方面，研究人員已經證明了針對水印的「偽造攻擊」。攻擊者可以訓練自己的模型來模仿目標模型的水印特徵，從而生成看似合法但實則由惡意方創造的內容，例如偽造新聞，使得溯源變得更加複雜。這意味著水印是重要的輔助工具，而非絕對可靠的防線，但它架起了法律訴訟與技術現實之間的橋樑，是當前最有前景的技術防禦手段之一。與水印技術相輔相成的是模型隔離與行為對齊技術。雖然無法阻止模型被複製，但可以在模型設計之初就引入限制，使其輸出更符合預期。其中，基於人類反饋的強化學習（RLHF）是一種被廣泛採用的行為對齊技術。它通過讓模型學習遵循人類預設的「無害」、「忠實」等指令，來降低其被用於生成有害或侵權內容的機率。這種方法從源頭上對模型的行為進行了約束，是一種積極的防禦策略。此外，技術還可用於鑑定。一些研究致力於建立系統來區分大型語言模型生成的代碼與人類編寫的代碼，這有助於在開源項目中篩選人工智慧產出物，並評估其合規風險。同時，記憶化檢測也是技術防禦的一個重要方向。記憶化指的是模型記住了訓練數據中的特定片段並在輸出時直接複製出來。研究表明，大型語言模型存在嚴重的記憶化問題。記憶化的檢測方法已經能夠以很高的準確率判斷特定代碼是否曾出現在模型的訓練數據中。這些技術共同構成了一套從「防堵」到「溯源」再到「鑑定」的完整技術防禦體系。</p>
<p dir="auto">結合應用場景：為開源專案、企業合規與政策倡議提供具體指引<br />
綜合上述法律與技術方案的分析，可以為不同應用場景下的利益相關方提供一套具體的、可操作的策略指引。有效的防禦並非依賴單一工具，而是需要一套精心設計的組合拳，將法律、技術和社群共治深度融合。</p>
<p dir="auto">為開源專案制定知識產權防護策略<br />
對於維護開源專案的個人或組織而言，其核心目標是在促進協作的同時，最大限度地保護自身的知識產權。一個全面的防護策略應包含以下四個層面：<br />
採用強制性許可證：堅持為你的核心專案選擇 GPL 或 AGPL 作為基礎許可證。這是最基本的法律屏障，能夠在一定程度上阻止商業公司將你的代碼直接封閉在他們的產品中。<br />
審慎處理數據共享：在接受外部貢獻時，要意識到這些代碼可能被用於訓練商業大型語言模型。可以考慮在協作協議中增加關於人工智慧訓練使用的特別條款，明確告知貢獻者其代碼可能的用途。<br />
積極參與「清潔數據運動」：鼓勵並貢獻代碼到經過嚴格審核的數據集中。這不僅是為了推動行業標準向合法、透明的方向發展，也能間接提高你專案代碼被合規使用的機會。<br />
探索水印技術：如果條件允許，可以為你的專案代碼打上水印。這將為未來可能發生的侵權事件提供關鍵的技術證據，彌補法律條文在執行上的不足。</p>
<p dir="auto">企業在大型語言模型開發中的合規風險評估<br />
對於開發和使用大型語言模型的企業而言，合規風險評估是其業務的生命線。企業必須認識到，其主要風險點在於訓練數據的侵權和輸出內容的合規性。<br />
建立內部審計功能：領先的人工智慧開發者需要內審職能來確保合規性。企業應建立專業的內部團隊，負責對訓練數據的合法性、輸出內容的合規性進行持續審計。<br />
投資數據治理框架：企業必須建立一個全面的數據合規框架，對訓練數據進行全生命週期的風險評估，而不能僅憑表面許可證聲明做出判斷。這包括對數據來源的合法性進行嚴格審核，並投入資源進行數據潔淨化。<br />
實施輸出內容檢查：大型語言模型可能會意外複製受版權保護的文字或代碼，導致下游用戶違法。因此，企業需要開發或採購工具來檢測大型語言模型的輸出，以識別潛在的侵權內容。<br />
採納水印技術：在自家模型中整合水印，既是對侵權行為的威懾，也是未來保護的手段。水印技術可以幫助企業證明其模型的來源，並在發生糾紛時提供關鍵證據。</p>
<p dir="auto">政策或社群倡議<br />
為了應對大型語言模型對開源生態的挑戰，政策制定者和開源社群可以採取一系列倡議來推動系統性的變革。<br />
推動立法透明度：倡導立法要求人工智慧公司公開其訓練數據集的詳細資訊，包括數據來源、規模和許可證類型。這將把「舉證責任」從開發者轉移到人工智慧公司身上，迫使他們為自己的數據採集行為負責。<br />
重新審視「合理使用」：目前美國法院在「合理使用」原則的解釋上存在矛盾，而歐盟正在通過相關法案來規範人工智慧訓練活動。社群應持續關注並影響這些立法進程，爭取更有利於原創作者的法律框架。<br />
建立行業標準與認證：推動建立一個類似「合倫理人工智慧訓練」的第三方認證體系，為合規的人工智慧模型和數據集提供背書。相關成功經驗表明，這樣的藍圖具有極大的戰略價值。<br />
加強社群教育：提高開發者對大型語言模型訓練潛在風險的認識，鼓勵他們在貢獻代碼時做出知情選擇。這包括普及關於不同許可證的差異以及代碼可能被用於訓練人工智慧模型的資訊。</p>
<p dir="auto">綜上所述<br />
面對大型語言模型對開源生態的挑戰，需要一套組合拳，而不是指望一把萬能鑰匙。透過精心設計的許可證策略、堅決推行的數據潔淨化工程，以及積極應用前沿的水印技術，開源世界和相關利益方仍有足夠的工具來保護自身的知識產權。</p>
]]></description><link>http://forum.d2learn.org/topic/223/現階段-如果我們反對使用llm程式碼進行訓練-agpl是唯一的選擇嗎</link><guid isPermaLink="true">http://forum.d2learn.org/topic/223/現階段-如果我們反對使用llm程式碼進行訓練-agpl是唯一的選擇嗎</guid><dc:creator><![CDATA[semmyenator]]></dc:creator><pubDate>Wed, 10 Jun 2026 14:54:30 GMT</pubDate></item><item><title><![CDATA[吃太飽生了個無需黑箱的高精度π計算方法]]></title><description><![CDATA[<p dir="auto">AREEM，一種無需黑箱的高精度π計算方法<br />
<a href="https://deepwiki.com/semmyenator/AREEM" rel="nofollow ugc">https://deepwiki.com/semmyenator/AREEM</a><br />
這個項目只是一個人完成的小型數學項目，並非一項發明或特殊功能設計。<br />
希望它對需要旋轉控制的工程師有所幫助。</p>
]]></description><link>http://forum.d2learn.org/topic/183/吃太飽生了個無需黑箱的高精度π計算方法</link><guid isPermaLink="true">http://forum.d2learn.org/topic/183/吃太飽生了個無需黑箱的高精度π計算方法</guid><dc:creator><![CDATA[semmyenator]]></dc:creator><pubDate>Tue, 31 Mar 2026 13:08:03 GMT</pubDate></item><item><title><![CDATA[快速十六进制转八进制]]></title><description><![CDATA[改进
<p dir="auto">经过@yyq252517提醒并测试，直接使用12bit的查找表可以更快：</p>
consteval std::array&lt;std::array&lt;char, 4&gt;, 4096&gt; hex_to_oct_lookup() noexcept
{
	std::array&lt;std::array&lt;char, 4&gt;, 4096&gt; lookup{};

	for (size_t i = 0; i &lt; 4096; ++i)
	{
		lookup[i][0] = '0' + ((i &gt;&gt; 0) &amp; 0b111);
		lookup[i][1] = '0' + ((i &gt;&gt; 3) &amp; 0b111);
		lookup[i][2] = '0' + ((i &gt;&gt; 6) &amp; 0b111);
		lookup[i][3] = '0' + ((i &gt;&gt; 9) &amp; 0b111);
	}

	return lookup;
}
// ...
std::string hex_to_oct(const std::string&amp; hex) noexcept
{
	const auto hex_length = hex.length();
	if (hex_length == 0) return "0";

	const auto groups = (hex_length + 2) / 3;
	const auto oct_digits = groups * 4;

	std::string res(oct_digits, '0');

	for (size_t i = hex_length % 3; i &lt; hex_length; i += 3)
	{
		const size_t curr_group = (i + 2) / 3;

		const uint16_t h0 = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[i + 2])];  // [3:0]
		const uint16_t h1 = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[i + 1])];  // [7:4]
		const uint16_t h2 = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[i + 0])];  // [11:8]

		const uint16_t idx = (h2 &lt;&lt; 8) | (h1 &lt;&lt; 4) | h0;  // [11:0]

		const auto [o1, o2, o3, o4] = hex_to_oct_lookup_table[idx];

		res[curr_group * 4 + 3] = o1;
		res[curr_group * 4 + 2] = o2;
		res[curr_group * 4 + 1] = o3;
		res[curr_group * 4 + 0] = o4;
	}

	if (hex_length % 3 != 0)
	{
		std::array&lt;uint16_t, 3&gt; h{0, 0, 0};

		if (hex_length % 3 == 1)
		{
			h[0] = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[0])];
		}
		else  // hex_length % 3 == 2
		{
			h[1] = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[0])];
			h[0] = hex_lookup[std::bit_cast&lt;uint8_t&gt;(hex[1])];
		}

		const uint16_t idx = (h[2] &lt;&lt; 8) | (h[1] &lt;&lt; 4) | h[0];

		const auto [o1, o2, o3, o4] = hex_to_oct_lookup_table[idx];

		res[3] = o1;
		res[2] = o2;
		res[1] = o3;
		res[0] = o4;
	}

	const auto first_non_zero = res.find_first_not_of('0');
	if (first_non_zero == std::string::npos) return "0";
	return res.substr(first_non_zero);
}

<p dir="auto">使用和此前一致的测试环境，可以得到：</p>
Optimized version: 72.16 ms (stddev: 0.45 ms), 1385897448.4948883 hex chars/sec

<p dir="auto">比此前快了15%！此前低估了现代CPU的L1缓存系统的能力，看来它处理4096*4byte = 16KiB的查找表也不在话下</p>
<blockquote>
<p dir="auto">感谢@yyq252517</p>
</blockquote>
]]></description><link>http://forum.d2learn.org/topic/174/快速十六进制转八进制</link><guid isPermaLink="true">http://forum.d2learn.org/topic/174/快速十六进制转八进制</guid><dc:creator><![CDATA[Stehsaer]]></dc:creator><pubDate>Mon, 23 Feb 2026 13:24:52 GMT</pubDate></item><item><title><![CDATA[使用自编C++Web框架搭建的个人博客]]></title><description><![CDATA[<p dir="auto">@unamed-coder 看https://glwebsite.us.ci/about下边的小字，我真不是福瑞</p>
]]></description><link>http://forum.d2learn.org/topic/173/使用自编c-web框架搭建的个人博客</link><guid isPermaLink="true">http://forum.d2learn.org/topic/173/使用自编c-web框架搭建的个人博客</guid><dc:creator><![CDATA[MineCode]]></dc:creator><pubDate>Mon, 23 Feb 2026 07:48:12 GMT</pubDate></item><item><title><![CDATA[小白学习给点建议 - C语言学习]]></title><description><![CDATA[<p dir="auto">@johanvx 这个也是非常经典的公开课 中国大学Mooc和B站上应该都能找到视频</p>
]]></description><link>http://forum.d2learn.org/topic/153/小白学习给点建议-c语言学习</link><guid isPermaLink="true">http://forum.d2learn.org/topic/153/小白学习给点建议-c语言学习</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Mon, 12 Jan 2026 14:33:45 GMT</pubDate></item><item><title><![CDATA[第一个文件注释掉D2X_wait后直接报错退出]]></title><description><![CDATA[<p dir="auto">这个之前有个类似情况, 程序遇到死循环这个就可能发生. 重新运行每次都会这样吗</p>
]]></description><link>http://forum.d2learn.org/topic/152/第一个文件注释掉d2x_wait后直接报错退出</link><guid isPermaLink="true">http://forum.d2learn.org/topic/152/第一个文件注释掉d2x_wait后直接报错退出</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Sat, 20 Dec 2025 04:28:18 GMT</pubDate></item><item><title><![CDATA[devcpp光标位置和显示乱码问题: 调完字体大小后光标位置不对啊，有没有大佬看看(用xlings下的文字也有问题）]]></title><description><![CDATA[<p dir="auto">@SPeak 在 调完字体大小后光标位置不对啊，有没有大佬看看(用xlings下的文字也有问题） 中说：</p>
<blockquote>
<p dir="auto">http://forum.d2learn.org/post/418</p>
</blockquote>
<p dir="auto">问题1: 界面乱码问题</p>
<blockquote>
<p dir="auto">A1: xlings已经更新解决(增加了utf8编码的支持, 重装即可</p>
</blockquote>
<p dir="auto">问题2: 代码输入光标位置问题</p>
<blockquote>
<p dir="auto">解决方法1: 代码中不要包含中文内容<br />
解决方法2: 取消beta/utf8编码选项, 然后卸载重新安装devcpp</p>
</blockquote>
xlings remove devcpp
xlings install devcpp

<p dir="auto">6c34d5cd-b1eb-4c7f-8181-1ca3ca6c673b-image.png</p>

<p dir="auto">中/英文切换: https://forum.d2learn.org/topic/134</p>
]]></description><link>http://forum.d2learn.org/topic/137/devcpp光标位置和显示乱码问题-调完字体大小后光标位置不对啊-有没有大佬看看-用xlings下的文字也有问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/137/devcpp光标位置和显示乱码问题-调完字体大小后光标位置不对啊-有没有大佬看看-用xlings下的文字也有问题</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Thu, 02 Oct 2025 14:35:04 GMT</pubDate></item><item><title><![CDATA[项目代码在gtest单元测试中崩溃的问题]]></title><description><![CDATA[<p dir="auto">chain对象104, 3个对象中间asan插入了红区保护<br />
通过内存布局看 [00] 的访问(size_)是在104最后32字节的, 但依然报错</p>
<p dir="auto">image.png</p>
<p dir="auto">821b2e52-ffc5-4751-a9f8-306ac05b66ef-image.png</p>
<p dir="auto"><strong>并且非常奇怪的是, 插入crash代码(减少使用printf/cout 造成代码生成变化带来的干扰) 92可以执行到, 95行无法执行到</strong></p>
<p dir="auto">14502bf3-0652-4f95-8779-5e65c987d49a-image.png</p>
<p dir="auto">怀疑的地方</p>

分配器内存对齐问题?
operator=的实现是否正确处理基类?
哪里的代码造成UB, 导致代码生成出现问题?

]]></description><link>http://forum.d2learn.org/topic/135/项目代码在gtest单元测试中崩溃的问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/135/项目代码在gtest单元测试中崩溃的问题</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Tue, 23 Sep 2025 12:14:18 GMT</pubDate></item><item><title><![CDATA[关于sonic实现音频变速不变调的问题]]></title><description><![CDATA[<p dir="auto">hi,友友有解决这个情况吗，我也是当speed不为一时就报错了，我完全不知道如何查找崩溃，找了一天了，下面是我的代码：<br />
void AudioDecodeThread::run()<br />
{<br />
// 加入sonic<br />
// 初始化部分：先创建一个流<br />
sonicStream stream = sonicCreateStream(m_videoPlayControl-&gt;m_audioCodecCtx-&gt;sample_rate, 2);<br />
if (!stream)<br />
{<br />
m_videoPlayControl-&gt;m_eventHandler-&gt;onVideoPlayerError(0, "sonicCreateStream error!");<br />
}</p>
    if (!initSwrCtx())
    {
        m_videoPlayControl-&gt;m_eventHandler-&gt;onVideoPlayerError(0, "initSwrCtx error");
        return;
    }

    while (true)
    {
        if (m_videoPlayControl-&gt;m_currentState == State::STOP)
        {
            break;
        }
        else if (m_videoPlayControl-&gt;m_currentState == State::PAUSE)
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
            continue;
        }

        AVPacket *pkt = m_videoPlayControl-&gt;m_audioPacketQueue.pop();
        if (pkt == nullptr)
        {
            if (m_videoPlayControl-&gt;m_isReadFinished)
            {
                break;
            }
            continue;
        }

        if (memcmp(pkt-&gt;data, FLUSHDATA, strlen(FLUSHDATA)) == 0)
        {
            avcodec_flush_buffers(m_videoPlayControl-&gt;m_audioCodecCtx);
            av_packet_free(&amp;pkt);
            continue;
        }

        int ret = avcodec_send_packet(m_videoPlayControl-&gt;m_audioCodecCtx, pkt);
        if (ret &lt; 0)
        {
            char errbuf[1024] = { 0 };
            av_strerror(ret, errbuf, sizeof(errbuf));
            fprintf(stderr, "avcodec_send_packet: %s (error pts: %d)\n", errbuf, pkt-&gt;pts);
            av_packet_free(&amp;pkt);
            continue;
        }

        AVFrame *frame = av_frame_alloc();
        while (avcodec_receive_frame(m_videoPlayControl-&gt;m_audioCodecCtx, frame) == 0)
        {
            // 读取frame, swr转换, 放到frameQueue里面去
            int inSamples = frame-&gt;nb_samples;
            // int outSamples = av_rescale_rnd(inSamples, 1, 1, AV_ROUND_UP);

            // 废除手动分配的 audioBuffer，改用 resampleFrame 内部缓冲区
            AVFrame *resampleFrame = av_frame_alloc();
            resampleFrame-&gt;format = AV_SAMPLE_FMT_S16;
            av_channel_layout_default(&amp;resampleFrame-&gt;ch_layout, 2); // 双声道
            resampleFrame-&gt;sample_rate = frame-&gt;sample_rate;         // 正确设置采样率
            resampleFrame-&gt;nb_samples = inSamples;

            // 让 FFmpeg 自动分配缓冲区（确保地址和大小正确）
            if (av_frame_get_buffer(resampleFrame, 0) &lt; 0)
            {
                av_frame_free(&amp;resampleFrame);
                continue;
            }

            int len = swr_convert(m_swrCtx, resampleFrame-&gt;data, resampleFrame-&gt;nb_samples, (const uint8_t **)frame-&gt;data, inSamples);

            // 加入sonic

            sonicSetSpeed(stream, m_videoPlayControl-&gt;m_speed);
            // 4. 写入音频数据到Sonic ,这里的bug

            short *valid_audio_data = (short *)resampleFrame-&gt;data[0];
            int total_samples = len; // 单声道总样本数

            std::cout &lt;&lt; len &lt;&lt; std::endl;

            ret = sonicWriteShortToStream(stream, valid_audio_data, total_samples);
            if (ret == 0)
            {
                m_videoPlayControl-&gt;m_eventHandler-&gt;onVideoPlayerError(0, "sonicWriteShortToStream error");
                continue;
            }

            int availableSamples = sonicSamplesAvailable(stream); //
            if (availableSamples &lt;= 0)
            {
                continue;
            }

            // 根据实际需要的样本数分配缓冲区
            short *output_pcm = new short[availableSamples * 2];
            int samples = sonicReadShortFromStream(stream, output_pcm, availableSamples);
            if (samples &lt;= 0)
            {
                delete[] output_pcm;
                av_frame_free(&amp;resampleFrame);
                continue;
            }

            std::cout &lt;&lt; inSamples &lt;&lt; "---" &lt;&lt; len &lt;&lt; "---" &lt;&lt; availableSamples &lt;&lt; "---" &lt;&lt; samples &lt;&lt; std::endl;

            PCMFrame *pcm = new PCMFrame();
            pcm-&gt;setBuffer((uint8_t *)output_pcm, samples * 4);
            pcm-&gt;setPts(frame-&gt;pts);
            pcm-&gt;setSampleRate(frame-&gt;sample_rate);
            m_videoPlayControl-&gt;m_audioFrameQueue.push(pcm);

            delete[] output_pcm;
            av_frame_free(&amp;resampleFrame);
        }
        av_frame_free(&amp;frame);
        av_packet_free(&amp;pkt);
    }
    sonicDestroyStream(stream);
}

]]></description><link>http://forum.d2learn.org/topic/122/关于sonic实现音频变速不变调的问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/122/关于sonic实现音频变速不变调的问题</guid><dc:creator><![CDATA[Cat-Guijun]]></dc:creator><pubDate>Thu, 14 Aug 2025 19:17:58 GMT</pubDate></item><item><title><![CDATA[关于 GitHub 中的 Fork 仓库的简单问题]]></title><description><![CDATA[<p dir="auto">为方便描述，称上游 GitHub 仓库为 upstream，自己 fork 的 GitHub 仓库为 origin。如果没有理解错的话，你应该是遇到下面这个场景并想做到 Step 4：</p>
= Step 1: Fork

* aaaaaa (HEAD -&gt; main, origin/main, upstream/main)
...

= Step 2: Make local changes and push them to origin

* bbbbbb (HEAD -&gt; main, origin/main)
* aaaaaa (upstream/main)
...

= Step 3: Check (fetch) upstream's update

* bbbbbb (HEAD -&gt; main, origin/main)
| * cccccc (upstream/main)
|/
* aaaaaa
...

= Step 4: Rebase (but how?)

* bbbbbb (HEAD -&gt; main, origin/main)
* cccccc (upstream/main)
* aaaaaa
...

<p dir="auto">如果是这样的话，我通常的做法是在本地进行这样的操作：</p>
git pull -r upstream main
# Resolve conflict
git rebase --continue

<p dir="auto">至于 GitHub 有没有一键（或者几键）的做法，我没有找到。</p>
<p dir="auto">参考阅读：https://gitolite.com/git-pull--rebase</p>
]]></description><link>http://forum.d2learn.org/topic/120/关于-github-中的-fork-仓库的简单问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/120/关于-github-中的-fork-仓库的简单问题</guid><dc:creator><![CDATA[johanvx]]></dc:creator><pubDate>Sun, 10 Aug 2025 16:10:04 GMT</pubDate></item><item><title><![CDATA[工閒手多搞了個python數學加密拹議, 有努諸位看倌批評一下]]></title><description><![CDATA[<p dir="auto">@semmyenator 是的, 需要 [私钥 -map-&gt; 公钥] 是一个不可逆或有限条件下不可逆, 这样才能保证安全性</p>
]]></description><link>http://forum.d2learn.org/topic/86/工閒手多搞了個python數學加密拹議-有努諸位看倌批評一下</link><guid isPermaLink="true">http://forum.d2learn.org/topic/86/工閒手多搞了個python數學加密拹議-有努諸位看倌批評一下</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Wed, 07 May 2025 04:07:57 GMT</pubDate></item><item><title><![CDATA[某小项目关于账号验证的问题...]]></title><description><![CDATA[<p dir="auto">只要在第一次验证后, 让服务器发一个自己的token, 后面就可以使用这个token来获取数据。实在不行可以把这个功能做成可选的 -- 即一次验证(也可手动重新验证, 老的将失效) + 功能可选</p>
]]></description><link>http://forum.d2learn.org/topic/81/某小项目关于账号验证的问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/81/某小项目关于账号验证的问题</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Sun, 13 Apr 2025 00:06:22 GMT</pubDate></item><item><title><![CDATA[Linux &amp; Win 游戏性能随手记录]]></title><description><![CDATA[<p dir="auto">我用错驱动了...<br />
理论上 上述linux的测试结果还能再提升？</p>
<p dir="auto">图片.png</p>
]]></description><link>http://forum.d2learn.org/topic/74/linux-win-游戏性能随手记录</link><guid isPermaLink="true">http://forum.d2learn.org/topic/74/linux-win-游戏性能随手记录</guid><dc:creator><![CDATA[MoYingJi]]></dc:creator><pubDate>Fri, 21 Mar 2025 10:55:20 GMT</pubDate></item><item><title><![CDATA[析构函数为何会调用]]></title><description><![CDATA[<p dir="auto">@CS-liujf 这里T2推导的应该是B类型</p>
]]></description><link>http://forum.d2learn.org/topic/72/析构函数为何会调用</link><guid isPermaLink="true">http://forum.d2learn.org/topic/72/析构函数为何会调用</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Sun, 16 Mar 2025 03:09:57 GMT</pubDate></item></channel></rss>