<?xml version="1.0" standalone="yes"?>
<rss version="2.0">
  <channel>
    <title><![CDATA[XOYOZO RSS]]></title>
    <link><![CDATA[https://xoyozo.net]]></link>
    <description><![CDATA[XOYOZO RSS]]></description>
    <item>
      <title><![CDATA[量化数据库复权与指标设计避坑指南]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/stock-adjustment]]></link>
      <description><![CDATA[<p><em>本文系 AI 生成，仅供参考，不保证准确性，实战中务必将结果与专业软件中的数据进行对比。</em></p><p><br/></p><p><a>在量化交易和股票数据分析中，“复权”是一个绕不开的核心概念。很多新手在搭建自己的数据库或编写策略时，常常因为复权处理不当，导致回测结果失真、技术指标错位，甚至引发系统性的计算灾难。</a></p><p><a>本文将从底层逻辑出发，用大白话为你讲透复权的本质，并提供一套成熟、高效的数据库与指标设计方案，帮你完美避开各种“坑”。</a></p><h3><a><strong>一、股票中的“复权”是什么意思？</strong></a></h3><p><a>简单来说，复权是为了消除股票因分红、送股、配股等除权除息事件造成的K线价格“断崖式”缺口。</a></p><p><a>当一家公司实施“10 送 10”时，股票数量翻倍，股价理论上会直接“腰斩”。如果看原始数据，K 线图上会出现一个巨大的向下跳空缺口。复权就是通过按比例调整历史价格，把这种非交易因素造成的断层“修复”，使股票的历史走势在图表上保持连续，从而真实反映投资者的累计收益和趋势变化。</a></p><h3><a><strong>二、如何计算复权因子？</strong></a></h3><p><a>复权因子本质上就是除权前后的价格比例，但不同数据源的定义方向恰好相反：</a></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>BaoStock 算法：复权因子 = 除权后价格 ÷ 除权前价格（结果小于 1，如 10 ÷ 20 = 0.5）。</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>掘金量化算法：复权因子 = 除权前价格 ÷ 除权后价格（结果大于 1，如 20 ÷ 10 = 2）。</p><p><a>无论哪种定义，其核心作用都是作为一个乘数，用于在不同历史价格之间进行等比换算。</a></p><h3><a><strong>三、将股票历史价格保存到数据库中时，建议使用真实价格还是复权价格？</strong></a></h3><p><a><strong>强烈建议：只保存不复权的真实价格和复权因子。</strong></a></p><p><a>前复权价格是一个动态变化的值（以当前最新价格为基准）。如果直接存储前复权价格，每次股票发生新的除权除息，你都需要把过去所有的历史价格全部重算并覆盖更新，维护成本极高且极易出错。而真实价格和复权因子是客观静态的，只需每天增量追加，历史数据永远无需修改。</a></p><h3><a><strong>四、以MA5为例，如何计算和保存指标价格？</strong></a></h3><p><a>遵循 “<strong>底层存真实指标，前端按需乘因子</strong>” 的原则：</a></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>计算与存储：永远使用“真实价格”来计算 MA5，并将结果存入数据库。这样历史指标是客观事实，无需因复权而重算。</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>展示与应用：在看盘或跑策略时，将数据库中的真实 MA5 乘以“当前的复权因子”，即可动态映射出完美的复权 MA5。</p><p>举个例子：某 6 天的真实价格是&nbsp;20，21，22，23，24，12，其中最后一天进行了除权，且假设这天没涨没跌，掘金因子是24/12=2，这样的话，倒数据第 2 天的 MA5 是 (20+21+22+23+24)/5=22，最后一天的 MA5 是 (21/2+22/2+23/2+24/2+12)/5=11.4，所以数据库中这两天的 MA5 值分别是 22 和 11.4 。复权因子同样适用于 MA5 值，即从最后一天看，其前一天的前复权 MA5 值是 22/2=11。</p><h3><a><strong>五、如何解决复权因子与四舍五入叠加产生的偏差问题？</strong></a></h3><p><a>核心原则是 “<strong>真实价格负责算钱，复权价格负责算趋势</strong>” （实盘中）：</a></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>交易与风控层：涉及真实盈亏、涨跌停价计算、下单挂单等，必须使用精确到两位小数的“真实价格”。</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>研究与回测层：涉及画K线图、计算 MA 等趋势指标时，才使用复权价格。此时允许存在极微小的尾数误差（如 1 分钱），因为技术指标看的是宏观趋势，微小偏差对信号毫无影响。</p><p>举个例子：真实价格 12.34（2位小数），复权因子 0.965678，前复权价格&nbsp;12.34 × 0.965678 = 11.91646652（8 位小数）</p><p>如果你用这个 11.91646652 去算涨停价：11.91646652 × 1.1 = 13.108113172，四舍五入变成 13.11。</p><p>但是，真实的涨停价是 13.57，它的前复权价应该是：13.57 × 0.965678 = 13.10429046，四舍五入变成 13.10。</p><h3><a><strong>六、前复权与后复权在实际应用中该如何选择？</strong></a></h3><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>前复权：以当前最新价格为基准，向下平移历史价格。优点是最新价格与真实交易价格一致，适合看近期K线走势、分析短期技术形态。</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>后复权：以历史最早价格为基准，向上放大最新价格。优点是能真实反映上市以来的累计涨幅，适合计算长期累计收益率、评估长线投资价值。</p><h3><a><strong>附：复权因子计算实战案例（小白秒懂版）</strong></a></h3><p><a><strong>【场景设定】</strong></a></p><p><a>假设某只股票在 T-1 日的收盘价是 <strong>20元</strong>。</a></p><p><a>T </a>日公司宣布“10 送 10”，股价直接“腰斩”变成 <strong>10元</strong>。假设 T 日当天市场不涨不跌，实际收盘价依然是 10元。</p><p><a><strong>1. </strong></a><strong>复权因子怎么算？</strong></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>BaoStock算法：10 ÷ 20 = 0.5</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>掘金量化算法：20 ÷ 10 = 2</p><p><a><strong>2. </strong></a><strong>前复权怎么算？</strong></p><p><a>前复权的核心是：<strong>T 日的 10元 保持不变</strong>，把 T-1 日的价格乘以 BaoStock 的因子（0.5）。</a></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T-1 日前复权价 = 20 × 0.5 = 10元</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T 日前复权价 = 10元（因为T日是基准日，保持不变）最终结果：T-1 日是 10元，T 日是 10元。K 线图完美连续，没有缺口。</p><p><a><strong>3. </strong></a><strong>后复权怎么算？</strong></p><p><a>后复权的核心是：<strong>T-1 日的 20元 保持不变</strong>，把 T 日的价格乘以掘金的因子（2）。</a></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T-1 日后复权价 = 20元</p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T 日后复权价 = 10 × 2 = 20元最终结果：T-1 日是 20元，T 日是 20元。K 线图同样连续，反映了你“虽然股价没涨，但手里股票翻倍了，总资产没变”的真实情况。</p><p><a><strong>4. </strong></a><strong>技术指标（以 MA2 为例）怎么算？</strong></p><p style="margin-left:29px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">•<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>数据库里存什么？ 存真实价格算出来的指标。</p><p style="margin-left:59px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">◦<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T-1 日前复权价格 = 20 × 0.5 = 10</p><p style="margin-left:59px"><span style="color: rgb(34, 34, 34); font-family: &quot;Microsoft YaHei&quot;, &quot;Segoe UI&quot;, system-ui, Roboto, &quot;Noto Sans SC&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; background-color: rgb(255, 255, 255);"></span><span style="font-family: &quot;Arial Unicode MS&quot;, sans-serif;">◦</span><span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 9px; line-height: normal; font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>T 日前复权价格 = 10（前复权以当日为基准，保持真实价格不变）</p><p style="margin-left:59px"><span style="font-family:&#39;Arial Unicode MS&#39;,sans-serif">◦<span style="font:9px &#39;Times New Roman&#39;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>T 日真实 MA2 =&nbsp;(10 + 10) ÷ 2 = 10</p><p><a><strong>【一句话总结】</strong></a></p><p><a>复权只是数学游戏。<strong>真实价格负责算钱，复权价格负责看趋势；数据库里只存真实指标，看盘时再乘因子映射。</strong></a></p><p style="text-align:left">(AI&nbsp;<span style="font-family:宋体">生成</span>)</p><p><br/></p>]]></description>
      <pubDate>Fri, 03 Jul 2026 11:54:35 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[ASP.NET 网站项目发布到 IIS 上运行时报 500 错误]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/aspnet-iis-500-error]]></link>
      <description><![CDATA[<p>ASP.NET 10 网站在 VS 中运行正常，发布到 IIS 后，某个页面打开报 500 错误，在 Action 中整个套上 try-catch 捕获不到错误，怎么才能查看这个异常原因？</p><p>最直接的方法是：<strong>在 Windows 中打开“事件查看器”，导航到“Windows 日志” -&gt; “应用程序”，查找来源为 IIS AspNetCore Module、.NET Runtime 或 IIS Express AspNetCore Module 的错误事件。</strong></p><p>当然你也可以在 IIS 管理器中配置对应网站的错误页，或在 Program.cs 中启用了开发者异常页面，但是非常不建议在开发环境中开启这些。</p>]]></description>
      <pubDate>Mon, 22 Jun 2026 00:46:56 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[2026世界杯赛程]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/fifa2026]]></link>
      <description><![CDATA[<p>
  <img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260609/2026fifa.jpg"/>
</p>]]></description>
      <pubDate>Tue, 09 Jun 2026 00:07:54 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Ollama 使用集成显卡跑大模型怎么办？如何更改为用独立显卡运行？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/ollama-use-nvidia]]></link>
      <description><![CDATA[<p>Ollama 跑大模型生成太慢，未使用独立显卡 GPU 0 NVIDIA GPU，而 GPU 1 Intel Graphics 使用率 100%，内存几乎占满，CPU 使用率也异常高，怎么办？如何改为用英伟达独立显卡来跑？</p><p>打开 NVIDIA 控制面板（NVIDIA Control Panel），展开左侧菜单中的“3D 设置”，点击“管理 3D 设置”，切到“程序设置”选项卡，在下拉框中选择 llama-server.exe 这个程序，为此程序选择首选图形处理器改为“高性能 NVIDIA 处理器”，点击右下角的“应用”保存设置。</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260604/6391620213012569946240999.png" title="image.png" alt="image.png"/></p><p>重启 Ollama。</p><p>使用 Ollama，即可在“NVIDIA GPU 活动”中看到 llama-server.exe。<br/></p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260604/6391620224165594021273668.png" title="image.png" alt="image.png"/></p>]]></description>
      <pubDate>Thu, 04 Jun 2026 12:37:29 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Web 部署任务失败。未能验证服务器的证书。]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/ERROR_CERTIFICATE_VALIDATION_FAILED-AllowUntrustedCertificate]]></link>
      <description><![CDATA[<p>ASP.NET 网站项目发布到远程 IIS，报错：</p><pre class="brush:plain;toolbar:false">Web&nbsp;部署任务失败。(已使用指定的进程(“Web&nbsp;Management&nbsp;Service”)连接到远程计算机，但未能验证服务器的证书。如果你信任该服务器，请再次连接并允许不信任的证书。&nbsp;&nbsp;在以下位置了解更多信息:&nbsp;https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_CERTIFICATE_VALIDATION_FAILED。)&nbsp;...</pre><p>参照错误信息中的网址，在项目文件中添加该配置：<br/></p><pre class="brush:xml;toolbar:false">&lt;PropertyGroup&gt;
&nbsp;&nbsp;&lt;AllowUntrustedCertificate&gt;true&lt;/AllowUntrustedCertificate&gt;
&lt;/PropertyGroup&gt;</pre><p><br/></p>]]></description>
      <pubDate>Wed, 03 Jun 2026 02:47:10 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[QQ 浏览器在 HTTPS 环境下无法接收并存储会话 Cookie，如何解决登录态问题]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/httpCookies-SameSite-None-Secure]]></link>
      <description><![CDATA[<p><strong>问题复现</strong></p><p>使用 .NET Framework 开发的网站项目，用 QQ 浏览器访问无法登录成功，用其它浏览器（如 Edge）没有问题。</p><p>只有访问 https 地址时出现问题。</p><p><br/></p><p><strong>原因</strong></p><p>在 HTTPS 协议下，现代浏览器（特别是 QQ 浏览器）会强制执行安全策略。根据规范，当 Cookie 设置了 SameSite=None 时，必须同时设置 Secure 属性，否则浏览器会静默拒绝（丢弃）该 Cookie。</p><p><br/></p><p><strong>解决方案</strong></p><p>方法一：如果您是通过 web.config 配置的，请确保 &lt;system.web&gt; 节点下的 &lt;httpCookies&gt; 设置正确，并且您的 .NET Framework 版本支持这些属性（4.7.2+）。</p><pre class="brush:xml;toolbar:false">&lt;system.web&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;httpCookies&nbsp;sameSite=&quot;None&quot;&nbsp;requireSSL=&quot;true&quot;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;sessionState&nbsp;...&nbsp;/&gt;
&lt;/system.web&gt;</pre><p>方法二：在 Global.asax 文件的 Application_PostAuthenticateRequest 或 Application_EndRequest 事件中，强制为 Cookie 添加 Secure 属性。</p><pre class="brush:c#;toolbar:false">protected&nbsp;void&nbsp;Application_PostAuthenticateRequest(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)
{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;仅在&nbsp;HTTPS&nbsp;环境下处理
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Request.IsSecureConnection)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpCookie&nbsp;sessionCookie&nbsp;=&nbsp;Response.Cookies[&quot;ASP.NET_SessionId&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(sessionCookie&nbsp;!=&nbsp;null)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;强制设置&nbsp;SameSite=None&nbsp;和&nbsp;Secure
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionCookie.SameSite&nbsp;=&nbsp;SameSiteMode.None;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionCookie.Secure&nbsp;=&nbsp;true;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Cookies.Set(sessionCookie);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p><br/></p><p><strong>检验</strong></p><p>确认 Set-Cookie 的值变为：</p><pre class="brush:plain;toolbar:false">ASP.NET_SessionId=...;&nbsp;path=/;&nbsp;HttpOnly;&nbsp;SameSite=None;&nbsp;Secure</pre><p><br/></p>]]></description>
      <pubDate>Wed, 27 May 2026 02:38:03 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[赶紧修复这个潜伏了18年的 nginx 漏洞]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability]]></link>
      <description><![CDATA[<p>报道称 NGINX 被曝一组高危漏洞，已潜伏约 18 年，威胁全球约三分之一的网络服务器。</p><p><span style="text-wrap-mode: nowrap;">本次曝光的漏洞如下：</span></p><p><span style="text-wrap-mode: nowrap;">CVE-2026-42945 - (9.2 Critical)</span></p><p><span style="text-wrap-mode: nowrap;">CVE-2026-42946 - (8.3 High)</span></p><p><span style="text-wrap-mode: nowrap;">CVE-2026-40701 - (6.3 Medium)</span></p><p><span style="text-wrap-mode: nowrap;">CVE-2026-42934 - (6.3 Medium)</span></p><p>攻击者无需登录认证，只需发送一条特制 HTTP 请求，就能让 NGINX 工作进程崩溃；在合适条件下，还可能拿到服务器远程代码执行权限。</p><p><br/></p><p><strong>修复方案一</strong></p><p>NGINX 升级到 1.31.0 或 1.30.1</p><p><br/></p><p><strong>修复方案二</strong></p><p><em>若你使用的是&nbsp;OpenResty 或宝塔面板，没有更新的 nginx 版本选择，那么手动修复此漏洞。</em></p><p>将 rewrite 规则中的未命名正则捕获改成命名捕获。</p><p>示例：</p><p>原来的写法：</p><pre class="brush:cpp;toolbar:false;">rewrite&nbsp;^(.*)$&nbsp;/index.php?s=$1&nbsp;last;</pre><p>修改为：<br/></p><pre class="brush:cpp;toolbar:false;">rewrite&nbsp;^(?&lt;a&gt;.*)$&nbsp;/index.php?s=$a&nbsp;last;</pre><p><br/></p><p>参考文献：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p><a href="https://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability" target="_blank">NGINX Rift: Achieving NGINX Remote Code Execution via an 18-Year-Old Vulnerability</a></p></li><li><p><a href="https://www.ithome.com/0/950/316.htm" target="_blank">NGINX 曝 9.2 分高危漏洞：潜伏 18 年，威胁全球约 1/3 服务器</a><br/></p></li></ol>]]></description>
      <pubDate>Thu, 14 May 2026 08:54:55 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Spectre.Console 常用示例]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/SpectreConsole-demo]]></link>
      <description><![CDATA[<p>以下是 Spectre.Console 的核心功能示例，涵盖最常用的输出和交互场景：</p><p><br/></p><h2>1. 基础富文本输出</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239487542241995795034.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">using&nbsp;Spectre.Console;

//&nbsp;使用&nbsp;Markup&nbsp;语法（类似&nbsp;BBCode）
AnsiConsole.Markup(&quot;[bold&nbsp;green]成功！[/]&nbsp;文件已保存。\n&quot;);
AnsiConsole.Markup(&quot;[red]错误：[/]&nbsp;无法连接到服务器。\n&quot;);

//&nbsp;混合样式
AnsiConsole.Markup(&quot;[underline&nbsp;blue]https://example.com[/]\n&quot;);

//&nbsp;自动换行写
AnsiConsole.Write(new&nbsp;Panel(&quot;[yellow]警告[/]&nbsp;磁盘空间不足&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.Header(&quot;系统通知&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.Border(BoxBorder.Rounded));</pre><p><br/></p><h2>2. 表格</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239489930179444702361.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;table&nbsp;=&nbsp;new&nbsp;Table();
table.AddColumn(&quot;[u]ID[/]&quot;);
table.AddColumn(new&nbsp;TableColumn(&quot;[u]名称[/]&quot;).Centered());
table.AddColumn(&quot;[u]状态[/]&quot;);

table.AddRow(&quot;1&quot;,&nbsp;&quot;订单服务&quot;,&nbsp;&quot;[green]运行中[/]&quot;);
table.AddRow(&quot;2&quot;,&nbsp;&quot;支付网关&quot;,&nbsp;&quot;[red]离线[/]&quot;);
table.AddRow(&quot;3&quot;,&nbsp;&quot;消息队列&quot;,&nbsp;&quot;[yellow]警告[/]&quot;);

AnsiConsole.Write(table);</pre><p><br/></p><h2>3. 进度条 / 状态指示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239493017913526615951.png" title="image.png" alt="image.png"/><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239495296302388101514.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;带进度条的循环任务
await&nbsp;AnsiConsole.Progress()
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;task1&nbsp;=&nbsp;ctx.AddTask(&quot;[green]下载文件[/]&quot;,&nbsp;maxValue:&nbsp;100);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;task2&nbsp;=&nbsp;ctx.AddTask(&quot;[green]处理数据[/]&quot;,&nbsp;maxValue:&nbsp;100);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!ctx.IsFinished)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task1.Increment(1.5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task2.Increment(0.8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(50);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;});

//&nbsp;不确定时长的旋转状态
await&nbsp;AnsiConsole.Status()
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(&quot;正在连接...&quot;,&nbsp;async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(3000);&nbsp;//&nbsp;模拟工作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AnsiConsole.MarkupLine(&quot;[green]连接成功！[/]&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;});</pre><p><br/></p><h2>4. 交互式提示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239498712053645502913.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;确认
if&nbsp;(AnsiConsole.Confirm(&quot;是否继续安装？&quot;))
{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;执行安装
}

//&nbsp;文本输入（带验证）
var&nbsp;name&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;TextPrompt&lt;string&gt;(&quot;请输入用户名：&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ValidationErrorMessage(&quot;[red]用户名不能为空[/]&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Validate(input&nbsp;=&gt;&nbsp;!string.IsNullOrWhiteSpace(input)));

//&nbsp;选择列表
var&nbsp;fruit&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;SelectionPrompt&lt;string&gt;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Title(&quot;请选择最喜欢的水果&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddChoices(new[]&nbsp;{&nbsp;&quot;苹果&quot;,&nbsp;&quot;香蕉&quot;,&nbsp;&quot;橙子&quot;,&nbsp;&quot;葡萄&quot;&nbsp;}));

AnsiConsole.MarkupLine($&quot;你选择了：[green]{fruit}[/]&quot;);

//&nbsp;多选
var&nbsp;colors&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;MultiSelectionPrompt&lt;string&gt;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Title(&quot;请选择颜色&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddChoices(new[]&nbsp;{&nbsp;&quot;红色&quot;,&nbsp;&quot;绿色&quot;,&nbsp;&quot;蓝色&quot;,&nbsp;&quot;黄色&quot;&nbsp;}));</pre><p><br/></p><h2>5. 树形结构</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239502727710954527704.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;root&nbsp;=&nbsp;new&nbsp;Tree(&quot;[yellow]项目结构[/]&quot;);
var&nbsp;src&nbsp;=&nbsp;root.AddNode(&quot;src&quot;);
src.AddNode(&quot;Program.cs&quot;);
src.AddNode(&quot;Services&quot;);
src.AddNode(&quot;Models&quot;);

var&nbsp;tests&nbsp;=&nbsp;root.AddNode(&quot;tests&quot;);
tests.AddNode(&quot;UnitTests&quot;);

AnsiConsole.Write(root);</pre><p><br/></p><h2>6. 布局 / 网格</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239505215208298013913.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;layout&nbsp;=&nbsp;new&nbsp;Layout(&quot;Root&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.SplitColumns(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Left&quot;).Size(30),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Right&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.SplitRows(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Top&quot;),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Bottom&quot;)));

layout[&quot;Left&quot;].Update(new&nbsp;Panel(&quot;导航栏&quot;));
layout[&quot;Top&quot;].Update(new&nbsp;Panel(&quot;主内容区&quot;));
layout[&quot;Bottom&quot;].Update(new&nbsp;Panel(&quot;日志输出&quot;));

AnsiConsole.Write(layout);</pre><p><br/></p><h2>7. 实时更新</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239510376053518476185.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;table&nbsp;=&nbsp;new&nbsp;Table().AddColumn(&quot;Time&quot;).AddColumn(&quot;Message&quot;);
table.AddRow(&quot;10:00&quot;,&nbsp;&quot;系统启动&quot;);

await&nbsp;AnsiConsole.Live(table)
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;5;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.AddRow($&quot;10:0{i}&quot;,&nbsp;$&quot;事件&nbsp;{i}&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.Refresh();&nbsp;//&nbsp;刷新显示
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;});</pre><p><br/></p><h2>8. 带样式的异常显示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239513664835336161506.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">try
{
&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InvalidOperationException(&quot;操作失败&quot;);
}
catch&nbsp;(Exception&nbsp;ex)
{
&nbsp;&nbsp;&nbsp;&nbsp;AnsiConsole.WriteException(ex,&nbsp;ExceptionFormats.ShortenPaths);
}</pre><p><br/></p><h2>9. 日历</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246416179731295957956.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;calendar&nbsp;=&nbsp;new&nbsp;Calendar(2026,&nbsp;4);
calendar.AddCalendarEvent(2026,&nbsp;4,&nbsp;22);&nbsp;//&nbsp;标记日期
calendar.HighlightStyle(Style.Parse(&quot;yellow&nbsp;bold&quot;));
AnsiConsole.Write(calendar);</pre><p><br/></p><p>10.&nbsp;条形图 / 柱状图</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246425198836408685666.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;BarChart()
&nbsp;&nbsp;&nbsp;&nbsp;.Width(60)
&nbsp;&nbsp;&nbsp;&nbsp;.Label(&quot;[green&nbsp;bold]项目进度[/]&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.CenterLabel()
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;后端&quot;,&nbsp;80,&nbsp;Color.Green)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;前端&quot;,&nbsp;65,&nbsp;Color.Blue)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;测试&quot;,&nbsp;40,&nbsp;Color.Red));</pre><p><br/></p><p>11. 分解图</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246488853737243175261.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;BreakdownChart()
&nbsp;&nbsp;&nbsp;&nbsp;.Width(60)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;CPU&quot;,&nbsp;45,&nbsp;Color.Red)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;内存&quot;,&nbsp;30,&nbsp;Color.Blue)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;磁盘&quot;,&nbsp;25,&nbsp;Color.Green));</pre><p><br/></p><p>12. 规则线</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246496095171171560976.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;Rule(&quot;[red]警告区域[/]&quot;).RuleStyle(&quot;red&quot;).LeftJustified());
AnsiConsole.WriteLine(&quot;内容&quot;);
AnsiConsole.Write(new&nbsp;Rule().RuleStyle(&quot;green&quot;));</pre><p><br/></p><p>13. 文本样式</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246505432037863173744.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;大字标题
AnsiConsole.Write(new&nbsp;FigletText(&quot;Hello&quot;).Color(Color.Green));
//&nbsp;Emoji
AnsiConsole.Markup(&quot;:check_mark_button:&nbsp;成功&nbsp;:cross_mark:&nbsp;失败&quot;);</pre><p><br/></p><p>14. 网格</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246517015701001421377.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;grid&nbsp;=&nbsp;new&nbsp;Grid();
grid.AddColumn(new&nbsp;GridColumn().NoWrap().PadRight(4));
grid.AddColumn();

