<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>yauntyour&#39;s Blog</title>
    <link href="https://yauntyour.github.io/feed/index.xml" rel="self"/>
    <link href="https://yauntyour.github.io/"/>
    <updated>2026-04-25T07:25:45Z</updated>
    <id>https://yauntyour.github.io/</id>
    <author>
        <name>yauntyour</name>
    </author>
    
    <entry>
        <title>MatLab.cpp</title>
        <link href="https://yauntyour.github.io/posts/matlabcpp/"/>
        <id>https://yauntyour.github.io/posts/matlabcpp/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;h1 id=&#34;matlab-cpp&#34;&gt;MatLab-cpp&lt;/h1&gt;
&lt;p&gt;简单的C++绘图库，由OpenGL原生实现，依赖于GLFW创建窗口。&lt;/p&gt;
&lt;p&gt;基本使用&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;quot;matlab.hpp&amp;quot;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;

int main()
{
    using namespace matplot;

    std::vector&amp;lt;float&amp;gt; x = linspace(-4 * acos(-1), 4 * acos(-1), 100);
    std::vector&amp;lt;float&amp;gt; y1, y2;
    for (float xi : x)
    {
        y1.push_back(sin(xi));
        y2.push_back(cos(xi));
    }

    // === 创建一个窗口 ===
    Figure *fig1 = figure();
    auto axes1 = fig1-&amp;gt;gca();
    axes1-&amp;gt;setTitle(&amp;quot;Sine and Cosine Waves&amp;quot;);
    axes1-&amp;gt;setXLabel(&amp;quot;X&amp;quot;);
    axes1-&amp;gt;setYLabel(&amp;quot;Y&amp;quot;);
    axes1-&amp;gt;grid(true);

    plot(axes1, x, y1, &amp;quot;b-&amp;quot;);
    plot(axes1, x, y2, &amp;quot;r--&amp;quot;);

    // === 主渲染循环 ===
    std::vector&amp;lt;Figure *&amp;gt; figures = {fig1};
    bool anyOpen = true;

    while (anyOpen)
    {
        anyOpen = false;
        for (auto fig : figures)
        {
            if (fig &amp;amp;&amp;amp; fig-&amp;gt;window &amp;amp;&amp;amp; !glfwWindowShouldClose(fig-&amp;gt;window))
            {
                fig-&amp;gt;render();
                glfwSwapBuffers(fig-&amp;gt;window);
                anyOpen = true;
            }
        }
        glfwPollEvents();
        std::this_thread::sleep_for(std::chrono::milliseconds(16));
    }

    // === 清理 ===
    delete fig1;
    glfwTerminate();

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;作为示波器：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;// main.cpp - 示波器功能（固定时间窗口滚动显示）
#include &amp;quot;matlab.hpp&amp;quot;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;

int main()
{
    using namespace matplot;

    Figure *fig = figure();
    auto axes = fig-&amp;gt;gca();
    axes-&amp;gt;setTitle(&amp;quot;Oscilloscope - Real-time Sine Wave&amp;quot;);
    axes-&amp;gt;setXLabel(&amp;quot;Time (s)&amp;quot;);
    axes-&amp;gt;setYLabel(&amp;quot;Amplitude&amp;quot;);
    axes-&amp;gt;grid(true);
    axes-&amp;gt;setDataRange(-1.8f, 1.8f, -3.0f, 3.0f);

    std::vector&amp;lt;float&amp;gt; initX, initY;
    auto line = plot(axes, initX, initY, &amp;quot;r-&amp;quot;);
    line-&amp;gt;setMaxPoints(50);
    line-&amp;gt;setAutoUpdateAxes(false);

    float currentTime = axes-&amp;gt;getdataXMin();
    const float dt = 0.05f;
    const float updateTime = 0.02f;
    auto lastUpdateTime = std::chrono::steady_clock::now();
    float b = 0;

    while (!glfwWindowShouldClose(fig-&amp;gt;window))
    {
        auto now = std::chrono::steady_clock::now();
        float elapsed = std::chrono::duration&amp;lt;float&amp;gt;(now - lastUpdateTime).count();

        if (elapsed &amp;gt;= updateTime)
        {
            float y = pow(abs(currentTime + b), 0.666666) + 0.9 * pow(3.36 - (abs(currentTime + b) * abs(currentTime + b)), 0.5) * sin(3.141592 * abs(currentTime + b) / 0.1314);
            line-&amp;gt;appendData(currentTime, y);
            currentTime += dt;
            if (currentTime &amp;gt;= axes-&amp;gt;getdataXMax())
            {
                currentTime = axes-&amp;gt;getdataXMin();
            }

            lastUpdateTime = now;
        }

        // 渲染
        fig-&amp;gt;render();
        glfwSwapBuffers(fig-&amp;gt;window);
        glfwPollEvents();
        std::this_thread::sleep_for(std::chrono::milliseconds(5));
    }

    delete fig;
    glfwTerminate();
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    
    <entry>
        <title>Numcpp</title>
        <link href="https://yauntyour.github.io/posts/numcpp/"/>
        <id>https://yauntyour.github.io/posts/numcpp/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;h1 id=&#34;cnumcpp&#34;&gt;&lt;strong&gt;基于原生C++的通用矩阵——Numcpp&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;原生的C++矩阵类封装，基本使用：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;math.h&amp;gt;
#include &amp;lt;complex&amp;gt;
#include &amp;quot;Numcpp.hpp&amp;quot;

using namespace np;

// 复数，推荐使用C++的复数类型，支持FFT变换
typedef std::complex&amp;lt;double&amp;gt; complex_double;

#define nc_t complex_double

nc_t sinxy(nc_t x, nc_t y)
{
    return nc_t(sin(x.real()), sin(x.imag()));
}

void generate(Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;nc)
{
    srand(time(NULL));
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        for (size_t j = 0; j &amp;lt; nc.col; j++)
        {
            double U1 = rand() * 1.0f / RAND_MAX;                // 0~1均匀分布
            double U2 = rand() * 1.0f / RAND_MAX;                // 0~1均匀分布
            double Z = sqrt(-2 * log(U1)) * cos(2 * NP_PI * U2); // 标准正态分布
            // 期望为1，方差为3^2的正态分布
            nc[i][j] *= 1 + 3 * Z;
        }
    }
}

nc_t func(nc_t n, nc_t m)
{
    nc_t result = n * m;
    return result;
}
nc_t sigmoid(nc_t n, nc_t m)
{
    return nc_t(1, 0) / (nc_t(1, 0) + exp(-n));
}

int main(int argc, char const *argv[])
{
    // 开启多核优化
    np::is_optimized = true;
    /*使用Numcpp&amp;lt;type&amp;gt; np(row,col)创建一个row * col的矩阵*/
    Numcpp&amp;lt;nc_t&amp;gt; n(16, 16), m(16, 16);

    /*矩阵中所有元素的默认值为1，也可以手动设置*/
    Numcpp&amp;lt;nc_t&amp;gt; c(6, 7, 3.0);
    Numcpp&amp;lt;nc_t&amp;gt; e(6, 8);

    /*广播操作*/
    n *= 2.0;
    m *= 3.0;

    try
    {

        // 矩阵乘法：
        Numcpp&amp;lt;nc_t&amp;gt; result = n * m;
        std::cout &amp;lt;&amp;lt; &amp;quot;n * m:&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 使用矩阵乘法优化算法，在M*K*N &amp;gt;64*64*64时生效,对特殊乘法无效;

        // 矩阵运算：
        result = n + m;
        std::cout &amp;lt;&amp;lt; &amp;quot;n + m:&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        // 哈达马乘积：
        result = n.Hadamard(m);
        std::cout &amp;lt;&amp;lt; &amp;quot;n (h*) m:&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 生成正态分布的矩阵
        generate(c);
        generate(e);
        std::cout &amp;lt;&amp;lt; c &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; e &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        // 矩阵转置：
        c.transposed();
        std::cout &amp;lt;&amp;lt; &amp;quot;c transposed:&amp;quot; &amp;lt;&amp;lt; c &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 矩阵的特殊乘法：
        Numcpp&amp;lt;nc_t&amp;gt; Out = c&amp;lt;func&amp;gt; e; // 会创建一个新的矩阵
        std::cout &amp;lt;&amp;lt; &amp;quot;Out:&amp;quot; &amp;lt;&amp;lt; Out &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 函数数乘特殊乘法：
        Numcpp&amp;lt;nc_t&amp;gt; act = result&amp;lt;sigmoid&amp;gt; NULL;
        std::cout &amp;lt;&amp;lt; &amp;quot;act:&amp;quot; &amp;lt;&amp;lt; act &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 矩阵fft
        std::cout &amp;lt;&amp;lt; &amp;quot;RAW:&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        result.ffted(1);
        std::cout &amp;lt;&amp;lt; &amp;quot;FFT:&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        // ifft
        result.ffted(-1);
        std::cout &amp;lt;&amp;lt; &amp;quot;iFFT&amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        // 保存矩阵
        Out.save(&amp;quot;mat&amp;quot;);
        // 读取矩阵
        Numcpp&amp;lt;nc_t&amp;gt; temp = load&amp;lt;nc_t&amp;gt;(&amp;quot;mat&amp;quot;);
        std::cout &amp;lt;&amp;lt; &amp;quot;temp load in Out:&amp;quot; &amp;lt;&amp;lt; temp &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 流式创建一个方阵
        Numcpp&amp;lt;int&amp;gt; mat(3, 3);
        mat &amp;lt;&amp;lt; 4, 1, 1,
            1, 3, 2,
            1, 2, 5;

        // 方阵的逆、行列式
        std::cout &amp;lt;&amp;lt; &amp;quot;mat:&amp;quot; &amp;lt;&amp;lt; mat &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;mat&#39;s sum:&amp;quot; &amp;lt;&amp;lt; mat.sum() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;mat Determinant value:&amp;quot; &amp;lt;&amp;lt; mat.determinant() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;mat Inverse mat:&amp;quot; &amp;lt;&amp;lt; mat.inverse() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // 直接赋值式流
        Numcpp&amp;lt;double&amp;gt; nmat = (Numcpp&amp;lt;double&amp;gt;(4, 3) &amp;lt;&amp;lt; 4, 1, 1, 1,
                               3, 2, 1, 2,
                               5, 5, 1, 1);
        // 矩阵阵的逆
        std::cout &amp;lt;&amp;lt; &amp;quot;nmat:&amp;quot; &amp;lt;&amp;lt; nmat &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;nmat pseudoinverse mat:&amp;quot; &amp;lt;&amp;lt; nmat.pseudoinverse() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;nmat[0:]:&amp;quot; &amp;lt;&amp;lt; nmat.srow(0) &amp;lt;&amp;lt; std::endl;
        std::cout &amp;lt;&amp;lt; &amp;quot;nmat[:2]:&amp;quot; &amp;lt;&amp;lt; nmat.scol(2) &amp;lt;&amp;lt; std::endl;

        Numcpp&amp;lt;double&amp;gt; U, S, V;
        nmat.svd(U, S, V);

        std::cout &amp;lt;&amp;lt; &amp;quot;SVD_U:&amp;quot; &amp;lt;&amp;lt; U &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;SVD_S:&amp;quot; &amp;lt;&amp;lt; S &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;SVD_V:&amp;quot; &amp;lt;&amp;lt; V &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;rebuild nmat:&amp;quot; &amp;lt;&amp;lt; U * S * V.transpose() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // lambda支持
        std::cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;lambda&amp;gt;:&amp;quot; &amp;lt;&amp;lt; (temp&amp;lt;[](nc_t x, nc_t y) -&amp;gt; nc_t
                                          { return nc_t(sin(x.real()), sin(x.imag())); }&amp;gt;
                                         NULL)
                  &amp;lt;&amp;lt; std::endl;
        std::cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;func&amp;gt;:&amp;quot; &amp;lt;&amp;lt; (n&amp;lt;sinxy&amp;gt; NULL)
                  &amp;lt;&amp;lt; std::endl;

        // 生成高斯矩阵基本用法
        auto gmat = np::randn&amp;lt;double&amp;gt;(100, 100); // 100x100标准高斯矩阵

        // 自定义参数
        np::GaussianConfig config;
        config.mean = 5.0;
        config.stddev = 2.0;
        config.seed = 12345;
        auto custom_mat = np::randn&amp;lt;double&amp;gt;(50, 50, config);

        // 多线程生成大矩阵
        auto big_mat = np::randn_parallel&amp;lt;double&amp;gt;(1000, 1000, config, 8);

        // 多变量高斯
        np::Numcpp&amp;lt;double&amp;gt; cov(2, 2);
        cov &amp;lt;&amp;lt; 1.0, 0.8, 0.8, 1.0;
        auto multi_mat = np::multivariate_randn&amp;lt;double&amp;gt;(1000, cov);

        // 向量的点积
        Numcpp&amp;lt;int&amp;gt; v1(1, 9), v2(9, 1, 8);
        std::cout &amp;lt;&amp;lt; &amp;quot;Dot: &amp;quot; &amp;lt;&amp;lt; v1.dot(v1) &amp;lt;&amp;lt; std::endl;

        // 范数计算
        auto normat = np::randn&amp;lt;double&amp;gt;(16, 16);
        std::cout &amp;lt;&amp;lt; &amp;quot;normat: &amp;quot; &amp;lt;&amp;lt; normat &amp;lt;&amp;lt; std::endl;
        std::cout &amp;lt;&amp;lt; &amp;quot;normat&#39;s L1: &amp;quot; &amp;lt;&amp;lt; normat.norm(np::L1) &amp;lt;&amp;lt; std::endl;
        std::cout &amp;lt;&amp;lt; &amp;quot;normat&#39;s L2: &amp;quot; &amp;lt;&amp;lt; normat.norm(np::L2) &amp;lt;&amp;lt; std::endl;
        std::cout &amp;lt;&amp;lt; &amp;quot;normat&#39;s INF: &amp;quot; &amp;lt;&amp;lt; normat.norm(np::INF) &amp;lt;&amp;lt; std::endl;
    }
    catch (const std::exception &amp;amp;e)
    {
        std::cerr &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; &#39;\n&#39;;
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 id=&#34;_1&#34;&gt;&lt;strong&gt;矩阵的运算&lt;/strong&gt;&lt;/h1&gt;
&lt;h3 id=&#34;_2&#34;&gt;下面是支持的操纵符的类型&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;Numcpp&amp;lt;typename&amp;gt; nc(4, 4),matrix(4,4);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_3&#34;&gt;赋值运算符&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;//矩阵简单运算的赋值运算
nc += matrix;
nc -= matrix;
nc = matrix;
//矩阵数乘广播的赋值运算
nc *= number//number为一个数值
nc += number
nc -= number
nc /= number
nc + number -&amp;gt; Numcpp
nc - number -&amp;gt; Numcpp
nc * number -&amp;gt; Numcpp
nc / number -&amp;gt; Numcpp
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_4&#34;&gt;矩阵的基本运算&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;Numcpp&amp;lt;typename&amp;gt; result = nc + matrix;
Numcpp&amp;lt;typename&amp;gt; result = nc - matrix;

Numcpp&amp;lt;typename&amp;gt; result = nc * number;//数乘
Numcpp&amp;lt;typename&amp;gt; result = nc * matrix;//矩阵乘法
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_5&#34;&gt;解矩阵运算&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;typename data = nc[x][y];//下标访问
nc.srow(index) -&amp;gt; Numcpp //行提取
nc.scol(index) -&amp;gt; Numcpp //列提取
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;hadamard-product&#34;&gt;矩阵的哈达马乘积（Hadamard product）&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;//哈达马乘积的基本运算
Numcpp&amp;lt;typename&amp;gt; result = nc.Hadamard(matrix);
//哈达马乘积的赋值运算
nc.Hadamard_self(matrix);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_6&#34;&gt;矩阵的置转运算&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;//获取矩阵的转置
Numcpp&amp;lt;typename&amp;gt; result = nc.transpose();
//转置矩阵
nc.transposed();
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_7&#34;&gt;方阵的逆以及矩形矩阵的伪逆&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;// 流式创建一个方阵
Numcpp&amp;lt;nc_t&amp;gt; mat(3, 3);
mat &amp;lt;&amp;lt; 1, 2, 3, 4, 5, 6, 7, 8, 9;

// 方阵的逆
mat.inverse() -&amp;gt; Numcpp

// 矩阵的逆
Numcpp&amp;lt;nc_t&amp;gt; nmat(4, 3);
nmat &amp;lt;&amp;lt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
nmat.pseudoinverse() -&amp;gt; Numcpp
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_8&#34;&gt;方阵的行列式计算&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;mat.determinant() -&amp;gt; Number
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_9&#34;&gt;矩阵的特殊乘法&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;Numcpp&amp;lt;nc_t&amp;gt; Out = c&amp;lt;func&amp;gt; e; // 会创建一个新的矩阵
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_10&#34;&gt;函数数乘特殊乘法&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;Numcpp&amp;lt;nc_t&amp;gt; act = result&amp;lt;sigmoid&amp;gt; NULL;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;fft&#34;&gt;FFT（只对复数矩阵有效）&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;// 矩阵fft
result.ffted(1);
// ifft
result.ffted(-1);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;cpu&#34;&gt;&lt;strong&gt;启用矩阵乘法优化算法和CPU多核优化加速计算&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;//默认同时开启矩阵乘法优化算法和CPU多核优化加速计算
nc.optimized(true);
//设置最大并发数
nc.maxprocs_set(thread_num);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;值得一提的是：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;if (sqrt(thread_num) * sqrt(thread_num) &amp;gt; std::thread::hardware_concurrency() || thread_num &amp;lt; 1)
{
 throw std::invalid_argument(&amp;quot;Invalid maxprocs&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果最大并发数大于CPU的最大线程数优化将毫无意义，我们禁止这种行为。同时根据约定，当&lt;code&gt;thread_num&lt;/code&gt;的值为一个可开方数，同时能够和矩阵的形状成几何倍数关系，此时优化效果最佳。同时，如果&lt;code&gt;nc.row/sqrt(thread_num)&lt;/code&gt;或&lt;code&gt;nc.col/sqrt(thread_num)&lt;/code&gt;不为整数，则可能存在分块缺陷。看起来像这样：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;(16,8)[
    [0][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [1][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [2][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [3][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [4][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [5][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [6][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [7][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [8][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [9][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [10][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [11][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [12][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [13][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [14][(2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (2,0) , (1,0) , (1,0)]
    [15][(1,0) , (1,0) , (1,0) , (1,0) , (1,0) , (1,0) , (1,0) , (1,0)]
]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;正常被处理的输出值应该为2，这是由于分块算法无法切割残块导致的，所以应该确保矩阵可以被分割为N个正方形大小的矩阵，如此可以保证效率与数据安全。&lt;/p&gt;
&lt;p&gt;关于矩阵乘法的优化算法，则是采用了Coppersmith和Winograd在1990年由Strassen算法改进而来的Coppersmith-Winograd算法：论文地址：&lt;a href=&#34;https://eprint.iacr.org/2013/107.pdf&#34;&gt;107.pdf&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;/*
 The mathematical principles mentioned in the paper:
     * this_matrix A_row * A_col
     * other_matrix A_col * B_col
     * result A_row * B_col
     * result = this_matrix * other_matrix
     * S1 = A21 + A22     T1 = B12 - B11
     * S2 = S1 - A11      T2 = B22 - T1
     * S3 = A11 - A21     T3 = B22 - B12
     * S4 = A12 - S2      T4 = T2 - B21
     * M1 = A11 * B11     U1 = M1 + M2
     * M2 = A12 * B21     U2 = M1 + M6
     * M3 = S4 * B22      U3 = U2 + M7
     * M4 = A22 * T4      U4 = U2 + M5
     * M5 = S1 * T1       U5 = U4 + M3
     * M6 = S2 * T2       U6 = U3 - U4
     * M7 = S3 * T3       U7 = U3 + M5
     * C11 = U1
     * C12 = U5
     * C21 = U6
     * C22 = U7
*/
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;_11&#34;&gt;矩阵有关的实用工具&lt;/h3&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;// 创建矩阵
np::Numcpp&amp;lt;int&amp;gt; mat(4, 5);
mat &amp;lt;&amp;lt; 1, 1, 0, 1, 0,
       1, 1, 1, 1, 1,
       1, 1, 1, 1, 1,
       1, 0, 1, 1, 0;

// 查找最大矩形
np::Rectangle rect = np::findMaximalRectangle(mat);
std::cout &amp;lt;&amp;lt; &amp;quot;最大矩形: &amp;quot; &amp;lt;&amp;lt; rect.area &amp;lt;&amp;lt; &amp;quot; 面积&amp;quot; &amp;lt;&amp;lt; std::endl;

// 基本用法
auto mat = np::randn&amp;lt;double&amp;gt;(100, 100);  // 100x100标准高斯矩阵

// 自定义参数
np::GaussianConfig config;
config.mean = 5.0;
config.stddev = 2.0;
config.seed = 12345;
auto custom_mat = np::randn&amp;lt;double&amp;gt;(50, 50, config);

// 多线程生成大矩阵
auto big_mat = np::randn_parallel&amp;lt;double&amp;gt;(1000, 1000, config, 8);

// 多变量高斯
np::Numcpp&amp;lt;double&amp;gt; cov(2, 2);
cov &amp;lt;&amp;lt; 1.0, 0.8, 0.8, 1.0;
auto multi_mat = np::multivariate_randn&amp;lt;double&amp;gt;(1000, cov);
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 id=&#34;nvidia-gpucuda&#34;&gt;对Nvidia GPU的CUDA加速支持&lt;/h1&gt;
&lt;p&gt;提供所有基础操作的CUDA加速，同时基于性能考量，内存自动同步默认为关，在&lt;strong&gt;完成所有运算后&lt;/strong&gt;应&lt;strong&gt;手动同步数据&lt;/strong&gt;回主机。&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;quot;Numcpp.hpp&amp;quot;

using namespace np;
#define nc_t double
int main()
{
    np::is_optimized = true;
    Numcpp&amp;lt;nc_t&amp;gt; n(16, 16);
    Numcpp&amp;lt;nc_t&amp;gt; m(16, 16);
    std::cout &amp;lt;&amp;lt; n;
    std::cout &amp;lt;&amp;lt; m;
    // 上传到GPU
    n.to(DEVICE_CUDA);
    m.to(DEVICE_CUDA);

    // 在GPU上操作
    n *= 2.0; // 广播操作
    m *= 3.0;
    n += 4;
    m -= 6;
    n /= 8;
    m /= 12;

    // 同步回CPU查看结果
    n.to(DEVICE_LOCAL);
    m.to(DEVICE_LOCAL);
    std::cout &amp;lt;&amp;lt; n;
    std::cout &amp;lt;&amp;lt; m;

    // GPU加速的矩阵乘法（无优化算法）
    Numcpp&amp;lt;nc_t&amp;gt; result = n * m;
    result.to(DEVICE_LOCAL);
    std::cout &amp;lt;&amp;lt; result;

    // 本位减法
    n -= m;
    n.to(DEVICE_LOCAL);
    std::cout &amp;lt;&amp;lt; n;

    // 同位广播 &amp;amp; 开启自动同步(默认关闭状态，避免运算期间反复拷贝内存)
    n.auto_sync = true;
    std::cout &amp;lt;&amp;lt; (n - 10) / 8.0 * 5 + 3 - 2 * 4 / 2 + 1 &amp;lt;&amp;lt; std::endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;注：要使用nvcc进行编译&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;_12&#34;&gt;利用矩阵进行神经网络计算示例&lt;/h1&gt;
&lt;p&gt;利用偏异化随机生成产生符合特定要求的训练数据，然后进行神经网络模型的训练。&lt;/p&gt;
&lt;p&gt;使用了两层隐含层。&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;quot;Numcpp/Numcpp.hpp&amp;quot;
#include &amp;lt;math.h&amp;gt;
#include &amp;lt;vector&amp;gt;

#define nc_t double

#define OWN(x, a, b) (a / b) * sqrt(a *x) * sqrt(a *x)
nc_t OWN_A = 1, OWN_K = 1;

void gIN(Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;nc)
{
    for (size_t j = 0; j &amp;lt; nc.row; j++)
    {
        nc.matrix[j][0] = 20 + 50 * rand() * 1.0f / RAND_MAX;  // age
        nc.matrix[j][1] = 50 + 10 * rand() * 1.0f / RAND_MAX;  // weight
        nc.matrix[j][2] = 170 + 30 * rand() * 1.0f / RAND_MAX; // high

        double fam = rand() * 1.0f / RAND_MAX;
        if (fam &amp;gt; 0.5)
        {
            // boy
            nc.matrix[j][3] = 1;
            nc.matrix[j][1] *= 1.05;
            nc.matrix[j][2] *= 1.05;
        }
        else
        {
            // girl
            nc.matrix[j][3] = 0;
            nc.matrix[j][1] *= 0.95;
            nc.matrix[j][2] *= 0.95;
        }
    }
}

void average(Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;nc)
{
    auto asum = 0, wsum = 0, hsum = 0;
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        asum += nc.matrix[i][0];
        wsum += nc.matrix[i][1];
        hsum += nc.matrix[i][2];
    }
    asum /= nc.row;
    wsum /= nc.row;
    hsum /= nc.row;
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        nc.matrix[i][0] -= asum;
        nc.matrix[i][1] -= wsum;
        nc.matrix[i][2] -= hsum;
    }
}

void gWei(Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;nc, nc_t age, nc_t weight, nc_t high)
{
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        nc.matrix[i][0] = age;
    }
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        nc.matrix[i][1] = weight;
    }
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        nc.matrix[i][2] = high;
    }
    for (size_t i = 0; i &amp;lt; nc.row; i++)
    {
        nc.matrix[i][3] = 0;
    }
}

void gCost(Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;Inputs, Numcpp&amp;lt;nc_t&amp;gt; &amp;amp;Cost)
{
    for (size_t i = 0; i &amp;lt; Inputs.row; i++)
    {
        Cost.matrix[i][0] = Inputs.matrix[i][3];
    }
}

nc_t sigmoid(nc_t x, nc_t y)
{
    return 1 / (1 + exp(-x));
}
nc_t d_sigmoid(nc_t x, nc_t y)
{
    return sigmoid(x, y) * (1 - sigmoid(x, y));
}
nc_t Squdiff(nc_t x, nc_t y)
{
    return x * x;
}
nc_t eta = 0.01;

int main(int argc, char const *argv[])
{
    // generate random data with random values
    Numcpp&amp;lt;nc_t&amp;gt; Inputs(64, 4);
    gIN(Inputs);
    // std::cout &amp;lt;&amp;lt; &amp;quot;RAW: &amp;quot; &amp;lt;&amp;lt; Inputs &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
    Numcpp&amp;lt;nc_t&amp;gt; Cost(Inputs.row, 1);
    gCost(Inputs, Cost);
    // std::cout &amp;lt;&amp;lt; &amp;quot;COST: &amp;quot; &amp;lt;&amp;lt; Cost &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

    // set weight
    Numcpp&amp;lt;nc_t&amp;gt; Wei(Inputs.col, Inputs.col);
    gWei(Wei, 1, 1, 1);
    Numcpp&amp;lt;nc_t&amp;gt; Aver = Inputs * Wei;
    average(Aver);
    Aver.col -= 1;
    // std::cout &amp;lt;&amp;lt; &amp;quot;Averaged:&amp;quot; &amp;lt;&amp;lt; Aver &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

    // Weight &amp;amp; BaisOut_Wei
    Numcpp&amp;lt;nc_t&amp;gt; Hider_Wei(Aver.col, 2);                 // 3*2
    Numcpp&amp;lt;nc_t&amp;gt; Hider_Bais(Aver.row, Hider_Wei.col, 0); // 16*2
    Numcpp&amp;lt;nc_t&amp;gt; Out_Wei(Hider_Wei.col, 1);              // 2*1
    Numcpp&amp;lt;nc_t&amp;gt; Out_Bais(Aver.row, Out_Wei.col, 0);     // 16*1
    //训练循环次数
    for (size_t i = 0; i &amp;lt; 100000; i++)
    // while (1)
    {
        // std::cout &amp;lt;&amp;lt; &amp;quot;############################################################################\n&amp;quot;;
        //   Hide layer computation
        Numcpp&amp;lt;nc_t&amp;gt; z1 = Aver * Hider_Wei + Hider_Bais;
        Numcpp&amp;lt;nc_t&amp;gt; Hider = z1&amp;lt;sigmoid&amp;gt; NULL;
        // std::cout &amp;lt;&amp;lt; &amp;quot;Hider: &amp;quot; &amp;lt;&amp;lt; Hider &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        //   Out layer computation
        Numcpp&amp;lt;nc_t&amp;gt; z2 = Hider * Out_Wei + Out_Bais; // 16 * 2
        Numcpp&amp;lt;nc_t&amp;gt; Out = z2&amp;lt;sigmoid&amp;gt; NULL;
        // std::cout &amp;lt;&amp;lt; &amp;quot;Out&amp;quot; &amp;lt;&amp;lt; Out &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        //    loss computation
        Numcpp&amp;lt;nc_t&amp;gt; L = Out - Cost;
        Numcpp&amp;lt;nc_t&amp;gt; s_L = Numcpp&amp;lt;nc_t&amp;gt;(1, Inputs.row) * (L&amp;lt;Squdiff&amp;gt; NULL) / Inputs.row;
        std::cout &amp;lt;&amp;lt; &amp;quot;Loss: &amp;quot; &amp;lt;&amp;lt; s_L[0][0] &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        // updata wei &amp;amp; bais computation
        // Out
        /*
        std::cout &amp;lt;&amp;lt; &amp;quot;Out_Wei: &amp;quot; &amp;lt;&amp;lt; Out_Wei &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;Out_Bais: &amp;quot; &amp;lt;&amp;lt; Out_Bais &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        */
        Numcpp&amp;lt;nc_t&amp;gt; dow = Hider.transpose() * (L.Hadamard(z2&amp;lt;d_sigmoid&amp;gt; NULL)) * 2;
        Out_Wei = Out_Wei - dow * eta;
        Numcpp&amp;lt;nc_t&amp;gt; dob = (L.Hadamard(z2&amp;lt;d_sigmoid&amp;gt; NULL)) * 2;
        Out_Bais = Out_Bais - dob * eta;
        /*
        std::cout &amp;lt;&amp;lt; &amp;quot;dow: &amp;quot; &amp;lt;&amp;lt; dow &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;dob: &amp;quot; &amp;lt;&amp;lt; dob &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;updata Out_Wei: &amp;quot; &amp;lt;&amp;lt; Out_Wei &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;updata Out_Bais: &amp;quot; &amp;lt;&amp;lt; Out_Bais &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        */
        //  Hider
        /*
        std::cout &amp;lt;&amp;lt; &amp;quot;Hider_Wei: &amp;quot; &amp;lt;&amp;lt; Hider_Wei &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;Hider_Bais: &amp;quot; &amp;lt;&amp;lt; Hider_Bais &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        */
        Numcpp&amp;lt;nc_t&amp;gt; dhw = (Aver.transpose() * (z1&amp;lt;d_sigmoid&amp;gt; NULL).Hadamard(L.Hadamard(z2&amp;lt;d_sigmoid&amp;gt; NULL) * Out_Wei.transpose())) * 2;
        Hider_Wei = Hider_Wei - dhw * eta;
        Numcpp&amp;lt;nc_t&amp;gt; dhb = (z1&amp;lt;d_sigmoid&amp;gt; NULL).Hadamard(L.Hadamard(z2&amp;lt;d_sigmoid&amp;gt; NULL) * Out_Wei.transpose()) * 2;
        Hider_Bais = Hider_Bais - dhb * eta;
        /*
        std::cout &amp;lt;&amp;lt; &amp;quot;dhw: &amp;quot; &amp;lt;&amp;lt; dhw &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;dhb: &amp;quot; &amp;lt;&amp;lt; dhb &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;updata Hider_Wei: &amp;quot; &amp;lt;&amp;lt; Hider_Wei &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;updata Hider_Bais: &amp;quot; &amp;lt;&amp;lt; Hider_Bais &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        std::cout &amp;lt;&amp;lt; &amp;quot;############################################################################\n&amp;quot;;
        */
        //_sleep(500);
    }
    std::cout &amp;lt;&amp;lt; &amp;quot;Train done.\n&amp;quot;;
    // testing
    /*
    //  Age weight high
    Numcpp&amp;lt;nc_t&amp;gt; T(Aver.row, 3, 0);
    while (1)
    {
        printf(&amp;quot;scan: Age &amp;amp;&amp;amp; Weight &amp;amp;&amp;amp; High\n&amp;quot;);
        std::cin &amp;gt;&amp;gt; T.matrix[0][0];
        std::cin &amp;gt;&amp;gt; T.matrix[0][1];
        std::cin &amp;gt;&amp;gt; T.matrix[0][2];
        std::cout &amp;lt;&amp;lt; &amp;quot;scan: &amp;quot; &amp;lt;&amp;lt; (T.matrix[0][0]) &amp;lt;&amp;lt; &amp;quot;&amp;amp;&amp;amp;&amp;quot; &amp;lt;&amp;lt; (T.matrix[0][1]) &amp;lt;&amp;lt; &amp;quot;&amp;amp;&amp;amp;&amp;quot; &amp;lt;&amp;lt; (T.matrix[0][2]) &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;

        Numcpp&amp;lt;nc_t&amp;gt; T_Hider = (T * Hider_Wei + Hider_Bais)&amp;lt;sigmoid&amp;gt; NULL;
        Numcpp&amp;lt;nc_t&amp;gt; T_Out = (T_Hider * Out_Wei + Out_Bais)&amp;lt;sigmoid&amp;gt; NULL;
        T_Out.row = 1;
        std::cout &amp;lt;&amp;lt; &amp;quot;Out&amp;quot; &amp;lt;&amp;lt; T_Out &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
    }
    */
    Numcpp&amp;lt;nc_t&amp;gt; T(Aver.row, 3);
    gIN(T);
    Numcpp&amp;lt;nc_t&amp;gt; T_Hider = (T * Hider_Wei + Hider_Bais)&amp;lt;sigmoid&amp;gt; NULL;
    Numcpp&amp;lt;nc_t&amp;gt; T_Out = (T_Hider * Out_Wei + Out_Bais)&amp;lt;sigmoid&amp;gt; NULL;
    std::cout &amp;lt;&amp;lt; &amp;quot;Out&amp;quot; &amp;lt;&amp;lt; T_Out &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 id=&#34;_13&#34;&gt;相关信息&lt;/h1&gt;
&lt;p&gt;作者：&lt;a href=&#34;[yauntyour (yauntyour) · GitHub](https://github.com/yauntyour/)&#34;&gt;yauntyour&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;授权协议：MIT开源协议&lt;/p&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://blog.csdn.net/darkrabbit/article/details/80025935&#34;&gt;数学基础 - 矩阵的基本运算（Matrix Operations）_沙沙的兔子的博客-CSDN博客_矩阵运算&lt;/a&gt;&lt;/p&gt;</content>
        
    </entry>
    
    <entry>
        <title>agent.cpp</title>
        <link href="https://yauntyour.github.io/posts/agentcpp/"/>
        <id>https://yauntyour.github.io/posts/agentcpp/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;h1 id=&#34;agentcpp-c-agent-webui&#34;&gt;agent.cpp：极致轻量、完全可控的 C++ Agent 系统（WebUI）&lt;/h1&gt;
&lt;h2 id=&#34;_1&#34;&gt;简介&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;agent.cpp&lt;/strong&gt; 是一个完全透明、高度可控的 C++ 原生 Agent 系统，具备完整的工具链支持。与庞大的 Openclaw 等框架相比，agent.cpp 仅依赖少数几个核心文件实现通信调度与工具管理，内存占用极低（系统额外开销趋近于零，实际占用完全取决于上下文长度），尤其适合资源受限或边缘计算环境。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设计理念&lt;/strong&gt;：语言是经验的载体。LLM 作为系统的语言中枢服务于 Agent，Agent 再将语言转化为行动与记忆。二者的协同，是通向通用人工智能（AGI）的一条可行路径。&lt;/p&gt;
&lt;h2 id=&#34;webui&#34;&gt;WebUI&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;WebUI 截图&#34; src=&#34;../assets/images/WebUI.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;依赖需求：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;#Linux：
sudo apt-get install -y libcurl4-openssl-dev libboost-dev

#Windows （msys2）：
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw-w64-x86_64-curl mingw-w64-x86_64-boost

#MacOS：
brew install cmake ninja curl boost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;懒狗安装指令：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;rm -rf ./* &amp;amp;&amp;amp; git clone --recurse-submodules https://github.com/yauntyour/agent.cpp.git &amp;amp;&amp;amp; cd agent.cpp &amp;amp;&amp;amp; mkdir build &amp;amp;&amp;amp; cd build &amp;amp;&amp;amp; cmake .. &amp;amp;&amp;amp; cmake --build build &amp;amp;&amp;amp; cmake --install build --prefix install
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_2&#34;&gt;核心特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极致轻量&lt;/strong&gt;：核心系统仅由数个 &lt;code&gt;.cpp&lt;/code&gt;/&lt;code&gt;.hpp&lt;/code&gt; 文件构成，充分利用 C++ 零拷贝与栈上分配特性，运行开销极低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整工具链&lt;/strong&gt;：通过 Python CLI 桥接方式，支持任意 Python 工具的原生链式调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100% 可控&lt;/strong&gt;：系统提示词（System Prompt）完全开放自定义，无隐藏魔法指令。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量化扩展设计&lt;/strong&gt;：工具直接调用 Python CLI 脚本，避免加载臃肿的技能包描述，最大限度节省上下文 Token。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话记忆系统&lt;/strong&gt;：支持自动/手动将对话历史摘要为记忆，并实时更新会话上下文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话记录热加载&lt;/strong&gt;：切换会话或频道时，记忆与聊天记录无缝动态加载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆自动演进&lt;/strong&gt;：当会话已存在记忆时，系统会基于既有记忆与最新交互自动优化并更新记忆内容，实现经验积累的闭环。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;_3&#34;&gt;核心文件结构&lt;/h2&gt;
&lt;p&gt;为了便于理解与二次开发，以下列出系统核心文件及其职责：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;.
├── agent.cpp / agent.hpp      # Agent 主循环、状态管理与指令分发
├── app.cpp                    # 程序入口，初始化服务与配置
├── servic.cpp                 # WebUI 后端服务与 API 处理
├── ui.py                       # WebUI 界面脚本（Python）
├── webui.html                 # WebUI 前端页面
├── sys/                       # 系统指令、工具调度与通信核心
├── tools/                     # 自定义 Python 工具存放目录
├── sessions/                  # 会话记录与记忆持久化
└── settings.json              # 系统配置文件
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;注：实际文件数量可能随版本迭代微调，以上为核心逻辑分布。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;_4&#34;&gt;系统指令集&lt;/h2&gt;
&lt;p&gt;系统采用简洁的 XML 标签格式进行内部通信，确保行为可审计、可干预。&lt;/p&gt;
&lt;h3 id=&#34;1-tools-call-system&#34;&gt;1. 工具调用指令（Tools Call System）&lt;/h3&gt;
&lt;p&gt;调用预定义工具，格式：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;&amp;lt;tool&amp;gt;name:args&amp;lt;/tool&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;内置基础工具&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;工具调用格式&lt;/th&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;功能描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;exec:&amp;lt;command&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;以当前服务权限执行系统命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;read:&amp;lt;filepath&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;读取指定文件内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;write:&amp;lt;filepath&amp;gt;\|&amp;lt;data&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;向指定文件写入数据（覆盖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;wget:&amp;lt;URL&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;发起 HTTP GET 请求并返回响应&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;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;tool&amp;gt;exec:pip list&amp;lt;/tool&amp;gt;
&amp;lt;tool&amp;gt;Image:test.jpg&amp;lt;/tool&amp;gt;
&amp;lt;tool&amp;gt;write:exp/data.txt|Hello, agent!&amp;lt;/tool&amp;gt;
&amp;lt;tool&amp;gt;read:data.txt&amp;lt;/tool&amp;gt;
&amp;lt;tool&amp;gt;wget:https://cn.bing.com/&amp;lt;/tool&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;2-communication-system-cs&#34;&gt;2. 通信系统指令（Communication System, CS）&lt;/h3&gt;
&lt;p&gt;用于获取系统状态或执行控制命令，格式：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;&amp;lt;cs&amp;gt;name:args&amp;lt;/cs&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;支持的命令&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;命令&lt;/th&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;功能描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;system_status&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;返回当前系统运行状态摘要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;tools_status&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;返回所有已注册工具的状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;restart&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;请求重启系统（需 master 显式确认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;返回当前系统日期与时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;&lt;code&gt;random:&amp;lt;seed&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;基于种子生成 [-1e9, 1e9] 范围内的伪随机数&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;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;cs&amp;gt;time&amp;lt;/cs&amp;gt;
&amp;lt;cs&amp;gt;random:123&amp;lt;/cs&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;tool&#34;&gt;自定义 Tool 开发&lt;/h2&gt;
&lt;p&gt;自定义工具采用约定优于配置的方式，仅需提供两个文件即可被系统识别和调度。以 &lt;code&gt;playwright-tools&lt;/code&gt; 为例，目录结构如下：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;/workspace/tools/
└── playwright-tools
    ├── run.py       # 被 CS 指令系统调度的入口脚本
    ├── tool.md      # 工具的参数文档、使用说明（仅此文件被系统读取用于生成帮助）
    └── ...          # 其他依赖文件（系统仅调用 run.py）
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;建议在 &lt;code&gt;run.py&lt;/code&gt; 中实现帮助信息回退&lt;/strong&gt;：当参数错误或调用失败时，将 &lt;code&gt;tool.md&lt;/code&gt; 的内容打印到标准输出，以便 Agent 获取正确的调用方式。&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;import os

def print_tool_help():
    &amp;quot;&amp;quot;&amp;quot;打印 tool.md 中的帮助信息&amp;quot;&amp;quot;&amp;quot;
    script_dir = os.path.dirname(os.path.abspath(__file__))
    tool_md_path = os.path.join(script_dir, &amp;quot;tool.md&amp;quot;)
    try:
        with open(tool_md_path, &amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:
            print(f.read())
    except FileNotFoundError:
        print(f&amp;quot;警告: 未找到帮助文件 {tool_md_path}&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_5&#34;&gt;安全与控制机制&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高风险操作需显式授权&lt;/strong&gt;：当 Agent 处于自主调用模式时，执行重启、关键文件写入等操作必须获得用户显式确认。通过主动指令触发的操作则无需二次确认（仍建议通过提示词约束 &lt;code&gt;shutdown&lt;/code&gt; 等敏感行为）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具状态实时反馈&lt;/strong&gt;：每次工具调用后，系统会以独立消息形式返回执行结果（成功或错误详情）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开箱即用&lt;/strong&gt;：会话启动后即可使用全部工具，亦可随时通过 &lt;code&gt;&amp;lt;cs&amp;gt;tools_status&amp;lt;/cs&amp;gt;&lt;/code&gt; 查询可用工具列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;_6&#34;&gt;会话管理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebUI 会话&lt;/strong&gt;：以创建时的 UNIX 时间戳（秒）作为唯一 &lt;code&gt;Session ID&lt;/code&gt;，同时用作会话目录命名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频道（Channel）&lt;/strong&gt;：每个频道对应一个以频道名命名的 JSON 文件，存储该频道的聊天记录。频道与 WebUI 会话一样具备独立的记忆摘要。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;_7&#34;&gt;自动会话记忆&lt;/h3&gt;
&lt;p&gt;当会话上下文长度超过配置的阈值时，系统会自动触发记忆摘要生成（或更新），并将记忆注入当前上下文。阈值可通过配置文件调整：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;quot;max_context&amp;quot;: 128000
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;注：阈值为字符数估算值，实际触发逻辑由系统内部维护。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;system-prompt&#34;&gt;系统提示词自定义（System Prompt）&lt;/h2&gt;
&lt;p&gt;系统支持 &lt;strong&gt;100% 自定义&lt;/strong&gt; 系统提示词。您可以在 &lt;code&gt;agent.txt&lt;/code&gt;（或配置中指定的路径）中以纯文本形式定义 Agent 的行为准则与身份认知。提示词结构建议包含以下模块：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外部宣言（External Manifesto）&lt;/strong&gt;：优先级排序的行为总则。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;身份认知初始化&lt;/strong&gt;：定义“你是谁”的起点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行为许可与禁止&lt;/strong&gt;：&lt;ul&gt;
&lt;li&gt;允许的行为（Permitted Conduct）&lt;/li&gt;
&lt;li&gt;禁止的行为（Prohibited Acts）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务对象定义&lt;/strong&gt;：明确 Agent 为谁服务及其关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自我愿景&lt;/strong&gt;：Agent 期望达成的长期目标或角色定位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边界定义&lt;/strong&gt;：能力与权限的硬性边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具调用说明&lt;/strong&gt;：必须保留的章节，用于告知 Agent 可用的 CS 指令及其格式。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;除“工具调用说明”部分需保留必要技术信息外，其余内容均可自由增删修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;_8&#34;&gt;配置文件详解&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;quot;name&amp;quot;: &amp;quot;user&amp;quot;,                      // 用户名称
    &amp;quot;agent_nickname&amp;quot;: &amp;quot;AI&amp;quot;,              // Agent 在会话中的显示昵称
    &amp;quot;workspace&amp;quot;: &amp;quot;.&amp;quot;,                    // 工作根目录，需包含 sessions、memorys、sys、tools 等子目录
    &amp;quot;server_address&amp;quot;: &amp;quot;http://localhost:11434&amp;quot;, // LLM 服务地址（兼容 OpenAI API 格式）
    &amp;quot;model&amp;quot;: &amp;quot;name&amp;quot;,                     // 模型名称
    &amp;quot;prompt_path&amp;quot;: &amp;quot;agent.txt&amp;quot;,          // 系统提示词文件路径（相对于 workspace）
    &amp;quot;stream&amp;quot;: false,                     // 是否启用流式响应（使用 llama.cpp 时建议关闭，防止 JSON 解析异常）
    &amp;quot;max_mpc_rounds&amp;quot;: 10,                // 最大多轮工具调用轮次
    &amp;quot;max_context&amp;quot;: 128000,               // 触发自动记忆摘要的上下文长度阈值
    &amp;quot;channels&amp;quot;: [
        {
            &amp;quot;name&amp;quot;: &amp;quot;Telegram&amp;quot;,
            &amp;quot;status&amp;quot;: &amp;quot;active&amp;quot;,
            &amp;quot;user_count&amp;quot;: 1,
            &amp;quot;path&amp;quot;: &amp;quot;sys/tg_bot.py&amp;quot;      // 频道对应的驱动脚本
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_9&#34;&gt;授权与致谢&lt;/h2&gt;
&lt;p&gt;本项目遵循 &lt;a href=&#34;LICENSE&#34;&gt;Apache-2.0&lt;/a&gt; 协议。在使用或分发时，请保留原始版权与许可声明。若您认可本项目的价值，欢迎点亮 Star ⭐，这对我是极大的鼓励。&lt;/p&gt;
&lt;hr /&gt;</content>
        
    </entry>
    
    <entry>
        <title>你好，世界！</title>
        <link href="https://yauntyour.github.io/posts/你好世界/"/>
        <id>https://yauntyour.github.io/posts/你好世界/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;p&gt;你好，世界！&lt;/p&gt;
&lt;p&gt;这是我的第一篇文章。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;2026-04-25，一个博客的诞生。&lt;/em&gt;&lt;/p&gt;</content>
        
        <category term="hello"/>
        
        <category term="blog"/>
        
        <category term="first"/>
        
    </entry>
    
    <entry>
        <title>router</title>
        <link href="https://yauntyour.github.io/posts/router/"/>
        <id>https://yauntyour.github.io/posts/router/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;h1 id=&#34;crouter&#34;&gt;原生C++实现的路由器：Router&lt;/h1&gt;
&lt;h2 id=&#34;header-only&#34;&gt;Header-only &amp;amp; 反傻逼设计&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;quot;router.hpp&amp;quot;
#include &amp;quot;iostream&amp;quot;

int main(int argc, char const *argv[])
{
    rt::router ros;

    ros.on(&amp;quot;app/index&amp;quot;);

    auto ptr1 = ros.get(&amp;quot;app/index/&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr1.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr2 = ros.get(&amp;quot;app/index&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr2.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr3 = ros.get(&amp;quot;app&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr3.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr4 = ros.get(&amp;quot;app/&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr4.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr5 = ros.get(&amp;quot;/app&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr5.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr6 = ros.get(&amp;quot;/&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr6.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr7 = ros.get(&amp;quot;&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr7.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr8 = ros.get(&amp;quot;//////////&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr8.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;

    auto ptr9 = ros.get(&amp;quot;app///////////index/&amp;quot;);
    std::cout &amp;lt;&amp;lt; (ptr9.lock())-&amp;gt;name &amp;lt;&amp;lt; std::endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_1&#34;&gt;回调函数示例&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;std::function&amp;lt;int(std::string &amp;amp;, std::string &amp;amp;)&amp;gt; func;

//example:
int default_func(std::string &amp;amp;url, std::string &amp;amp;data)
{
 data = &amp;quot;&amp;lt;null&amp;gt;&amp;quot;;
 return FLAG_DONE;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_2&#34;&gt;异常状态标注：（对路由无影响，表明回调函数的执行情况，可以自行安排）&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;enum service_state
{
 FLAG_DONE = 0,
 FLAG_ERROR,
    FLAG_WARN
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;_3&#34;&gt;基本语法&lt;/h2&gt;
&lt;p&gt;全自动注册节点（基于哈希表）&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;int page_func(std::string &amp;amp;url, std::string &amp;amp;data)
{
 data = &amp;quot;&amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;&amp;quot;;
 return FLAG_DONE;
}

ros.on(&amp;quot;app/index&amp;quot;);
ros.on(&amp;quot;app/test&amp;quot;);
ros.on(&amp;quot;app/index/page&amp;quot;,page_func);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;对应的节点为：&lt;/p&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code&gt;app/
 index/
  page/
 test/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;不提供回调函数则默认设置为&lt;code&gt;default_func&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;_4&#34;&gt;动态路由&lt;/h2&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;quot;router.hpp&amp;quot;
#include &amp;quot;iostream&amp;quot;

int main(int argc, char const *argv[])
{
    rt::router ros;

    // 注册静态路由
    ros.on(&amp;quot;app/index&amp;quot;, [](std::string &amp;amp;url, std::string &amp;amp;data, const std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;params)
           {
        data = &amp;quot;Static Index Page&amp;quot;;
        return rt::FLAG_DONE; });

    // 注册动态路由 :id 和 :action
    ros.on(&amp;quot;user/:id&amp;quot;, [](std::string &amp;amp;url, std::string &amp;amp;data, const std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;params)
           {
        std::string id = params.count(&amp;quot;id&amp;quot;) ? params.at(&amp;quot;id&amp;quot;) : &amp;quot;unknown&amp;quot;;
        data = &amp;quot;User Profile: &amp;quot; + id;
        return rt::FLAG_DONE; });

    ros.on(&amp;quot;api/:version/data&amp;quot;, [](std::string &amp;amp;url, std::string &amp;amp;data, const std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;params)
           {
        std::string ver = params.count(&amp;quot;version&amp;quot;) ? params.at(&amp;quot;version&amp;quot;) : &amp;quot;v1&amp;quot;;
        data = &amp;quot;Data from API version: &amp;quot; + ver;
        std::cout &amp;lt;&amp;lt; &amp;quot;URL: &amp;quot; &amp;lt;&amp;lt; url &amp;lt;&amp;lt; &amp;quot; -&amp;gt; &amp;quot; &amp;lt;&amp;lt; data &amp;lt;&amp;lt; std::endl;
        return rt::FLAG_DONE; });
    ros.on(&amp;quot;api/:version/list&amp;quot;, [](std::string &amp;amp;url, std::string &amp;amp;data, const std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;params)
           {
        std::string ver = params.count(&amp;quot;version&amp;quot;) ? params.at(&amp;quot;version&amp;quot;) : &amp;quot;v1&amp;quot;;
        data = &amp;quot;Data from API version: &amp;quot; + ver;
        std::cout &amp;lt;&amp;lt; &amp;quot;URL: &amp;quot; &amp;lt;&amp;lt; url &amp;lt;&amp;lt; &amp;quot; -&amp;gt; &amp;quot; &amp;lt;&amp;lt; data &amp;lt;&amp;lt; std::endl;
        return rt::FLAG_DONE; });

    // 测试动态路由
    std::string result_data;
    std::string test_url = &amp;quot;user/12345&amp;quot;;

    auto [ptr, params] = ros.get(test_url);

    if (!ptr.expired())
    {
        auto node = ptr.lock();
        node-&amp;gt;func(test_url, result_data, params);
        std::cout &amp;lt;&amp;lt; &amp;quot;URL: &amp;quot; &amp;lt;&amp;lt; test_url &amp;lt;&amp;lt; &amp;quot; -&amp;gt; &amp;quot; &amp;lt;&amp;lt; result_data &amp;lt;&amp;lt; std::endl;

        // 打印提取的参数
        std::cout &amp;lt;&amp;lt; &amp;quot;Parameters: &amp;quot;;
        for (const auto &amp;amp;p : params)
        {
            std::cout &amp;lt;&amp;lt; &amp;quot;[&amp;quot; &amp;lt;&amp;lt; p.first &amp;lt;&amp;lt; &amp;quot;=&amp;quot; &amp;lt;&amp;lt; p.second &amp;lt;&amp;lt; &amp;quot;] &amp;quot;;
        }
        std::cout &amp;lt;&amp;lt; std::endl;
    }
    else
    {
        std::cout &amp;lt;&amp;lt; &amp;quot;Route not found: &amp;quot; &amp;lt;&amp;lt; test_url &amp;lt;&amp;lt; std::endl;
    }

    // 测试另一个动态路由
    test_url = &amp;quot;api/v2/data&amp;quot;;
    auto [ptr2, params2] = ros.get(test_url);
    if (!ptr2.expired())
    {
        auto node = ptr2.lock();
        node-&amp;gt;func(test_url, result_data, params2);
    }
    test_url = &amp;quot;api/v2/list&amp;quot;;
    auto [ptr3, params3] = ros.get(test_url);
    if (!ptr3.expired())
    {
        auto node = ptr3.lock();
        node-&amp;gt;func(test_url, result_data, params3);
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    
    <entry>
        <title>servic.cpp</title>
        <link href="https://yauntyour.github.io/posts/serviccpp/"/>
        <id>https://yauntyour.github.io/posts/serviccpp/</id>
        <updated>2026-04-25T07:25:41Z</updated>
        <content type="html">&lt;h1 id=&#34;serviccppstdcoroutineasio&#34;&gt;servic.cpp：std::coroutine与asio的无缝衔接&lt;/h1&gt;
&lt;p&gt;Appweb的续作，基于C++20的&lt;code&gt;coroutine&lt;/code&gt;与&lt;code&gt;boost::asio&lt;/code&gt;的服务端。&lt;/p&gt;
&lt;p&gt;路由器是另一个小组件：&lt;a href=&#34;https://github.com/yauntyour/router&#34;&gt;yauntyour/router: 原生C++实现的路由器：Router&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;example&#34;&gt;Example&lt;/h1&gt;
&lt;pre class=&#34;codehilite&#34;&gt;&lt;code class=&#34;language-c++&#34;&gt;#include &amp;quot;server.hpp&amp;quot;
#include &amp;lt;boost/asio.hpp&amp;gt;
#include &amp;lt;boost/asio/co_spawn.hpp&amp;gt;
#include &amp;lt;boost/asio/detached.hpp&amp;gt;
#include &amp;lt;boost/asio/use_awaitable.hpp&amp;gt;
namespace asio = boost::asio;
int main()
{
    try
    {
        rt::router ros;
        asio::io_context io_context;
        servic::Server server(io_context, 8080, 300000);

        ros.on(&amp;quot;/&amp;quot;, [](std::string &amp;amp;input, std::string &amp;amp;output)
               {
            output = &amp;quot;HTTP/1.1 200 OK\r\n\r\nHello World!&amp;quot;;
            return 0; });
        ros.on(&amp;quot;/test&amp;quot;, [](std::string &amp;amp;input, std::string &amp;amp;output)
               {
            output = &amp;quot;HTTP/1.1 200 OK\r\n\r\nHello World!&amp;quot;;
            return 0; });

        server.run(ros);
    }
    catch (std::exception &amp;amp;e)
    {
        std::cerr &amp;lt;&amp;lt; &amp;quot;Exception: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        return 1;
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    
</feed>