grid.AddRow(&quot;[b]名称[/]&quot;,&nbsp;&quot;Spectre.Console&quot;);
grid.AddRow(&quot;[b]版本[/]&quot;,&nbsp;&quot;0.49.1&quot;);
grid.AddRow(&quot;[b]许可[/]&quot;,&nbsp;&quot;MIT&quot;);

AnsiConsole.Write(grid);</pre><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/></p>]]></description>
      <pubDate>Tue, 21 Apr 2026 11:05:39 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Windows Server 服务器没有安装物理声卡，如何播放声音]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/windows-server-vb-cable]]></link>
      <description><![CDATA[<p>安装虚拟声卡&nbsp;VB-Cable 搞定。</p><p>若重启后未生效，在服务中启动&nbsp;Windows Audio、Windows Audio Endpoint Builder 和&nbsp;Multimedia Class Scheduler（如果有），并设置为自动启动。</p><p><br/></p><p>如何希望使用 OBS 录制系统声音，在 OBS 菜单 - 文件 - 设置 - 音频 - 桌面音频 中选择正确的音源（如“远程音频”）。</p>]]></description>
      <pubDate>Mon, 20 Apr 2026 14:28:40 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[C盘满了怎么办？WinSxS 可以删吗？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/win-c-winsxs-delete]]></link>
      <description><![CDATA[<p><em>如果你不会激活 Windows，本文可能不适用。</em></p><p>C盘满了如何清理？特别是 C:\Windows\WinSxS 占用大量磁盘空间，删又不敢删。</p><p>推荐一个比较完美又彻底有效的办法：</p><p>设置-系统-恢复-使用 Windows 更新修复问题。</p><p>或下载与原系统版本一致的 <a href="https://xoyozo.net/Software/Index/Windows" target="_blank">Windows 原版安装镜像</a>，双击运行，选择<strong>保留个人文件和应用</strong>，等待约半个小时。</p><p>完成后，原来安装的应用程序和设置会保留，无用的系统文件会移至 C:\Windows.old。</p><p>若新系统运行没有问题，则可删除该目录（设置-系统-存储-清理建议），释放磁盘空间；若有问题，可还原到原系统（设置-系统-恢复）。</p>]]></description>
      <pubDate>Sun, 19 Apr 2026 02:53:27 GMT</pubDate>
    </item>
  </channel>
</rss>