<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Noam's Blog]]></title><description><![CDATA[Dive into bytes]]></description><link>https://blog.jnn.icu/</link><image><url>https://blog.jnn.icu/favicon.png</url><title>Noam&apos;s Blog</title><link>https://blog.jnn.icu/</link></image><generator>Ghost 5.80</generator><lastBuildDate>Fri, 17 Apr 2026 05:53:33 GMT</lastBuildDate><atom:link href="https://blog.jnn.icu/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[抽象二问 — Why Abstraction]]></title><description><![CDATA[<p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x6765;&#x81EA;&#x4E8E;review pr&#x65F6;&#xFF0C;&#x53D1;&#x73B0;owner&#x5BF9;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x9700;&#x6C42;&#x8FDB;&#x884C;&#x4E86;&#x6709;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x62BD;&#x8C61;&#x3002;review&#x5B8C;&#x540E;&#x5728;&#x60F3;&#x600E;&#x4E48;&#x548C;&#x4ED6;&#x8BB2;&#x8FD9;&#x4E2A;&#x4E8B;&#x60C5;&#xFF1A;&#x76F4;&#x89C9;&#x544A;</p>]]></description><link>https://blog.jnn.icu/chou-xiang-er-wen-why-abstraction/</link><guid isPermaLink="false">69663033c8e62100019ef4e7</guid><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Tue, 13 Jan 2026 12:50:31 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2026/01/abstraction.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2026/01/abstraction.jpg" alt="&#x62BD;&#x8C61;&#x4E8C;&#x95EE; &#x2014; Why Abstraction"><p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x6765;&#x81EA;&#x4E8E;review pr&#x65F6;&#xFF0C;&#x53D1;&#x73B0;owner&#x5BF9;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x9700;&#x6C42;&#x8FDB;&#x884C;&#x4E86;&#x6709;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x62BD;&#x8C61;&#x3002;review&#x5B8C;&#x540E;&#x5728;&#x60F3;&#x600E;&#x4E48;&#x548C;&#x4ED6;&#x8BB2;&#x8FD9;&#x4E2A;&#x4E8B;&#x60C5;&#xFF1A;&#x76F4;&#x89C9;&#x544A;&#x8BC9;&#x6211;&#x4E0D;&#x592A;OK&#xFF0C;&#x6211;&#x4E5F;&#x77E5;&#x9053;&#x600E;&#x4E48;&#x6539;&#x5408;&#x9002;&#x3002;&#x4F46;&#x662F;&#x6211;&#x4E0D;&#x77E5;&#x9053;&#x600E;&#x4E48;&#x80FD;&#x8BA9;&#x4ED6;&#x672A;&#x6765;&#x9047;&#x5230;&#x5176;&#x5B83;&#x95EE;&#x9898;&#x65F6;&#x80FD;&#x591F;&#x8FDB;&#x884C;&#x6070;&#x5F53;&#x7684;&#x62BD;&#x8C61;&#x3002;&#x4E8E;&#x662F;&#x5C31;&#x5F00;&#x59CB;&#x601D;&#x8003;&#xFF0C;&#x6709;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x7CFB;&#x7EDF;&#x5316;&#x7684;&#x65B9;&#x6CD5;&#x8BBA;&#xFF0C;&#x6765;&#x6307;&#x5BFC;&#x786E;&#x5B9A;&#x4E00;&#x4E2A;&#x8BBE;&#x8BA1;&#x9700;&#x8981;&#x8FDB;&#x4E00;&#x6B65;&#x62BD;&#x8C61;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x9760;&#x76F4;&#x89C9;&#x3002;</p><p>&#x7ED3;&#x8BBA;&#x662F;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x4E24;&#x4E2A;&#x95EE;&#x9898;&#x5E2E;&#x52A9;&#x81EA;&#x5DF1;&#x786E;&#x8BA4;&#x662F;&#x5426;&#x8981;&#x8FDB;&#x884C;&#x62BD;&#x8C61;&#xFF1A;</p><ul><li>&#x4E3A;&#x4EC0;&#x4E48;&#x76F4;&#x63A5;&#x5199;&#x4E0D;&#x53EF;&#x4EE5;&#xFF1F;</li><li>&#x62BD;&#x8C61;&#x7684;&#x4EE3;&#x4EF7;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</li></ul><h3 id="%E9%97%AE%E9%A2%98-1%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E7%9B%B4%E6%8E%A5%E5%86%99%E4%B8%8D%E5%8F%AF%E4%BB%A5%EF%BC%9F"><strong>&#x95EE;&#x9898; 1&#xFF1A;&#x4E3A;&#x4EC0;&#x4E48;&#x76F4;&#x63A5;&#x5199;&#x4E0D;&#x53EF;&#x4EE5;&#xFF1F;</strong></h3><p>&#x2014;&#x2014; &#x8BF4;&#x4E0D;&#x4E0A;&#x6765;&#x5F80;&#x5F80;&#x662F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5199;&#x3002;</p><p>&#xA0;&#x53EF;&#x4EE5;&#x63A5;&#x53D7;&#x7684;&#x5E38;&#x89C1;&#x7B54;&#x6848;&#xFF1A;</p><ol><li>&#x4FEE;&#x6539;&#x9762;&#x4E0D;&#x53EF;&#x63A7;&#xFF1A;&#x76F4;&#x63A5;&#x5199;&#x4F1A;&#x5BFC;&#x81F4;&#x672A;&#x6765;&#x65B0;&#x589E;/&#x53D8;&#x66F4;&#x9700;&#x8981;&#x6539; N &#x5904;&#xFF08;N &#x660E;&#x663E;&#x5927;&#x4E8E; 2 &#x6216;&#x8005;&#x5206;&#x6563;&#x5728;&#x591A;&#x6A21;&#x5757;&#xFF09;&#xFF0C;&#x4E14;&#x5BB9;&#x6613;&#x6F0F;&#x6539;&#x3002;</li><li>&#x4E0D;&#x53D8;&#x5F0F;&#x65E0;&#x6CD5;&#x96C6;&#x4E2D;&#x8868;&#x8FBE;&#xFF1A;&#x76F4;&#x63A5;&#x5199;&#x4F1A;&#x8BA9;&#x5173;&#x952E;&#x4E0D;&#x53D8;&#x5F0F;&#xFF08;&#x5B89;&#x5168;/&#x98CE;&#x63A7;/&#x72B6;&#x6001;&#x4E00;&#x81F4;&#x6027;/&#x8D44;&#x6E90;&#x91CA;&#x653E;&#xFF09;&#x6563;&#x843D;&#x5728;&#x5404;&#x5904;&#xFF0C;&#x96BE;&#x4EE5;&#x5BA1;&#x8BA1;&#x548C;&#x6D4B;&#x8BD5;&#x3002;</li><li>&#x8FB9;&#x754C;&#x65E0;&#x6CD5;&#x5EFA;&#x7ACB;&#xFF1A;&#x76F4;&#x63A5;&#x5199;&#x4F1A;&#x5BFC;&#x81F4;&#x8C03;&#x7528;&#x65B9;&#x5FC5;&#x987B;&#x77E5;&#x9053;&#x5185;&#x90E8;&#x7EC6;&#x8282;&#x624D;&#x80FD;&#x6B63;&#x786E;&#x4F7F;&#x7528;&#xFF08;&#x4F8B;&#x5982;&#xFF1A;&#x5FC5;&#x987B;&#x6309;&#x7279;&#x5B9A;&#x987A;&#x5E8F;&#x8C03;&#x7528;&#x3001;&#x5FC5;&#x987B;&#x624B;&#x52A8;&#x5BF9;&#x9F50;&#x67D0;&#x4E9B;&#x65F6;&#x5E8F;/&#x9501;&#xFF09;&#xFF0C;&#x8FD9;&#x8BF4;&#x660E;&#x7F3A;&#x5C11;&#x201C;&#x8BED;&#x4E49;&#x8FB9;&#x754C;&#x201D;&#x3002;</li><li>&#x6027;&#x80FD;&#x6216;&#x8D44;&#x6E90;&#x76EE;&#x6807;&#x8FBE;&#x4E0D;&#x5230;&#xFF1A;&#x76F4;&#x63A5;&#x5199;&#x4F1A;&#x5BFC;&#x81F4;&#x65E0;&#x6CD5;&#x6EE1;&#x8DB3; O(&#x394;n)/&#x5EF6;&#x8FDF;/&#x5185;&#x5B58;&#x4E0A;&#x9650;/&#x5E76;&#x53D1;&#x5B89;&#x5168;&#x7B49;&#x786C;&#x6307;&#x6807;&#xFF0C;&#x800C;&#x62BD;&#x8C61;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E9B;&#x7EA6;&#x675F;&#x56FA;&#x5316;&#x6210;&#x7ED3;&#x6784;&#x3002;</li><li>&#x53EF;&#x89C2;&#x6D4B;/&#x8FD0;&#x8425;&#x4E0D;&#x53EF;&#x6301;&#x7EED;&#xFF1A;&#x76F4;&#x63A5;&#x5199;&#x4F1A;&#x5BFC;&#x81F4;&#x6307;&#x6807;&#x53E3;&#x5F84;&#x4E0D;&#x4E00;&#x81F4;&#x3001;&#x6392;&#x969C;&#x8DEF;&#x5F84;&#x4E0D;&#x7EDF;&#x4E00;&#xFF0C;&#x65E0;&#x6CD5;&#x5728;&#x56E2;&#x961F;&#x89C4;&#x6A21;&#x4E0B;&#x7A33;&#x5B9A;&#x8FD0;&#x884C;&#x3002;</li></ol><p>&#x5982;&#x679C;&#x56DE;&#x7B54;&#x4E0D;&#x843D;&#x5728;&#x4EE5;&#x4E0A;&#x4E4B;&#x4E00;&#xFF0C;&#x9ED8;&#x8BA4;&#x7ED3;&#x8BBA;&#x901A;&#x5E38;&#x662F;&#xFF1A;<strong>&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5199;</strong>&#x3002;</p><h3 id="%E9%97%AE%E9%A2%98-2%EF%BC%9A%E6%8A%BD%E8%B1%A1%E7%9A%84%E4%BB%A3%E4%BB%B7%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F"><strong>&#x95EE;&#x9898; 2&#xFF1A;&#x62BD;&#x8C61;&#x7684;&#x4EE3;&#x4EF7;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</strong></h3><p><strong>&#x2014;&#x2014; &#x62BD;&#x8C61;&#x4E0D;&#x662F;&#x514D;&#x8D39;&#x5348;&#x9910;</strong></p><p>&#x56DB;&#x7C7B;&#x7A0E;&#xFF1A;</p><ol><li><strong>&#x6982;&#x5FF5;&#x7A0E;&#xFF1A;</strong>&#x5F15;&#x5165;&#x4E86;&#x51E0;&#x4E2A;&#x65B0;&#x6982;&#x5FF5;/&#x65B0;&#x7C7B;&#x578B;/&#x65B0;&#x534F;&#x8BAE;&#xFF1F;&#x65B0;&#x4EBA;&#x7406;&#x89E3;&#x9700;&#x8981;&#x591A;&#x957F;&#x8DEF;&#x5F84;&#xFF1F;&#x662F;&#x5426;&#x9700;&#x8981;&#x8BFB;&#x591A;&#x4E2A;&#x6587;&#x4EF6;&#x624D;&#x80FD;&#x7406;&#x89E3;&#xFF1F;</li><li><strong>&#x8026;&#x5408;&#x7A0E;&#xFF1A;</strong>&#x62BD;&#x8C61;&#x628A;&#x54EA;&#x4E9B;&#x4E1C;&#x897F;&#x7ED1;&#x5B9A;&#x6B7B;&#x4E86;&#xFF1F;&#x672A;&#x6765;&#x66FF;&#x6362;&#x5B9E;&#x73B0;&#x662F;&#x5426;&#x66F4;&#x96BE;&#xFF1F;&#x62BD;&#x8C61;&#x8FB9;&#x754C;&#x662F;&#x5426;&#x6CC4;&#x6F0F;&#xFF08;&#x8C03;&#x7528;&#x65B9;&#x4ECD;&#x9700;&#x7406;&#x89E3;&#x5185;&#x90E8;&#x7EC6;&#x8282;&#xFF09;&#xFF1F;</li><li><strong>&#x6027;&#x80FD;&#x7A0E;&#xFF1A;</strong>&#x4ECE; O(&#x394;n) &#x53D8; O(n) &#x4E86;&#x5417;&#xFF1F;&#x591A;&#x4E86;&#x5206;&#x914D;/&#x62F7;&#x8D1D;/&#x89E3;&#x7801;/unique/sort &#x5417;&#xFF1F;&#x70ED;&#x8DEF;&#x5F84;&#x662F;&#x5426;&#x53EF;&#x8BC1;&#x660E;&#x4E0D;&#x9000;&#x5316;&#xFF1F;</li><li><strong>&#x6F14;&#x8FDB;&#x7A0E;&#xFF1A;</strong>&#x4E3A;&#x4E86;&#x9002;&#x914D;&#x4E00;&#x4E2A;&#x65B0;&#x9700;&#x6C42;&#xFF0C;&#x9700;&#x8981;&#x6539;&#x62BD;&#x8C61;&#x672C;&#x8EAB;&#x5417;&#xFF1F;&#x5982;&#x679C;&#x8981;&#x6539;&#x62BD;&#x8C61;&#xFF0C;&#x4F1A;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x6240;&#x6709;&#x8C03;&#x7528;&#x65B9;&#xFF1F;</li></ol><p>&#x6070;&#x5F53;&#x8FDB;&#x884C;&#x62BD;&#x8C61;&#x65F6;&#xFF0C;&#x4E0A;&#x8FF0;&#x56DB;&#x4E2A;&#x4EE3;&#x4EF7;&#x5E94;&#x5F53;&#x662F;&#x60F3;&#x6E05;&#x695A;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x7B54;&#x4E0D;&#x51FA;&#x6765;&#xFF0C;&#x8BF4;&#x660E;&#x662F;&#x51ED;&#x611F;&#x89C9;&#x62BD;&#x8C61;&#xFF0C;&#x4E0D;&#x53EF;&#x53D6;&#x3002;</p><h3 id="%E8%A1%A5%E5%85%85%E4%B8%80%E9%97%AE%EF%BC%9A%E6%A0%B8%E5%BF%83%E4%B8%8D%E5%8F%98%E9%87%8F%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">&#x8865;&#x5145;&#x4E00;&#x95EE;&#xFF1A;&#x6838;&#x5FC3;&#x4E0D;&#x53D8;&#x91CF;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h3><p>&#x2014;&#x2014; &#x53EF;&#x80FD;&#x7684;&#x56DE;&#x51FB;&#xFF1A;&#x672A;&#x6765;&#x53EF;&#x80FD;&#x4F1A;&#x62D3;&#x5C55;</p><p>&#x9488;&#x5BF9;&#x8FD9;&#x79CD;&#x6F5C;&#x5728;&#x9700;&#x6C42;&#xFF0C;&#x8981;&#x6C42;&#x5199;&#x51FA;&#x672A;&#x6765;&#x53EF;&#x80FD;&#x51FA;&#x73B0;&#x7684;&#x4E24;&#x4E2A;&#x6269;&#x5C55;&#x793A;&#x4F8B;&#xFF0C;&#x5E76;&#x8BF4;&#x660E;&#x5B83;&#x4EEC;&#x5982;&#x4F55;&#x843D;&#x5728;&#x540C;&#x4E00;&#x5951;&#x7EA6;&#x4E0B;&#x3002;&#x5199;&#x4E0D;&#x51FA;&#x6765;&#xFF0C;&#x5C31;&#x8BF4;&#x660E;&#x62BD;&#x8C61;&#x662F;&#x9884;&#x652F;&#x3002;</p><h3 id="%E6%80%BB%E7%BB%93">&#x603B;&#x7ED3;</h3><p>&#x8FD9;&#x6B21; code review &#x8BA9;&#x6211;&#x610F;&#x8BC6;&#x5230;&#xFF1A;&#x5224;&#x65AD;&#x662F;&#x5426;&#x9700;&#x8981;&#x62BD;&#x8C61;&#xFF0C;&#x4E0D;&#x80FD;&#x53EA;&#x9760;&#x201C;&#x76F4;&#x89C9;&#x89C9;&#x5F97;&#x4E0D;&#x5BF9;&#x201D;&#xFF0C;&#x800C;&#x5E94;&#x5F53;&#x6709;&#x4E00;&#x5957;&#x53EF;&#x590D;&#x7528;&#x7684;&#x51B3;&#x7B56;&#x6D41;&#x7A0B;&#x3002;&#x62BD;&#x8C61;&#x7684;&#x4EF7;&#x503C;&#x5728;&#x4E8E;&#x5EFA;&#x7ACB;&#x7A33;&#x5B9A;&#x8BED;&#x4E49;&#x8FB9;&#x754C;&#x3001;&#x96C6;&#x4E2D;&#x4E0D;&#x53D8;&#x5F0F;&#x5E76;&#x9694;&#x79BB;&#x53D8;&#x5316;&#xFF0C;&#x4F46;&#x5B83;&#x6C38;&#x8FDC;&#x4F34;&#x968F;&#x6210;&#x672C;&#xFF0C;&#x56E0;&#x6B64;&#x5FC5;&#x987B;&#x5148;&#x95EE;&#x6E05;&#x695A;&#x4E24;&#x4EF6;&#x4E8B;&#xFF1A;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x5199;&#x3001;&#x62BD;&#x8C61;&#x8981;&#x4ED8;&#x51FA;&#x4EC0;&#x4E48;&#x4EE3;&#x4EF7;&#x3002;&#x82E5;&#x201C;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x5199;&#x201D;&#x7684;&#x7406;&#x7531;&#x65E0;&#x6CD5;&#x843D;&#x5728;&#x4FEE;&#x6539;&#x9762;&#x4E0D;&#x53EF;&#x63A7;&#x3001;&#x4E0D;&#x53D8;&#x5F0F;&#x65E0;&#x6CD5;&#x96C6;&#x4E2D;&#x3001;&#x8FB9;&#x754C;&#x65E0;&#x6CD5;&#x5EFA;&#x7ACB;&#x3001;&#x6027;&#x80FD;/&#x8D44;&#x6E90;&#x76EE;&#x6807;&#x8FBE;&#x4E0D;&#x5230;&#x3001;&#x53EF;&#x89C2;&#x6D4B;/&#x8FD0;&#x8425;&#x4E0D;&#x53EF;&#x6301;&#x7EED;&#x8FD9;&#x7C7B;&#x786C;&#x7EA6;&#x675F;&#x4E0A;&#xFF0C;&#x9ED8;&#x8BA4;&#x5C31;&#x5E94;&#x8BE5;&#x76F4;&#x63A5;&#x5199;&#xFF1B;&#x800C;&#x4E00;&#x65E6;&#x9009;&#x62E9;&#x62BD;&#x8C61;&#xFF0C;&#x5C31;&#x5FC5;&#x987B;&#x663E;&#x5F0F;&#x6838;&#x7B97;&#x6982;&#x5FF5;&#x7A0E;&#x3001;&#x8026;&#x5408;&#x7A0E;&#x3001;&#x6027;&#x80FD;&#x7A0E;&#x3001;&#x6F14;&#x8FDB;&#x7A0E;&#xFF0C;&#x7B54;&#x4E0D;&#x51FA;&#x6765;&#x5F80;&#x5F80;&#x610F;&#x5473;&#x7740;&#x62BD;&#x8C61;&#x662F;&#x51ED;&#x611F;&#x89C9;&#x800C;&#x975E;&#x8BC1;&#x636E;&#x9A71;&#x52A8;&#x3002;&#x6700;&#x540E;&#xFF0C;&#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x7528;&#x201C;&#x672A;&#x6765;&#x53EF;&#x80FD;&#x6269;&#x5C55;&#x201D;&#x5408;&#x7406;&#x5316;&#x8FC7;&#x5EA6;&#x8BBE;&#x8BA1;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x8865;&#x5145;&#x8FFD;&#x95EE;&#x6838;&#x5FC3;&#x4E0D;&#x53D8;&#x91CF;&#x4E0E;&#x53D8;&#x5316;&#x8F74;&#xFF1A;&#x8981;&#x6C42;&#x7ED9;&#x51FA;&#x81F3;&#x5C11;&#x4E24;&#x4E2A;&#x5177;&#x4F53;&#x6269;&#x5C55;&#x793A;&#x4F8B;&#xFF0C;&#x5E76;&#x8BC1;&#x660E;&#x5B83;&#x4EEC;&#x786E;&#x5B9E;&#x843D;&#x5728;&#x540C;&#x4E00;&#x5951;&#x7EA6;&#x4E4B;&#x4E0B;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x662F;&#x5728;&#x9884;&#x652F;&#x590D;&#x6742;&#x5EA6;&#x3002;&#x901A;&#x8FC7;&#x8FD9;&#x5957;&#x95EE;&#x9898;&#x96C6;&#xFF0C;&#x62BD;&#x8C61;&#x4ECE;&#x5BA1;&#x7F8E;&#x4E0E;&#x4E60;&#x60EF;&#x53D8;&#x6210;&#x53EF;&#x5BA1;&#x8BA1;&#x7684;&#x5DE5;&#x7A0B;&#x51B3;&#x7B56;&#xFF0C;&#x4E5F;&#x66F4;&#x5BB9;&#x6613;&#x5728;&#x56E2;&#x961F;&#x5185;&#x5F62;&#x6210;&#x4E00;&#x81F4;&#x7684;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x4E0E;&#x6F14;&#x8FDB;&#x8DEF;&#x5F84;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[用户和系统的边界区分]]></title><description><![CDATA[<p>&#x6211;&#x4EEC;&#x5728;&#x505A;&#x98CE;&#x63A7;&#x5C42;&#x7684;&#x65F6;&#x5019;&#x6709;&#x4E2A;&#x9700;&#x6C42;&#xFF0C;&#x5C31;&#x662F;&#x5B9E;&#x73B0;&#x4E00;&#x6761;&#x4E00;&#x6761;&#x7684;&#x98CE;&#x63A7;&#x89C4;&#x5219;&#xFF0C;&#x5BF9;&#x6BCF;&#x4E2A;&#x89C4;&#x5219;&#xFF0C;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x9700;&#x8981;&#x7EF4;&#x62A4;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x6BD4;&#x5982;&#x5173;</p>]]></description><link>https://blog.jnn.icu/yong-hu-he-xi-tong-de-bian-jie-qu-fen/</link><guid isPermaLink="false">693f2264c8e62100019ef4dc</guid><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sun, 14 Dec 2025 20:49:45 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2025/12/2.-Multi-User-Operating-System.jpg.webp" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2025/12/2.-Multi-User-Operating-System.jpg.webp" alt="&#x7528;&#x6237;&#x548C;&#x7CFB;&#x7EDF;&#x7684;&#x8FB9;&#x754C;&#x533A;&#x5206;"><p>&#x6211;&#x4EEC;&#x5728;&#x505A;&#x98CE;&#x63A7;&#x5C42;&#x7684;&#x65F6;&#x5019;&#x6709;&#x4E2A;&#x9700;&#x6C42;&#xFF0C;&#x5C31;&#x662F;&#x5B9E;&#x73B0;&#x4E00;&#x6761;&#x4E00;&#x6761;&#x7684;&#x98CE;&#x63A7;&#x89C4;&#x5219;&#xFF0C;&#x5BF9;&#x6BCF;&#x4E2A;&#x89C4;&#x5219;&#xFF0C;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x9700;&#x8981;&#x7EF4;&#x62A4;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x6BD4;&#x5982;&#x5173;&#x6CE8;&#x76D8;&#x53E3;&#x7684;&#x9700;&#x8981;&#x8BFB;books5&#xFF0C;&#x5173;&#x6CE8;&#x8D44;&#x91D1;&#x7684;&#x9700;&#x8981;&#x8BFB;fund&#xFF0C;&#x5173;&#x6CE8;nav&#x7684;&#x9700;&#x8981;&#x8BFB;nav_update&#x3002;&#x4E4B;&#x524D;&#x4E3A;&#x4E86;&#x590D;&#x7528;&#x903B;&#x8F91;&#xFF0C;&#x76F4;&#x63A5;&#x8BA9;&#x98CE;&#x63A7;&#x89C4;&#x5219;&#x7684;&#x57FA;&#x7C7B;&#x501F;&#x7528;&#x4E86;Executor&#xFF0C;&#x8BA9;&#x98CE;&#x63A7;&#x89C4;&#x5219;&#x53BB;override+subscribe Executor&#x7684;&#x5404;&#x7C7B;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x3002;&#x8FD9;&#x662F;&#x5F53;&#x65F6;&#x8BBE;&#x8BA1;&#x98CE;&#x63A7;&#x5C42;&#x65F6;&#x5F88;&#x81EA;&#x7136;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x4F46;&#x662F;&#x4ECA;&#x5929;&#x68B3;&#x7406;&#x65F6;&#x53D1;&#x73B0;&#x4F1A;&#x6709;&#x4E9B;&#x6076;&#x5FC3;&#x7684;&#x95EE;&#x9898;&#xFF1A;</p><ul><li>&#x8C03;&#x7528;&#x590D;&#x6742;&#x5EA6;&#x4E0A;&#x5347;&#xFF1A;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#x8FC7;&#x6765;&#x540E;&#x9700;&#x8981;&#x77E5;&#x9053;&#x8FD9;&#x662F;&#x54EA;&#x7C7B;&#x4E8B;&#x4EF6;&#xFF0C;&#x54EA;&#x4E9B;&#x89C4;&#x5219;&#x8BA2;&#x9605;&#x4E86;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x518D;&#x9010;&#x4E2A;&#x53BB;&#x8C03;&#x7528;&#x8BA2;&#x9605;&#x4E86;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#x7684;&#x89C4;&#x5219;&#x5BF9;&#x5E94;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x5BF9;&#x6211;&#x4EEC;&#x6D77;&#x91CF;&#x7684;&#x4E8B;&#x4EF6;&#x6765;&#x8BF4;&#xFF0C;&#x6BCF;&#x5904;&#x7406;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#x90FD;&#x9700;&#x8981;&#x53CD;&#x590D;&#x67E5;&#x5B57;&#x5178;&#x53CD;&#x590D;&#x53BB;&#x8C03;&#x5404;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x662F;&#x4E0D;&#x5C0F;&#x7684;&#x6027;&#x80FD;&#x5F00;&#x9500;</li><li>&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x4E0B;&#x964D;&#xFF1A;Executor&#x63A5;&#x53E3;&#x5B9A;&#x4E49;&#x53EF;&#x80FD;&#x5E38;&#x6539;&#xFF0C;&#x6539;&#x4E00;&#x6B21;&#x90FD;&#x8981;&#x8C03;&#x6574;&#x4E00;&#x5927;&#x5806;&#x98CE;&#x63A7;&#x89C4;&#x5219;</li><li>&#x601D;&#x7EF4;&#x4E0A;&#x6BD4;&#x8F83;&#x201C;&#x91CD;&#x201D;&#xFF1A;&#x6BCF;&#x4E2A;&#x98CE;&#x63A7;&#x89C4;&#x5219;&#x5176;&#x5B9E;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5C0F;&#x6267;&#x884C;&#x7B56;&#x7565;Executor&#xFF0C;&#x51E0;&#x5341;&#x6761;&#x89C4;&#x5219;&#x5C31;&#x662F;&#x540C;&#x65F6;&#x8DD1;&#x51E0;&#x5341;&#x4E2A;Executor&#xFF0C;&#x4E0D;&#x5BF9;&#x52B2;</li></ul><p>&#x601D;&#x8003;&#x4E86;&#x4E24;&#x4E2A;&#x5C0F;&#x65F6;&#x540E;&#x53D1;&#x73B0;&#x5176;&#x5B9E;&#x662F;&#x5185;&#x90E8;&#x7CFB;&#x7EDF;&#x548C;&#x7528;&#x6237;&#x63A5;&#x53E3;&#x7684;&#x8FB9;&#x754C;&#x6CA1;&#x6709;&#x68B3;&#x7406;&#x6E05;&#x695A;&#xFF0C;&#x6B63;&#x786E;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x76F4;&#x63A5;&#x5728;&#x98CE;&#x63A7;&#x5C42;&#x7528;&#x66F4;&#x5E95;&#x5C42;&#x7684;on_event&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4E00;&#x5806;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x7528;&#x6237;&#x987E;&#x540D;&#x601D;&#x4E49;&#x7684;&#x4E0D;&#x540C;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;&#x533A;&#x5206;&#x51E0;&#x4E2A;&#x6982;&#x5FF5;&#xFF1A;</p><ul><li>&#x7CFB;&#x7EDF;&#xFF1A;&#x63D0;&#x4F9B;&#x4E00;&#x7CFB;&#x5217;&#x529F;&#x80FD;&#x7684;&#x590D;&#x6742;&#x4EE3;&#x7801;&#x903B;&#x8F91;</li><li>&#x7528;&#x6237;&#xFF1A;&#x5BF9;&#x7CFB;&#x7EDF;&#x4E0D;&#x4E86;&#x89E3;&#x7684;&#x4F7F;&#x7528;&#x8005;&#xFF0C;&#x5728;&#x6211;&#x4EEC;&#x7684;&#x8BED;&#x5883;&#x4E0B;&#x53EF;&#x4EE5;&#x662F;&#x7B56;&#x7565;&#x7814;&#x7A76;&#x5458;</li><li>&#x5DE5;&#x7A0B;&#x5E08;&#xFF1A;&#x5BF9;&#x7CFB;&#x7EDF;&#x5185;&#x90E8;&#x5B9E;&#x73B0;&#x975E;&#x5E38;&#x4E86;&#x89E3;&#x7684;&#x5F00;&#x53D1;&#x8005;&#xFF0C;&#x5C31;&#x662F;&#x6211;&#x4EEC;</li><li>&#x7528;&#x6237;&#x63A5;&#x53E3;&#xFF1A;&#x7CFB;&#x7EDF;&#x7684;&#x7528;&#x6237;&#x548C;&#x7CFB;&#x7EDF;&#x5185;&#x90E8;&#x903B;&#x8F91;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x7684;&#x5165;&#x53E3;</li></ul><p>Executor&#x7684;API set&#x8BBE;&#x8BA1;&#x662F;&#x9762;&#x5411;&#x7528;&#x6237;&#x7684;&#x4E00;&#x79CD;&#x6613;&#x7528;&#x7528;&#x6237;&#x63A5;&#x53E3;&#xFF0C;&#x4F7F;&#x5F97;&#x7528;&#x6237;&#x4E0D;&#x611F;&#x77E5;&#x6267;&#x884C;&#x5F15;&#x64CE;&#x3001;ctx&#x4E2D;&#x7684;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x548C;&#x5206;&#x53D1;&#x903B;&#x8F91;&#xFF0C;&#x4FDD;&#x8BC1;&#x4E86;&#x53EF;&#x8BFB;&#x6027;&#x3001;&#x6613;&#x7528;&#x6027;&#x3001;&#x9632;&#x5446;&#x8BBE;&#x8BA1;&#x3002;&#x4F46;&#x662F;&#x98CE;&#x63A7;&#x5C42;&#x672C;&#x8EAB;&#x662F;&#x7CFB;&#x7EDF;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x8FD9;&#x90E8;&#x5206;&#x903B;&#x8F91;&#x4E0D;&#x9762;&#x5411;&#x7528;&#x6237;&#x800C;&#x662F;&#x9762;&#x5411;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x4E4B;&#x524D;&#x56FE;&#x65B9;&#x4FBF;&#x76F4;&#x63A5;&#x501F;&#x7528;&#x4E86;Executor&#x7684;API set&#xFF0C;&#x4F46;&#x662F;&#x5B9E;&#x9645;&#x4E0A;&#x98CE;&#x63A7;&#x5C42;&#x6839;&#x672C;&#x7528;&#x4E0D;&#x7740;&#x8FD9;&#x4E48;&#x4E0A;&#x5C42;&#x7684;API&#xFF1A;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x6BCF;&#x4E2A;&#x53EF;&#x4EE5;override&#x7684;callback&#x80CC;&#x540E;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x4E2A;&#x7684;event&#xFF0C;&#x90A3;&#x4E48;&#x4E0D;&#x7528;&#x7ED5;&#x4E00;&#x5708;&#x53BB;&#x5C4F;&#x853D;event&#x6982;&#x5FF5;&#xFF0C;&#x76F4;&#x63A5;&#x5B9A;&#x4E49;&#x4E2A;on_event&#x51FD;&#x6570;&#x5C31;&#x5B8C;&#x4E8B;&#x4E86;&#xFF0C;&#x91CC;&#x9762;&#x8BA9;&#x89C4;&#x5219;&#x81EA;&#x5DF1;&#x53BB;match event&#x3002;</p><blockquote>&#x9762;&#x5411;&#x7528;&#x6237;&#x7684;&#x63A5;&#x53E3;&#x8981;&#x51CF;&#x5C11;&#x6982;&#x5FF5;&#xFF1B;&#x9762;&#x5411;&#x7CFB;&#x7EDF;&#x7684;&#x63A5;&#x53E3;&#x8981;&#x66B4;&#x9732;&#x4E8B;&#x5B9E;&#x3002;&#x628A;&#x7CFB;&#x7EDF;&#x90E8;&#x4EF6;&#x5EFA;&#x7ACB;&#x5728;&#x7528;&#x6237;&#x63A5;&#x53E3;&#x4E4B;&#x4E0A;&#xFF0C;&#x8FDF;&#x65E9;&#x4F1A;&#x88AB;&#x7528;&#x6237;&#x63A5;&#x53E3;&#x7684;&#x6F14;&#x8FDB;&#x62D6;&#x7D2F;&#x3002;</blockquote><p>&#x5C0F;&#x5C0F;&#x7684;&#x5DE5;&#x7A0B;&#x54F2;&#x5B66;&#xFF1A;&#x62BD;&#x8C61;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x5E95;&#x5C42;&#x7ED9;&#x7CFB;&#x7EDF;&#x3002;&#x987A;&#x624B;&#x8BB0;&#x4E00;&#x4E0B;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[Let's Encrypt+CDN自动证书续订]]></title><description><![CDATA[本文介绍了如何使用 Let’s Encrypt 获取免费泛域名证书和自动化工具 acme.sh 配合腾讯云 API 实现 HTTPS 服务的自动化部署和证书更新。随着免费 SSL 证书有效期从一年缩短到三个月，本方案提供了一个高度自定义的解决方案，适用于需要频繁更新证书的场景。通过集成 acme.sh、Nginx、宝塔面板和腾讯云 CDN，该方案自动管理和续签证书，大大减轻了网站管理员的运维压力。无论是新手还是有经验的服务器管理员，都可以从中获得宝贵的操作指南和技术洞见，简化 SSL 证书的管理流程。]]></description><link>https://blog.jnn.icu/wildcard-cert-with-cdn-auto-renew/</link><guid isPermaLink="false">663c891197075f0001454338</guid><category><![CDATA[运维]]></category><category><![CDATA[CDN]]></category><category><![CDATA[腾讯云]]></category><category><![CDATA[证书]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sat, 18 May 2024 09:34:06 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2024/05/LetsEncrypt-SocialShare.png" medium="image"/><content:encoded><![CDATA[<h2 id="%E8%83%8C%E6%99%AF">&#x80CC;&#x666F;</h2><img src="https://blog.jnn.icu/content/images/2024/05/LetsEncrypt-SocialShare.png" alt="Let&apos;s Encrypt+CDN&#x81EA;&#x52A8;&#x8BC1;&#x4E66;&#x7EED;&#x8BA2;"><p>2024&#x5E74;4&#x6708;&#x4E4B;&#x524D;&#x817E;&#x8BAF;&#x4E91;&#x53EF;&#x4EE5;&#x7533;&#x8BF7;&#x4E00;&#x5E74;&#x6709;&#x6548;&#x671F;&#x7684;&#x514D;&#x8D39;&#x5355;&#x57DF;&#x540D;SSL&#x8BC1;&#x4E66;&#xFF0C;&#x653F;&#x7B56;&#x66F4;&#x65B0;&#x540E;&#x514D;&#x8D39;&#x8BC1;&#x4E66;&#x53EA;&#x80FD;&#x7533;&#x8BF7;3&#x4E2A;&#x6708;&#x6709;&#x6548;&#x671F;&#x7684;&#x5355;&#x57DF;&#x540D;&#x8BC1;&#x4E66;&#xFF0C;&#x8003;&#x8651;&#x5230;&#x6211;&#x6709;&#x4F17;&#x591A;HTTPS&#x670D;&#x52A1;&#xFF0C;&#x5E76;&#x4E14;&#x66F4;&#x65B0;&#x535A;&#x5BA2;&#x6E90;&#x7AD9;&#x8BC1;&#x4E66;&#x9700;&#x8981;&#x540C;&#x6B65;&#x66F4;&#x65B0;CDN&#x8BC1;&#x4E66;&#x914D;&#x7F6E;&#xFF0C;&#x9891;&#x7E41;&#x66FF;&#x6362;&#x8BC1;&#x4E66;&#x4E3A;&#x7F51;&#x7AD9;/&#x670D;&#x52A1;&#x8FD0;&#x7EF4;&#x9020;&#x6210;&#x5DE8;&#x5927;&#x7684;&#x65F6;&#x95F4;&#x4E0E;&#x7CBE;&#x529B;&#x6210;&#x672C;&#xFF08;&#x770B;&#x5230;&#x653F;&#x7B56;&#x66F4;&#x65B0;&#x7684;&#x5185;&#x5BB9;&#x540E;&#x4E00;&#x53E3;&#x8001;&#x8840;&#x5410;&#x4E86;&#x51FA;&#x6765;&#xFF09;&#x3002;</p><p>&#x4E8E;&#x662F;&#x5F00;&#x59CB;&#x5BFB;&#x627E;&#x4E00;&#x79CD;&#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72;&#x4E0E;&#x66F4;&#x65B0;&#x65B9;&#x6848;&#xFF0C;&#x6070;&#x597D;&#x53D1;&#x73B0;&#x8457;&#x540D;&#x514D;&#x8D39;SSL&#x8BC1;&#x4E66;&#x673A;&#x6784;Let&apos;s Encrypt&#x6709;&#x6CDB;&#x57DF;&#x540D;&#x8BC1;&#x4E66;&#x63D0;&#x4F9B;&#xFF0C;&#x6709;&#x6548;&#x671F;&#x4E09;&#x4E2A;&#x6708;&#xFF0C;&#x4E4B;&#x524D;&#x53EA;&#x662F;&#x7528;&#x8FC7;Let&apos;s Encrypt&#x5355;&#x57DF;&#x540D;&#x8BC1;&#x4E66;&#xFF0C;&#x8BA1;&#x5212;&#x4F9D;&#x8D56;&#x8BE5;&#x673A;&#x6784;&#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x5316;&#x6E90;&#x7AD9;&#x8BC1;&#x4E66;&#x4E0E;CDN&#x8BC1;&#x4E66;&#x66F4;&#x65B0;&#x3002;</p><p>&#x672C;&#x6587;&#x5C06;&#x4F7F;&#x7528;acme.sh&#x5BA2;&#x6237;&#x7AEF;+&#x817E;&#x8BAF;&#x4E91;API(TCCLI)&#x5B9E;&#x73B0;&#x8BE5;&#x9700;&#x6C42;&#xFF0C;&#x4E0B;&#x9762;&#x7B80;&#x8981;&#x4ECB;&#x7ECD;&#x6D89;&#x53CA;&#x5230;&#x7684;&#x5DE5;&#x5177;&#x548C;&#x6982;&#x5FF5;&#xFF1A;</p><p>acme.sh&#xFF1A;acme&#x534F;&#x8BAE;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x7528;&#x4E8E;&#x5411;&#x673A;&#x6784;&#xFF08;Let&apos;s Encrypt&#xFF09;&#x7533;&#x8BF7;&#x8BC1;&#x4E66;&#xFF0C;&#x5728;&#x7533;&#x8BF7;&#x8FC7;&#x7A0B;&#x4E2D;&#x5B8C;&#x6210;&#x53D1;&#x8D77;&#x8BC1;&#x4E66;&#x7533;&#x8BF7;&#x548C;&#x9A8C;&#x8BC1;&#x57DF;&#x540D;&#x6240;&#x6709;&#x6743;&#x529F;&#x80FD;&#x3002;github repo&#xFF1A;<a href="https://github.com/acmesh-official/acme.sh?ref=blog.jnn.icu">https://github.com/acmesh-official/acme.sh</a></p><p>&#x6D89;&#x53CA;&#x5230;&#x7684;&#x817E;&#x8BAF;&#x4E91;API&#xFF1A;</p><ul><li><strong>UploadCertificate</strong>&#xFF1A;&#x4E0A;&#x4F20;&#x8BC1;&#x4E66;&#x52A0;&#x5165;&#x6258;&#x7BA1;&#x5217;&#x8868;</li><li><strong>ModifyDomainConfig&#xFF1A;&#x4FEE;&#x6539;&#x8BC1;&#x4E66;&#x4E3A;&#x5DF2;&#x6258;&#x7BA1;&#x7684;&#x8BC1;&#x4E66;&#xFF08;ref-</strong>&#x793A;&#x4F8B;4 &#x66F4;&#x65B0; HTTPS &#x670D;&#x52A1;&#x5668;&#x8BC1;&#x4E66; ID&#xFF09;</li></ul><p>API&#x8C03;&#x7528;&#x4F7F;&#x7528;TCCLI&#x5B8C;&#x6210;&#xFF1A;TCCLI&#x7B80;&#x4ECB; <a href="https://cloud.tencent.com/document/product/440/6176?ref=blog.jnn.icu">https://cloud.tencent.com/document/product/440/6176</a></p><h2 id="%E6%90%AD%E5%BB%BA%E6%AD%A5%E9%AA%A4">&#x642D;&#x5EFA;&#x6B65;&#x9AA4;</h2><p>&#x57FA;&#x672C;&#x65B9;&#x6848;&#xFF1A;</p><ul><li>&#x8BC1;&#x4E66;&#x7B7E;&#x53D1;/&#x7EF4;&#x62A4;&#xFF1A;&#x7528;acme.sh&#x7533;&#x8BF7;Let&apos;s Encrypt&#x7684;&#x6CDB;&#x57DF;&#x540D;&#x8BC1;&#x4E66;&#xFF0C;&#x7533;&#x8BF7;&#x4E00;&#x4E2A;&#x8BC1;&#x4E66;&#x5168;&#x5BB6;&#x57DF;&#x540D;&#x53EF;&#x7528;&#xFF0C;&#x5E76;&#x4E14;&#x901A;&#x8FC7;acme.sh&#x63D0;&#x4F9B;&#x7684;renew hook&#x529F;&#x80FD;&#x89E6;&#x53D1;CDN&#x8BC1;&#x4E66;&#x90E8;&#x7F72;&#x548C;&#x5B9D;&#x5854;(Nginx)&#x8BC1;&#x4E66;&#x66F4;&#x65B0;&#x66FF;&#x6362;</li><li>CDN&#x90E8;&#x7F72;&#xFF1A;&#x817E;&#x8BAF;&#x7ED9;&#x7684;TCCLI&#x51E0;&#x4E4E;&#x652F;&#x6301;100%&#x7684;&#x63A7;&#x5236;&#x53F0;&#x529F;&#x80FD;&#xFF0C;&#x652F;&#x6301;&#x67E5;&#x8BE2;&#x542F;&#x7528;CDN&#x57DF;&#x540D;&#xFF0C;&#x4E0A;&#x4F20;&#x548C;&#x66FF;&#x6362;CDN&#x8BBE;&#x7F6E;&#x7684;&#x8BC1;&#x4E66;</li></ul><ol><li>Prerequisite<ol><li>&#x4E00;&#x53F0;&#x670D;&#x52A1;&#x5668;</li><li>&#x4E00;&#x4E2A;&#x57DF;&#x540D;</li><li>BT&#x9762;&#x677F;(optional)/Nginx&#x90E8;&#x7F72;<ol><li>&#x9700;&#x8981;&#x5148;&#x6709;&#x4E2A;&#x7F51;&#x7AD9;&#xFF0C;&#x9700;&#x8981;&#x77E5;&#x9053;&#x600E;&#x4E48;&#x7528;Nginx&#x914D;&#x7F6E;SSL&#xFF0C;&#x8FD9;&#x4E2A;&#x6B64;&#x5904;&#x4E0D;&#x5C55;&#x5F00;&#x8BB2;&#xFF0C;&#x4E0D;&#x7528;&#x5B9D;&#x5854;&#x9762;&#x677F;&#x4E5F;&#x53EF;&#x4EE5;&#xFF0C;&#x6211;&#x4E3B;&#x8981;&#x662F;&#x61D2;&#xFF0C;&#x7528;UI&#x914D;&#x7F6E;&#x65B9;&#x4FBF;&#x4E0D;&#x52A8;&#x8111;</li><li>&#x540E;&#x9762;&#x7684;Nginx SSL&#x914D;&#x7F6E;&#x8DEF;&#x5F84;&#x66FF;&#x6362;&#x5B9D;&#x5854;&#x7684;&#xFF0C;&#x7ED9;&#x51FA;&#x7684;&#x811A;&#x672C;&#x4EC5;&#x4F9B;&#x53C2;&#x8003;&#xFF0C;&#x811A;&#x672C;&#x7684;&#x529F;&#x80FD;&#x672C;&#x8EAB;&#x662F;Nginx&#x8BC1;&#x4E66;&#x66F4;&#x65B0;+Tencent CDN&#x90E8;&#x7F72;&#x7684;&#x8D85;&#x96C6;&#xFF0C;&#x53C2;&#x8003;&#x811A;&#x672C;&#x7A0D;&#x4F5C;&#x4FEE;&#x6539;&#x5373;&#x53EF;&#x81EA;&#x5DF1;&#x5B8C;&#x6210;&#x5B9A;&#x5236;&#x5316;&#x90E8;&#x7F72;</li></ol></li><li>CDN&#x5DF2;&#x90E8;&#x7F72;<ol><li>&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x817E;&#x8BAF;&#x7684;CDN&#xFF0C;12&#x5757;&#x94B1;100GB/yr&#x7684;&#x6D41;&#x91CF;&#x5305;</li></ol></li><li>&#x79D1;&#x5B66;&#x4E0A;&#x7F51;<ol><li>&#x5B89;&#x88C5;acme.sh&#x9700;&#x8981;&#x4ECE;&#x88AB;&#x5899;&#x7684;raw.githubusercontent&#x83B7;&#x53D6;</li></ol></li><li>&#x5BF9;web&#x670D;&#x52A1;&#x5668;&#x8FD0;&#x7EF4;&#x6280;&#x672F;&#x6709;&#x57FA;&#x672C;&#x4E86;&#x89E3;</li></ol></li><li>&#x5B89;&#x88C5;acme.sh<ol><li>&#x53C2;&#x8003;acme.sh&#x4E2D;&#x6587;Wiki <a href="https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E?ref=blog.jnn.icu">https://github.com/acmesh-official/acme.sh/wiki/&#x8BF4;&#x660E;</a></li><li>&#x670D;&#x52A1;&#x5668;&#x65E0;&#x6CD5;&#x8FDE;&#x63A5;GitHub&#x53EF;&#x4EE5;&#x4E0B;&#x8F7D;Release&#x538B;&#x7F29;&#x5305;&#x79BB;&#x7EBF;&#x5B89;&#x88C5;</li></ol></li><li>&#x5B89;&#x88C5;TCCLI&#xFF1A;<a href="https://cloud.tencent.com/document/product/440/34011?ref=blog.jnn.icu">https://cloud.tencent.com/document/product/440/34011</a><ol><li>&#x6309;&#x7167;&#x6587;&#x6863;&#x914D;&#x7F6E;&#xFF0C;&#x9700;&#x8981;&#x53BB;&#x63A7;&#x5236;&#x53F0;&#x521B;&#x5EFA;&#x817E;&#x8BAF;&#x4E91;API Token</li></ol></li><li>&#x521B;&#x5EFA;DNSPod API Token&#xFF1A;&#x53BB;DNSPod&#x540E;&#x53F0;&#x521B;&#x5EFA;&#xFF0C;&#x8BB0;&#x4F4F;Secret Key&#xFF0C;&#x4EE5;&#x540E;&#x770B;&#x4E0D;&#x5230;&#x4E86;</li><li>&#x8BC1;&#x4E66;&#x7B7E;&#x53D1;&#xFF1A;example.com&#x66FF;&#x6362;&#x6210;&#x81EA;&#x5DF1;&#x7684;&#x4E3B;&#x57DF;&#x540D;&#xFF0C;&#x4F7F;&#x7528;acme.sh --issue&#x6307;&#x4EE4;&#x914D;&#x5408;--dns dns_dp&#x6307;&#x5B9A;DNSPod&#x4F5C;&#x4E3A;&#x89E3;&#x6790;&#x670D;&#x52A1;&#x5546;&#xFF0C;acme.sh&#x4F1A;&#x5411;CA&#x7533;&#x8BF7;&#x8BC1;&#x4E66;&#xFF0C;&#x518D;&#x7528;API&#x5728;DNSPod&#x89E3;&#x6790;&#x8BB0;&#x5F55;&#x91CC;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x9A8C;&#x8BC1;&#x7528;&#x8BB0;&#x5F55;&#xFF0C;&#x5E76;&#x4E14;&#x542F;&#x7528;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x6309;&#x65F6;&#x7EED;&#x671F;&#xFF0C;&#x5C06;&#x7EED;&#x671F;&#x65F6;&#x7684;hook&#x811A;&#x672C;&#x8BBE;&#x7F6E;&#x6210;<code>/path/to/on/renew/hook.sh</code></li></ol><pre><code class="language-shell">DP_Id=&lt;DNSPodTokenId&gt; DP_Key=&lt;DNSPodTokenSecret&gt; acme.sh --issue --dns dns_dp -d example.com -d &apos;*.example.com&apos; \
  --renew-hook &quot;/path/to/on/renew/hook.sh&quot;</code></pre><p>&#x8FD8;&#x6CA1;&#x521B;&#x5EFA;&#x56DE;&#x8C03;&#x7684;hook.sh&#xFF0C;&#x540E;&#x9762;&#x518D;&#x521B;&#x5EFA;&#xFF0C;&#x81EA;&#x5DF1;&#x7ED9;&#x4E00;&#x4E2A;&#x559C;&#x6B22;&#x7684;&#x8DEF;&#x5F84;&#x5C31;&#x597D;</p><p><strong>&#x6CE8;&#x610F;&#xFF1A;</strong>renew-hook&#x53EA;&#x4F1A;&#x5728;issue&#x7684;&#x65F6;&#x5019;&#x8BBE;&#x7F6E;&#xFF0C;&#x540E;&#x9762;acme&#x6307;&#x4EE4;&#x518D;&#x52A0;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x5C31;&#x4E0D;&#x4F1A;&#x6709;&#x9884;&#x671F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x8C03;&#x6574;&#xFF0C;&#x4FEE;&#x6539;<code>~/.acme.sh/example.com(_ecc)/example.conf</code>&#x5373;&#x53EF;</p><ol start="6"><li>&#x786E;&#x5B9A;&#x8BC1;&#x4E66;&#x5B89;&#x88C5;&#x4F4D;&#x7F6E;&#xFF1A;&#x641E;&#x4E00;&#x4E2A;&#x8DEF;&#x5F84;&#xFF0C;&#x6BD4;&#x5982;&#x6211;&#x7528;&#x7684;/root/cert&#xFF0C;&#x91CC;&#x9762;&#x5B58;Nginx&#x9700;&#x8981;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;fullchain.pem&#x548C;privkey.pem&#xFF0C;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#x548C;&#x79C1;&#x94A5;&#x6587;&#x4EF6;&#xFF0C;Nginx config&#x91CC;&#x4E5F;&#x914D;&#x7F6E;&#x4E3A;&#x8FD9;&#x4E2A;&#x8DEF;&#x5F84;&#x3002;&#x53E6;&#x5916;&#x8FD8;&#x5B58;&#x4E2A;cert.cer&#xFF0C;&#x7528;&#x6765;&#x8BFB;&#x53D6;&#x8BC1;&#x4E66;&#x4FE1;&#x606F;&#x751F;&#x6210;bt&#x9700;&#x8981;&#x7684;info.json</li><li>&#x5B89;&#x88C5;&#x8BC1;&#x4E66;&#xFF0C;&#x4F7F;&#x7528;acme.sh&#x7684;--install-cert&#x547D;&#x4EE4;</li></ol><pre><code class="language-shell">acme.sh --install-cert -d jnn.icu \
  --key-file       /root/cert/privkey.pem  \
  --fullchain-file /root/cert/fullchain.pem \
  --cert-file      /root/cert/cert.cer \
  --reloadcmd      &quot;service nginx force-reload&quot;  # &#x8FD9;&#x4E00;&#x884C;&#x53EF;&#x9009;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x6CA1;&#x6709;bt&#x9762;&#x677F;&#x4E4B;&#x7C7B;&#x7684;&#xFF0C;&#x76F4;&#x63A5;&#x5B89;&#x88C5;&#x5230;nginx&#xFF0C;&#x66F4;&#x65B0;&#x5B8C;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#x8BA9;Nginx reload&#x4E00;&#x4E0B;&#x5C31;&#x5B8C;&#x4E8B;&#x4E86;&#xFF0C;&#x540E;&#x9762;&#x66F4;&#x65B0;bt&#x7684;&#x6B65;&#x9AA4;&#x90FD;&#x4E0D;&#x9700;&#x8981;&#x7BA1;&#x4E86;</code></pre><p>&#x8FD9;&#x4E00;&#x6B65;&#x7684;&#x6307;&#x4EE4;&#x4F1A;&#x88AB;acme.sh&#x4FDD;&#x5B58;&#xFF0C;&#x540E;&#x9762;acme.sh&#x81EA;&#x52A8;renew&#x8BC1;&#x4E66;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x89E6;&#x53D1;&#x8FD9;&#x4E2A;&#x6307;&#x4EE4;&#xFF0C;&#x628A;/root/cert&#x91CC;&#x7684;&#x6587;&#x4EF6;&#x66F4;&#x65B0;&#x4E3A;&#x6700;&#x65B0;</p><ol start="8"><li><code>renew_hook.sh</code>&#x5185;&#x5BB9;&#xFF0C;&#x9700;&#x8981;<code>chmod +x renew_hook.sh</code></li></ol><p>&#x51E0;&#x5206;&#x949F;&#x968F;&#x624B;&#x6413;&#x4E86;&#x4E2A;shell&#x811A;&#x672C;&#xFF0C;&#x6BD4;&#x8F83;&#x7CD9;&#xFF0C;&#x4F46;&#x662F;&#x80FD;&#x7528;&#x1F648;</p><pre><code class="language-shell">echo on_renew_cert hook invoked
# env
export main_domain=&lt;example.com&gt;   # EDITME
export DP_Id=&lt;DNSPodTokenId&gt;       # EDITME
export DP_Key=&lt;DNSPodTokenSecret&gt;  # EDITME

# extract cert info
openssl x509 -text -noout -in /root/cert.cer 2&gt;$1 &gt; cert_info.txt
cn=$(cat cert_info.txt | grep -E &apos;Issuer.*CN&apos; | sed -E &apos;s/.*CN = (.*)/\1/&apos; | tr -d &apos;\n&apos;)
not_bef=$(cat cert_info.txt | grep -E &apos;Not Before&apos; | sed -E &apos;s/.*: (.*)/\1/&apos; | tr -d &apos;\n&apos;)
not_aft=$(cat cert_info.txt | grep -E &apos;Not After&apos; | sed -E &apos;s/.*: (.*)/\1/&apos; | tr -d &apos;\n&apos;)
subject=$(cat cert_info.txt | grep &apos;Subject: CN = &apos; | sed -E &apos;s/.*CN = (.*)/\1/&apos; | tr -d &apos;\n&apos;)
dnss=$(cat cert_info.txt | grep &apos;DNS:&apos; | tr -d &apos; &apos; | tr -d &apos;\n&apos; | sed -E &apos;s/DNS:([^,]+)/&quot;\1&quot;/g&apos;)

# write bt info.json
echo \{\&quot;issuer\&quot;: \&quot;$cn\&quot;, \&quot;notAfter\&quot;: \&quot;$(date -d &quot;$not_aft&quot; +&apos;%Y-%m-%d&apos;)\&quot;, \&quot;notBefore\&quot;: \&quot;$(date -d &quot;$not_bef&quot; +&apos;%Y-%m-%d&apos;)\&quot;, \&quot;dns\&quot;: \[$dnss\], \&quot;subject\&quot;: \&quot;$subject\&quot;, \&quot;endtime\&quot;: $((($(date +%s -d &quot;$not_aft&quot;) - $(date +%s -d &quot;$not_bef&quot;)) / 86400 - 1))\} &gt; info.json

# deploy cert to sites
for site in $(ls /www/server/panel/vhost/cert); do
  if [[ $site == *$subject ]]; then
    echo updating nginx $site cert
    # cp certs and info.json to bt cert/ssl path
    cp /root/cert/privkey.pem /root/cert/fullchain.pem info.json /www/server/panel/vhost/cert/$site/
    cp /root/cert/privkey.pem /root/cert/fullchain.pem info.json /www/server/panel/vhost/ssl/$site/
  fi
done

# reload nginx
echo reload nginx
service nginx force-reload

# upload cert to tencent cloud
resp=$(tccli ssl UploadCertificate --cli-unfold-argument --CertificatePublicKey &quot;$(cat /root/cert/fullchain.pem)&quot; --CertificatePrivateKey &quot;$(cat /root/cert/privkey.pem)&quot;)
echo $resp
cert_id=$(echo $resp | grep CertificateId | sed -E &apos;s/.*CertificateId.*:.*&quot;(.*)&quot;.*/\1/&apos; | tr -d &apos;\n&apos;)

# deploy cdn cert
# grep online domain cdn deployments
for domain in $(tccli cdn DescribeDomains --cli-unfold-argument --endpoint cdn.ap-beijing.tencentcloudapi.com --Filters.0.Name status --Filters.0.Value online | grep \&quot;Domain\&quot; | sed -E &apos;s/.*:.*\&quot;(.*)\&quot;.*/\1/&apos; | tr &apos;\n&apos; &apos; &apos;); do
  if [[ $domain == *$subject ]]; then
    echo update online cdn domain deployment $domain
    tccli cdn ModifyDomainConfig --cli-unfold-argument --Domain &quot;$domain&quot; --Route &apos;Https.CertInfo.CertId&apos; --Value &quot;{\&quot;update\&quot;:\&quot;$cert_id\&quot;}&quot;
  fi
done
echo done</code></pre><p>&#x811A;&#x672C;&#x6D41;&#x7A0B;&#xFF1A;</p><ol><ol><li>&#x4F7F;&#x7528;openssl&#x5BFC;&#x51FA;&#x8BC1;&#x4E66;&#x4FE1;&#x606F;&#xFF08;&#x7528;&#x6765;&#x6413;&#x5B9D;&#x5854;&#x7684;&#x8BC1;&#x4E66;&#x4FE1;&#x606F;JSON&#xFF09;<ol><li>PS&#xFF1A;&#x4E0D;&#x7528;&#x50CF;&#x6211;&#x8FD9;&#x6837;&#x5168;&#x7528;sed&#x6B63;&#x5219;&#x63D0;&#x53D6;&#xFF0C;openssl&#x89E3;&#x6790;&#x8BC1;&#x4E66;&#x6709;&#x5F88;&#x591A;&#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;&#x51FA;&#x9700;&#x8981;&#x7684;&#x4FE1;&#x606F;</li></ol></li><li>&#x751F;&#x6210;&#x5B9D;&#x5854;&#x9762;&#x677F;&#x9700;&#x8981;&#x7684;info.json</li><li>&#x5C06;&#x8BC1;&#x4E66;&#x62F7;&#x8D1D;&#x5230;&#x6240;&#x6709;&#x901A;&#x8FC7;&#x5B9D;&#x5854;&#x9762;&#x677F;&#x90E8;&#x7F72;&#x7684;&#x7F51;&#x7AD9;&#x914D;&#x7F6E;&#x76EE;&#x5F55;</li><li>nginx&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x66F4;&#x65B0;&#x8BC1;&#x4E66;&#x90E8;&#x7F72;</li><li>TCCLI&#x4E0A;&#x4F20;&#x8BC1;&#x4E66;&#x5230;&#x817E;&#x8BAF;&#x4E91;&#x6258;&#x7BA1;</li><li>TCCLI&#x83B7;&#x53D6;&#x53EF;&#x5E94;&#x7528;&#x672C;&#x8BC1;&#x4E66;&#x7684;CDN&#x90E8;&#x7F72;</li><li>&#x66F4;&#x65B0;CDN&#x8BC1;&#x4E66;&#x914D;&#x7F6E;&#x4E3A;&#x4E0A;&#x4F20;&#x7684;&#x6258;&#x7BA1;&#x8BC1;&#x4E66;</li></ol></ol><h2 id="%E6%80%BB%E7%BB%93">&#x603B;&#x7ED3;</h2><p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x8BB0;&#x5F55;&#x4E86;&#x4E00;&#x4E2A;highly customized&#x65B9;&#x6848;&#xFF0C;&#x5BF9;&#x5927;&#x90E8;&#x5206;&#x4EBA;&#x6765;&#x8BF4;&#x662F;&#x6CA1;&#x6CD5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x7684;&#x3002;&#x4F46;&#x662F;&#x76F8;&#x4FE1;SSL&#x514D;&#x8D39;&#x8BC1;&#x4E66;&#x6709;&#x6548;&#x671F;&#x4ECE;1&#x5E74;&#x7F29;&#x77ED;&#x4E3A;3&#x6708;&#x540E;&#xFF0C;&#x5E94;&#x8BE5;&#x5F88;&#x591A;&#x4EBA;&#x90FD;&#x4F1A;&#x6709;&#x7533;&#x8BF7;&#x514D;&#x8D39;&#x6CDB;&#x57DF;&#x540D;&#x8BC1;&#x4E66;&#x5E76;&#x81EA;&#x52A8;&#x66F4;&#x65B0;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x6240;&#x4EE5;&#x672C;&#x6587;&#x8BB0;&#x5F55;&#x7684;&#x65B9;&#x6848;&#x5E94;&#x8BE5;&#x6709;&#x8F83;&#x5927;&#x7684;&#x53C2;&#x8003;&#x4EF7;&#x503C;&#xFF0C;&#x5E0C;&#x671B;&#x53EF;&#x4EE5;&#x5E2E;&#x5230;&#x4E00;&#x4E9B;&#x88AB;&#x8BC1;&#x4E66;&#x53CD;&#x590D;&#x90E8;&#x7F72;&#x70E6;&#x607C;&#x5230;&#x7684;&#x8BFB;&#x8005;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[Numba 常见问题与解决方案]]></title><description><![CDATA[Numba是一个高性能Python编译器，能够显著提升数据处理速度，但同时也具有复杂性。本文深入探讨了如何利用Numba优化Python代码，包括np.dtype类型签名的使用、自定义dtype的转换、提前编译的方法以及定位编译发生的技巧。特别是，通过使用Numba提供的工具函数和自定义钩子，我们可以显式指定ndarray的签名，提前编译函数，避免首次调用时的性能瓶颈，并监控编译位置和重新编译的原因。这些技术对于那些需要在Python中实现高性能数据处理逻辑的开发者来说，至关重要。通过这些实践，您可以在保证代码性能的同时，简化开发过程，提高工作效率。]]></description><link>https://blog.jnn.icu/numba-faq/</link><guid isPermaLink="false">6662bbfc97075f000145449d</guid><category><![CDATA[最佳实践]]></category><category><![CDATA[Numba]]></category><category><![CDATA[python]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sun, 09 Jun 2024 08:57:46 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2024/06/numba.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2024/06/numba.png" alt="Numba &#x5E38;&#x89C1;&#x95EE;&#x9898;&#x4E0E;&#x89E3;&#x51B3;&#x65B9;&#x6848;"><p>Numba&#x662F;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x9AD8;&#x6027;&#x80FD;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x7531;&#x4E8E;&#x6211;&#x5DE5;&#x4F5C;&#x7684;&#x7279;&#x70B9;&#xFF0C;&#x4F1A;&#x7ECF;&#x5E38;&#xFF08;&#x88AB;&#x8FEB;&#xFF09;&#x9700;&#x8981;&#x4F7F;&#x7528;Python&#x5B8C;&#x6210;&#x4E00;&#x4E9B;&#x5BF9;&#x6027;&#x80FD;&#x8981;&#x6C42;&#x6781;&#x9AD8;&#x7684;&#x6570;&#x636E;&#x5904;&#x7406;&#x5DE5;&#x5177;&#xFF0C;&#x5BFC;&#x81F4;&#x6211;&#x7ECF;&#x5E38;&#x4E0E;Numba&#x6597;&#x667A;&#x6597;&#x52C7;&#x3002;Numba&#x80FD;&#x591F;&#x63D0;&#x4F9B;&#x6781;&#x5927;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;&#xFF0C;&#x5728;Python&#x91CC;&#x5FEB;&#x901F;&#x5F00;&#x53D1;&#x5177;&#x6709;C&#x6027;&#x80FD;&#x7684;&#x6570;&#x636E;&#x5904;&#x7406;&#x903B;&#x8F91;&#xFF0C;&#x4F46;&#x540C;&#x6837;&#x7684;&#xFF0C;Numba&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x4E14;&#x5751;&#x70B9;&#x91CD;&#x91CD;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><h2 id="npdtype%E7%9A%84%E7%B1%BB%E5%9E%8B%E7%AD%BE%E5%90%8D">np.dtype&#x7684;&#x7C7B;&#x578B;&#x7B7E;&#x540D;</h2><p>Numba&#x5BF9;Numpy ufunc&#x548C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x6709;&#x826F;&#x597D;&#x7684;&#x517C;&#x5BB9;&#xFF0C;&#x76F4;&#x63A5;&#x5C06;ndarray&#x5BF9;&#x8C61;&#x4F20;&#x5165;jitted func&#xFF0C;Numba&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x8BC6;&#x522B;&#x7C7B;&#x578B;&#x7B7E;&#x540D;&#x3002;&#x4F46;&#x662F;&#x67D0;&#x4E9B;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x663E;&#x5F0F;&#x6307;&#x5B9A;&#x8FD9;&#x4E9B;ndarray&#x7684;&#x7B7E;&#x540D;&#xFF0C;&#x6BD4;&#x5982;&#xFF1A;&#x5B9A;&#x4E49;&#x6709;ndarray&#x6210;&#x5458;&#x7684;jitclass&#xFF0C;&#x5B9A;&#x4E49;empty typed list&#x7B49;&#x9700;&#x8981;&#x7ACB;&#x5373;&#x800C;&#x975E;Lazy&#x786E;&#x5B9A;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x7B7E;&#x540D;&#x7684;&#x573A;&#x666F;&#x3002;</p><h3 id="%E4%BD%BF%E7%94%A8%E5%86%85%E7%BD%AEdtype%E7%9A%84ndarray">&#x4F7F;&#x7528;&#x5185;&#x7F6E;dtype&#x7684;ndarray</h3><pre><code class="language-Python">import numpy as np
from numba import experimental as nbe

@nbe.jitclass([(&apos;arr&apos;, nb.types.float64[:])])
class JITClass:
    def __init__(self):
        self.arr = np.zeros(100, dtype=np.float64)</code></pre><p>Numba&#x7684;&#x57FA;&#x672C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x548C;Numpy&#x5B58;&#x5728;&#x6620;&#x5C04;&#x5173;&#x7CFB;&#xFF0C;nb.float64&#x548C;np.float64&#x7F16;&#x8BD1;&#x540E;&#x662F;&#x540C;&#x4E00;&#x79CD;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF0C;&#x5728;&#x88C5;&#x9970;&#x5668;&#x7684;spec&#x53C2;&#x6570;&#x91CC;&#x586B;&#x5199;&#x53C2;&#x6570;&#x5217;&#x8868;&#x7684;&#x7C7B;&#x578B;&#xFF0C;np.float64&#x6570;&#x7EC4;&#x5C31;&#x662F;nb.types.float64[:]&#x3002;</p><h3 id="%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89dtype%E7%9A%84ndarray">&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;dtype&#x7684;ndarray</h3><p>&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x7528;&#x5230;Numba&#x63D0;&#x4F9B;&#x7684;&#x5DE5;&#x5177;&#x51FD;&#x6570;<code>nb.from_dtype</code>&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x5B9A;&#x4E49;&#x597D;&#x7684;dtype&#x5BF9;&#x8C61;&#x8F6C;&#x6362;&#x4E3A;Numba&#x53EF;&#x8BC6;&#x522B;&#x7684;&#x7C7B;&#x578B;&#x7B7E;&#x540D;&#x3002;</p><pre><code class="language-Python">import numpy as np
import numba as nb

my_type = np.dtype([(&apos;a&apos;, np.int32), (&apos;b&apos;, np.float64)])
print(nb.from_dtype(my_type))</code></pre><p>&#x6267;&#x884C;&#x8FD9;&#x4E2A;&#x811A;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x6253;&#x5370;&#x51FA;&#x8FD9;&#x4E2A;dtype&#x7684;Numba&#x7C7B;&#x578B;&#x7B7E;&#x540D;<code>Record(a[type=int32;offset=0],b[type=float64;offset=4];12;False)</code></p><p>&#x5982;&#x679C;&#x8981;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;ndarray&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528;<code>nb.from_dtype(my_type)[:]</code>&#xFF0C;&#x56E0;&#x4E3A;&#x8FD4;&#x56DE;&#x7684;Record&#x662F;&#x201C;&#x4E00;&#x884C;&#x201D;&#xFF08;&#x4E5F;&#x5C31;&#x662F;&#x6807;&#x91CF;&#xFF09;&#x7684;&#x7C7B;&#x578B;&#x3002;&#x4F46;&#x662F;&#x7279;&#x6B8A;&#x5730;&#xFF0C;Numba&#x4F3C;&#x4E4E;&#x4E5F;&#x4E0D;&#x652F;&#x6301;&#x5C06;Numpy&#x6807;&#x91CF;&#x4F5C;&#x4E3A;jitclass&#x7684;&#x6210;&#x5458;&#xFF0C;&#x81F3;&#x5C11;&#x4E5F;&#x5F97;&#x7528;ndarray&#x5305;&#x6210;&#x5411;&#x91CF;Numba&#x624D;&#x80FD;&#x63A5;&#x53D7;&#x3002;</p><p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p><pre><code class="language-Python">import numpy as np
from numba import experimental as nbe

# DTYPE_TRADE_EVENT &#x662F;&#x6211;&#x81EA;&#x5B9A;&#x4E49;&#x7684;dtype

@nbe.jitclass([(&apos;_event&apos;, nb.from_dtype(DTYPE_TRADE_EVENT)[:])])
class EventWrapper:

    def __init__(self, event: np.ndarray):
        self._event = event

    @property
    def event(self) -&gt; np.ndarray:
        return self._event[0]</code></pre><p>&#x6211;&#x4E3A;&#x4E86;&#x5728;&#x4E00;&#x4E2A;JIT&#x961F;&#x5217;&#x91CC;&#x9762;&#x4F20;&#x9012;DTYPE_TRADE_EVENT&#x7C7B;&#x578B;&#x7684;&#x6807;&#x91CF;&#xFF0C;&#x8BBE;&#x8BA1;&#x4E86;&#x4E00;&#x4E2A;wrapper class&#xFF0C;&#x7528;&#x4E00;&#x4E2A;&#x4E00;&#x7EF4;&#x5411;&#x91CF;&#x4FDD;&#x5B58;&#x8FD9;&#x4E2A;&#x6807;&#x91CF;&#xFF08;&#x5F53;&#x7136;&#x8FD9;&#x4E2A;class&#x8FD8;&#x6709;&#x5176;&#x4ED6;&#x7684;&#x53C2;&#x6570;&#x548C;&#x529F;&#x80FD;&#xFF0C;&#x6BD4;&#x5982;&#x5F53;&#x4F5C;&#x6392;&#x5E8F;&#x5BB9;&#x5668;&#xFF0C;&#x6CA1;&#x6709;&#x5C55;&#x793A;&#x5728;&#x8FD9;&#x91CC;&#xFF09;&#x3002;</p><h2 id="%E6%8F%90%E5%89%8D%E7%BC%96%E8%AF%91">&#x63D0;&#x524D;&#x7F16;&#x8BD1;</h2><p>&#x51FA;&#x4E8E;&#x5404;&#x79CD;&#x8003;&#x91CF;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x6D4B;&#x91CF;&#x6027;&#x80FD;&#xFF0C;&#x4E5F;&#x53EF;&#x80FD;&#x662F;&#x5B9A;&#x4F4D;&#x6027;&#x80FD;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x5E0C;&#x671B;&#x9700;&#x8981;JIT&#x7684;&#x51FD;&#x6570;&#x5728;&#x9996;&#x6B21;&#x8C03;&#x7528;&#x65F6;&#x624D;Lazy&#x5730;&#x8FDB;&#x884C;&#x7F16;&#x8BD1;&#xFF0C;&#x800C;&#x662F;&#x6267;&#x884C;&#x65F6;&#x51FD;&#x6570;&#x5DF2;&#x7ECF;&#x5C31;&#x7EEA;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x6709;&#x4E09;&#x79CD;&#x65B9;&#x6848;&#x53EF;&#x4EE5;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;</p><ul><li>AOT&#xFF08;Ahead of Time&#xFF09;&#xFF1A;&#x63D0;&#x524D;&#x7F16;&#x8BD1;&#xFF0C;&#x53EF;&#x4EE5;&#x6253;&#x6210;&#x5916;&#x90E8;&#x5E93;&#xFF0C;&#x6027;&#x80FD;&#x6700;&#x5F3A;&#xFF0C;&#x9650;&#x5236;&#x6700;&#x591A;</li><li>Dummy Call&#xFF1A;import&#x6A21;&#x5757;&#x7684;&#x65F6;&#x5019;&#x7528;&#x4E00;&#x7EC4;&#x4F2A;&#x8C03;&#x7528;&#x63D0;&#x524D;&#x8C03;&#x7528;&#x8981;JIT&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x4E14;&#x6309;&#x672A;&#x6765;&#x5B9E;&#x9645;&#x4F7F;&#x7528;&#x7684;&#x7C7B;&#x578B;&#x63D0;&#x4F9B;&#x53C2;&#x6570;</li><li>Eager Compilation&#xFF1A;&#x5728;@jit&#x4FEE;&#x9970;&#x65F6;&#x5C31;&#x6307;&#x5B9A;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#xFF0C;&#x5B9A;&#x4E49;&#x65F6;&#x7ACB;&#x523B;&#x7F16;&#x8BD1;&#xFF0C;&#x8C03;&#x7528;&#x65F6;&#x4E0D;&#x518D;&#x652F;&#x6301;&#x5176;&#x5B83;&#x7C7B;&#x578B;&#x7684;&#x53C2;&#x6570;</li></ul><h2 id="%E4%BD%95%E5%A4%84%E5%8F%91%E7%94%9F%E4%BA%86%E7%BC%96%E8%AF%91">&#x4F55;&#x5904;&#x53D1;&#x751F;&#x4E86;&#x7F16;&#x8BD1;</h2><p>&#x7528;Numba&#x8FDB;&#x884C;&#x52A0;&#x901F;&#x65F6;&#xFF0C;&#x603B;&#x662F;&#x9700;&#x8981;&#x53CD;&#x590D;&#x8FDB;&#x884C;&#x6D4B;&#x91CF;&#xFF0C;&#x89C2;&#x5BDF;&#x8FD0;&#x884C;&#x65F6;&#x95F4;&#xFF0C;&#x7136;&#x800C;Numba&#x7684;&#x7F16;&#x8BD1;&#x5E76;&#x4E0D;&#x7B97;&#x5FEB;&#xFF0C;&#x5E76;&#x4E0D;&#x590D;&#x6742;&#x7684;&#x51FD;&#x6570;&#x5373;&#x65F6;&#x7F16;&#x8BD1;&#x9700;&#x8981;&#x4EE5;&#x79D2;&#x8BA1;&#x65F6;&#xFF0C;&#x8FD9;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x5BF9;&#x4EE3;&#x7801;&#x6BB5;&#x8FD0;&#x884C;&#x6548;&#x7387;&#x7684;&#x8BC4;&#x4F30;&#x6709;&#x9519;&#x8BEF;&#x7684;&#x7ED3;&#x8BBA;&#x3002;&#x8FD9;&#x5C31;&#x5BFC;&#x81F4;&#x6211;&#x9700;&#x8981;&#x77E5;&#x9053;&#x4F55;&#x5904;&#x53D1;&#x751F;&#x4E86;&#x9884;&#x671F;&#x5916;&#x7684;&#x7F16;&#x8BD1;&#x3002;</p><p>Numba&#x63D0;&#x4F9B;&#x4E86;&#x7F16;&#x8BD1;&#x51FD;&#x6570;&#x7684;&#x91CD;&#x8F7D;&#x529F;&#x80FD;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x62E6;&#x622A;&#x4E0B;&#x6765;&#xFF0C;&#x6253;&#x5370;&#x6808;&#x4FE1;&#x606F;&#xFF0C;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x5B9A;&#x4F4D;&#x5230;&#x53D1;&#x751F;JIT&#x7684;&#x51FD;&#x6570;&#x3002;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A;&#x4E00;&#x4E2A;numba&#x7F16;&#x8BD1;hook&#x51FD;&#x6570;&#x3002;</p><pre><code class="language-Python">import traceback
import numba as nb

compile = nb.core.registry.CPUDispatcher.compile
def jit_probe(*args, **kwargs):
    print(f&quot;------\ncompile {args[0]}:\n{&apos;&apos;.join(traceback.format_stack())}------&quot;)
    return compile(*args, **kwargs)

nb.core.registry.CPUDispatcher.compile = jit_probe</code></pre><p>&#x6548;&#x679C;&#xFF1A;</p><pre><code class="language-Bash">$ python3.8 testnb.py 
------
compile CPUDispatcher(&lt;function test at 0x7fa4b466a280&gt;):
  File &quot;testnb.py&quot;, line 22, in &lt;module&gt;
    test()
  File &quot;/home/kino/.local/lib/python3.8/site-packages/numba/core/dispatcher.py&quot;, line 420, in _compile_for_args
    return_val = self.compile(tuple(argtypes))
  File &quot;testnb.py&quot;, line 11, in jit_probe
    print(f&quot;------\ncompile {args[0]}:\n{&apos;&apos;.join(traceback.format_stack())}------&quot;)
------
$</code></pre><p>&#x4E0B;&#x9762;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x5F3A;&#x5316;&#x4E86;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x53EF;&#x4EE5;&#x6253;&#x5370;&#x65B0;&#x589E;&#x7684;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#xFF0C;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x5F80;&#x4E0B;&#x770B;&#x3002;</p><h2 id="%E6%98%AF%E4%BB%80%E4%B9%88%E5%AF%BC%E8%87%B4%E4%BA%86%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91">&#x662F;&#x4EC0;&#x4E48;&#x5BFC;&#x81F4;&#x4E86;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;</h2><p>&#x8FDB;&#x884C;Numba+Numpy&#x7684;&#x9AD8;&#x6027;&#x80FD;&#x5F00;&#x53D1;&#x65F6;&#xFF0C;&#x4F1A;&#x9047;&#x5230;&#x4E00;&#x4E9B;&#x96BE;&#x4EE5;&#x5B9A;&#x4F4D;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x4F1A;&#x5BFC;&#x81F4;&#x5DF2;&#x7ECF;&#x88AB;&#x7F16;&#x8BD1;&#x7684;&#x51FD;&#x6570;&#x518D;&#x6B21;&#x88AB;&#x7F16;&#x8BD1;&#xFF0C;&#x6BD4;&#x5982;&#x4F20;&#x5165;&#x51FD;&#x6570;&#x7684;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#x7531;np.int32&#x53D8;&#x6210;&#x4E86;np.int64&#x3002;</p><p>&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x4F7F;&#x7528;<strong><code>.signatures</code></strong> &#x51FD;&#x6570;&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x5DF2;&#x7F16;&#x8BD1;&#x51FD;&#x6570;&#x7684;&#x6240;&#x6709;&#x7B7E;&#x540D;&#x7EC4;&#x5408;&#x3002;</p><p>Note&#xFF1A;Numba&#x5728;&#x7F16;&#x8BD1;&#x51FD;&#x6570;&#x5BF9;&#x8C61;&#x540E;&#xFF0C;&#x4F1A;&#x4E3A;&#x65B0;&#x7684;&#x51FD;&#x6570;&#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E00;&#x4E9B;&#x51FD;&#x6570;&#xFF0C;&#x56E0;&#x4E3A;&#x6CA1;&#x6709;&#x7B7E;&#x540D;&#xFF0C;VSCode&#x7ED9;jitted func&#x540E;&#x9762;&#x52A0;&#x4E2A;&apos;.&apos;dot&#x610F;&#x56FE;&#x8BBF;&#x95EE;&#x662F;&#x4E0D;&#x4F1A;&#x6709;&#x8BED;&#x6CD5;&#x9AD8;&#x4EAE;&#x548C;&#x8054;&#x60F3;&#x7684;&#x3002;</p><p>&#x7565;&#x5FAE;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#x4E0A;&#x9762;&#x7684;hook&#xFF0C;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x4E2A;&#x52A0;&#x5F3A;&#x7248;&#x7684;probe&#xFF1A;</p><pre><code class="language-Python">import traceback
import numba as nb

compile = nb.core.registry.CPUDispatcher.compile

def jit_probe(*args, **kwargs):
    r = compile(*args, **kwargs)
    print(&quot;------&quot;)
    print(f&quot;compile {args[0]}:\n{&apos;&apos;.join(traceback.format_stack())}&quot;)
    print(f&quot;signature: {args[0].signatures[-1]}&quot;)
    print(&quot;------&quot;)
    return r

nb.core.registry.CPUDispatcher.compile = jit_probe

@nb.njit
def test(a):
    pass

test(1)
test(1.0)</code></pre><p>&#x6548;&#x679C;&#xFF1A;</p><pre><code class="language-Bash">$ python3.8 testnb.py 
------
compile CPUDispatcher(&lt;function test at 0x7f660f191280&gt;):
  File &quot;testnb.py&quot;, line 23, in &lt;module&gt;
    test(1)
  File &quot;/home/nji/.local/lib/python3.8/site-packages/numba/core/dispatcher.py&quot;, line 420, in _compile_for_args
    return_val = self.compile(tuple(argtypes))
  File &quot;testnb.py&quot;, line 9, in jit_probe
    print(f&quot;compile {args[0]}:\n{&apos;&apos;.join(traceback.format_stack())}&quot;)

added signature: (int64,)
------
------
compile CPUDispatcher(&lt;function test at 0x7f660f191280&gt;):
  File &quot;testnb.py&quot;, line 24, in &lt;module&gt;
    test(1.0)
  File &quot;/home/nji/.local/lib/python3.8/site-packages/numba/core/dispatcher.py&quot;, line 420, in _compile_for_args
    return_val = self.compile(tuple(argtypes))
  File &quot;testnb.py&quot;, line 9, in jit_probe
    print(f&quot;compile {args[0]}:\n{&apos;&apos;.join(traceback.format_stack())}&quot;)

added signature: (float64,)
------
$ </code></pre><p>Numba&#x5E76;&#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x4E13;&#x95E8;&#x7684;&#x5DE5;&#x5177;&#x51FD;&#x6570;&#x5B8C;&#x6210;&#x8FD9;&#x4E2A;&#x9700;&#x6C42;&#x3002;&#x4F46;&#x662F;&#xFF0C;hook&#x5B83;&#x7684;&#x7F16;&#x8BD1;&#x51FD;&#x6570;&#xFF0C;&#x7528;&#x8FD9;&#x79CD;&#x7A0D;&#x6709;&#x4E9B;tricky&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x5F88;&#x7B80;&#x5355;&#x5730;&#x62FF;&#x5230;&#x7F16;&#x8BD1;&#x53D1;&#x751F;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x4EE5;&#x53CA;&#x9020;&#x6210;&#x7F16;&#x8BD1;&#x7684;&#x53C2;&#x6570;&#x7B7E;&#x540D;&#x5217;&#x8868;&#x3002;</p><p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F1A;&#x7EE7;&#x7EED;&#x5B8C;&#x5584;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x8865;&#x5145;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x8BC4;&#x8BBA;&#x533A;&#x7559;&#x8A00;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[【最佳实践】JSON校验]]></title><description><![CDATA[任何语言都可以考虑的JSON校验方案，拒绝100个if-else。]]></description><link>https://blog.jnn.icu/zui-jia-shi-jian-json-jiao-yan/</link><guid isPermaLink="false">64412c1bb2ef5100019488f6</guid><category><![CDATA[Django]]></category><category><![CDATA[python]]></category><category><![CDATA[后端]]></category><category><![CDATA[教程]]></category><category><![CDATA[最佳实践]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Wed, 22 Sep 2021 17:30:19 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2022/07/jsonschema.png" medium="image"/><content:encoded><![CDATA[
<!--kg-card-begin: html-->
<h2>&#x524D;&#x8A00;</h2>
<img src="https://blog.jnn.icu/content/images/2022/07/jsonschema.png" alt="&#x3010;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x3011;JSON&#x6821;&#x9A8C;"><p>&#x4E00;&#x4E2A;&#x6BB5;&#x597D;&#x7684;&#x4EE3;&#x7801;&#x5E94;&#x8BE5;&#x662F;&#x4F18;&#x96C5;&#x7684;&#xFF0C;&#x62E5;&#x6709;&#x5F3A;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x3001;&#x5F3A;&#x7A33;&#x5065;&#x6027;&#x3001;&#x9AD8;&#x7B80;&#x6D01;&#x6027;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x8981;&#x5B9E;&#x73B0;&#x590D;&#x7528;&#x3002;&#x524D;&#x4E24;&#x70B9;&#xFF0C;&#x901A;&#x8FC7;&#x7CBE;&#x5FC3;&#x7684;&#x8BBE;&#x8BA1;&#x548C;&#x5BF9;&#x60C5;&#x51B5;&#x7684;&#x8BE6;&#x5C3D;&#x8003;&#x8651;&#xFF0C;&#x662F;&#x5F88;&#x5BB9;&#x6613;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x8981;&#x5B9E;&#x73B0;&#x5F3A;&#x7A33;&#x5065;&#x6027;&#xFF0C;&#x5F88;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x727A;&#x7272;&#x7B80;&#x6D01;&#x6027;&#xFF08;&#x4E0B;&#x9762;&#x6709;&#x4E2A;&#x4F8B;&#x5B50;&#x8BB2;&#x4E3A;&#x4EC0;&#x4E48;&#xFF09;&#xFF0C;&#x4E8E;&#x662F;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x7B80;&#x6D01;&#x6027;&#x4FBF;&#x6210;&#x4E3A;&#x4E86;&#x5F71;&#x54CD;&#x7F16;&#x5199;&#x4F18;&#x96C5;&#x4EE3;&#x7801;&#x7684;&#x5173;&#x952E;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x6211;&#x5728;&#x5199;&#x540E;&#x7AEF;&#x65F6;&#x7ECF;&#x5E38;&#x4F1A;&#x6709;&#x8FD9;&#x4E48;&#x4E00;&#x4E2A;&#x9700;&#x6C42;&#xFF1A;&#x6211;&#x5B9A;&#x4E49;&#x7684;&#x67D0;&#x4E2A;&#x63A5;&#x53E3;&#x6536;&#x5230;&#x4E86;&#x4E00;&#x4E9B;&#x8BF7;&#x6C42;&#xFF0C;&#x8FD9;&#x4E9B;&#x8BF7;&#x6C42;&#x7684;&#x6765;&#x6E90;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#xFF0C;&#x5185;&#x5BB9;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#xFF0C;&#x683C;&#x5F0F;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#xFF0C;&#x6211;&#x8981;&#x8BA9;&#x5904;&#x7406;&#x8FD9;&#x4E9B;&#x8BF7;&#x6C42;&#x7684;&#x6D41;&#x7A0B;&#x4FDD;&#x6301;&#x6709;&#x6548;&#xFF0C;&#x80FD;&#x591F;&#x5BF9;&#x5404;&#x7C7B;&#x5F02;&#x5E38;&#x548C;&#x975E;&#x6CD5;&#x7684;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x8BC6;&#x522B;&#x548C;&#x54CD;&#x5E94;&#x3002;&#x73B0;&#x5728;&#xFF0C;&#x8BA9;&#x6211;&#x5C55;&#x793A;&#x4E00;&#x4E0B;&#x65B0;&#x624B;&#xFF08;&#x521A;&#x5F00;&#x59CB;&#x63A5;&#x89E6;&#x8FD9;&#x7C7B;&#x5F00;&#x53D1;&#x65F6;&#x7684;&#x6211;&#xFF09;&#x4F1A;&#x600E;&#x4E48;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x9700;&#x6C42;&#x3002;</p>
<h2>&#x4E00;&#x4E9B;&#x539F;&#x59CB;&#x65B9;&#x6848;</h2>
<h3>&#x6BD4;&#x521D;&#x5B66;&#x65F6;&#x7684;&#x6211;&#x8FD8;&#x65B0;&#x7684;&#x65B0;&#x624B;</h3>
<pre><code class="language-python line-numbers">def request_handler(req: HttpRequest) -&gt; JsonResponse:
    try:
        # do some preprocessing...
    except Exception:
        return JsonResponse({
            &apos;code&apos;: 1,
            &apos;msg&apos;: &quot;internal error&quot;
        })
    # do something...
    return JsonResponse({
        &apos;code&apos;: 0,
        &apos;msg&apos;: &quot;success&quot;
    })
</code></pre>
<p>&#x770B;&#x8D77;&#x6765;&#x89E3;&#x51B3;&#x4E86;&#x95EE;&#x9898;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x4EA7;&#x751F;&#x4E86;&#x5F88;&#x591A;&#x522B;&#x7684;&#x95EE;&#x9898;&#x3002;&#x9996;&#x5148;&#xFF0C;try-catch&#x4F1A;&#x9690;&#x85CF;&#x903B;&#x8F91;&#x9519;&#x8BEF;&#xFF0C;&#x4F60;&#x53EA;&#x77E5;&#x9053;&#x5B83;&#x51FA;&#x95EE;&#x9898;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x77E5;&#x9053;&#x51FA;&#x4E86;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x3002;&#x4E5F;&#x8BB8;&#x4F60;&#x4F1A;&#x5728;&#x65E5;&#x5FD7;&#x91CC;&#x6253;&#x5370;&#x5F02;&#x5E38;&#x4FE1;&#x606F;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x53EF;&#x5426;&#x8BA4;&#x7684;&#x662F;&#x5F88;&#x591A;&#x5F02;&#x5E38;&#x4FE1;&#x606F;&#x662F;&#x4F4E;&#x53EF;&#x8BFB;&#x6027;&#x7684;&#xFF0C;&#x4F60;&#x5E76;&#x4E0D;&#x80FD;&#x901A;&#x8FC7;&#x9605;&#x8BFB;&#x65E5;&#x5FD7;&#x7ACB;&#x523B;&#x4E86;&#x89E3;&#x662F;&#x54EA;&#x91CC;&#x51FA;&#x4E86;&#x95EE;&#x9898;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x5904;&#x7406;&#x65B9;&#x5F0F;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x8BA9;&#x7A0B;&#x5E8F;&#x4EA7;&#x751F;&#x4E00;&#x4E9B;&#x4E0D;&#x53EF;&#x63A7;&#x56E0;&#x7D20;&#xFF08;&#x9B3C;&#x77E5;&#x9053;&#x975E;&#x6CD5;&#x8F93;&#x5165;&#x5728;try-catch&#x91CC;&#x9762;&#x5E72;&#x4E86;&#x4EC0;&#x4E48;&#x4E8B;&#x60C5;&#xFF09;</p>
<h3>&#x521D;&#x5B66;&#x65F6;&#x7684;&#x6211;</h3>
<p>&#x8FD9;&#x662F;&#x6211;&#x505A;&#x5927;&#x521B;&#x9879;&#x76EE;&#x65F6;&#x7684;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;</p>
<pre><code class="language-python line-numbers">def queryCardPage(request: HttpRequest) -&gt; JsonResponse:
    # &#x9884;&#x5148;&#x5B9A;&#x4E49;&#x57FA;&#x7840;&#x7684;&#x8FD4;&#x56DE; Json
    respj = {
        &apos;code&apos;: None,
        &apos;message&apos;: None,
        &apos;data&apos;: {}
    }
    data = respj[&apos;data&apos;]

    # &#x68C0;&#x67E5;&#x8BF7;&#x6C42;&#x7C7B;&#x578B;
    if request.method != &apos;GET&apos;:
        respj[&apos;code&apos;] = 0
        respj[&apos;message&apos;] = &quot;bad request&quot;
        return JsonResponse(respj)

    courtId = request.GET.get(&apos;court&apos;)
    pageSize = request.GET.get(&apos;size&apos;)
    pageAt = request.GET.get(&apos;page&apos;)
    cardType = request.GET.get(&apos;type&apos;)
    targetType = request.GET.get(&apos;target&apos;)
    searchText = request.GET.get(&apos;name&apos;)
    normal = request.GET.get(&apos;normal&apos;)
    student = request.GET.get(&apos;student&apos;)
    faculty = request.GET.get(&apos;faculty&apos;)

    # &#x53C2;&#x6570;&#x5408;&#x6CD5;&#x6027;&#x6821;&#x9A8C;
    if courtId is None or pageSize is None or pageAt is None \
       or not v.integerValidate(courtId) \
       or not v.integerValidate(pageSize, positive=True) \
       or not v.integerValidate(pageAt, positive=True) \
       or (normal is not None and not v.integerValidate(normal)) \
       or (student is not None and not v.integerValidate(student)) \
       or (faculty is not None and not v.integerValidate(faculty)) \
       or (cardType is not None and not v.integerValidate(cardType, positive=True)) \
       or (targetType is not None and not v.integerValidate(targetType, positive=True)):
        respj[&apos;code&apos;] = 0
        respj[&apos;message&apos;] = &quot;bad request&quot;
        return JsonResponse(respj)

    # do something HERE...

    respj[&apos;code&apos;] = 0
    respj[&apos;message&apos;] = &quot;success&quot;
    respj[&apos;data&apos;] = &apos;...&apos;
    return JsonResponse(respj)
</code></pre>
<p>&#x597D;&#x7684;&#xFF01;&#x6211;&#x6210;&#x529F;&#x5B8C;&#x6210;&#x4E86;&#x8FD9;&#x4E2A;&#x9700;&#x6C42;&#xFF0C;&#x4E3A;<code>do something HERE...</code>&#x4FDD;&#x8BC1;&#x4E86;&#x8F93;&#x5165;&#x7684;&#x5408;&#x6CD5;&#x6027;&#xFF01;&#x5C31;&#x662F;&#x2026;&#x8FD9;&#x6BB5;&#x5904;&#x7406;&#x53C8;&#x81ED;&#x53C8;&#x957F;&#x1F92E;</p>
<p><strong>&#x5BF9;&#xFF0C;&#x8FD9;&#x4E2A;&#x539F;&#x59CB;&#x7684;&#x65B9;&#x6848;&#x975E;&#x5E38;&#x7684;&#x9EBB;&#x70E6;&#x3001;&#x7E41;&#x7410;&#xFF0C;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x548C;&#x53EF;&#x8BFB;&#x6027;&#x4E5F;&#x4E0D;&#x9AD8;&#xFF0C;&#x4E0B;&#x9762;&#x770B;&#x770B;&#x6709;&#x4EC0;&#x4E48;&#x66F4;&#x4F18;&#x96C5;&#x7684;&#x65B9;&#x6848;</strong></p>
<h2>&#x66F4;&#x4F18;&#x96C5;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;</h2>
<p>2021&#x5E74;9&#x6708;19&#x65E5;&#xFF0C;&#x6211;&#x53C8;&#x5F00;&#x59CB;&#x5199;&#x540E;&#x7AEF;&#xFF0C;&#x8FD9;&#x6B21;&#x56E0;&#x4E3A;&#x6709;&#x4E86;&#x4E00;&#x4E9B;&#x7ECF;&#x9A8C;&#xFF0C;&#x4FBF;&#x5F00;&#x59CB;&#x601D;&#x8003;&#x6709;&#x6CA1;&#x6709;&#x66F4;&#x5408;&#x7406;&#x7684;&#x65B9;&#x5F0F;&#x5904;&#x7406;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;</p>
<h3>&#x4E00;&#x4E9B;&#x601D;&#x8003;</h3>
<p>&#x80FD;&#x4E0D;&#x80FD;&#x7528;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x53BB;&#x5B8C;&#x6210;&#x9A8C;&#x8BC1;&#xFF1F;&#x7A0D;&#x5FAE;&#x601D;&#x8003;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x60F3;&#x7ED9;&#x6240;&#x6709;&#x63A5;&#x53E3;&#x7528;&#xFF0C;&#x8FD9;&#x4E0D;&#x662F;&#x626F;&#x6DE1;&#x5417;&#xFF1F;&#x6BCF;&#x4E2A;&#x63A5;&#x53E3;&#x8981;&#x6C42;&#x7684;&#x5B57;&#x6BB5;&#x90FD;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x8FD8;&#x6709;&#x5BF9;&#x5B57;&#x6BB5;&#x5185;&#x5BB9;&#x66F4;&#x7EC6;&#x7C92;&#x5EA6;&#x7684;&#x8981;&#x6C42;&#xFF0C;pass</p>
<p>&#x8FD0;&#x7528;&#x4E00;&#x4E0B;&#x81EA;&#x52A8;&#x673A;&#x7684;&#x601D;&#x7EF4;&#xFF1F;&#x7F16;&#x5199;&#x4E00;&#x4E2A;&#x4EBA;&#x7C7B;&#x53EF;&#x8BFB;&#x7684;&#x8BED;&#x6CD5;&#x5B9A;&#x4E49;&#x5F0F;&#xFF0C;&#x4E3A;&#x6BCF;&#x4E2A;&#x63A5;&#x53E3;&#x5355;&#x72EC;&#x5199;&#x4E00;&#x4E2A;&#x5BF9;&#x8F93;&#x5165;&#x7684;&#x8BED;&#x6CD5;&#x5B9A;&#x4E49;&#xFF0C;&#x7136;&#x540E;&#x53BB;&#x6784;&#x5EFA;&#x8FD9;&#x4E2A;&#x8BED;&#x6CD5;&#x5B9A;&#x4E49;&#x7684;&#x81EA;&#x52A8;&#x673A;&#xFF0C;&#x5728;&#x8BF7;&#x6C42;&#x53D1;&#x8FC7;&#x6765;&#x65F6;&#xFF0C;&#x7528;&#x81EA;&#x52A8;&#x673A;&#x53BB;&#x5339;&#x914D;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#xFF1F;&#x611F;&#x89C9;&#x53EF;&#x884C;&#xFF0C;&#x62E5;&#x6709;&#x901A;&#x7528;&#x7684;&#x5408;&#x6CD5;&#x6027;&#x5224;&#x65AD;&#x80FD;&#x529B;&#x3002;&#x6765;&#x627E;&#x627E;&#x6709;&#x6CA1;&#x6709;&#x8F6E;&#x5B50;&#x53EF;&#x4EE5;&#x7528;&#xFF01;</p>
<h3>JSON Schema</h3>
<p>JSON Schema&#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x653E;&#x7684;&#x6807;&#x51C6;&#x683C;&#x5F0F;&#xFF0C;&#x5B83;&#x7528;&#x4E8E;&#x63CF;&#x8FF0;&#x4E00;&#x4E2A;&#x201C;&#x5408;&#x6CD5;&#x7684;JSON&#x6587;&#x6863;&#x201D;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x7528;&#x9014;&#x5C31;&#x662F;&#x5B9E;&#x4F8B;&#x9A8C;&#x8BC1;&#xFF0C;&#x4E0B;&#x9762;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p>
<pre><code class="language-json line-numbers">{
    &quot;type&quot;: &quot;object&quot;,
    &quot;required&quot;: [&quot;title&quot;],
    &quot;properties&quot;: {
        &quot;title&quot;: {&quot;type&quot;: &quot;string&quot;},
        &quot;tag&quot;: {
            &quot;type&quot;: &quot;array&quot;,
            &quot;items&quot;: {
                &quot;type&quot;: &quot;string&quot;,
                &quot;minLength&quot;: 1
            }
        },
        &quot;author&quot;: {&quot;type&quot;: &quot;string&quot;, &quot;minLength&quot;: 1},
        &quot;gallery&quot;: {&quot;type&quot;: &quot;string&quot;, &quot;minLength&quot;: 1},
        &quot;minRating&quot;: {&quot;type&quot;: &quot;number&quot;, &quot;minimum&quot;: 0, &quot;maximum&quot;: 10}
    }
}
</code></pre>
<p>&#x8FD9;&#x4E2A;JSON Schema&#x6587;&#x6863;&#xFF08;&#x4E0B;&#x9762;&#x79F0;Pattern&#xFF09;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;&#x5408;&#x6CD5;&#x8F93;&#x5165;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x8981;&#x6C42;&#x8F93;&#x5165;&#x7684;JSON&#x6587;&#x6863;&#xFF08;&#x4E0B;&#x9762;&#x79F0;&#x8FD9;&#x4E2A;&#x6587;&#x6863;&#x4E3A;A&#xFF09;&#x6EE1;&#x8DB3;&#x5B83;&#x5B9A;&#x4E49;&#x7684;&#x8981;&#x6C42;&#xFF1A;A&#x4E2D;&#x4E00;&#x5B9A;&#x8981;&#x51FA;&#x73B0;&#x201D;title&#x201D;&#x5B57;&#x6BB5;&#xFF0C;&#x5176;&#x4F59;&#x5B57;&#x6BB5;&#x53EF;&#x9009;&#xFF0C;&#x5E76;&#x4E14;&#xFF0C;A&#x4E2D;&#x53EA;&#x8981;&#x51FA;&#x73B0;&#x4E86;&#x5728;Pattern&#x7684;properties&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x5B57;&#x6BB5;&#xFF0C;&#x8BE5;&#x5B57;&#x6BB5;&#x5C31;&#x5FC5;&#x987B;&#x6EE1;&#x8DB3;properties&#x4E2D;&#x5BF9;&#x5B83;&#x7684;&#x9650;&#x5236;&#x6761;&#x4EF6;&#x3002;</p>
<p>&#x5149;&#x6709;&#x8FD9;&#x4E2A;Pattern&#x8FD8;&#x505A;&#x4E0D;&#x4E86;&#x5BF9;JSON&#x7684;&#x9A8C;&#x8BC1;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x9700;&#x8981;&#x62E5;&#x6709;&#x5BF9;JSON Schema&#x9A8C;&#x8BC1;&#x5668;&#x7684;&#x5B9E;&#x73B0;&#xFF08;&#x8F6E;&#x5B50;&#xFF09;</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x8FDE;&#x63A5;&#x6307;&#x5411;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#x5E93;&#xFF0C;&#x91CC;&#x9762;&#x5217;&#x4E3E;&#x4E86;&#x7528;&#x4E0D;&#x540C;&#x8BED;&#x8A00;&#x5B9E;&#x73B0;JSON Schema&#x6821;&#x9A8C;&#x7684;&#x5F00;&#x6E90;&#x9879;&#x76EE;</p>
<blockquote><p>
  <strong>JSON Schema</strong> is a vocabulary that allows you to <strong>annotate</strong> and <strong>validate</strong> JSON documents.<br>
  <a class="wp-editor-md-post-content-link" href="https://json-schema.org/?ref=blog.jnn.icu">JSON Schema | The home of JSON Schema (json-schema.org)</a>
</p></blockquote>
<p>&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4EE5;Python&#x7684; <a class="wp-editor-md-post-content-link" href="https://pypi.org/project/jsonschema/?ref=blog.jnn.icu">jsonschema</a> &#x4E3A;&#x4F8B;&#xFF0C;&#x8FD9;&#x4E2A;&#x7B2C;&#x4E09;&#x65B9;&#x5F00;&#x6E90;&#x5305;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;JSON Schema validator&#xFF0C;&#x76F4;&#x63A5;&#x7528;Python&#x7684;&#x5B57;&#x5178;&#x8868;&#x793A;JSON Schema&#x5373;&#x53EF;</p>
<pre><code class="language-python line-numbers">import json
import jsonschema

schema = {
    &apos;type&apos;: &apos;object&apos;,
    &apos;required&apos;: [&apos;...&apos;],
    &apos;properties&apos;: {
        &apos;...&apos;: {&apos;type&apos;: &apos;...&apos;}
    }
}

def request_handler(http_req: HttpRequest) -&gt; JsonResponse:
    if http_req.method == &apos;GET&apos;:
        return JsonResponse({
            &apos;code&apos;: 1,
            &apos;msg&apos;: &quot;not post&quot;
        })
    try:
        req = json.loads(http_req.body)
        jsonschema.validate(req, schema=schema)
    except JSONDecodeError:
        return JsonResponse({
            &apos;code&apos;: 1,
            &apos;msg&apos;: &apos;not json format&apos;
        })
    except ValidationError as e:
        return JsonResponse({
            &apos;code&apos;: 1,
            &apos;msg&apos;: f&quot;bad request format: {e.message}&quot;
        })

    # do something HERE...

    return JsonResponse({
        &apos;code&apos;: 0,
        &apos;msg&apos;: &quot;success&quot;,
        &apos;response&apos;: &apos;...&apos;
    })
</code></pre>
<p>&#x8FD0;&#x884C;&#x5230;<code>do something HERE...</code>&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C31;&#x80FD;&#x786E;&#x4FDD;req&#x662F;&#x4E00;&#x4E2A;&#x5408;&#x6CD5;&#x7684;JSON&#xFF08;&#x5B57;&#x5178;&#xFF09;&#x8BF7;&#x6C42;&#x4E86;</p>
<p><strong>&#x8FD9;&#x91CC;&#x8FD8;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x8FDB;&#x4E00;&#x6B65;&#x62BD;&#x8C61;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;<code>do something HERE...</code>&#x62BD;&#x8C61;&#x51FA;&#x6765;&#xFF0C;&#x653E;&#x5230;service&#x5C42;&#x5185;&#xFF0C;&#x4E8E;&#x662F;&#x8FD9;&#x91CC;&#x7684;request_handler&#x53D8;&#x6210;&#x4E3A;&#x4E86;&#x7EAF;&#x7CB9;&#x7684;controller&#x7EC4;&#x4EF6;</strong></p>
<p>&#x1F446;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x4E1A;&#x52A1;&#x5C42;&#x4E0E;&#x63A7;&#x5236;&#x5C42;&#x7684;&#x5B8C;&#x5168;&#x5206;&#x79BB;&#xFF0C;&#x903B;&#x8F91;&#x4E0A;&#x4E5F;&#x4F1A;&#x6E05;&#x6670;&#x5F88;&#x591A;&#xFF0C;&#x5206;&#x79BB;&#x540E;&#x4E1A;&#x52A1;&#x5C42;&#x7684;&#x4EE3;&#x7801;&#x4E5F;&#x53EF;&#x4EE5;&#x88AB;&#x5176;&#x4ED6;&#x63A7;&#x5236;&#x5C42;&#x51FD;&#x6570;<strong>&#x590D;&#x7528;</strong>&#xFF0C;&#x53EF;&#x4EE5;&#x6D88;&#x706D;&#x4E00;&#x5927;&#x5806;&#x5197;&#x4F59;&#x4EE3;&#x7801;</p>
<hr>
<h2>&#x7ED3;&#x8BED;</h2>
<p>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x9700;&#x8981;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x5F00;&#x53D1;&#x7ECF;&#x9A8C;&#x624D;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#xFF0C;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4E2D;&#x4E5F;&#x4F53;&#x73B0;&#x4E86;&#x6211;&#x4E00;&#x4E9B;&#x66F2;&#x66F2;&#x6298;&#x6298;&#x7684;&#x5C1D;&#x8BD5;&#x8DEF;&#x5F84;&#xFF0C;&#x5E0C;&#x671B;&#x672C;&#x7BC7;&#x7B14;&#x8BB0;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x4E00;&#x4E9B;&#x4EBA;&#x5C11;&#x8D70;&#x4E00;&#x70B9;&#x70B9;&#x5F2F;&#x8DEF;~</p>
<p>2021&#x5E74;9&#x6708;22&#x65E5;</p>

<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[北京租房提取公积金流程]]></title><description><![CDATA[本文介绍了北京公积金租房提取的两种方式：无发票提取和租住商品房提取。无发票提取每月最多2000元，无需额外证明，只需承诺租住信息真实；租住商品房提取需开具租房发票，流程复杂但可提取更多公积金。公积金提取事项每月可发起或变更一次，建议选择每月3号及以后提取。详情可咨询北京住房公积金管理中心010-12329。了解更多北京公积金提取方式及详细流程，请继续阅读～]]></description><link>https://blog.jnn.icu/housing-provident-fund-withdrawal/</link><guid isPermaLink="false">664d9e6297075f000145445f</guid><category><![CDATA[教程]]></category><category><![CDATA[生活经验]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sat, 08 Jun 2024 14:47:05 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2024/06/IMG_2316.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2024/06/IMG_2316.jpeg" alt="&#x5317;&#x4EAC;&#x79DF;&#x623F;&#x63D0;&#x53D6;&#x516C;&#x79EF;&#x91D1;&#x6D41;&#x7A0B;"><p>&#x5317;&#x4EAC;&#x516C;&#x79EF;&#x91D1;&#x79DF;&#x623F;&#x63D0;&#x53D6;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;</p><ul><li>&#x65E0;&#x53D1;&#x7968;&#x63D0;&#x53D6;</li><li>&#x79DF;&#x4F4F;&#x5546;&#x54C1;&#x623F;&#x63D0;&#x53D6;</li></ul><h2 id="%E6%97%A0%E5%8F%91%E7%A5%A8%E6%8F%90%E5%8F%96">&#x65E0;&#x53D1;&#x7968;&#x63D0;&#x53D6;</h2><p>&#x65E0;&#x53D1;&#x7968;&#x63D0;&#x53D6;&#x65B9;&#x5F0F;&#x4E00;&#x4E2A;&#x6708;&#x6700;&#x591A;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;2000&#x4EBA;&#x6C11;&#x5E01;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x627F;&#x8BFA;&#x79DF;&#x4F4F;&#x4FE1;&#x606F;&#x771F;&#x5B9E;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x989D;&#x5916;&#x8BC1;&#x660E;&#x6750;&#x6599;&#x3002;</p><p>&#x6253;&#x5F00;&#x652F;&#x4ED8;&#x5B9D;&#x4EAC;&#x901A;&#x5C0F;&#x7A0B;&#x5E8F;&#xFF0C;&#x9009;&#x62E9;&#x79DF;&#x623F;&#x516C;&#x79EF;&#x91D1;&#x63D0;&#x53D6;&#xFF0C;&#x9875;&#x9762;&#x586B;&#x5199;&#x57FA;&#x672C;&#x4FE1;&#x606F;&#x9009;&#x62E9;&#x65E0;&#x53D1;&#x7968;&#x63D0;&#x53D6;&#x65B9;&#x5F0F;&#xFF0C;&#x6CA1;&#x6709;&#x7279;&#x522B;&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x63D0;&#x9192;&#x4E00;&#x4E0B;&#xFF0C;&#x5982;&#x679C;&#x5B9E;&#x9645;&#x5E76;&#x6CA1;&#x6709;&#x79DF;&#x623F;&#x53EA;&#x662F;&#x60F3;&#x63D0;&#x53D6;&#x516C;&#x79EF;&#x91D1;&#x7684;&#x8BDD;&#xFF0C;&#x9700;&#x8981;&#x627F;&#x62C5;&#x6B3A;&#x8BC8;&#x884C;&#x4E3A;&#x88AB;&#x53D1;&#x73B0;&#x7684;&#x6F5C;&#x5728;&#x5904;&#x7F5A;&#x98CE;&#x9669;&#xFF0C;&#x5373;&#x7981;&#x6B62;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x7684;&#x516C;&#x79EF;&#x91D1;&#x63D0;&#x53D6;&#x3002;</p><p>&#x63D0;&#x53D6;&#x7533;&#x8BF7;&#x9875;&#x9762;&#x9700;&#x8981;&#x586B;&#x5199;&#x7EA6;&#x5B9A;&#x63D0;&#x53D6;&#x65E5;&#x671F;&#xFF0C;&#x5EFA;&#x8BAE;&#x9009;&#x62E9;&#x6BCF;&#x6708;3&#x53F7;&#x53CA;&#x4EE5;&#x540E;&#xFF0C;1&#x53F7;2&#x53F7;&#x63D0;&#x53D6;&#x91CF;&#x5927;&#xFF0C;&#x5230;&#x8D26;&#x65F6;&#x95F4;&#x53EF;&#x80FD;&#x4E0D;&#x51C6;&#x786E;&#xFF0C;3&#x53F7;&#x4EE5;&#x540E;&#x57FA;&#x672C;&#x5C31;&#x662F;&#x7EA6;&#x5B9A;&#x54EA;&#x5929;&#x54EA;&#x5929;&#x5230;&#x8D26;&#x3002;</p><h2 id="%E6%9C%89%E5%8F%91%E7%A5%A8%E6%8F%90%E5%8F%96">&#x6709;&#x53D1;&#x7968;&#x63D0;&#x53D6;</h2><p>&#x76EE;&#x524D;&#x7F51;&#x4E0A;&#x51E0;&#x4E4E;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x5173;&#x4E8E;&#x5F00;&#x79DF;&#x623F;&#x53D1;&#x7968;&#x7684;&#x8BE6;&#x7EC6;&#x8D44;&#x6599;&#xFF0C;&#x6211;&#x5728;&#x7814;&#x7A76;&#x7684;&#x65F6;&#x5019;&#x6253;&#x4E86;&#x65E0;&#x6570;&#x54A8;&#x8BE2;&#x7535;&#x8BDD;&#xFF0C;&#x6BCF;&#x4E2A;&#x5355;&#x4F4D;&#x90FD;&#x4E0D;&#x77E5;&#x9053;&#x79DF;&#x623F;&#x53D1;&#x7968;&#x63D0;&#x53D6;&#x516C;&#x79EF;&#x91D1;&#x7684;&#x5B8C;&#x6574;&#x6D41;&#x7A0B;&#xFF0C;&#x7B97;&#x662F;&#x81EA;&#x5DF1;&#x63A2;&#x7D22;&#x51FA;&#x6765;&#x7684;&#x1F613;&#x3002;</p><ul><li>&#x597D;&#x5904;&#xFF1A;&#x79DF;&#x91D1;&#x591A;&#x5C11;&#x6700;&#x591A;&#x63D0;&#x591A;&#x5C11;</li><li>&#x574F;&#x5904;&#xFF1A;&#x6D41;&#x7A0B;&#x9EBB;&#x70E6;&#xFF0C;&#x5F00;&#x53D1;&#x7968;&#x9700;&#x8981;&#x4EA4;2.5%&#x5DE6;&#x53F3;&#x7684;&#x7A0E;</li></ul><p>&#x63D0;&#x53D6;&#x6D41;&#x7A0B;&#xFF1A;</p><ol><li>&#x7535;&#x8BDD;&#x54A8;&#x8BE2;&#x8857;&#x9053;&#x529E;&#xFF0C;&#x8BE2;&#x95EE;&#x53BB;&#x54EA;&#x91CC;&#x4EE3;&#x5F00;&#x79DF;&#x623F;&#x53D1;&#x7968;&#xFF0C;&#x627E;&#x5230;&#x8D1F;&#x8D23;&#x8857;&#x9053;&#x7684;&#x653F;&#x52A1;&#x529E;&#x516C;&#x5385;&#x4F4D;&#x7F6E;</li><li>&#x51C6;&#x5907;&#x6750;&#x6599;&#xFF1A;&#x548C;&#x4E2D;&#x4ECB;&#x6216;&#x623F;&#x4E1C;&#x8054;&#x7CFB;&#xFF0C;&#x83B7;&#x53D6;&#x79DF;&#x623F;&#x5907;&#x6848;&#x53F7;&#xFF08;&#x5982;&#xFF1A;ZL2023&#x6D77;112***&#x53F7;&#xFF09;&#xFF0C;&#x83B7;&#x53D6;&#x623F;&#x4E1C;&#x8EAB;&#x4EFD;&#x8BC1;&#x590D;&#x5370;&#x4EF6;&#xFF0C;&#x51C6;&#x5907;&#x597D;&#x623F;&#x4E1C;&#x7684;&#x624B;&#x673A;&#x53F7;&#x7801;&#xFF0C;&#x6253;&#x5370;&#x79DF;&#x623F;&#x5408;&#x540C;&#xFF0C;&#x6253;&#x5370;&#x81EA;&#x5DF1;&#x7684;&#x8EAB;&#x4EFD;&#x8BC1;&#x590D;&#x5370;&#x4EF6;&#xFF0C;&#x51C6;&#x5907;&#x597D;&#x81EA;&#x5DF1;&#x7684;&#x8EAB;&#x4EFD;&#x8BC1;&#x539F;&#x4EF6;</li><li>&#x7535;&#x8BDD;&#x54A8;&#x8BE2;&#x653F;&#x52A1;&#x529E;&#x786E;&#x8BA4;&#x8D44;&#x6599;&#x9F50;&#x5168;&#xFF0C;&#x786E;&#x8BA4;&#x5DE5;&#x4F5C;&#x65F6;&#x95F4;&#xFF0C;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x6BCF;&#x6708;24&#x53F7;&#x4E4B;&#x524D;&#x53EF;&#x4EE5;&#x5F00;&#x5177;&#x79DF;&#x623F;&#x53D1;&#x7968;&#xFF0C;24&#x53F7;&#x540E;&#x9700;&#x8981;&#x7B49;&#x5F85;&#x5230;&#x4E0B;&#x4E2A;&#x6708;1&#x53F7;</li><li>&#x7EBF;&#x4E0B;&#x524D;&#x5F80;&#x653F;&#x52A1;&#x529E;&#x5F00;&#x5177;&#x53D1;&#x7968;&#xFF0C;&#x9700;&#x8981;&#x7F34;&#x7EB3;&#x6708;&#x79DF;x&#x7F34;&#x7EB3;&#x6708;&#x6570;x2.5%&#x5DE6;&#x53F3;&#x7684;&#x4E2A;&#x7A0E;&#xFF0C;&#x9700;&#x8981;&#x6309;&#x5408;&#x540C;&#x79DF;&#x7EA6;&#x65F6;&#x95F4;&#x548C;&#x529E;&#x4E8B;&#x5458;&#x786E;&#x8BA4;&#x4F60;&#x9700;&#x8981;&#x5F00;&#x5177;&#x7684;&#x6708;&#x6570;&#xFF0C;12&#x4E2A;&#x6708;&#x79DF;&#x7EA6;&#x53EF;&#x4EE5;&#x591A;&#x6B21;&#x5F00;&#x5177;&#x4E5F;&#x53EF;&#x4EE5;&#x4E00;&#x6B21;&#x6027;&#x5F00;&#x5177;&#xFF0C;&#x4EA4;&#x7684;&#x7A0E;&#x662F;&#x4E0D;&#x53D8;&#x7684;&#xFF0C;&#x770B;&#x9700;&#x6C42;&#x5F00;&#x5177;</li><li>&#x6253;&#x5F00;&#x652F;&#x4ED8;&#x5B9D;&#x4EAC;&#x901A;&#x5C0F;&#x7A0B;&#x5E8F;&#xFF0C;&#x9009;&#x62E9;&#x79DF;&#x623F;&#x63D0;&#x53D6;&#x516C;&#x79EF;&#x91D1;&#xFF0C;&#x7C7B;&#x578B;&#x9009;&#x62E9;&#x79DF;&#x4F4F;&#x5546;&#x54C1;&#x623F;&#xFF0C;&#x5907;&#x6848;&#x53F7;&#x586B;&#x5199;&#x540E;&#x5927;&#x90E8;&#x5206;&#x4FE1;&#x606F;&#x4F1A;&#x81EA;&#x52A8;&#x586B;&#x5199;&#xFF0C;&#x4E0A;&#x4F20;&#x6240;&#x9700;&#x7684;&#x5168;&#x90E8;&#x6750;&#x6599;&#xFF0C;&#x9009;&#x62E9;&#x7EA6;&#x5B9A;&#x63D0;&#x53D6;&#x65E5;&#x671F;</li></ol><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x7533;&#x8BF7;&#x63D0;&#x53D6;&#x540E;&#x5F53;&#x6708;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;&#x5230;&#x8D26;&#x4E00;&#x6B21;&#xFF0C;&#x5982;&#x679C;&#x7EA6;&#x5B9A;&#x65E5;&#x671F;&#x5728;&#x7533;&#x8BF7;&#x65E5;&#x524D;&#xFF0C;&#x7533;&#x8BF7;&#x901A;&#x8FC7;&#x540E;&#x4F1A;&#x7ACB;&#x523B;&#x5230;&#x8D26;&#x3002;&#x516C;&#x79EF;&#x91D1;&#x63D0;&#x53D6;&#x4E8B;&#x9879;&#x6BCF;&#x4E2A;&#x6708;&#x53EF;&#x4EE5;&#x53D1;&#x8D77;/&#x53D8;&#x66F4;&#x4E00;&#x6B21;&#xFF0C;&#x5982;&#x679C;&#x5F53;&#x6708;&#x5DF2;&#x7ECF;&#x63D0;&#x53D6;&#x5230;&#x8D26;&#xFF0C;&#x5219;&#x4E0D;&#x80FD;&#x5728;&#x5F53;&#x6708;&#x53D1;&#x8D77;/&#x53D8;&#x66F4;&#x3002;&#x5177;&#x4F53;&#x89C4;&#x5219;&#x53EF;&#x4EE5;&#x7535;&#x8BDD;&#x54A8;&#x8BE2;&#x5317;&#x4EAC;&#x4F4F;&#x623F;&#x516C;&#x79EF;&#x91D1;&#x7BA1;&#x7406;&#x4E2D;&#x5FC3;010-12329&#x3002;</div></div><p>&#x5317;&#x4EAC;&#x79DF;&#x623F;&#x63D0;&#x53D6;&#x516C;&#x79EF;&#x91D1;&#x6D41;&#x7A0B;&#x5927;&#x81F4;&#x5982;&#x4E0A;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4EC0;&#x4E48;&#x7591;&#x95EE;&#x53EF;&#x4EE5;&#x53D1;&#x8868;&#x5728;&#x8BC4;&#x8BBA;&#x533A;&#xFF0C;&#x6211;&#x4F1A;&#x5C3D;&#x53EF;&#x80FD;&#x5B8C;&#x5584;&#x672C;&#x6587;&#x7AE0;&#x3002;</p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[后端入门]]></title><description><![CDATA[本文详细介绍了后端开发的基础知识，包括HTTP的工作原理、GET与POST请求的区别、以及HTTP请求的结构，特别强调了header和body的功能。文章还解释了Cookie的机制和安全性问题，以及JSON的重要性和应用。最后，本文探讨了后端框架的作用，如何利用它们简化HTTP服务器的开发过程，以及ORM的概念和其在数据库交互中的应用。]]></description><link>https://blog.jnn.icu/basic-concepts-in-back-end-development/</link><guid isPermaLink="false">64412c1bb2ef5100019488f3</guid><category><![CDATA[教程]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sat, 23 Jan 2021 22:37:00 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2022/07/backend-vs-frontend-2.png" medium="image"/><content:encoded><![CDATA[
<!--kg-card-begin: html-->
<h2>&#x57FA;&#x7840;&#x6982;&#x5FF5;</h2>
<h3>HTTP&#x7684;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;</h3>
<img src="https://blog.jnn.icu/content/images/2022/07/backend-vs-frontend-2.png" alt="&#x540E;&#x7AEF;&#x5165;&#x95E8;"><p>&#x5B8C;&#x6574;&#x7684;HTTP&#x8BF7;&#x6C42;&#x662F;&#x4E00;&#x6BB5;&#x8FDE;&#x7EED;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x524D;&#x6BB5;&#x662F;header&#xFF0C;&#x540E;&#x6BB5;&#x662F;body&#xFF0C;header&#x5185;&#x4E00;&#x822C;&#x662F;HTTP&#x6807;&#x51C6;&#x6307;&#x5B9A;&#x7684;&#x4FE1;&#x606F;&#xFF0C;body&#x4E3A;&#x6570;&#x636E;&#x4F53;&#xFF0C;&#x5305;&#x542B;&#x901A;&#x8BAF;&#x4E2D;&#x7684;&#x6570;&#x636E;</p>
<p>&#x8BF7;&#x6C42;&#x4E4B;&#x540E;HTTP&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x56DE;&#x590D;&#x4E00;&#x4E2A;&#x54CD;&#x5E94;&#xFF08;&#x5305;&#x542B;&#x72B6;&#x6001;&#x7801;&#x548C;&#x56DE;&#x590D;&#x5185;&#x5BB9;&#xFF09;</p>
<p>&#x4E0A;&#x9762;&#x4E24;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E4B;&#x540E;&#x4E00;&#x6B21;HTTP&#x901A;&#x8BAF;&#x5C31;&#x7ED3;&#x675F;&#x4E86;&#xFF08;&#x6210;&#x4E3A;&#x5386;&#x53F2;&#xFF0C;&#x6240;&#x8C13;&#x7684;&#x65E0;&#x72B6;&#x6001;&#x6027;&#xFF09;</p>
<h4>GET&#x548C;POST</h4>
<p>GET&#x8BF7;&#x6C42;&#x662F;&#x6CA1;&#x6709;body&#x7684;HTTP&#x8BF7;&#x6C42;&#xFF0C;&#x7528;&#x4E8E;&#x201C;&#x83B7;&#x53D6;&#x201D;&#x6570;&#x636E;&#xFF0C;&#x6BD4;&#x5982; <code>GET http://example.com/time</code>&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x83B7;&#x53D6;&#x65F6;&#x95F4;</p>
<p>GET&#x8BF7;&#x6C42;&#x53EF;&#x4EE5;&#x5728;URL&#x4E2D;&#x9644;&#x5E26;&#x53C2;&#x6570;&#xFF0C;&#x6BD4;&#x5982;<code>GET http://example.com/time?p=earth&amp;zone=beijing</code> &#x4ECE;&#x670D;&#x52A1;&#x5668;&#x83B7;&#x53D6; &#x5730;&#x7403; &#x4E0A; &#x5317;&#x4EAC; &#x65F6;&#x533A;&#x7684;&#x65F6;&#x95F4;</p>
<p>POST&#x8BF7;&#x6C42;&#x662F;&#x5305;&#x542B;body&#x7684;HTTP&#x8BF7;&#x6C42;&#xFF0C;&#x6570;&#x636E;&#x4F53;body&#x4E2D;&#x50A8;&#x5B58;&#x5BA2;&#x6237;&#x7AEF;&#x548C;&#x670D;&#x52A1;&#x7AEF;&#x7EA6;&#x5B9A;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x4F7F;&#x7528; Webform &#x6216;&#x8005; JSON &#x4F5C;&#x4E3A;&#x901A;&#x8BAF;&#x683C;&#x5F0F;</p>
<p>POST&#x8BF7;&#x6C42;&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;&#x662F;&#x4E0A;&#x4F20;&#x6587;&#x4EF6;&#x6216;&#x8005;&#x63D0;&#x4EA4;&#x8868;&#x5355;&#xFF0C;&#x4EE5;&#x53CA;&#x8C03;&#x7528;API&#x65F6;&#x7684;&#x4FE1;&#x606F;&#x4F20;&#x9012;</p>
<p><strong>&#x6CE8;&#x610F;</strong> POST&#x8BF7;&#x6C42;&#x7684;URL&#x4E5F;&#x53EF;&#x4EE5;&#x9644;&#x5E26;&#x53C2;&#x6570;</p>
<h4>&#x4E86;&#x89E3; header&#xFF0C;body</h4>
<p>header&#x5185;&#x4E00;&#x822C;&#x662F;HTTP&#x6807;&#x51C6;&#x6307;&#x5B9A;&#x7684;&#x4FE1;&#x606F;</p>
<p>header&#x662F;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x5F88;&#x591A;&#x4FDD;&#x7559;key&#xFF0C;&#x6BD4;&#x5982;&#x4E00;&#x6B21;&#x767E;&#x5EA6;&#x641C;&#x7D22;&#x7684;&#x8BF7;&#x6C42;</p>
<pre><code class="language-http line-numbers">GET https://www.baidu.com/s?ie=utf-8&amp;wd=&#x641C;&#x7D22;&#x5185;&#x5BB9; HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.49
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://www.baidu.com/s?wd=linux%20%E8%BF%85%E9%9B%B7%E5%BF%AB%E9%B8%9F&amp;rsv_spt=1&amp;rsv_iqid=0x95c7e05c000bda09&amp;issp=1&amp;f=8&amp;rsv_bp=1&amp;rsv_idx=2&amp;ie=utf-8&amp;tn=baiduhome_pg&amp;rsv_enter=1&amp;rsv_dl=tb&amp;rsv_sug3=25&amp;rsv_sug1=29&amp;rsv_sug7=100&amp;rsv_sug2=0&amp;rsv_btype=i&amp;inputT=6580&amp;rsv_sug4=6580
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5
Cookie: A=&#x8FD9;&#x91CC;&#x662F;Cookie; B=HTTP&#x8BF7;&#x6C42;&#x4E2D;Cookie&#x4F1A;&#x88AB;&#x6DFB;&#x52A0;&#x5728;header&#x4E2D;; Cookie&#x7684;&#x5185;&#x5BB9;&#x662F;&#x670D;&#x52A1;&#x5668;&#x51B3;&#x5B9A;&#x7684;&#xFF0C;&#x6BD4;&#x5982;sessionid&#x4F1A;&#x50A8;&#x5B58;&#x5728;Cookie
</code></pre>
<p><strong>&#x8FD9;&#x91CC;&#x9762;&#x7684;key&#x90FD;&#x662F;HTTP&#x8BF7;&#x6C42;&#x6807;&#x51C6;&#x4FDD;&#x7559;&#x7684;</strong></p>
<p>body&#x5185;&#x5BB9;&#x5B8C;&#x5168;&#x662F;&#x5F00;&#x53D1;&#x8005;&#x6765;&#x81EA;&#x5B9A;&#x7684;&#xFF0C;&#x4E0D;&#x5199;&#x4F8B;&#x5B50;&#x4E86;</p>
<h3>Cookie</h3>
<p>Cookie&#x662F;&#x50A8;&#x5B58;&#x5728;&#x672C;&#x5730;&#x7684;&#xFF0C;&#x5927;&#x5C0F;&#x9650;&#x5236;&#x4E3A;4k&#x7684;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x91CC;&#x9762;&#x5305;&#x542B;&#x4E00;&#x4E9B;&#x7531;&#x670D;&#x52A1;&#x5668;&#x51B3;&#x5B9A;&#x7684;&#x4FE1;&#x606F;</p>
<p>&#x6BD4;&#x5982;&#x4F60;&#x5728;example.com&#x767B;&#x9646;&#x4E86;&#x8D26;&#x53F7;&#xFF0C;&#x90A3;&#x4E48;example.com&#x7684;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x7ED9;&#x4F60;&#x5206;&#x53D1;&#x4E00;&#x4E2A;sessionid&#xFF0C;&#x5B83;&#x4F1A;&#x50A8;&#x5B58;&#x5728;&#x4F60;&#x7684;Cookie&#x91CC;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4E5F;&#x4F1A;&#x50A8;&#x5B58;&#x4E00;&#x4E2A;sessionid&#xFF0C;&#x6BCF;&#x6B21;HTTP&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;header&#x4E2D;&#x90FD;&#x4F1A;&#x9644;&#x4E0A;sessionid&#xFF08;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x9644;&#x4E0A;Cookie&#xFF09;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x53EF;&#x4EE5;&#x5728;&#x81EA;&#x5DF1;&#x7684;cache&#x4E2D;&#x5BFB;&#x627E;&#x4F60;&#x7684;sessionid&#xFF0C;&#x627E;&#x5230;&#x4E86;&#x5C31;&#x8BF4;&#x660E;&#x4F60;&#x767B;&#x9646;&#x4E86;&#xFF0C;&#x6CA1;&#x627E;&#x5230;&#x5C31;&#x662F;&#x6CA1;&#x767B;&#x9646;</p>
<p>Cookie&#x5E76;&#x4E0D;&#x5B89;&#x5168;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x670D;&#x52A1;&#x5668;&#x4ECE;cache&#x4E2D;&#x79FB;&#x9664;&#x4F60;&#x7684;sessionid&#x524D;&#xFF08;&#x767B;&#x9646;&#x8FC7;&#x671F;&#x4E4B;&#x524D;&#xFF09;&#xFF0C;&#x6709;&#x4EBA;&#x5077;&#x8D70;&#x4E86;&#x4F60;&#x7684;Cookie&#xFF08;&#x6BD4;&#x5982;&#x770B;&#x96EA;&#x7206;&#x51FA;&#x6765;&#x7684;&#xFF0C;QQ&#x4E00;&#x76F4;&#x5728;&#x5E72;&#x8FD9;&#x4E8B;&#xFF0C;&#x7B80;&#x76F4;&#x662F;&#x6728;&#x9A6C;&#x7A0B;&#x5E8F;&#xFF09;&#xFF0C;&#x90A3;&#x4E48;&#x4ED6;&#x5728;&#x8FD9;&#x6BB5;&#x65F6;&#x95F4;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5411;header&#x4E2D;&#x52A0;&#x4F60;&#x7684;sessionid&#x5192;&#x5145;&#x4F60;&#x5E72;&#x4EFB;&#x4F55;&#x4E8B;&#x60C5;</p>
<p>&#x522B;&#x7684;&#x4E00;&#x4E9B;&#x4FE1;&#x606F;&#x4E5F;&#x53EF;&#x4EE5;&#x50A8;&#x5B58;&#x5728;Cookie&#x4E2D;&#xFF0C;&#x8FD9;&#x5C31;&#x5B8C;&#x5168;&#x53D6;&#x51B3;&#x4E8E;&#x5F00;&#x53D1;&#x8005;&#x4E86;&#xFF08;&#x5176;&#x5B9E;&#x4E0A;&#x9762;&#x7684;session&#x4E5F;&#x53EA;&#x662F;&#x4E00;&#x79CD;&#x6A21;&#x578B;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x5927;&#x90E8;&#x5206;&#x4EBA;&#x5B9E;&#x73B0;&#x7684;session&#x6A21;&#x5F0F;&#x90FD;&#x662F;&#x5DEE;&#x4E0D;&#x591A;&#x7684;&#xFF09;</p>
<h4>Response</h4>
<p>&#x670D;&#x52A1;&#x5668;&#x6536;&#x5230;GET&#x548C;POST&#x8BF7;&#x6C42;&#x4E4B;&#x540E;&#xFF0C;&#x5904;&#x7406;&#x5B8C;&#x6BD5;&#xFF0C;&#x4F1A;&#x53D1;&#x9001;&#x4E00;&#x4E2A;Response&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;</p>
<hr>
<p>JSON</p>
<p>JSON&#x4E00;&#x5B9A;&#x8981;&#x638C;&#x63E1;&#xFF0C;&#x901A;&#x8BAF;&#x7684;&#x65F6;&#x5019;&#x7ECF;&#x5E38;&#x4F1A;&#x7528;&#x5230;&#xFF0C;&#x4E5F;&#x6709;&#x4E00;&#x4E9B;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x628A;&#x5B83;&#x5F53;&#x4F5C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF08;&#x4E0D;&#x8FC7;&#x56E0;&#x4E3A;&#x4E0D;&#x5141;&#x8BB8;&#x6CE8;&#x91CA;&#xFF0C;&#x6240;&#x4EE5;&#x5E76;&#x4E0D;&#x63A8;&#x8350;&#xFF09;</p>
<p>JSON&#x672C;&#x8EAB;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x53BB;W3C&#x4E4B;&#x7C7B;&#x7684;&#x5730;&#x65B9;&#x7A0D;&#x5FAE;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;</p>
<p>&#x9644;&#x4E2A;&#x94FE;&#x63A5; http://www.json.org.cn/</p>
<hr>
<h3>HTTP&#x670D;&#x52A1;&#x5668;</h3>
<p>&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;&#x7528;&#x6765;&#x5904;&#x7406;HTTP&#x8BF7;&#x6C42;&#x7684;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x8FC7;&#x6765;HTTP&#x8BF7;&#x6C42;&#xFF0C;&#x5728;HTTP&#x670D;&#x52A1;&#x5668;&#x53D7;&#x7406;&#x3001;&#x5B8C;&#x6210;&#x3001;&#x83B7;&#x5F97;&#x54CD;&#x5E94;</p>
<hr>
<h3>&#x540E;&#x7AEF;</h3>
<p>&#x540E;&#x7AEF;&#x662F;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x5316;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x7528;&#x6237;&#x5728;&#x524D;&#x7AEF;&#x505A;&#x4E86;&#x4E9B;&#x4E8B;&#x60C5;&#xFF0C;&#x524D;&#x7AEF;&#x628A;&#x4E1A;&#x52A1;&#x4FE1;&#x606F;&#x4F20;&#x9012;&#x7ED9;&#x540E;&#x7AEF;&#xFF0C;&#x540E;&#x7AEF;&#x53BB;&#x5B8C;&#x6210;&#x64CD;&#x4F5C;&#xFF0C;&#x518D;&#x628A;&#x7ED3;&#x679C;&#x544A;&#x8BC9;&#x524D;&#x7AEF;&#xFF0C;&#x524D;&#x7AEF;&#x518D;&#x628A;&#x7ED3;&#x679C;&#x4EE5;&#x53EF;&#x89C6;&#x5316;&#x7684;&#x65B9;&#x5F0F;&#x53CD;&#x9988;&#x7ED9;&#x7528;&#x6237;</p>
<p>&#x6CE8;&#xFF1A;&#x524D;&#x7AEF;&#x662F;&#x5728;&#x7528;&#x6237;&#x4F7F;&#x7528;&#x8F6F;&#x4EF6;&#x7684;&#x65F6;&#x5019;&#x7531;&#x670D;&#x52A1;&#x5668;&#x6574;&#x4F53;&#x53D1;&#x9001;&#x8FC7;&#x53BB;&#x7684;&#xFF0C;&#x5C31;&#x597D;&#x50CF;&#x53D1;&#x4E86;&#x4E2A;exe&#x8FC7;&#x53BB;&#xFF0C;&#x8FD9;&#x4E2A;exe&#x5728;&#x672C;&#x5730;&#x5E72;&#x6D3B;&#xFF0C;&#x65F6;&#x4E0D;&#x65F6;&#x8054;&#x7CFB;&#x4E0B;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x540E;&#x7AEF;&#xFF09;</p>
<p>&#x4E0B;&#x56FE;&#x662F;&#x4F20;&#x7EDF;&#x7684;&#x4E09;&#x5C42;&#x67B6;&#x6784;&#xFF08;&#x524D;&#x540E;&#x7AEF;&#x5206;&#x79BB;&#x6A21;&#x5F0F;&#x4E2D;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x7528;&#x6237;&#x754C;&#x9762;&#x5728;&#x524D;&#x7AEF;&#xFF09;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x7B2C;&#x4E00;&#x4E2A;&#x7BAD;&#x5934;&#x53EF;&#x4EE5;&#x770B;&#x4F5C;&#x7F51;&#x7EDC;&#x901A;&#x8BAF;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x7BAD;&#x5934;&#x8868;&#x793A;&#x6570;&#x636E;&#x8BBF;&#x95EE;&#x7684;&#x76EE;&#x6807;&#x662F;&#x6570;&#x636E;&#x5E93;&#xFF08;&#x6301;&#x4E45;&#x5316;&#x5C42;&#xFF09;&#xFF0C;&#x5176;&#x5B9E;&#x53EF;&#x4EE5;&#x770B;&#x4F5C;&#x56DB;&#x5C42;&#x67B6;&#x6784;&#x5427;&#xFF08;&#x9003;</p>
<p><img src="https://blog.jnn.icu/content/images/wordpress/2021/01/1535337833-7503-1359192536-4828.png" alt="&#x540E;&#x7AEF;&#x5165;&#x95E8;"></p>
<p>&#x4E00;&#x822C;&#x7684;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x90FD;&#x4F1A;&#x4EE5;&#x8FD9;&#x4E2A;&#x4E3A;&#x57FA;&#x7840;&#x8FDB;&#x884C;&#x540E;&#x7AEF;&#x7684;&#x5F00;&#x53D1;</p>
<p>&#x540E;&#x7AEF;&#x5F00;&#x53D1;&#x8005;&#x7684;&#x4EFB;&#x52A1;&#x662F;&#x8BBE;&#x8BA1;&#x540E;&#x4E09;&#x5768;&#x4E1C;&#x897F;</p>
<h4>&#x540E;&#x7AEF;&#x6846;&#x67B6;</h4>
<p>&#x8981;&#x624B;&#x52A8;&#x53BB;&#x505A;&#x4E00;&#x4E2A;HTTP&#x670D;&#x52A1;&#x5668;&#x5F88;&#x9EBB;&#x70E6;&#xFF08;&#x518D;&#x9020;&#x8F6E;&#x5B50;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x5F00;&#x53D1;&#x8005;&#x4EEC;&#x5F00;&#x53D1;&#x4E86;&#x5F88;&#x591A;&#x73B0;&#x6210;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x7528;&#x4E8E;&#x7B80;&#x5316;&#x6784;&#x5EFA;HTTP&#x670D;&#x52A1;&#x5668;&#x7684;&#x6D41;&#x7A0B;</p>
<p>&#x540E;&#x7AEF;&#x6846;&#x67B6;&#x4F1A;&#x4E3A;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x5B9E;&#x73B0;&#x5927;&#x91CF;&#x5E95;&#x5C42;&#x64CD;&#x4F5C;&#x3002;&#x5229;&#x7528;&#x6846;&#x67B6;&#xFF0C;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x53EF;&#x4EE5;&#x628A;&#x5927;&#x90E8;&#x5206;&#x7CBE;&#x529B;&#x96C6;&#x4E2D;&#x5728;&#x529F;&#x80FD;&#x4E0A;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5927;&#x91CF;&#x7E41;&#x7410;&#x7684;&#x5E95;&#x5C42;&#x64CD;&#x4F5C;</p>
<p><a class="wp-editor-md-post-content-link" href="https://blog.csdn.net/qq_40714902/article/details/78817173?ref=blog.jnn.icu">&#x4EC0;&#x4E48;&#x662F;&#x6846;&#x67B6;&#xFF1F;&#xFF08;&#x524D;&#x7AEF;&#x548C;&#x540E;&#x7AEF;&#xFF09;</a></p>
<h4>&#x6570;&#x636E;&#x5E93;</h4>
<p>&#x57FA;&#x4E8E;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x50A8;&#x5B58;&#x4FE1;&#x606F;&#xFF0C;&#x6301;&#x4E45;&#x5316;&#x4FDD;&#x5B58;&#x6570;&#x636E;&#xFF0C;&#x5177;&#x6709;&#x67E5;&#x8BE2;&#x3001;&#x65B0;&#x589E;&#x3001;&#x4FEE;&#x6539;&#x6570;&#x636E;&#x7684;&#x529F;&#x80FD;</p>
<p><a class="wp-editor-md-post-content-link" href="https://www.runoob.com/sql/sql-tutorial.html?ref=blog.jnn.icu">SQL(&#x7ED3;&#x6784;&#x5316;&#x67E5;&#x8BE2;&#x8BED;&#x8A00;)&#x6559;&#x7A0B;</a></p>
<h5>&#x5173;&#x7CFB;&#x6570;&#x636E;&#x5E93;&#x4E0E;&#x975E;&#x5173;&#x7CFB;&#x6570;&#x636E;&#x5E93;</h5>
<p>&#x5927;&#x4E8C;&#x8FD8;&#x6CA1;&#x4E0A;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8BFE;&#xFF0C;&#x7406;&#x8BBA;&#x77E5;&#x8BC6;&#x4E0D;&#x5145;&#x5206;&#xFF0C;&#x4E0D;&#x8BE6;&#x7EC6;&#x89E3;&#x91CA;&#x4E86;&#xFF08;&#x9003;</p>
<p>&#x5E73;&#x65F6;&#x4F7F;&#x7528;&#x7684;MySQL&#x7B49;&#x6570;&#x636E;&#x5E93;&#x5C31;&#x662F;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;</p>
<p>&#x975E;&#x5173;&#x7CFB;&#x578B;&#x5C31;&#x6BD4;&#x5982;&#x5229;&#x7528;Key-Value&#x952E;&#x503C;&#x5BF9;&#x50A8;&#x5B58;&#x7684;Redis&#xFF08;&#x53EF;&#x4EE5;&#x5F53;cache&#x7528;&#xFF09;</p>
<p>&#x8FD9;&#x4E9B;&#x7A0D;&#x5FAE;&#x6709;&#x4E2A;&#x6982;&#x5FF5;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;</p>
<h5>ORM</h5>
<p>&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x76F4;&#x63A5;&#x5728;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x4E2D;&#x4F7F;&#x7528;SQL&#x8BED;&#x53E5;&#x4F1A;&#x4F7F;&#x7A0B;&#x5E8F;&#x4E0D;&#x6613;&#x7406;&#x89E3;&#x3001;&#x96BE;&#x4EE5;&#x7EF4;&#x62A4;&#xFF0C;&#x540C;&#x65F6;&#x4F1A;&#x5BF9;&#x8FED;&#x4EE3;&#x66F4;&#x65B0;&#x9020;&#x6210;&#x5DE8;&#x5927;&#x9EBB;&#x70E6;&#xFF08;&#x7275;&#x4E00;&#x53D1;&#x800C;&#x52A8;&#x5168;&#x8EAB;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x4E2D;&#x72EC;&#x7ACB;&#x51FA;&#x4E86;&#x6570;&#x636E;&#x8BBF;&#x95EE;&#x5C42;&#xFF08;DAO&#x5C42;&#xFF0C;&#x6570;&#x636E;&#x8BBF;&#x95EE;&#x5BF9;&#x8C61;&#xFF09;&#xFF0C;&#x6570;&#x636E;&#x8BBF;&#x95EE;&#x5C42;&#x8BBE;&#x8BA1;&#x4EE5;&#x4E3A;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x5C42;&#x63D0;&#x4F9B;&#x7EDF;&#x4E00;&#x7684;&#x6570;&#x636E;&#x8BBF;&#x95EE;&#x63A5;&#x53E3;&#xFF0C;&#x4F7F;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x5C42;&#x4E0D;&#x5FC5;&#x5C06;&#x7CBE;&#x529B;&#x7528;&#x4E8E;&#x5904;&#x7406;&#x590D;&#x6742;&#x7684;&#x6570;&#x636E;&#x5E93;&#x5173;&#x7CFB;&#x4E0E;SQL&#x8BED;&#x53E5;&#x3002;</p>
<p>ORM &#x6307;&#x5BF9;&#x8C61;-&#x5173;&#x7CFB;&#x6620;&#x5C04;&#x3002;&#x5C06;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x62BD;&#x8C61;&#x4E3A;&#x7A0B;&#x5E8F;&#x4E2D;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>
<p>&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x6709; user &#x8868;&#xFF0C;&#x6B64;&#x65F6;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4ECE;&#x8868;&#x4E2D;&#x62BD;&#x8C61;&#x51FA; User &#x5BF9;&#x8C61;&#xFF0C;&#x5BF9; user &#x8868;&#x7684;&#x64CD;&#x4F5C;&#x89C6;&#x4E3A;&#x5BF9;&#x4E00;&#x7EC4; User &#x5BF9;&#x8C61;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x8FD9;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x5C42;&#xFF0C;&#x5904;&#x7406;&#x7684;&#x90FD;&#x662F; User &#x5BF9;&#x8C61;&#xFF0C;&#x5BF9; User &#x7684;&#x4FEE;&#x6539;&#x7B49;&#x4EF7;&#x4E8E;&#x5BF9; user &#x8868;&#x6570;&#x636E;&#x5143;&#x7D20;&#x7684;&#x4FEE;&#x6539;&#xFF0C;user &#x8868;&#x6570;&#x636E;&#x5143;&#x7D20;&#x7684;&#x53D8;&#x66F4;&#x4E5F;&#x4F1A;&#x540C;&#x6B65;&#x5230; User &#x5BF9;&#x8C61;&#x4E0A;&#x3002;</p>
<p><del>&#x540E;&#x7AEF;&#x6846;&#x67B6;&#x5927;&#x591A;&#x4F1A;&#x63D0;&#x4F9B;&#x7B80;&#x5316; ORM &#x5EFA;&#x7ACB;&#x7684;&#x65B9;&#x6CD5;</del></p>
<h2>&#x5B66;&#x4E60;&#x540E;&#x7AEF;&#x6846;&#x67B6;</h2>
<h3>&#x914D;&#x7F6E; Django &#x5F00;&#x53D1;&#x73AF;&#x5883;</h3>
<p>&#x5F3A;&#x70C8;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528; VSCode&#xFF0C;&#x592A;&#x9999;&#x4E86;&#xFF0C;&#x5F88;&#x65B9;&#x4FBF;</p>
<p><a class="wp-editor-md-post-content-link" href="https://blog.csdn.net/cierlongbu/article/details/103753452/?ref=blog.jnn.icu">Django &#x4F7F;&#x7528; VSCode &#x914D;&#x7F6E;&#x5F00;&#x53D1;&#x73AF;&#x5883; &#x8C03;&#x8BD5;</a></p>
<p><a class="wp-editor-md-post-content-link" href="https://code.visualstudio.com/docs/python/tutorial-django?ref=blog.jnn.icu">Django Tutorial in Visual Studio Code</a></p>
<h3>&#x4E00;&#x5B9A;&#x8981;&#x770B;&#x6587;&#x6863;</h3>
<p><a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/2.0/?ref=blog.jnn.icu">Django &#x5B98;&#x65B9;&#x4E2D;&#x6587;&#x6587;&#x6863;</a></p>
<p><strong>&#x5FEB;&#x901F;&#x5165;&#x95E8;&#x4E00;&#x5B9A;&#x8981;&#x770B;</strong>&#xFF0C;&#x5982;&#x679C;&#x6709;&#x65F6;&#x95F4;&#x4E0B;&#x9762;&#x7684;&#x5404;&#x79CD;&#x6A21;&#x5F0F;&#x3001;&#x6A21;&#x578B;&#x4E5F;&#x8981;&#x770B;&#x770B;&#xFF0C;&#x91CC;&#x9762;&#x6709;&#x5F88;&#x591A; best practice</p>
<p><a class="wp-editor-md-post-content-link" href="https://blog.jnn.icu/django-cors-%e7%ad%96%e7%95%a5%e9%85%8d%e7%bd%ae/">CORS &#x7B56;&#x7565;&#x914D;&#x7F6E; (&#x4E0D;&#x914D;&#x7F6E;&#x597D;&#x4F1A; bad request)</a></p>
<p><a class="wp-editor-md-post-content-link" href="https://blog.jnn.icu/%e5%90%8e%e7%ab%af%e7%94%a8%e6%88%b7%e8%ae%a4%e8%af%81%e7%b3%bb%e7%bb%9f%e6%9e%84%e5%bb%ba%e8%af%a6%e8%a7%a3/">&#x4E24;&#x79CD;&#x5E38;&#x7528;&#x7528;&#x6237;&#x7CFB;&#x7EDF;&#x8BA4;&#x8BC1;&#x65B9;&#x6848;</a></p>
<p>&#x540E;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x4F1A;&#x968F;&#x672C;&#x6B21;&#x5927;&#x521B;&#x9879;&#x76EE;&#x7684;&#x63A8;&#x8FDB;&#x9010;&#x6B65;&#x5B8C;&#x5584;&#x1F91E;&#x1F606;</p>

<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[Pyverbs 基本教程]]></title><description><![CDATA[这篇文章简单介绍了 rdma-core 的 python 封装库 pyerbs。]]></description><link>https://blog.jnn.icu/pyverbs/</link><guid isPermaLink="false">64412c1bb2ef5100019488fb</guid><category><![CDATA[RDMA]]></category><category><![CDATA[python]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Tue, 18 Apr 2023 08:13:21 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2023/04/rdma-core.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2023/04/rdma-core.png" alt="Pyverbs &#x57FA;&#x672C;&#x6559;&#x7A0B;"><p>2024-05-18 &#x5927;&#x6982;&#x662F;&#x56E0;&#x4E3A;&#x5927;&#x6A21;&#x578B;&#x7206;&#x706B;&#xFF0C;&#x53D1;&#x73B0;&#x6700;&#x8FD1;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x70B9;&#x51FB;&#x91CF;&#x5728;&#x5FEB;&#x901F;&#x4E0A;&#x5347;&#x3002;&#x8BF4;&#x660E;&#x4E00;&#x4E0B;&#xFF0C;pyverbs&#x662F;&#x6211;23&#x5E74;&#x521D;&#x5728;&#x7075;&#x5747;&#x6295;&#x8D44;&#x5B9E;&#x4E60;&#x505A;RDMA&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x65F6;&#x5B66;&#x4E60;&#x7684;&#xFF0C;&#x5F53;&#x65F6;&#x53D1;&#x73B0;pyverbs&#x6709;&#x4E00;&#x4E9B;&#x96BE;&#x4EE5;&#x6392;&#x67E5;&#x7684;bug&#xFF0C;&#x53EF;&#x80FD;&#x548C;&#x5F53;&#x65F6;&#x4F7F;&#x7528;&#x7684;IB&#x5361;&#x578B;&#x53F7;&#x548C;&#x9A71;&#x52A8;&#x6709;&#x5173;&#xFF0C;&#x4E0D;&#x6E05;&#x695A;&#x4E00;&#x5E74;&#x4EE5;&#x540E;&#x6709;&#x6CA1;&#x6709;&#x6539;&#x5584;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x987E;&#x8651;&#x53EF;&#x4EE5;&#x9009;&#x62E9;rdma-core&#x7684;C-API&#x8FDB;&#x884C;&#x5F00;&#x53D1;&#x3002;&#x4E0D;&#x8FC7;&#x901A;&#x8FC7;&#x672C;&#x6587;&#x4E86;&#x89E3;Pyverbs&#x7684;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;&#x662F;&#x8DB3;&#x591F;&#x7684;&#x3002;</p><h1 id="pyverbs">Pyverbs</h1>
<p><a href="https://github.com/linux-rdma/rdma-core/blob/master/Documentation/pyverbs.md?ref=blog.jnn.icu">Pyverbs</a> &#x662F; Mellanox &#x5F00;&#x6E90;&#x7684; rdma-core &#x63A5;&#x53E3;&#x5C01;&#x88C5;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x5957;&#x7B80;&#x5355;&#x6613;&#x61C2;&#x7684;&#x670D;&#x52A1;&#x539F;&#x8BED;&#x3002;</p>
<h2 id="%E6%89%93%E5%BC%80%E8%AE%BE%E5%A4%87">&#x6253;&#x5F00;&#x8BBE;&#x5907;</h2>
<pre><code class="language-python">from pyverbs import device


ctx = device.Context(name=&apos;mlx5_0&apos;)
</code></pre>
<p>&#x4F7F;&#x7528;device&#x6A21;&#x5757;&#x7684;Context&#x7C7B;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x4E0A;&#x4E0B;&#x6587;&#xFF0C;<code>name</code>&#x53C2;&#x6570;&#x6307;&#x5B9A;<strong>&#x8BBE;&#x5907;&#x540D;&#x79F0;</strong>&#x3002;ctx&#x521B;&#x5EFA;&#x540E;&#xFF0C;&#x5373;&#x53EF;&#x901A;&#x8FC7;ctx&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x3002;</p>
<h2 id="%E6%9F%A5%E8%AF%A2%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF">&#x67E5;&#x8BE2;&#x8BBE;&#x5907;&#x4FE1;&#x606F;</h2>
<pre><code class="language-python">from pyverbs import device


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    attr = ctx.query_device()
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4F1A;&#x6253;&#x5370;&#x51FA;&#x8BBE;&#x5907;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<h2 id="%E6%9F%A5%E8%AF%A2gid">&#x67E5;&#x8BE2;GID</h2>
<pre><code class="language-python">from pyverbs import device


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    gid = ctx.query_gid(port_num=1, index=3)
    print(gid)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4F1A;&#x6253;&#x5370;&#x6307;&#x5B9A;&#x7AEF;&#x53E3;&#x53CA;index&#x7684;GID&#x3002;&#x5728;&#x57FA;&#x4E8E;IB&#x7684;RDMA&#x6982;&#x5FF5;&#x4E2D;&#xFF0C;Node&#x53CA;Node&#x7684;&#x7AEF;&#x53E3;&#x90FD;&#x6709;&#x5404;&#x81EA;&#x7684;GID&#xFF0C;&#x5E76;&#x4E14;&#x7AEF;&#x53E3;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;GID&#x8868;&#x7EF4;&#x62A4;&#x591A;&#x4E2A;GID&#x3002;</p>
<h2 id="%E6%9F%A5%E8%AF%A2%E7%AB%AF%E5%8F%A3">&#x67E5;&#x8BE2;&#x7AEF;&#x53E3;</h2>
<pre><code class="language-python">from pyverbs import device


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    port_attr = ctx.query_port(1)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4F1A;&#x6253;&#x5370;&#x7AEF;&#x53E3;1&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<h2 id="%E5%88%9B%E5%BB%BArdma%E7%9B%B8%E5%85%B3%E5%AF%B9%E8%B1%A1">&#x521B;&#x5EFA;RDMA&#x76F8;&#x5173;&#x5BF9;&#x8C61;</h2>
<h3 id="protection-domain">Protection Domain</h3>
<pre><code class="language-python">from pyverbs import device
from pyverbs.pd import PD


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    pd = PD(ctx)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;PD&#x3002;</p>
<p>Protection Domain&#x662F;&#x4E00;&#x79CD;&#x96C6;&#x5408;&#xFF0C;&#x5185;&#x90E8;&#x5143;&#x7D20;&#x53EA;&#x80FD;&#x4E0E;&#x5185;&#x90E8;&#x5143;&#x7D20;&#x4EA4;&#x4E92;&#xFF0C;&#x8FD9;&#x4E9B;&#x5143;&#x7D20;&#x53EF;&#x4EE5;&#x662F;AH,QP,MR,SRQ&#x3002;&#x76F8;&#x5F53;&#x4E8E;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;RDMA&#x5DE5;&#x4F5C;&#x7684;&#x5BB9;&#x5668;&#x3002;</p>
<h3 id="memory-region">Memory Region</h3>
<pre><code class="language-python">from pyverbs import device
from pyverbs.pd import PD


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    with PD(ctx) as pd:
        flags = e.IBV_ACCESS_LOCAL_WRITE
        mr = MR(pd, mr_len, flags)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4E3A;&#x8BE5;&#x8BBE;&#x5907;mlx5_0&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;MR&#x3002;</p>
<p>Memory Region&#x662F;&#x7528;&#x4E8E;&#x4E3A;RDMA&#x5B58;&#x653E;&#x6536;&#x53D1;&#x6570;&#x636E;&#x7684;&#x5185;&#x5B58;&#x533A;&#x57DF;&#xFF0C;MR&#x9700;&#x8981;&#x7ED1;&#x5B9A;&#x5230;PD&#x5E76;&#x88AB;&#x6CE8;&#x518C;&#x4EE5;&#x4F9B;RDMA&#x7F51;&#x5361;&#x8FDB;&#x884C;DMA&#x8BBF;&#x95EE;&#x3002;</p>
<h3 id="memory-window">Memory Window</h3>
<pre><code class="language-python">from pyverbs import enums, device
from pyverbs.pd import PD
from pyverbs.mr import MW


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    with PD(ctx) as pd:
        mw = MW(pd, enums.IBV_MW_TYPE_1)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;MW&#x3002;</p>
<p>Memory Window&#x4ECE;MR&#x4E2D;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#x5206;&#x914D;&#x7684;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#xFF0C;MW&#x5728;&#x521B;&#x5EFA;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x88AB;&#x7ED1;&#x5B9A;&#x5230;&#x4E00;&#x4E2A;&#x5DF2;&#x6CE8;&#x518C;&#x7684;MR&#x4E0A;&#xFF0C;MW&#x662F;MR&#x7684;&#x5B50;&#x96C6;&#xFF0C;&#x63D0;&#x4F9B;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#x7684;&#x6743;&#x9650;&#x63A7;&#x5236;&#x3002;</p>
<h3 id="device-memory">Device Memory</h3>
<pre><code class="language-python">from pyverbs import device
from pyverbs.device import DM, AllocDmAttr


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    attr = ctx.query_device_ex()
    if attr.max_dm_size != 0:
        dm_len = random.randint(4, attr.max_dm_size)
        dm_attrs = AllocDmAttr(dm_len)
        dm = DM(ctx, dm_attrs)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;DM&#xFF0C;&#x4F7F;&#x7528;&#x8BBE;&#x5907;&#x5185;&#x5B58;&#x3002;</p>
<p>Device Memory&#x662F;&#x4F4D;&#x4E8E;RDMA&#x7F51;&#x5361;&#x4E0A;&#x7684;&#x5185;&#x5B58;&#xFF0C;&#x4F7F;&#x7528;DM&#x548C;&#x4F7F;&#x7528;Host Memory&#x5728;&#x4F7F;&#x7528;&#x4E0A;&#x6CA1;&#x6709;&#x592A;&#x5927;&#x533A;&#x522B;&#xFF0C;&#x4F7F;&#x7528;DM&#x6700;&#x5927;&#x7684;&#x4F18;&#x52BF;&#x662F;&#x663E;&#x8457;&#x964D;&#x4F4E;&#x4E86;&#x5305;&#x7684;&#x4F20;&#x8F93;&#x5EF6;&#x8FDF;&#x3002;</p>
<h3 id="device-memory-memory-region">Device Memory Memory Region</h3>
<pre><code class="language-python">import random

from pyverbs import enums, device
from pyverbs.device import DM, AllocDmAttr
from pyverbs.mr import DMMR
from pyverbs.pd import PD


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    attr = ctx.query_device_ex()
    if attr.max_dm_size != 0:
        dm_len = random.randint(4, attr.max_dm_size)
        dm_attrs = AllocDmAttr(dm_len)
        dm_mr_len = random.randint(4, dm_len)
        with DM(ctx, dm_attrs) as dm:
            with PD(ctx) as pd:
                dm_mr = DMMR(pd, dm_mr_len, enums.IBV_ACCESS_ZERO_BASED, dm=dm,
                             offset=0)
</code></pre>
<p>&#x672C;&#x6BB5;&#x4EE3;&#x7801;&#x5728;&#x8BBE;&#x5907;&#x4E0A;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;DMMR&#x3002;</p>
<p>DMMR&#x4E0E;MR&#x662F;&#x540C;&#x4E00;&#x7EA7;&#x522B;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x533A;&#x522B;&#x662F;MR&#x7A7A;&#x95F4;&#x5728;&#x4E3B;&#x673A;&#x5185;&#x5B58;&#x4E2D;&#xFF0C;DMMR&#x7A7A;&#x95F4;&#x5728;RDMA&#x7F51;&#x5361;&#x5185;&#x5B58;&#x4E2D;&#x3002;</p>
<h3 id="completion-queue">Completion Queue</h3>
<pre><code class="language-python">import random

from pyverbs.cq import CompChannel, CQ
from pyverbs as device


with device.Context(name=&apos;mlx5_0&apos;) as ctx:
    num_cqes = random.randint(0, 200) # Just arbitrary values. Max value can be
                                      # found in device attributes
    comp_vector = 0 # An arbitrary value. comp_vector is limited by the
                    # context&apos;s num_comp_vectors
    if random.choice([True, False]):
        with CompChannel(ctx) as cc:
            cq = CQ(ctx, num_cqes, None, cc, comp_vector)
    else:
        cq = CQ(ctx, num_cqes, None, None, comp_vector)
    print(cq)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;CQ&#x3002;</p>
<p>Completion Queue&#x7528;&#x4E8E;&#x63A5;&#x6536;&#x786C;&#x4EF6;&#x4F20;&#x8F93;&#x6765;&#x7684;CQE&#xFF0C;&#x7528;&#x4E8E;&#x4ECE;&#x786C;&#x4EF6;&#x5411;&#x5E94;&#x7528;&#x5C42;&#x4F20;&#x9012;&#x67D0;&#x4E2A;WEQ/WR&#x7684;&#x5B8C;&#x6210;&#x60C5;&#x51B5;&#x3002;</p>
<h3 id="addressing-related-objects">Addressing related objects</h3>
<p>&#x5730;&#x5740;&#x4E0E;&#x8DEF;&#x7531;&#x76F8;&#x5173;&#x6982;&#x5FF5;&#x4E0E;&#x63A5;&#x53E3;&#x7684;&#x5206;&#x6790;&#x63A8;&#x8FDF;&#x5230;&#x5B8C;&#x6210;demo&#x540E;&#x7EE7;&#x7EED;&#x8865;&#x5145;&#x3002;</p>
<h3 id="queue-pair">Queue Pair</h3>
<pre><code class="language-python">from pyverbs.qp import QPCap, QPInitAttr, QPAttr, QP
from pyverbs.addr import GlobalRoute
from pyverbs.addr import AH, AHAttr
from pyverbs import enums, device
from pyverbs.pd import PD
from pyverbs.cq import CQ
import pyverbs.wr as pwr


ctx = device.Context(name=&apos;mlx5_0&apos;)
pd = PD(ctx)
cq = CQ(ctx, 100, None, None, 0)
cap = QPCap(100, 10, 1, 1, 0)
qia = QPInitAttr(cap=cap, qp_type = enums.IBV_QPT_UD, scq=cq, rcq=cq)
# A UD QP will be in RTS if a QPAttr object is provided
udqp = QP(pd, qia, QPAttr())
port_num = 1
gid_index = 3 # Hard-coded for RoCE v2 interface
gid = ctx.query_gid(port_num, gid_index)
gr = GlobalRoute(dgid=gid, sgid_index=gid_index)
ah_attr = AHAttr(gr=gr, is_global=1, port_num=port_num)
ah = AH(pd, ah_attr)
wr = pwr.SendWR()
wr.set_wr_ud(ah, 0x1101, 0) # in real life, use real values
udqp.post_send(wr)
</code></pre>
<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;QP&#xFF0C;&#x5E76;&#x4E14;&#x4F7F;&#x7528;post_send&#x539F;&#x8BED;&#x53D1;&#x9001;&#x4E86;&#x4E00;&#x4E2A;wr&#x3002;</p>
<p>Queue Pair&#x5305;&#x542B;Send Queue&#x548C;Receive Queue&#xFF0C;&#x5E94;&#x7528;&#x5C42;&#x8BBF;&#x95EE;&#x4E0B;&#x5C42;&#x7684;&#x91CD;&#x8981;&#x63A5;&#x53E3;&#x3002;</p>
<h3 id="extended-reliable-connection">Extended Reliable Connection</h3>
<p>&#x62D3;&#x5C55;&#x53EF;&#x9760;&#x8FDE;&#x63A5;&#x57DF;&#xFF0C;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#x5148;&#x4E0D;&#x5206;&#x6790;</p>
<h3 id="extended-reliable-connection-domain">Extended Reliable Connection Domain</h3>
<p>&#x62D3;&#x5C55;&#x53EF;&#x9760;&#x8FDE;&#x63A5;&#x57DF;&#xFF0C;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#x5148;&#x4E0D;&#x5206;&#x6790;</p>
<h3 id="shared-receive-queue">Shared Receive Queue</h3>
<p>&#x5171;&#x4EAB;&#x63A5;&#x6536;&#x961F;&#x5217;&#xFF0C;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#x5148;&#x4E0D;&#x5206;&#x6790;</p>
]]></content:encoded></item><item><title><![CDATA[计算图任务调度与优化策略]]></title><description><![CDATA[这篇文章主要分享了与计算图相关的金融工程应用，探讨了计算图在实际业务中的应用与优化策略。这篇文章详细介绍了建图、调度、节点的开销、节点优先级、执行器流程与调度流程等关键概念，并分享了与此相关的技术实践与思考。]]></description><link>https://blog.jnn.icu/computation-graph-brief/</link><guid isPermaLink="false">6545c21632420100018bd2fb</guid><category><![CDATA[随笔]]></category><category><![CDATA[计算图]]></category><category><![CDATA[量化]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sat, 04 Nov 2023 15:34:39 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2023/11/AdobeStock_246907462.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2023/11/AdobeStock_246907462.jpg" alt="&#x8BA1;&#x7B97;&#x56FE;&#x4EFB;&#x52A1;&#x8C03;&#x5EA6;&#x4E0E;&#x4F18;&#x5316;&#x7B56;&#x7565;"><p>&#x4E0A;&#x73ED;&#x597D;&#x5FD9;&#xFF0C;&#x597D;&#x4E45;&#x6CA1;&#x5199;blog&#x4E86;&#xFF0C;&#x8FD9;&#x5468;&#x672B;&#x96BE;&#x5F97;&#x6E05;&#x95F2;&#xFF0C;&#x4F46;&#x53D1;&#x73B0;&#x81EA;&#x5DF1;&#x5DF2;&#x7ECF;&#x7535;&#x5B50;&#x6E38;&#x620F;&#x9633;&#x75FF;&#x4E86;&#xFF0C;&#x4E0D;&#x5982;&#x6765;&#x5199;&#x5199;&#x535A;&#x5BA2;&#x5427;~</p><p>&#x5728;&#x6B63;&#x5B9A;&#x79C1;&#x52DF;&#x5DE5;&#x4F5C;&#x7684;&#x8FD9;&#x534A;&#x5E74;&#xFF0C;&#x5B66;&#x5230;&#x4E86;&#x5F88;&#x591A;&#x91D1;&#x878D;&#x77E5;&#x8BC6;&#xFF0C;&#x4E5F;&#x79EF;&#x7D2F;&#x4E86;&#x5F88;&#x591A;&#x6280;&#x672F;&#x5B9E;&#x8DF5;&#xFF0C;&#x8FD9;&#x6B21;&#x5C31;&#x6765;&#x8BB2;&#x8BB2;&#x6211;&#x82B1;&#x4E86;&#x5927;&#x7B14;&#x65F6;&#x95F4;&#x7814;&#x7A76;&#x7684;&#x4E1C;&#x897F;&#x2014;&#x2014;&#x8BA1;&#x7B97;&#x56FE;&#x8C03;&#x5EA6;&#x4E0E;&#x4F18;&#x5316;&#x3002;</p><p>&#x80CC;&#x666F;&#x662F;&#x8FD9;&#x8FB9;&#x6709;&#x8BA1;&#x7B97;&#x5927;&#x91CF;&#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x8868;&#x8FBE;&#x5F0F;&#x5148;&#x88AB;&#x89E3;&#x6790;&#x4E3A;&#x4E3A;AST&#xFF0C;&#x800C;&#x4E14;&#x8FD9;&#x4E9B;&#x8868;&#x8FBE;&#x5F0F;&#x53EF;&#x80FD;&#x6709;&#x516C;&#x5171;&#x5B50;&#x8868;&#x8FBE;&#x5F0F;&#xFF08;AST&#x8282;&#x70B9;&#x590D;&#x7528;&#xFF09;&#xFF0C;&#x5B50;&#x8868;&#x8FBE;&#x5F0F;&#x53C8;&#x6709;&#x5B50;&#x8868;&#x8FBE;&#x5F0F;&#x5C42;&#x5C42;&#x5D4C;&#x5957;&#xFF08;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x4E0E;&#x8BA1;&#x7B97;&#x6B21;&#x5E8F;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x8868;&#x8FBE;&#x5F0F;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#x53EF;&#x4EE5;&#x88AB;&#x8868;&#x793A;&#x4E3A;DAG&#x3002;</p><p>&#x8BF4;&#x6765;&#x6709;&#x8DA3;&#xFF0C;&#x5F53;&#x65F6;&#x4E7E;&#x8C61;&#x6295;&#x8D44;&#x9762;&#x8BD5;&#x7684;&#x65F6;&#x5019;&#xFF08;&#x6302;&#x4E86;&#xFF09;&#xFF0C;&#x76F4;&#x63A5;&#x7ED9;&#x6211;&#x6765;&#x4E86;&#x9053;&#x8BA1;&#x7B97;&#x56FE;&#x8C03;&#x5EA6;&#x7684;&#x9898;&#x76EE;&#x3002;&#x6211;&#x4E4B;&#x524D;&#x505A;&#x540E;&#x7AEF;&#x505A;&#x6027;&#x80FD;&#x4F18;&#x5316;&#xFF0C;&#x4F46;&#x662F;&#x771F;&#x6CA1;&#x505A;&#x8FC7;&#x4EFB;&#x4F55;&#x8BA1;&#x7B97;&#x56FE;&#x7684;&#x76F8;&#x5173;&#x65B9;&#x5411;&#xFF0C;&#x5F53;&#x65F6;&#x8D39;&#x8001;&#x5927;&#x52B2;&#x8FD8;&#x88AB;&#x63D0;&#x793A;&#x597D;&#x51E0;&#x6B21;&#x624D;&#x505A;&#x51FA;&#x6765;&#x3002;&#x4E5F;&#x6B63;&#x662F;&#x56E0;&#x4E3A;&#x8FD9;&#x6B21;&#x7ECF;&#x5386;&#xFF0C;&#x75DB;&#x5B9A;&#x601D;&#x75DB;&#xFF0C;&#x5BF9;&#x8BA1;&#x7B97;&#x56FE;&#x6709;&#x4E86;&#x66F4;&#x591A;&#x7684;&#x8BA4;&#x77E5;&#xFF0C;&#x4E5F;&#x6709;&#x4E86;&#x6DF1;&#x5165;&#x601D;&#x8003;&#x7684;&#x52A8;&#x529B;&#x3002;</p><h2 id="%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2">&#x5199;&#x5728;&#x524D;&#x9762;</h2><p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x7BC7;&#x7B97;&#x6CD5;&#x6216;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x7684;&#x79D1;&#x666E;&#x6587;&#x7AE0;&#xFF0C;&#x800C;&#x662F;&#x5BF9;&#x8BA1;&#x7B97;&#x56FE;&#x5728;&#x5DE5;&#x7A0B;&#x4E0A;&#x5E94;&#x7528;&#x7684;&#x601D;&#x8003;&#x4E0E;&#x603B;&#x7ED3;&#x3002;&#x5982;&#x679C;&#x6709;&#x53EF;&#x80FD;&#xFF0C;&#x5E0C;&#x671B;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x80FD;&#x5C3D;&#x53EF;&#x80FD;&#x5730;&#x62D3;&#x5C55;&#x8BFB;&#x8005;&#x7684;&#x601D;&#x8DEF;&#xFF5E;&#x5185;&#x5BB9;&#x4E13;&#x95E8;&#x505A;&#x8FC7;&#x8131;&#x654F;&#xFF0C;&#x6240;&#x4EE5;&#x7F3A;&#x5C11;&#x4F8B;&#x5B50;&#xFF0C;&#x53EF;&#x80FD;&#x4E0D;&#x90A3;&#x4E48;&#x5BB9;&#x6613;&#x8BFB;&#x61C2;&#x3002;</p><p>&#x8BA1;&#x7B97;&#x56FE;&#x6709;&#x7279;&#x522B;&#x7279;&#x522B;&#x591A;&#x7684;&#x4F18;&#x5316;&#x7B56;&#x7565;&#xFF0C;&#x8FD8;&#x6CA1;&#x6709;&#x5F88;&#x7EC6;&#x7684;&#x7814;&#x7A76;&#xFF0C;&#x4EE5;&#x540E;&#x5982;&#x679C;&#x6709;&#x9700;&#x6C42;&#x4F1A;&#x6162;&#x6162;&#x8865;&#x5145;&#x3002;</p><h2 id="%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5">&#x57FA;&#x672C;&#x6982;&#x5FF5;</h2><p>&#x9996;&#x5148;&#x5F04;&#x660E;&#x767D;&#x8BA1;&#x7B97;&#x56FE;&#x662F;&#x5565;&#xFF0C;&#x8FD9;&#x91CC;&#x6709;&#x4E2A;&#x8868;&#x8FBE;&#x5F0F; X=MAX((A+B)*C, C*D) &#xFF0C;&#x7FFB;&#x8BD1;&#x6210;&#x8BA1;&#x7B97;&#x56FE;&#x5C31;&#x662F;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#xFF0C;&#x6309;&#x8BA1;&#x7B97;&#x6B21;&#x5E8F;&#x8868;&#x660E;&#x4E86;&#x8868;&#x8FBE;&#x5F0F;&#x548C;&#x5B50;&#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x7684;DAG&#x3002;&#x8FD9;&#x91CC;&#x8FD9;&#x4E2A;&#x548C;AST&#x5C31;&#x6BD4;&#x8F83;&#x50CF;&#xFF0C;&#x56E0;&#x4E3A;&#x6CA1;&#x6709;&#x522B;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#xFF0C;&#x6709;&#x522B;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x8BDD;&#x8282;&#x70B9;&#x4E4B;&#x95F4;&#x53EF;&#x80FD;&#x4F1A;&#x590D;&#x7528;&#xFF0C;&#x4ECE;&#x800C;&#x8FDE;&#x63A5;&#x6210;&#x4E00;&#x4E2A;&#x56FE;&#xFF0C;AST&#x5C31;&#x8868;&#x793A;&#x4E0D;&#x4E86;&#x8FD9;&#x4E2A;&#x4EFB;&#x52A1;&#x5566;&#x3002;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jnn.icu/content/images/2023/11/Screenshot-2023-11-04-221648.png" class="kg-image" alt="&#x8BA1;&#x7B97;&#x56FE;&#x4EFB;&#x52A1;&#x8C03;&#x5EA6;&#x4E0E;&#x4F18;&#x5316;&#x7B56;&#x7565;" loading="lazy" width="651" height="354" srcset="https://blog.jnn.icu/content/images/size/w600/2023/11/Screenshot-2023-11-04-221648.png 600w, https://blog.jnn.icu/content/images/2023/11/Screenshot-2023-11-04-221648.png 651w"><figcaption>Powered by GraphViz</figcaption></figure><p>&#x8FD9;&#x91CC;&#x7684;&#x6982;&#x5FF5;&#x5176;&#x5B9E;&#x6211;&#x6839;&#x636E;&#x4E1A;&#x52A1;&#x91CC;&#x5177;&#x4F53;&#x7684;&#x4EFB;&#x52A1;&#x505A;&#x7684;&#x62BD;&#x8C61;&#xFF0C;&#x53EF;&#x80FD;&#x4E0D;&#x662F;&#x5F88;&#x901A;&#x7528;&#x1F937;&#xFF0C;&#x770B;&#x770B;&#x5C31;&#x5B8C;&#x4E86;&#xFF1A;</p><ul><li>&#x4EFB;&#x52A1;&#xFF1A;&#x4E1A;&#x52A1;&#x4E2D;&#x771F;&#x6B63;&#x7684;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;</li><li>&#x8282;&#x70B9;&#xFF1A;&#x8BA1;&#x7B97;&#x56FE;&#x4E2D;&#x7684;&#x8C03;&#x5EA6;&#x5355;&#x5143;&#xFF0C;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x53EF;&#x80FD;&#x5305;&#x62EC;&#x591A;&#x4E2A;&#x4EFB;&#x52A1;</li><li>&#x6267;&#x884C;&#x7EBF;&#x7A0B;&#xFF1A;&#x7528;&#x4E8E;&#x8FDB;&#x884C;&#x8282;&#x70B9;&#x7684;&#x8BA1;&#x7B97;&#xFF0C;&#x6267;&#x884C;&#x8282;&#x70B9;&#x5185;&#x7684;&#x4EFB;&#x52A1;</li><li>&#x8C03;&#x5EA6;&#x5668;&#xFF1A;&#x8D1F;&#x8D23;&#x89C4;&#x5212;&#x8282;&#x70B9;&#x7684;&#x6267;&#x884C;&#xFF0C;&#x5206;&#x914D;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;</li></ul><p>&#x8BA1;&#x7B97;&#x56FE;&#x8C03;&#x5EA6;&#x7684;&#x4EFB;&#x52A1;&#x672C;&#x8D28;&#x4E0A;&#x662F;&#x4ECE;&#x65E0;&#x5165;&#x5EA6;&#x8282;&#x70B9;&#x5F00;&#x59CB;&#x904D;&#x5386;&#x8BA1;&#x7B97;&#x56FE;&#xFF0C;&#x6240;&#x6709;&#x8282;&#x70B9;&#x88AB;&#x904D;&#x5386;&#x5B8C;&#x6210;&#x5C31;&#x662F;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#x3002;</p><h2 id="%E5%BB%BA%E5%9B%BE">&#x5EFA;&#x56FE;</h2><p>&#x6211;&#x8FD9;&#x91CC;&#x7684;&#x9700;&#x6C42;&#x5728;&#x5EFA;&#x56FE;&#x7684;&#x65F6;&#x5019;&#x5DF2;&#x7ECF;&#x62FF;&#x5230;&#x4E86;&#x7ECF;&#x8FC7;&#x62D3;&#x6251;&#x6392;&#x5E8F;&#x7684;&#x4EFB;&#x52A1;&#x5E8F;&#x5217;&#xFF0C;&#x8282;&#x70B9;&#x4E5F;&#x6709;&#x4E0A;&#x6E38;&#x4F9D;&#x8D56;&#x4FE1;&#x606F;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x5F88;&#x7B80;&#x5355;&#x4E86;&#x3002;&#x5148;&#x7B80;&#x5355;&#x626B;&#x63CF;&#x4E00;&#x904D;&#xFF0C;&#x628A;&#x4EFB;&#x52A1;&#x5C01;&#x88C5;&#x8FDB;&#x8282;&#x70B9;&#xFF0C;&#x62FF;&#x5230;&#x4EFB;&#x52A1;&#x548C;&#x8282;&#x70B9;&#x7684;&#x6620;&#x5C04;&#xFF0C;&#x518D;&#x53CD;&#x5411;&#x626B;&#x63CF;&#x4E00;&#x904D;&#xFF0C;&#x628A;&#x4EFB;&#x52A1;&#x7684;&#x8282;&#x70B9;&#x52A0;&#x5165;&#x5230;&#x4E0A;&#x6E38;&#x4EFB;&#x52A1;&#x7684;&#x8282;&#x70B9;&#x7684;&#x4E0B;&#x6E38;&#x5217;&#x8868;&#x4E2D;&#xFF0C;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x57FA;&#x4E8E;&#x94FE;&#x8868;&#x7684;&#x56FE;&#x5C31;&#x5EFA;&#x597D;&#x4E86;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x7528;&#x90BB;&#x63A5;&#x8868;&#x4EC0;&#x4E48;&#x7684;&#x4E5F;&#x884C;&#xFF0C;&#x89C6;&#x9700;&#x6C42;&#x9009;&#x7528;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x6BD5;&#x7ADF;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x4E0D;&#x662F;&#x91CD;&#x70B9;&#x3002;</p><h2 id="%E8%B0%83%E5%BA%A6">&#x8C03;&#x5EA6;</h2><p>&#x6211;&#x8FD9;&#x91CC;&#x6709;&#x4E00;&#x4E2A;&#x8C03;&#x5EA6;&#x5668;&#x7EBF;&#x7A0B;&#x53BB;&#x5206;&#x914D;&#x4EFB;&#x52A1;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4F7F;&#x7528;&#x76F8;&#x5BF9;&#x5E38;&#x89C1;&#x4E14;&#x7B80;&#x5355;&#x7684;&#x751F;&#x4EA7;&#x6D88;&#x8D39;&#x8005;&#x6A21;&#x5F0F;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x751F;&#x4EA7;&#x6D88;&#x8D39;&#x8005;&#x6A21;&#x5F0F;&#x5E76;&#x4E0D;&#x80FD;&#x5F88;&#x597D;fit&#x4EFB;&#x52A1;&#x9700;&#x6C42;&#x3002;&#x6D88;&#x8D39;&#x8005;&#x53BB;&#x7ADE;&#x4E89;&#x961F;&#x5217;&#xFF0C;&#x5F80;&#x5F80;&#x4F1A;&#x589E;&#x52A0;&#x5E73;&#x5747;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#xFF0C;&#x66F4;&#x4F55;&#x51B5;&#x6211;&#x7684;&#x76EE;&#x6807;&#x662F;&#x4F7F;&#x7528;100&#x751A;&#x81F3;200&#x4E2A;CPU&#x6838;&#x5FC3;&#x53BB;&#x52A0;&#x901F;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#xFF0C;&#x7ADE;&#x4E89;&#x53EF;&#x80FD;&#x4F1A;&#x975E;&#x5E38;&#x660E;&#x663E;&#xFF0C;&#x54EA;&#x6015;&#x7528;CAS&#x4E5F;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x8F83;&#x5927;&#x7684;&#x5931;&#x8D25;&#x7387;&#x3002;&#x66F4;&#x4F55;&#x51B5;&#xFF0C;&#x4EFB;&#x52A1;&#x662F;&#x6709;&#x4F18;&#x5148;&#x7EA7;&#x7684;&#xFF0C;&#x5728;&#x6267;&#x884C;&#x65F6;&#x6211;&#x4EEC;&#x603B;&#x662F;&#x5E0C;&#x671B;&#x90A3;&#x4E00;&#x77AC;&#x95F4;&#x662F;&#x9AD8;&#x4F18;&#x800C;&#x975E;&#x4F4E;&#x4F18;&#x4EFB;&#x52A1;&#x88AB;&#x6267;&#x884C;&#x3002;&#x800C;&#x751F;&#x4EA7;&#x8005;&#x961F;&#x5217;&#x4E2D;&#x9AD8;&#x4F18;&#x7684;&#x4EFB;&#x52A1;&#x53EF;&#x80FD;&#x4F1A;&#x665A;&#x4E8E;&#x4F4E;&#x4F18;&#x4EFB;&#x52A1;&#x88AB;&#x6DFB;&#x52A0;&#xFF0C;&#x4E0D;&#x4FBF;&#x4E8E;&#x6309;&#x4F18;&#x5148;&#x7EA7;&#x5B8C;&#x6210;&#x4EFB;&#x52A1;&#xFF08;&#x5982;&#x679C;&#x628A;&#x961F;&#x5217;&#x505A;&#x6210;&#x4F18;&#x5148;&#x961F;&#x5217;&#x90A3;&#x5E73;&#x5747;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#x5C31;&#x7206;&#x4E86;&#xFF09;&#x3002;&#x540E;&#x9762;&#x4F1A;&#x63D0;&#x5230;&#x662F;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x8C03;&#x5EA6;&#x5668;+&#x6267;&#x884C;&#x5668;&#x7684;&#x6A21;&#x578B;&#x89E3;&#x51B3;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x7684;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x90A3;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528;GPU&#x5462;&#xFF1F;1. &#x56E0;&#x4E3A;&#x663E;&#x5B58;&#x771F;&#x4E0D;&#x591F;&#xFF0C;&#x8FD9;&#x4E2A;&#x8C03;&#x5EA6;&#x5668;&#x4E00;&#x5206;&#x949F;&#x8C03;&#x7528;&#x4E00;&#x6B21;&#xFF0C;&#x8017;&#x65F6;&#x8981;&#x63A7;&#x5236;&#x5728;100ms&#xFF0C;&#x800C;&#x4E14;&#x6BCF;&#x6B21;&#x8C03;&#x7528;&#x9700;&#x8981;&#x8BA1;&#x7B97;&#x4E00;&#x904D;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x56FE;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x9AD8;&#x81F3;500GB&#x7684;&#x5185;&#x5B58;&#xFF08;&#x540E;&#x9762;&#x7684;&#x5927;&#x578B;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#x751A;&#x81F3;&#x8981;2TB&#x5185;&#x5B58;&#xFF09;&#x3002;&#x5982;&#x679C;&#x7528;GPU&#xFF0C;&#x9700;&#x8981;&#x5206;&#x5E03;&#x5F0F;&#x8BA1;&#x7B97;&#xFF0C;&#x800C;&#x4E14;&#x5F97;&#x628A;&#x663E;&#x5B58;&#x51D1;&#x591F;&#xFF0C;&#x5426;&#x5219;&#x8FD8;&#x5F97;&#x6309;&#x9700;&#x4ECE;&#x5185;&#x5B58;&#x62F7;&#x8D1D;&#x5230;&#x663E;&#x5B58;&#x518D;&#x6309;&#x9700;&#x91CA;&#x653E;&#xFF0C;&#x5B9E;&#x73B0;&#x9EBB;&#x70E6;&#x7A0B;&#x5EA6;&#x5C31;&#x5927;&#x4E86;&#x53BB;&#x4E86;&#xFF1B;2. &#x7B97;&#x5B50;&#x5F88;&#x590D;&#x6742;&#xFF0C;&#x53EF;&#x4EE5;&#x786E;&#x5B9A;&#x7684;&#x662F;&#x6CA1;&#x6709;&#x7B97;&#x5B50;&#x5E93;&#x53EF;&#x4EE5;&#x7528;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x7B97;&#x5B50;&#x9700;&#x8981;&#x5199;CUDA&#x53BB;&#x5B9E;&#x73B0;&#xFF0C;&#x5B66;&#x4E60;&#x6210;&#x672C;&#x548C;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x4E0D;&#x592A;&#x80FD;&#x63A5;&#x53D7;&#x3002;&#x5927;&#x6982;&#x5C31;&#x8FD9;&#x4E24;&#x4E2A;&#x539F;&#x56E0;&#x4E86;&#x3002;</p><h3 id="%E8%8A%82%E7%82%B9%E7%9A%84%E5%BC%80%E9%94%80">&#x8282;&#x70B9;&#x7684;&#x5F00;&#x9500;</h3><p>&#x8282;&#x70B9;&#x7684;&#x5F00;&#x9500;&#x5BF9;&#x8C03;&#x5EA6;&#x5668;&#x662F;&#x5F88;&#x91CD;&#x8981;&#x7684;&#xFF0C;&#x867D;&#x7136;&#x771F;&#x5B9E;&#x7684;&#x65F6;&#x95F4;&#x5F00;&#x9500;&#x9700;&#x8981;&#x5B9E;&#x9645;&#x6267;&#x884C;&#x540E;&#x624D;&#x80FD;&#x77E5;&#x9053;&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x57FA;&#x4E8E;&#x8282;&#x70B9;&#x5185;&#x4EFB;&#x52A1;&#x7684;&#x590D;&#x6742;&#x5EA6;&#x53BB;&#x4F30;&#x8BA1;&#x8282;&#x70B9;&#x7684;&#x65F6;&#x95F4;&#x5F00;&#x9500;&#xFF0C;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x90FD;&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x81EA;&#x5DF1;&#x7684;&#x5F00;&#x9500;&#x4FE1;&#x606F;&#x3002;</p><h3 id="%E8%8A%82%E7%82%B9%E4%BC%98%E5%85%88%E7%BA%A7">&#x8282;&#x70B9;&#x4F18;&#x5148;&#x7EA7;</h3><p>&#x8282;&#x70B9;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x6216;&#x8005;&#x79F0;&#x4E3A;&#x6743;&#x91CD;&#xFF0C;&#x603B;&#x5E0C;&#x671B;&#x5F53;&#x524D;&#x53EF;&#x7528;&#x4EFB;&#x52A1;&#x4E2D;&#x6743;&#x91CD;&#x6700;&#x9AD8;&#x7684;&#x8282;&#x70B9;&#x5148;&#x88AB;&#x6267;&#x884C;&#x3002;&#x6211;&#x8FD9;&#x91CC;&#x6743;&#x91CD;&#x7684;&#x5B9A;&#x4E49;&#x662F;<strong>&#x5BF9;&#x8282;&#x70B9;&#x4ECE;&#x8BE5;&#x8282;&#x70B9;&#x51FA;&#x53D1;&#x76F4;&#x5230;&#x7EC8;&#x6B62;&#x8282;&#x70B9;&#x6240;&#x7ECF;&#x8FC7;&#x8282;&#x70B9;&#x7684;&#x5F00;&#x9500;&#x603B;&#x548C;&#x7684;&#x6700;&#x5927;&#x503C;</strong>&#x3002;&#x8FD9;&#x6837;&#x7684;&#x5B9A;&#x4E49;&#x7684;&#x76EE;&#x7684;&#x662F;&#x8BA9;&#x5F00;&#x9500;&#x6700;&#x91CD;&#x7684;&#x94FE;&#x8DEF;&#xFF08;&#x56E0;&#x4E3A;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x5BFC;&#x81F4;&#x4E0D;&#x80FD;&#x5E76;&#x884C;&#x52A0;&#x901F;&#xFF09;&#x6700;&#x5148;&#x88AB;&#x6267;&#x884C;&#xFF0C;&#x4ECE;&#x800C;&#x5C3D;&#x53EF;&#x80FD;&#x7F29;&#x77ED;&#x5B8C;&#x6210;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x56FE;&#x7684;&#x8017;&#x65F6;&#xFF0C;&#x8FD9;&#x662F;&#x4F18;&#x5148;&#x7EA7;&#x5B9A;&#x4E49;&#x7684;&#x9996;&#x8981;&#x8003;&#x91CF;&#x3002;</p><h3 id="%E6%89%A7%E8%A1%8C%E5%99%A8%E6%B5%81%E7%A8%8B">&#x6267;&#x884C;&#x5668;&#x6D41;&#x7A0B;</h3><ol><li>&#x5C1D;&#x8BD5;&#x4ECE;&#x56FA;&#x5B9A;&#x5730;&#x5740;&#x8F6E;&#x8BE2;&#x83B7;&#x53D6;&#x8282;&#x70B9;</li><li>&#x6267;&#x884C;&#x8282;&#x70B9;&#x5185;&#x4EFB;&#x52A1;</li><li>&#x5411;&#x901A;&#x77E5;&#x961F;&#x5217;&#x53D1;&#x9001;&#x5B8C;&#x6210;&#x4FE1;&#x606F;</li></ol><h3 id="%E8%B0%83%E5%BA%A6%E6%B5%81%E7%A8%8B">&#x8C03;&#x5EA6;&#x6D41;&#x7A0B;</h3><p>&#x7EF4;&#x62A4;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E;&#x6743;&#x91CD;&#x7684;&#x5927;&#x6839;&#x5806;&#xFF0C;&#x9996;&#x5148;&#x628A;&#x5F00;&#x59CB;&#x8282;&#x70B9;&#xFF08;&#x65E0;&#x5165;&#x5EA6;&#xFF09;&#x5168;&#x90E8;&#x653E;&#x8FDB;&#x53BB;&#x3002;&#x6D41;&#x7A0B;&#xFF1A;</p><ol><li>&#x542F;&#x52A8;&#x5FAA;&#x73AF;</li><li>&#x5224;&#x65AD;&#x662F;&#x5426;&#x5927;&#x6839;&#x5806;&#x4E3A;&#x7A7A;&#x4E14;&#x6CA1;&#x6709;&#x8282;&#x70B9;&#x5728;&#x6267;&#x884C;&#x5668;&#x5185;&#x6267;&#x884C;&#xFF0C;&#x662F;&#x5219;&#x7EC8;&#x6B62;&#x5FAA;&#x73AF;&#xFF0C;&#x5426;&#x5219;&#x7EE7;&#x7EED;</li><li>&#x5FAA;&#x73AF;&#x4ECE;&#x5927;&#x6839;&#x5806;&#x4E2D;&#x53D6;&#x51FA;&#x6743;&#x91CD;&#x6700;&#x5927;&#x8282;&#x70B9;&#x5E76;&#x4EA4;&#x7ED9;&#x7A7A;&#x95F2;&#x6267;&#x884C;&#x5668;&#xFF0C;&#x76F4;&#x5230;&#x5927;&#x6839;&#x5806;&#x4E3A;&#x7A7A;&#x6216;&#x65E0;&#x7A7A;&#x95F2;&#x6267;&#x884C;&#x5668;</li><li>&#x5C1D;&#x8BD5;&#x4ECE;&#x901A;&#x77E5;&#x961F;&#x5217;&#x4E2D;&#x83B7;&#x53D6;&#xFF0C;&#x5982;&#x679C;&#x5931;&#x8D25;&#xFF0C;&#x56DE;&#x5230;&#x6B65;&#x9AA4;2</li><li>&#x66F4;&#x65B0;&#x5B8C;&#x6210;&#x8282;&#x70B9;&#x6240;&#x6709;&#x5B69;&#x5B50;&#x8282;&#x70B9;&#x7684;&#x7B49;&#x5F85;&#x60C5;&#x51B5;</li><li>&#x83B7;&#x53D6;&#x6240;&#x6709;&#x4E0A;&#x6E38;&#x5C31;&#x7EEA;&#x7684;&#x5B69;&#x5B50;&#x8282;&#x70B9;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x56DE;&#x5230;&#x6B65;&#x9AA4;2</li><li>&#x8BB2;&#x83B7;&#x53D6;&#x5230;&#x7684;&#x5B69;&#x5B50;&#x8282;&#x70B9;&#x653E;&#x5165;&#x5927;&#x6839;&#x5806;&#x4E2D;&#xFF0C;&#x56DE;&#x5230;&#x6B65;&#x9AA4;2</li></ol><p>&#x8FD9;&#x91CC;&#x8FD8;&#x6709;&#x4E00;&#x4E9B;&#x4F18;&#x5316;&#x65B9;&#x6848;&#x4F1A;&#x6539;&#x53D8;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#xFF0C;&#x4E0B;&#x9762;&#x4F1A;&#x8BB2;&#x3002;</p><h2 id="%E4%BC%98%E5%8C%96">&#x4F18;&#x5316;</h2><p>&#x8FD9;&#x91CC;&#x7684;&#x4F18;&#x5316;&#x7B56;&#x7565;&#x548C;&#x6211;&#x4EEC;&#x5177;&#x4F53;&#x7684;&#x4E1A;&#x52A1;&#x662F;&#x606F;&#x606F;&#x76F8;&#x5173;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x5927;&#x6982;&#x8BFB;&#x8BFB;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x542F;&#x53D1;&#x6700;&#x597D;&#x3002;&#x4F46;&#x662F;&#x5177;&#x4F53;&#x7684;&#x4E1A;&#x52A1;&#x5185;&#x5BB9;&#x90A3;&#x80AF;&#x5B9A;&#x662F;&#x4E0D;&#x80FD;&#x8BB2;&#xFF0C;&#x53EA;&#x80FD;&#x5199;&#x5728;&#x5185;&#x7F51;&#x7684;wiki&#x4E0A;&#x5566;~</p><h3 id="%E5%89%AA%E6%9E%9D">&#x526A;&#x679D;</h3><p>&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x4E1A;&#x52A1;&#x9700;&#x6C42;&#x4E2D;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#x662F;&#x8981;&#x88AB;&#x591A;&#x6B21;&#x8BA1;&#x7B97;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x6B21;&#x8BA1;&#x7B97;&#x65F6;&#x4F1A;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x4F1A;&#x51B3;&#x5B9A;&#x672C;&#x6B21;&#x8BA1;&#x7B97;&#x6709;&#x54EA;&#x4E9B;&#x8868;&#x8FBE;&#x5F0F;&#x9700;&#x8981;&#x88AB;&#x8BA1;&#x7B97;&#xFF0C;&#x5728;&#x8BA1;&#x7B97;&#x56FE;&#x8C03;&#x5EA6;&#x7684;&#x8BED;&#x5883;&#x4E0B;&#xFF0C;&#x5C31;&#x662F;&#x6709;&#x4E00;&#x4E9B;&#x8282;&#x70B9;&#x4E0D;&#x9700;&#x8981;&#x88AB;&#x8BA1;&#x7B97;&#x3002;</p><p>&#x526A;&#x679D;&#x64CD;&#x4F5C;&#x4E0D;&#x662F;&#x5FC5;&#x8981;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x4E1A;&#x52A1;&#x4E2D;&#x7684;&#x4EFB;&#x52A1;&#x4F1A;&#x81EA;&#x52A8;&#x8DF3;&#x8FC7;&#x4E0D;&#x9700;&#x8981;&#x6267;&#x884C;&#x7684;&#x53C2;&#x6570;&#x3002;&#x4F46;&#x662F;&#x4E3A;&#x4E86;&#x964D;&#x4F4E;&#x8C03;&#x5EA6;&#x5F00;&#x9500;&#xFF0C;&#x526A;&#x679D;&#x53C8;&#x662F;&#x5F88;&#x91CD;&#x8981;&#x7684;&#x3002;&#x8FD9;&#x91CC;&#x7684;&#x526A;&#x679D;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x9884;&#x5904;&#x7406;&#x3002;&#x9884;&#x5904;&#x7406;&#x4F1A;&#x5728;&#x5EFA;&#x56FE;&#x4E4B;&#x540E;&#x53CD;&#x5411;&#x626B;&#x63CF;&#x8282;&#x70B9;&#x62D3;&#x6251;&#x5E8F;&#x5217;&#xFF0C;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x53CA;&#x5176;&#x540E;&#x7EED;&#x6240;&#x6709;&#x8282;&#x70B9;&#x8BA1;&#x7B97;&#x6761;&#x4EF6;&#x7684;&#x5E76;&#x96C6;&#xFF0C;&#x8C03;&#x5EA6;&#x65F6;&#x53EA;&#x9700;&#x8981;&#x5224;&#x65AD;&#x53C2;&#x6570;&#x662F;&#x5426;&#x6EE1;&#x8DB3;&#x6761;&#x4EF6;&#x96C6;&#x5408;&#xFF0C;&#x5373;&#x53EF;&#x786E;&#x8BA4;&#x5B50;&#x56FE;&#x662F;&#x5426;&#x4E0D;&#x9700;&#x8981;&#x88AB;&#x8BA1;&#x7B97;&#xFF0C;&#x4ECE;&#x800C;&#x5B8C;&#x6210;&#x526A;&#x679D;&#x3002;</p><p>&#x9700;&#x8981;&#x4FEE;&#x6539;&#x8C03;&#x5EA6;&#x6D41;&#x7A0B;&#xFF0C;&#x5C06;7&#x4FEE;&#x6539;&#x4E3A;&#xFF1A;</p><blockquote>7. &#x83B7;&#x53D6;&#x6240;&#x6709;&#x4E0A;&#x6E38;&#x5C31;&#x7EEA;&#x4E14;&#x6EE1;&#x8DB3;&#x8BA1;&#x7B97;&#x6761;&#x4EF6;&#x7684;&#x5B69;&#x5B50;&#x8282;&#x70B9;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x56DE;&#x5230;&#x6B65;&#x9AA4;2</blockquote><h3 id="%E8%8A%82%E7%82%B9%E5%86%85%E5%8A%A0%E9%80%9F">&#x8282;&#x70B9;&#x5185;&#x52A0;&#x901F;</h3><p>&#x5BF9;&#x4E8E;&#x8BA1;&#x7B97;&#x56FE;&#x8C03;&#x5EA6;&#x6765;&#x8BF4;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6267;&#x884C;&#x6548;&#x7387;&#x90FD;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#x5230;&#x6574;&#x4F53;&#x7684;&#x6027;&#x80FD;&#x3002;&#x5C24;&#x5176;&#x5728;&#x91D1;&#x878D;&#x9886;&#x57DF;&#xFF0C;&#x6BCF;&#x4E00;&#x6BEB;&#x79D2;&#x7684;&#x65F6;&#x95F4;&#x90FD;&#x53EF;&#x80FD;&#x4E0E;&#x5927;&#x91CF;&#x7684;&#x8D44;&#x91D1;&#x6D41;&#x8F6C;&#x606F;&#x606F;&#x76F8;&#x5173;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x63D0;&#x9AD8;&#x5355;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6267;&#x884C;&#x901F;&#x5EA6;&#x53D8;&#x5F97;&#x81F3;&#x5173;&#x91CD;&#x8981;&#x3002;&#x56E0;&#x4E3A;&#x5355;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x52A0;&#x901F;&#xFF0C;&#x53EF;&#x4EE5;&#x964D;&#x4F4E;&#x8FD9;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x65F6;&#x95F4;&#x5F00;&#x9500;&#xFF0C;&#x4ECE;&#x800C;&#x7F29;&#x77ED;&#x8BA1;&#x7B97;&#x56FE;&#x4E2D;&#x7684;&#x6700;&#x957F;&#x94FE;&#x8DEF;&#xFF0C;&#x7F29;&#x77ED;&#x8BA1;&#x7B97;&#x56FE;&#x5185;&#x8282;&#x70B9;&#x7684;&#x5E73;&#x5747;&#x6743;&#x91CD;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x7684;&#x65B9;&#x6848;&#x662F;&#x4E3A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x62C6;&#x5206;&#x5C5E;&#x6027;breakdown&#xFF0C;&#x5E76;&#x4E14;&#x7528;&#x4E00;&#x4E2A;&#x8FDB;&#x5EA6;&#x53D8;&#x91CF;node_progress&#x8868;&#x793A;&#x8FD9;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x5B8C;&#x6210;&#x60C5;&#x51B5;&#x3002;&#x5411;&#x6267;&#x884C;&#x5668;&#x5206;&#x914D;&#x4EFB;&#x52A1;&#x65F6;&#xFF0C;breakdown&#x4E3A;10&#x7684;&#x8282;&#x70B9;&#x5C31;&#x4F1A;&#x88AB;&#x62C6;&#x6210;10&#x4E2A;&#x4EFB;&#x52A1;&#x53BB;&#x5206;&#x53D1;&#xFF0C;&#x8C03;&#x5EA6;&#x5668;&#x62FF;&#x5230;&#x7684;&#x5B8C;&#x6210;&#x53CD;&#x9988;&#x4E5F;&#x662F;10&#x6B21;&#xFF0C;&#x6BCF;&#x6B21;&#x53BB;&#x66F4;&#x65B0;&#x4E0B;&#x8BA1;&#x6570;&#x5668;&#xFF0C;&#x8C03;&#x5EA6;&#x5668;&#x53D1;&#x73B0;&#x8FDB;&#x5EA6;&#x6EE1;&#x4E86;&#x5C31;&#x89E6;&#x53D1;&#x8282;&#x70B9;&#x5B8C;&#x6210;&#x7684;&#x5904;&#x7406;&#x903B;&#x8F91;&#x3002;</p><p>&#x53E6;&#x5916;&#x4E5F;&#x4E3A;&#x4E86;&#x8282;&#x70B9;&#x5185;&#x52A0;&#x901F;&#x8BBE;&#x8BA1;&#x4E86;&#x4E00;&#x5957;&#x62C6;&#x5206;&#x903B;&#x8F91;&#xFF0C;&#x56E0;&#x4E3A;&#x6709;&#x4E9B;&#x4EFB;&#x52A1;&#x5E76;&#x4E0D;&#x80FD;&#x5B8C;&#x5168;&#x5E76;&#x884C;&#x5B8C;&#x6210;&#xFF0C;&#x4EFB;&#x52A1;&#x5185;&#x53EF;&#x80FD;&#x5305;&#x542B;&#x4E00;&#x4E9B;&#x6B65;&#x9AA4;&#x662F;&#x5FC5;&#x987B;&#x4E32;&#x884C;&#x5904;&#x7406;&#x7684;&#x3002;&#x6700;&#x7EC8;&#x7684;&#x65B9;&#x6848;&#x662F;&#x628A;&#x8282;&#x70B9;&#x6309;&#x4EFB;&#x52A1;&#x7684;&#x6B65;&#x9AA4;&#x62C6;&#x5206;&#x6210;&#x5E76;&#x884C;&#x8282;&#x70B9;&#x548C;&#x4E32;&#x884C;&#x8282;&#x70B9;&#xFF0C;&#x8FD9;&#x4E00;&#x6B65;&#x5728;&#x5EFA;&#x56FE;&#x8BA1;&#x7B97;breakdown&#x7684;&#x65F6;&#x5019;&#x5C31;&#x5B8C;&#x6210;&#x3002;</p><p>&#x9700;&#x8981;&#x4FEE;&#x6539;&#x8C03;&#x5EA6;&#x6D41;&#x7A0B;&#xFF0C;&#x5728;4&#x540E;&#x9762;&#x6DFB;&#x52A0;4.5&#xFF1A;</p><blockquote>4.5 &#x66F4;&#x65B0;&#x8282;&#x70B9;&#x7684;&#x5B8C;&#x6210;&#x60C5;&#x51B5;&#xFF0C;&#x5982;&#x679C;breakdown&#x672A;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#xFF0C;&#x5219;&#x56DE;&#x5230;&#x6B65;&#x9AA4;2</blockquote><h3 id="%E8%8A%82%E7%82%B9%E5%90%88%E5%B9%B6">&#x8282;&#x70B9;&#x5408;&#x5E76;</h3><p>&#x6709;&#x4E00;&#x7C7B;&#x8868;&#x8FBE;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982; X=((A+B)*C)/D&#xFF0C;&#x6BCF;&#x4E2A;&#x8BA1;&#x7B97;&#x90FD;&#x4EC5;&#x4EC5;&#x4F9D;&#x8D56;&#x4E0A;&#x6B21;&#x7684;&#x7ED3;&#x679C;&#xFF08;ABC&#x662F;&#x53D8;&#x91CF;&#xFF0C;&#x4E0D;&#x662F;&#x8BA1;&#x7B97;&#x8282;&#x70B9;&#xFF09;&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x5728;&#x8BA1;&#x7B97;&#x56FE;&#x4E2D;&#xFF08;&#x5982;&#x679C;&#x5B50;&#x8868;&#x8FBE;&#x5F0F;&#x6CA1;&#x6709;&#x88AB;&#x5176;&#x5B83;&#x8868;&#x8FBE;&#x5F0F;&#x590D;&#x7528;&#xFF09;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x94FE;&#x6761;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x94FE;&#x6761;&#x5FC5;&#x987B;&#x4E32;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x8FD9;&#x5C31;&#x5BFC;&#x81F4;&#x4E0E;&#x5176;&#x4F9D;&#x6B21;&#x8BA1;&#x7B97;X&#x7684;&#x8FD9;&#x4E9B;&#x8282;&#x70B9;&#xFF0C;&#x4E0D;&#x5982;&#x628A;&#x8FD9;&#x4E9B;&#x8282;&#x70B9;&#x5408;&#x5E76;&#x6210;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x4E00;&#x6B21;&#x6027;&#x8C03;&#x5EA6;&#x548C;&#x5B8C;&#x6210;&#xFF0C;&#x6D88;&#x9664;&#x8C03;&#x5EA6;&#x5E26;&#x6765;&#x7684;&#x5E73;&#x5747;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#x63D0;&#x5347;&#x3002;</p><p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x8FDB;&#x884C;&#x4E86;&#x8282;&#x70B9;&#x5185;&#x52A0;&#x901F;&#xFF08;&#x8981;&#x6C42;&#x8282;&#x70B9;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#xFF09;&#x7684;&#x8282;&#x70B9;&#x4E0D;&#x80FD;&#x4E0E;&#x5176;&#x5B83;&#x8282;&#x70B9;&#x8FDB;&#x884C;&#x5408;&#x5E76;&#x3002;</p><p>&#x4E0D;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x8C03;&#x5EA6;&#x6D41;&#x7A0B;&#x3002;</p><h3 id="%E6%89%B9%E9%87%8F%E5%A4%84%E7%90%86">&#x6279;&#x91CF;&#x5904;&#x7406;</h3><p>&#x4E3A;&#x6267;&#x884C;&#x5668;&#x961F;&#x5217;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x6709;&#x5BB9;&#x91CF;&#x9650;&#x5236;&#x7684;&#x961F;&#x5217;&#xFF0C;&#x5141;&#x8BB8;&#x6267;&#x884C;&#x5668;&#x961F;&#x5217;&#x5185;&#x7684;&#x4EFB;&#x52A1;&#x4E00;&#x6B21;&#x6027;&#x53D6;&#x51FA;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x6743;&#x91CD;&#x6392;&#x5E8F;&#xFF0C;&#x6309;&#x987A;&#x5E8F;&#x4E00;&#x6B21;&#x6027;&#x5B8C;&#x6210;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x53D6;&#x4E00;&#x4E2A;&#x505A;&#x4E00;&#x4E2A;&#xFF0C;&#x964D;&#x4F4E;&#x961F;&#x5217;&#x7ADE;&#x4E89;&#x5E26;&#x6765;&#x7684;&#x5F00;&#x9500;&#x3002;&#x8FD9;&#x91CC;&#x4F9D;&#x8D56;&#x4E86;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684;ConcurrentQueue&#x5B9E;&#x73B0;&#xFF0C;&#x652F;&#x6301;bulk enqueue&#x548C;dequeue&#x3002;</p><p>&#x8FD9;&#x91CC;&#x5176;&#x5B9E;&#x662F;&#x6743;&#x8861;&#x4E86;&#x9AD8;&#x4F18;&#x4EFB;&#x52A1;&#x7684;&#x5E73;&#x5747;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#x4E0E;&#x8C03;&#x5EA6;&#x5F00;&#x9500;&#xFF0C;&#x5728;&#x4FDD;&#x8BC1;&#x8C03;&#x5EA6;&#x5F00;&#x9500;&#x5C3D;&#x53EF;&#x80FD;&#x4F4E;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#x9AD8;&#x4F18;&#x4EFB;&#x52A1;&#x5C3D;&#x53EF;&#x80FD;&#x5148;&#x5730;&#x88AB;&#x6267;&#x884C;&#x3002;&#x961F;&#x5217;&#x5BB9;&#x91CF;&#x8D8A;&#x5C0F;&#xFF0C;&#x8C03;&#x5EA6;&#x5F00;&#x9500;&#x8D8A;&#x5927;&#xFF0C;&#x4F46;&#x662F;&#x9AD8;&#x4F18;&#x4EFB;&#x52A1;&#x7684;&#x5E73;&#x5747;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#x8D8A;&#x4F4E;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x628A;&#x961F;&#x5217;&#x5BB9;&#x91CF;&#x8BBE;&#x7F6E;&#x4E3A;&#x4E00;&#x4E2A;&#x5408;&#x9002;&#x7684;&#x503C;&#x3002;</p><p>&#x9700;&#x8981;&#x4FEE;&#x6539;&#x6267;&#x884C;&#x6D41;&#x7A0B;&#xFF0C;&#x4FEE;&#x6539;1&#x548C;2&#xFF1A;</p><blockquote>1. &#x5C1D;&#x8BD5;&#x8F6E;&#x8BE2;&#x6267;&#x884C;&#x5668;&#x961F;&#x5217;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x8282;&#x70B9;&#x5143;&#x7D20;&#xFF0C;&#x4E00;&#x6B21;&#x6027;&#x5168;&#x90E8;&#x53D6;&#x51FA;</blockquote><blockquote>2. &#x904D;&#x5386;&#x53D6;&#x51FA;&#x7684;&#x6240;&#x6709;&#x8282;&#x70B9;&#xFF0C;&#x6267;&#x884C;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5185;&#x7684;&#x4EFB;&#x52A1;</blockquote><p>&#x9700;&#x8981;&#x4FEE;&#x6539;&#x8C03;&#x5EA6;&#x6D41;&#x7A0B;&#xFF0C;&#x5C06;3&#x4FEE;&#x6539;&#x4E3A;&#xFF1A;</p><blockquote>3. &#x5FAA;&#x73AF;&#x4ECE;&#x5927;&#x6839;&#x5806;&#x4E2D;&#x53D6;&#x51FA;&#x6743;&#x91CD;&#x6700;&#x5927;&#x8282;&#x70B9;&#x5E76;&#x4EA4;&#x7ED9;&#x7A7A;&#x95F2;&#x6267;&#x884C;&#x5668;&#xFF0C;&#x76F4;&#x5230;&#x5927;&#x6839;&#x5806;&#x4E3A;&#x7A7A;&#x6216;&#x4E0D;&#x5B58;&#x5728;&#x8FD8;&#x6709;&#x53EF;&#x7528;&#x7A7A;&#x95F4;&#x7684;&#x6267;&#x884C;&#x5668;&#x961F;&#x5217;</blockquote><h3 id="%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%8A%A0%E9%80%9F">&#x6D41;&#x6C34;&#x7EBF;&#x52A0;&#x901F;</h3><p>&#x8FD9;&#x4E2A;&#x548C;&#x4E1A;&#x52A1;&#x5F3A;&#x76F8;&#x5173;&#xFF0C;&#x53EF;&#x4EE5;&#x5141;&#x8BB8;&#x8FD9;&#x6B21;&#x53C2;&#x6570;&#x8BA1;&#x7B97;&#x7684;&#x56FE;&#x7684;&#x8BA1;&#x7B97;&#x5B8C;&#x4E14;&#x4E0D;&#x518D;&#x88AB;&#x4F9D;&#x8D56;&#x7684;&#x8282;&#x70B9;&#xFF0C;&#x8BA1;&#x7B97;&#x4E0B;&#x4E00;&#x6B21;&#x53C2;&#x6570;&#x8BA1;&#x7B97;&#x7684;&#x4EFB;&#x52A1;&#x3002;&#x5927;&#x5E45;&#x6269;&#x5927;&#x53EF;&#x7528;&#x8282;&#x70B9;&#x6C60;&#xFF0C;&#x8BA9;&#x6267;&#x884C;&#x5668;&#x5168;&#x7A0B;&#x4E0D;&#x95F2;&#x4E0B;&#x6765;&#x3002;</p><p>&#x6BD4;&#x8F83;&#x654F;&#x611F;&#xFF0C;&#x7531;&#x4E8E;&#x4FDD;&#x5BC6;&#x539F;&#x56E0;&#x4E0D;&#x5C55;&#x5F00;&#x8BB2;&#x4E86;</p>]]></content:encoded></item><item><title><![CDATA[【随笔】毕业总结]]></title><description><![CDATA[<p>&#x4ECA;&#x5929;&#x662F;2023&#x5E74;4&#x6708;19&#x65E5;&#xFF0C;&#x8FD8;&#x6709;&#x4E24;&#x4E2A;&#x6708;&#x6211;&#x5C31;&#x6BD5;&#x4E1A;&#x4E86;&#x3002;&#x5317;&#x4EAC;&#x90AE;&#x7535;&#x5927;&#x5B66;&#x2014;&#x2014;&#x867D;&#x7136;&#x8BF4;&#x4E0D;&#x4E0A;&#x662F;&#x4EC0;&#x4E48;&#x5F88;&#x597D;&#x7684;&#x5B66;&#x6821;&#xFF0C;&#x4F46;&#x81F3;&#x5C11;&#x4E8C;&#x5341;&#x5E74;&#x524D;</p>]]></description><link>https://blog.jnn.icu/grad-summary/</link><guid isPermaLink="false">64412c1bb2ef5100019488fc</guid><category><![CDATA[随笔]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Thu, 20 Apr 2023 01:39:42 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2023/04/5C7449E1-A394-4F57-B2BE-11C529A414CC.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2023/04/5C7449E1-A394-4F57-B2BE-11C529A414CC.jpeg" alt="&#x3010;&#x968F;&#x7B14;&#x3011;&#x6BD5;&#x4E1A;&#x603B;&#x7ED3;"><p>&#x4ECA;&#x5929;&#x662F;2023&#x5E74;4&#x6708;19&#x65E5;&#xFF0C;&#x8FD8;&#x6709;&#x4E24;&#x4E2A;&#x6708;&#x6211;&#x5C31;&#x6BD5;&#x4E1A;&#x4E86;&#x3002;&#x5317;&#x4EAC;&#x90AE;&#x7535;&#x5927;&#x5B66;&#x2014;&#x2014;&#x867D;&#x7136;&#x8BF4;&#x4E0D;&#x4E0A;&#x662F;&#x4EC0;&#x4E48;&#x5F88;&#x597D;&#x7684;&#x5B66;&#x6821;&#xFF0C;&#x4F46;&#x81F3;&#x5C11;&#x4E8C;&#x5341;&#x5E74;&#x524D;&#x5728;&#x4FE1;&#x606F;&#x6280;&#x672F;&#x65B9;&#x5411;&#x8FD8;&#x662F;&#x80FD;&#x5E72;&#x4E00;&#x5E72;&#x5317;&#x5927;&#x7684;&#x54C8;&#x54C8;&#xFF08;&#x770B;&#x770B;&#x4ECA;&#x5929;&#x90FD;&#x4EC0;&#x4E48;&#x6837;&#x4E86;&#xFF09;&#x3002;&#x4EE5;&#x540E;&#x5C31;&#x4E0D;&#x8BFB;&#x4E66;&#x8FA3;&#xFF01;&#x6240;&#x4EE5;&#x4E5F;&#x60F3;&#x7A0D;&#x5FAE;&#x603B;&#x7ED3;&#x4E00;&#x4E0B;&#x81EA;&#x5DF1;&#x8BFB;&#x4E66;&#x7684;&#x8FD9;&#x4E9B;&#x5E74;&#x3002;</p><p>&#x5173;&#x4E8E;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x8BFB;&#x7814;&#xFF1A;&#x6211;&#x5DE6;&#x770B;&#x53F3;&#x770B;&#x524D;&#x770B;&#x540E;&#x770B;&#x90FD;&#x611F;&#x89C9;&#x56FD;&#x5185;&#x7684;&#x7814;&#x7A76;&#x751F;&#x5B9E;&#x5728;&#x6CA1;&#x4EC0;&#x4E48;&#x8BFB;&#x7684;&#x5FC5;&#x8981;&#x2026;&#x53CD;&#x6B63;&#x8BFB;&#x4E0D;&#x8BFB;&#x7814;&#x5BF9;&#x6211;&#x804C;&#x4E1A;&#x53D1;&#x5C55;&#x90FD;&#x6CA1;&#x5565;&#x5F71;&#x54CD;&#xFF0C;&#x6211;&#x5BF9;&#x79D1;&#x7814;&#x6CA1;&#x5565;&#x5174;&#x8DA3;&#xFF0C;&#x6240;&#x4EE5;&#x8BFB;&#x4E09;&#x5E74;&#x7814;&#x7A76;&#x751F;&#xFF0C;&#x80FD;&#x4E0D;&#x80FD;&#x8BA9;&#x6211;&#x80FD;&#x529B;&#x4E0A;&#x4E00;&#x4E2A;&#x65B0;&#x53F0;&#x9636;&#xFF0C;&#x771F;&#x7684;&#x8981;&#x6253;&#x4E2A;&#x95EE;&#x53F7;&#xFF0C;&#x6BD5;&#x7ADF;&#x6211;&#x5927;&#x5B66;&#x56DB;&#x5E74;&#x6559;&#x5BA4;&#x90FD;&#x6CA1;&#x8FDB;&#x8FC7;&#x51E0;&#x6B21;&#xFF08;&#x9003;&#x3002;</p><p>&#x7559;&#x5B66;&#x7684;&#x8BDD;&#xFF0C;&#x4E00;&#x65B9;&#x9762;&#x5317;&#x7F8E;&#x5C31;&#x4E1A;&#x5E02;&#x573A;&#x4E00;&#x5768;&#x5C4E;&#xFF0C;&#x53E6;&#x4E00;&#x65B9;&#x9762;&#x786E;&#x5B9E;10043&#x4E86;&#xFF0C;&#x53BB;&#x4E0D;&#x4E86;&#x5FC3;&#x5FC3;&#x5FF5;&#x5FF5;&#x7684;&#x67D0;&#x1F1FA;&#x1F1F8;&#x5927;&#x5B66;&#xFF0C;&#x6700;&#x540E;&#x8FD8;&#x6709;&#x4E2A;&#x539F;&#x56E0;&#x5C31;&#x662F;&#x1F474;&#x88AB;&#x5973;&#x4EBA;&#x62D0;&#x8D70;&#x5566;&#xFF01;&#xFF08;&#x5168;&#x90E8;&#x51C6;&#x5907;&#x597D;&#x7ED3;&#x679C;&#x7533;&#x8BF7;&#x5B63;&#x4E0D;&#x60F3;&#x6DA6;&#x4E86;&#xFF09;</p><p>&#x53BB;&#x5411;&#x7684;&#x8BDD;&#xFF0C;&#x8BEF;&#x6253;&#x8BEF;&#x649E;&#x8FDB;&#x5165;&#x4E86;&#x91CF;&#x5316;&#x884C;&#x4E1A;&#xFF0C;&#x8EAB;&#x8FB9;&#x90FD;&#x662F;&#x4E16;&#x754C;&#x4E0A;&#x6700;&#x806A;&#x660E;&#x3001;&#x5B66;&#x5386;&#x6700;&#x70B8;&#x88C2;&#x7684;&#x4E00;&#x6279;&#x4EBA;&#xFF08;&#x5317;&#x90AE;&#x672C;&#x79D1;&#x90FD;&#x79F0;&#x4E0D;&#x4E0A;&#x4E0A;&#x8FC7;&#x5927;&#x5B66;&#xFF09;&#xFF0C;&#x85AA;&#x8D44;&#x5F88;&#x9AD8;&#x5F88;&#x9AD8;&#xFF0C;&#x7BA1;&#x7406;&#x6241;&#x5E73;&#x5316;&#xFF0C;&#x4E5F;&#x6CA1;&#x6709;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x90A3;&#x79CD;&#x6D6E;&#x8E81;&#x4E0E;&#x5185;&#x5377;&#x3002;&#x5927;&#x6982;&#x5C31;&#x662F;&#x6211;&#x7684;&#x5F52;&#x5BBF;&#x4E86;&#xFF5E;&#x6700;&#x540E;&#x5728;&#x7075;&#x5747;infra&#x5B9E;&#x4E60;&#x8F6C;&#x6B63;&#x4E0E;&#x6B63;&#x5B9A;&#x79C1;&#x52DF;&#x91CF;&#x5F00;&#x4E4B;&#x95F4;&#x6289;&#x62E9;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x9009;&#x62E9;&#x4E86;&#x6B63;&#x5B9A;&#x79C1;&#x52DF;&#x3002;</p><p>&#x5BF9;&#x884C;&#x4E1A;&#x6709;&#x4E00;&#x5B9A;&#x4E86;&#x89E3;&#x7684;&#x540C;&#x5B66;&#x4E00;&#x5B9A;&#x4F1A;&#x597D;&#x5947;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x9009;&#x62E9;&#x5728;&#x7075;&#x5747;&#x5DE5;&#x4F5C;&#x3002;&#x5934;&#x90E8;&#x767E;&#x4EBF;&#x79C1;&#x52DF;&#xFF0C;&#x9876;&#x7EA7;&#x85AA;&#x8D44;&#x5F85;&#x9047;&#xFF0C;&#x8D85;&#x9AD8;&#x7684;&#x793E;&#x62DB;bar&#xFF0C;&#x591A;&#x68D2;&#x554A;&#x4E0D;&#x662F;&#x5417;&#x3002;&#x4E3B;&#x8981;&#x662F;&#x56E0;&#x4E3A;&#xFF0C;&#x53E6;&#x4E00;&#x8FB9;&#x7684;&#x5C97;&#x4F4D;&#x5DE5;&#x4F5C;&#x5185;&#x5BB9;&#x662F;&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x642D;&#x5EFA;T0&#x80A1;&#x7968;&#x4EA4;&#x6613;&#x53CA;&#x56DE;&#x6D4B;&#x7CFB;&#x7EDF;&#xFF0C;&#x5BF9;&#x4E8E;&#x6211;&#xFF0C;&#x65B9;&#x624D;&#x6BD5;&#x4E1A;&#xFF0C;&#x60F3;&#x6DF1;&#x5EA6;&#x8FDB;&#x5165;&#x91CF;&#x5316;&#x884C;&#x4E1A;&#x7684;&#x65E0;&#x57FA;&#x7840;&#x672C;&#x79D1;&#x751F;&#xFF0C;&#x6211;&#x8BA4;&#x4E3A;&#x662F;&#x66F4;&#x597D;&#x7684;&#x9009;&#x62E9;&#x3002;&#x7075;&#x5747;&#x7684;&#x8BDD;&#x4E00;&#x65B9;&#x9762;&#x662F;&#x505A;infra&#xFF0C;&#x521A;&#x6BD5;&#x4E1A;&#x5C31;&#x53BB;&#x91CF;&#x5316;&#x505A;infra&#xFF0C;&#x6211;&#x771F;&#x7684;&#x4E0D;&#x77E5;&#x9053;&#x662F;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x597D;&#x7684;&#x9009;&#x62E9;&#xFF0C;&#x6BD5;&#x7ADF;&#x505A;infra&#xFF0C;&#x4E92;&#x8054;&#x7F51;&#x5927;&#x5382;&#x624D;&#x662F;&#x5386;&#x7EC3;&#x7684;&#x597D;&#x9009;&#x62E9;&#x4E0D;&#x662F;&#x5417;&#xFF1F;&#x4F46;&#x662F;2023&#x5E74;&#x7684;&#x4E92;&#x8054;&#x7F51;&#x66F4;&#x5F97;&#x6253;&#x4E2A;&#x95EE;&#x53F7;&#x4E86;&#x2026;</p><p>&#x8FD8;&#x6709;&#x5C31;&#x662F;&#xFF0C;&#x6B63;&#x5B9A;&#x90A3;&#x8FB9;&#x5E26;&#x6211;&#x8FD9;&#x4E2A;&#x7EC4;&#x7684;leader&#x662F;&#x4ED6;&#x4EEC;CTO&#x2014;&#x2014;&#x83AB;&#x961F;&#xFF0C;&#x9AD8;&#x4E2D;&#x6253;&#x4FE1;&#x606F;&#x7ADE;&#x8D5B;&#x5237;&#x6D1B;&#x8C37;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x7ECF;&#x5E38;&#x542C;&#x8BF4;&#xFF0C;&#x4E5F;&#x7B97;&#x8FFD;&#x661F;&#x4E86;&#x5427;&#xFF08;bushi&#x3002;</p><p>&#x8A00;&#x5F52;&#x6B63;&#x4F20;&#xFF0C;&#x4E0D;&#x804A;&#x5C06;&#x6765;&#x4E86;&#xFF0C;&#x804A;&#x804A;&#x8FC7;&#x53BB;&#x3002;&#x6211;&#x4E2A;&#x4EBA;&#x7ECF;&#x5386;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x6709;&#x610F;&#x601D;&#x7684;&#xFF0C;&#x5C0F;&#x65F6;&#x5019;&#x4E00;&#x76F4;&#x5728;&#x5B66;&#x7F8E;&#x672F;&#xFF0C;&#x7F8E;&#x672F;&#x7279;&#x957F;&#x751F;&#x8003;&#x7684;&#x521D;&#x4E2D;&#xFF0C;&#x79D1;&#x6280;&#x7279;&#x957F;&#x751F;&#xFF08;&#x4E2D;&#x8003;&#x5206;&#x6570;&#x591F;&#x4E86;&#x6CA1;&#x5360;&#x8D44;&#x683C;&#xFF09;&#x8003;&#x7684;&#x9AD8;&#x4E2D;&#xFF0C;&#x9AD8;&#x4E2D;&#x8DD1;&#x53BB;&#x6253;&#x4FE1;&#x606F;&#x7ADE;&#x8D5B;&#xFF08;&#x6253;&#x5F97;&#x5F88;&#x70C2;&#xFF0C;&#x5B66;&#x4E86;&#x4FE9;&#x6708;NOIP&#x6253;&#x4E86;20&#x5206;&#x54C8;&#x54C8;&#x54C8;&#x54C8;&#x54C8;&#xFF09;&#x548C;VEX&#x673A;&#x5668;&#x4EBA;&#x6BD4;&#x8D5B;&#xFF0C;&#x4E24;&#x5E74;&#x6CA1;&#x4E0A;&#x8BFE;&#xFF0C;&#x6700;&#x540E;&#x4E24;&#x5B66;&#x671F;&#x4ECE;&#x9AD8;&#x4E8C;&#x4E0B;&#x671F;&#x672B;&#x671D;&#x9633;&#x533A;rank 600&#x786C;&#x751F;&#x751F;&#x5E72;&#x5230;&#x4E00;&#x6A21;rank 30&#xFF0C;&#x53C2;&#x52A0;&#x4E86;&#x6E05;&#x534E;&#x7684;&#x9886;&#x519B;&#x8BA1;&#x5212;&#xFF0C;&#x7136;&#x540E;&#x9AD8;&#x8003;&#x70C2;&#x4E86;&#xFF08;&#x4E3B;&#x8981;&#x662F;&#x8BED;&#x6587;&#x70C2;&#x4E86;&#xFF09;&#xFF0C;&#x53BB;&#x4E86;&#x5317;&#x90AE;&#x3002;</p><p>&#x8BF4;&#x771F;&#x7684;&#x6211;&#x597D;&#x559C;&#x6B22;&#x6211;&#x7684;&#x521D;&#x9AD8;&#x4E2D;&#x2014;&#x2014;&#x5317;&#x4EAC;&#x5E02;&#x7B2C;&#x516B;&#x5341;&#x4E2D;&#x5B66;&#x3002;&#x5B66;&#x6821;&#x7684;&#x6C1B;&#x56F4;&#x5F88;&#x5F00;&#x653E;&#xFF0C;&#x5141;&#x8BB8;&#x6211;&#x9AD8;&#x4E2D;&#x4E24;&#x5E74;&#x4E0D;&#x4E0A;&#x8BFE;&#x53BB;&#x505A;&#x81EA;&#x5DF1;&#x559C;&#x6B22;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x4E5F;&#x4E3A;&#x6211;&#x63D0;&#x4F9B;&#x4E86;&#x5411;&#x5404;&#x79CD;&#x65B9;&#x5411;&#x53D1;&#x5C55;&#x7684;&#x571F;&#x58E4;&#x3002;&#x753B;&#x5802;&#x6625;&#x7F8E;&#x672F;&#x793E;&#xFF0C;&#x6ED1;&#x677F;&#x793E;&#xFF0C;&#x8FEA;&#x6069;&#x5361;&#x95E8;&#x673A;&#x5668;&#x4EBA;&#x793E;&#xFF0C;&#x627F;&#x8F7D;&#x4E86;&#x6211;&#x592A;&#x591A;&#x592A;&#x591A;&#x7684;&#x56DE;&#x5FC6;&#x3002;&#x8FD8;&#x8BB0;&#x5F97;&#x9AD8;&#x4E8C;&#x6BCF;&#x5929;&#x65E9;&#x4E0A;&#x4E03;&#x70B9;&#x5230;&#x673A;&#x5668;&#x4EBA;&#x793E;&#xFF0C;&#x665A;&#x4E0A;&#x5341;&#x70B9;&#x624D;&#x56DE;&#x5BB6;&#xFF0C;&#x5728;&#x793E;&#x56E2;&#x72E0;&#x72E0;&#x6572;&#x4E00;&#x5929;&#x4EE3;&#x7801;&#xFF0C;&#x522B;&#x7684;&#x4EFB;&#x4F55;&#x4E8B;&#x60C5;&#x90FD;&#x4E0D;&#x9700;&#x8981;&#x8003;&#x8651;&#xFF0C;&#x771F;&#x7684;&#x7279;&#x522B;&#x7279;&#x522B;&#x5F00;&#x5FC3;&#x3002;&#x6211;&#x7EDD;&#x5BF9;&#x662F;&#x6700;&#x5F00;&#x5FC3;&#x7684;&#x9AD8;&#x4E2D;&#x751F;&#x3002;</p><p>&#x603B;&#x4E4B;&#x4E0D;&#x80FD;&#x7B97;&#x6210;&#x529F;&#xFF0C;&#x4E5F;&#x4E0D;&#x80FD;&#x7B97;&#x5931;&#x8D25;&#xFF0C;&#x7528;&#x7CBE;&#x5F69;&#x6765;&#x8BC4;&#x4EF7;&#x6211;&#x89C9;&#x5F97;&#x662F;&#x6BD4;&#x8F83;&#x4E2D;&#x80AF;&#x7684;&#x3002;&#x8FD9;&#x4E9B;&#x7ECF;&#x5386;&#x7ED9;&#x6211;&#x5E26;&#x6765;&#x6700;&#x5927;&#x7684;&#x4F18;&#x52BF;&#x662F;&#xFF0C;&#x8BA9;&#x6211;&#x5BF9;&#x65B0;&#x4E8B;&#x7269;&#x7684;&#x89C2;&#x5FF5;&#x6BD4;&#x8F83;open&#xFF0C;&#x613F;&#x610F;&#x53BB;&#x6311;&#x6218;&#x5B8C;&#x5168;&#x6CA1;&#x6709;&#x63A5;&#x89E6;&#x8FC7;&#x7684;&#x4E8B;&#x60C5;&#x3002;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x80FD;&#x5E26;&#x6765;&#x4E86;&#x4E00;&#x4E9B;&#x7F3A;&#x70B9;&#xFF0C;&#x6BD4;&#x5982;&#x4E0D;&#x592A;&#x613F;&#x610F;&#x6DF1;&#x94BB;&#x8FDB;&#x67D0;&#x4E00;&#x4E2A;&#x7EC6;&#x5206;&#x9886;&#x57DF;&#x3002;&#x4E5F;&#x8BB8;&#x8FD9;&#x4E5F;&#x6CE8;&#x5B9A;&#x4E86;&#x6211;&#x7684;&#x5F52;&#x5BBF;&#x662F;startup&#x516C;&#x53F8;&#xFF0C;&#x53BB;&#x505A;&#x4E00;&#x4E9B;&#x5BF9;&#x6280;&#x672F;&#x5E7F;&#x5EA6;&#x4E0E;&#x601D;&#x7EF4;&#x5E7F;&#x5EA6;&#x8981;&#x6C42;&#x6BD4;&#x8F83;&#x9AD8;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x53BB;&#x5927;&#x5382;&#x6210;&#x4E3A;&#x67D0;&#x65B9;&#x5411;&#x7684;&#x6280;&#x672F;&#x4E13;&#x5BB6;&#x3002;</p><p>&#x5148;&#x5199;&#x5230;&#x8FD9;&#x513F;&#xFF0C;&#x6709;&#x65B0;&#x60F3;&#x6CD5;&#x518D;&#x7EE7;&#x7EED;&#x5199;&#x1F60C;&#xFF5E;</p>]]></content:encoded></item><item><title><![CDATA[理解 RDMA]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x9886;&#x57DF;&#xFF0C;&#x8FDC;&#x7A0B;&#x76F4;&#x63A5;&#x5185;&#x5B58;&#x8BBF;&#x95EE;&#xFF08;&#x82F1;&#x8A9E;&#xFF1A;remote direct memory access&#xFF0C;RDMA&#xFF09;&#x662F;&#x4E00;&#x79CD;&#x7ED5;&#x8FC7;&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5185;&#x6838;&#x8BBF;&#x95EE;&#x5176;&#x5185;&#x5B58;&#x4E2D;&#x6570;&#x636E;</p>]]></description><link>https://blog.jnn.icu/li-jie-rdma/</link><guid isPermaLink="false">64412c1bb2ef5100019488fa</guid><category><![CDATA[RDMA]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Wed, 04 Jan 2023 08:46:24 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2023/01/word-image-55.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.jnn.icu/content/images/2023/01/word-image-55.png" alt="&#x7406;&#x89E3; RDMA"><p>&#x5728;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x9886;&#x57DF;&#xFF0C;&#x8FDC;&#x7A0B;&#x76F4;&#x63A5;&#x5185;&#x5B58;&#x8BBF;&#x95EE;&#xFF08;&#x82F1;&#x8A9E;&#xFF1A;remote direct memory access&#xFF0C;RDMA&#xFF09;&#x662F;&#x4E00;&#x79CD;&#x7ED5;&#x8FC7;&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5185;&#x6838;&#x8BBF;&#x95EE;&#x5176;&#x5185;&#x5B58;&#x4E2D;&#x6570;&#x636E;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x7531;&#x4E8E;&#x4E0D;&#x7ECF;&#x8FC7;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x4E0D;&#x4EC5;&#x8282;&#x7701;&#x4E86;&#x5927;&#x91CF;CPU&#x8D44;&#x6E90;&#xFF0C;&#x540C;&#x6837;&#x4E5F;&#x63D0;&#x9AD8;&#x4E86;&#x7CFB;&#x7EDF;&#x541E;&#x5410;&#x91CF;&#x3001;&#x964D;&#x4F4E;&#x4E86;&#x7CFB;&#x7EDF;&#x7684;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x5EF6;&#x8FDF;&#xFF0C;&#x5C24;&#x5176;&#x9002;&#x5408;&#x5728;&#x5927;&#x89C4;&#x6A21;&#x5E76;&#x884C;&#x8BA1;&#x7B97;&#x673A;&#x96C6;&#x7FA4;&#x4E2D;&#x6709;&#x5E7F;&#x6CDB;&#x5E94;&#x7528;&#x3002;&#x5728;&#x57FA;&#x4E8E;NVMe over Fabric&#x7684;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x4E2D;&#xFF0C;RDMA&#x53EF;&#x4EE5;&#x914D;&#x5408;&#x9AD8;&#x6027;&#x80FD;&#x7684;NVMe SSD&#x6784;&#x5EFA;&#x9AD8;&#x6027;&#x80FD;&#x3001;&#x4F4E;&#x5EF6;&#x8FDF;&#x7684;&#x5B58;&#x50A8;&#x7F51;&#x7EDC;&#x3002;</p>
<h2 id="%E4%BB%8E-dma-%E5%88%B0-rdma">&#x4ECE; DMA &#x5230; RDMA</h2>
<p>&#x5728;&#x7406;&#x89E3; RDMA &#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x8981;&#x56DE;&#x987E;&#x4E00;&#x4E0B; DMA&#x3002;</p>
<blockquote>
<p>DMA&#xFF0C;&#x76F4;&#x63A5;&#x5185;&#x5B58;&#x8BBF;&#x95EE;&#xFF0C;&#x662F;&#x7535;&#x8111;&#x79D1;&#x5B66;&#x4E2D;&#x7684;&#x4E00;&#x79CD;&#x5185;&#x5B58;&#x8BBF;&#x95EE;&#x6280;&#x672F;&#x3002;&#x5B83;&#x5141;&#x8BB8;&#x67D0;&#x4E9B;&#x7535;&#x8111;&#x5185;&#x90E8;&#x7684;&#x786C;&#x4EF6;&#x5B50;&#x7CFB;&#x7EDF;&#xFF08;&#x7535;&#x8111;&#x5916;&#x8BBE;&#xFF09;&#xFF0C;&#x53EF;&#x4EE5;&#x72EC;&#x7ACB;&#x5730;&#x76F4;&#x63A5;&#x8BFB;&#x5199;&#x7CFB;&#x7EDF;&#x5185;&#x5B58;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x4E2D;&#x592E;&#x5904;&#x7406;&#x5668;&#xFF08;CPU&#xFF09;&#x4ECB;&#x5165;&#x5904;&#x7406; &#x3002;&#x5728;&#x540C;&#x7B49;&#x7A0B;&#x5EA6;&#x7684;&#x5904;&#x7406;&#x5668;&#x8D1F;&#x62C5;&#x4E0B;&#xFF0C;DMA&#x662F;&#x4E00;&#x79CD;&#x5FEB;&#x901F;&#x7684;&#x6570;&#x636E;&#x4F20;&#x9001;&#x65B9;&#x5F0F;&#x3002;&#x5F88;&#x591A;&#x786C;&#x4EF6;&#x7684;&#x7CFB;&#x7EDF;&#x4F1A;&#x4F7F;&#x7528;DMA&#xFF0C;&#x5305;&#x542B;&#x786C;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x3001;&#x7ED8;&#x56FE;&#x663E;&#x5361;&#x3001;&#x7F51;&#x5361;&#x548C;&#x58F0;&#x5361;&#x3002;</p>
</blockquote>
<p>&#x5728; DMA &#x51FA;&#x73B0;&#x4E4B;&#x524D;&#xFF0C;&#x8BFB;&#x53D6; IO &#x8BBE;&#x5907;&#x7684;&#x6570;&#x636E;&#x9700;&#x8981;&#x5B8C;&#x5168;&#x4F9D;&#x8D56; CPU&#xFF0C;IO &#x8BBE;&#x5907;&#x5728;&#x6709;&#x6570;&#x636E;&#x53EF;&#x8BFB;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x89E6;&#x53D1;&#x4E00;&#x4E2A;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#xFF0C;CPU &#x653E;&#x4E0B;&#x624B;&#x5934;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x4FDD;&#x5B58;&#x5DE5;&#x4F5C;&#x573A;&#x666F;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#xFF0C;&#x8FDB;&#x5165;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#xFF0C;&#x4E14; IO &#x8BBE;&#x5907;&#x5360;&#x7528;&#x603B;&#x7EBF;&#xFF0C;CPU &#x8BFB;&#x53D6;&#x603B;&#x7EBF;&#xFF0C;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x5B8C;&#x6210;&#x540E;&#x518D;&#x6062;&#x590D;&#x4E4B;&#x524D;&#x6B63;&#x5728;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x3002;DMA &#x5176;&#x5B9E;&#x5C31;&#x662F;&#x5F15;&#x5165;&#x4E86;&#x4E00;&#x4E2A; DMA &#x63A7;&#x5236;&#x5668;&#xFF0C;&#x8BA9; IO &#x8BBE;&#x5907;&#x7ECF;&#x8FC7;&#x63A7;&#x5236;&#x5668;&#x76F4;&#x63A5;&#x5411;&#x5185;&#x5B58;&#x5199;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x8BA9; CPU &#x5904;&#x7406;&#x4E2D;&#x65AD;&#xFF0C;&#x6D88;&#x9664;&#x4E86; CPU &#x5904;&#x7406;&#x4E2D;&#x65AD;&#x7684;&#x5F00;&#x9500;&#xFF0C;&#x8282;&#x7EA6;&#x4E86; CPU &#x5B9D;&#x8D35;&#x7684;&#x65F6;&#x949F;&#x5468;&#x671F;&#x3002;</p>
<p>RDMA &#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;&#x662F;&#x8FDC;&#x7A0B; DMA&#xFF0C;&#x4F46;&#x662F; DMA &#x662F; IO &#x8BBE;&#x5907;&#x8BBF;&#x95EE;&#x5185;&#x5B58;&#xFF0C;RDMA &#x7684;&#x4E24;&#x4E2A;&#x4E3B;&#x8981;&#x5BF9;&#x8C61;&#x4E0D;&#x518D;&#x662F;&#x901A;&#x8FC7;&#x603B;&#x7EBF;&#x76F8;&#x8FDE;&#xFF0C;&#x5E76;&#x4E14;&#x4E5F;&#x4E0D;&#x662F; IO &#x8BBE;&#x5907;&#x3002;RDMA &#x662F;&#x4E00;&#x53F0;&#x8BA1;&#x7B97;&#x673A;&#x8BBF;&#x95EE;&#x53E6;&#x4E00;&#x53F0;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x5185;&#x5B58;&#x3002;</p>
<p>&#x7B80;&#x5355;&#x5BF9;&#x6BD4;&#x4E00;&#x4E0B; DMA &#x4E0E; RDMA &#x7684;&#x8FC7;&#x7A0B;&#x3002;</p>
<ul>
<li>DMA&#xFF1A;IO &#x8BBE;&#x5907; -&gt; DMA &#x63A7;&#x5236;&#x5668; -&gt; &#x5185;&#x5B58;</li>
<li>RDMA&#xFF1A;&#x8FDC;&#x7AEF;&#x8BA1;&#x7B97;&#x673A;&#x67D0;&#x64CD;&#x4F5C; -&gt; &#x8FDC;&#x7AEF;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x5361; -&gt; &#x67D0;&#x7F51;&#x7EDC; -&gt; &#x672C;&#x5730;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x5361; -&gt; DMA &#x63A7;&#x5236;&#x5668; -&gt; &#x5185;&#x5B58;</li>
</ul>
<p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x8FDC;&#x7AEF;&#x8BA1;&#x7B97;&#x673A;&#x5230;&#x672C;&#x673A;&#x7F51;&#x5361;&#x4E00;&#x4F53;&#x5316;&#x89C6;&#x4F5C;&#x4E00;&#x53F0; IO &#x8BBE;&#x5907;&#xFF0C;&#x518D;&#x901A;&#x8FC7; DMA &#x7684;&#x65B9;&#x5F0F;&#x5199;&#x5165;&#x672C;&#x673A;&#x5185;&#x5B58;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x672C;&#x673A;&#x7684; CPU &#x53C2;&#x4E0E;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x3002;</p>
<h2 id="rdma-how-to">RDMA How to</h2>
<p>RDMA &#x6070;&#x6070;&#x662F; InfiniBand &#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x5E94;&#x7528;&#x3002;</p>
<p>&#x5F88;&#x660E;&#x663E;&#xFF0C;RDMA &#x7684;&#x8FC7;&#x7A0B;&#x6709;&#x7F51;&#x5361;&#x53C2;&#x4E0E;&#xFF0C;&#x5E76;&#x4E14;&#x8FD9;&#x4E9B;&#x7F51;&#x5361;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x4E13;&#x7528;&#x7684;&#x63A7;&#x5236;&#x903B;&#x8F91;&#xFF0C;&#x65E0;&#x6CD5;&#x4E0D;&#x4F9D;&#x8D56;&#x4E13;&#x7528;&#x7F51;&#x5361;&#x5C31;&#x5F88;&#x8F7B;&#x677E;&#x5730;&#x5B9E;&#x73B0;&#x3002;&#x8FD9;&#x65F6;&#x5019;&#x5C31;&#x5F15;&#x5165;&#x4E86; InfiniBand &#x67B6;&#x6784;&#x3002;</p>
<p>Mellanox &#x63D0;&#x4F9B;&#x4E86;&#x57FA;&#x4E8E; IB &#x5F00;&#x6E90;&#x7684; rdma &#x5185;&#x6838;&#x62D3;&#x5C55; rdma-core&#xFF0C;&#x5E76;&#x4E14;&#x5C01;&#x88C5;&#x4E86;&#x5404;&#x8BED;&#x8A00;&#x53EF;&#x7528;&#x7684;&#x5E93;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8BE5;&#x62D3;&#x5C55;&#x5B9E;&#x73B0;&#x57FA;&#x4E8E; IB &#x7684; RDMA &#x901A;&#x8BAF;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x4F1A;&#x5C1D;&#x8BD5;&#x57FA;&#x4E8E; rdma-core &#x7684; python &#x5C01;&#x88C5;&#x5728; IB &#x7F51;&#x7EDC;&#x4E0A;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A; RDMA demo&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[理解 InfiniBand 网络架构]]></title><description><![CDATA[<p>InfiniBand &#x5176;&#x5B9E;&#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x534F;&#x8BAE;&#x6808;&#xFF0C;&#x4E3B;&#x8981;&#x5173;&#x6CE8;&#x7F51;&#x7EDC;&#x5C42;&#x3001;&#x7269;&#x7406;&#x5C42;&#x4E0E;&#x6570;&#x636E;&#x94FE;&#x8DEF;&#x5C42;&#xFF0C;&#x5E76;&#x4E14;&#x652F;&#x6301;&#x6570;&#x79CD;&#x53EF;&#x9760;&#x6027;&#x7B49;&#x7EA7;&#x3002;InfiniBand &#x7684;&#x6700;&#x5927;&#x7279;&#x70B9;</p>]]></description><link>https://blog.jnn.icu/li-jie-infiniband-wang-luo-jia-gou/</link><guid isPermaLink="false">64412c1bb2ef5100019488f9</guid><category><![CDATA[InfiniBand]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Wed, 04 Jan 2023 07:45:59 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2023/01/mellanox-logo-horizontal-blue.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jnn.icu/content/images/2023/01/mellanox-logo-horizontal-blue.jpg" alt="&#x7406;&#x89E3; InfiniBand &#x7F51;&#x7EDC;&#x67B6;&#x6784;"><p>InfiniBand &#x5176;&#x5B9E;&#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x534F;&#x8BAE;&#x6808;&#xFF0C;&#x4E3B;&#x8981;&#x5173;&#x6CE8;&#x7F51;&#x7EDC;&#x5C42;&#x3001;&#x7269;&#x7406;&#x5C42;&#x4E0E;&#x6570;&#x636E;&#x94FE;&#x8DEF;&#x5C42;&#xFF0C;&#x5E76;&#x4E14;&#x652F;&#x6301;&#x6570;&#x79CD;&#x53EF;&#x9760;&#x6027;&#x7B49;&#x7EA7;&#x3002;InfiniBand &#x7684;&#x6700;&#x5927;&#x7279;&#x70B9;&#x662F;&#x8D85;&#x9AD8;&#x5E26;&#x5BBD;&#xFF0C;&#x5E76;&#x4E14;&#x652F;&#x6301;&#x4FDD;&#x8BC1;&#x53EF;&#x9760;&#x4E14;&#x65E0;&#x635F;&#x7684;&#x4F20;&#x8F93;&#x3002;<br>&#x5982;&#x679C;&#x5BF9; OSI &#x4E03;&#x5C42;&#x6A21;&#x578B;&#x6BD4;&#x8F83;&#x4E86;&#x89E3;&#xFF0C;&#x4F1A;&#x53D1;&#x73B0; InfiniBand &#x548C; OSI &#x4E03;&#x5C42;&#x6A21;&#x578B;&#x7684;&#x5B66;&#x4E60;&#x601D;&#x8DEF;&#x662F;&#x4E00;&#x81F4;&#x7684;&#x3002;InfiniBand &#x7F51;&#x7EDC;&#x4E0D;&#x662F;&#x4E00;&#x79CD;&#x5177;&#x4F53;&#x7684;&#x7F51;&#x7EDC;&#x3002;&#x57FA;&#x4E8E;InfiniBand&#x89C4;&#x8303;&#x6240;&#x642D;&#x5EFA;&#x7684;&#x7F51;&#x7EDC;&#x5747;&#x4E3A; InfiniBand &#x7F51;&#x7EDC;&#xFF0C;&#x6B63;&#x5982;&#x6309;&#x7167;&#x4EE5;&#x592A;&#x7F51;&#x89C4;&#x8303;&#x5EFA;&#x7ACB;&#x7684;&#x7F51;&#x7EDC;&#x662F;&#x4EE5;&#x592A;&#x7F51;&#x4E00;&#x6837;&#x3002;&#x8FD9;&#x79CD;&#x67B6;&#x6784;&#x89C4;&#x5B9A;&#x4E86;&#x4F20;&#x8F93;&#x4ECB;&#x8D28;&#x4EE5;&#x53CA;&#x8FDE;&#x63A5;&#x65B9;&#x5F0F;&#x548C;&#x4F20;&#x8F93;&#x89C4;&#x5219;&#xFF08;&#x6821;&#x9A8C;&#x3001;&#x5305;&#x683C;&#x5F0F;&#x3001;&#x9519;&#x8BEF;&#x68C0;&#x6D4B;&#x7B49;&#xFF09;&#x3002;<br>&#x4F46;&#x662F;&#x4E0E; OSI &#x4E03;&#x5C42;&#x6A21;&#x578B;&#x4E0D;&#x540C;&#xFF0C;IB &#x4E3B;&#x8981;&#x5C06;&#x6CE8;&#x610F;&#x529B;&#x96C6;&#x4E2D;&#x5728;&#x4E0B;&#x4E09;&#x5C42;&#xFF08;&#x66F4;&#x591A;&#x7684;&#x7CBE;&#x5DE7;&#x8BBE;&#x8BA1;&#x96C6;&#x4E2D;&#x5728;&#x4E0B;&#x4E24;&#x5C42;&#xFF09;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x8D85;&#x9AD8;&#x5E26;&#x5BBD;&#x548C;&#x65E0;&#x635F;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x3002;<br>&#x9605;&#x8BFB; InfiniBand &#x7684;&#x4ECB;&#x7ECD;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;InfiniBand &#x5176;&#x5B9E;&#x662F;&#x5BF9;&#x4F20;&#x7EDF;&#x7F51;&#x7EDC;&#x67B6;&#x6784;&#x7684;&#x4F18;&#x5316;&#x3001;&#x521B;&#x65B0;&#x4E0E;&#x7EE7;&#x627F;&#xFF0C;&#x7279;&#x5316;&#x4E86;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x96C6;&#x7FA4;&#x573A;&#x666F;&#x4E0B;&#x7684;&#x901A;&#x8BAF;&#x529F;&#x80FD;&#xFF0C;&#x5EF6;&#x7528;&#x4E86;&#x5F88;&#x591A;&#x4F20;&#x7EDF;&#x7F51;&#x7EDC;&#x67B6;&#x6784;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x800C;&#x975E;&#x98A0;&#x8986;&#x6027;&#x5730;&#x5F15;&#x5165;&#x4FE1;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x4F8B;&#x5982; MAC &#x3001;&#x5B50;&#x7F51;&#x7B49;&#x6982;&#x5FF5;&#x7684;&#x542B;&#x4E49;&#x5728; InfiniBand &#x67B6;&#x6784;&#x4E2D;&#x4E0E;&#x4F20;&#x7EDF;&#x67B6;&#x6784;&#x4E2D;&#x76F8;&#x540C;&#x3002;<br>&#x7531;&#x4E8E;&#x5206;&#x5C42;&#x660E;&#x786E;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x5B8C;&#x6574;&#x7684;&#x670D;&#x52A1;&#x539F;&#x8BED;&#xFF0C;&#x4F20;&#x7EDF;&#x7684;&#x4E0A;&#x5C42;&#x534F;&#x8BAE;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x5728; IB &#x4E0A;&#xFF08;&#x867D;&#x7136;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x4E00;&#x4E9B; adapter&#xFF09;&#xFF0C;&#x5982; UDP&#x3001;TCP&#x4E0E;HTTP&#x7B49;&#x4E0A;&#x5C42;&#x534F;&#x8BAE;&#x3002;&#x4F46;&#x662F;&#x6709;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x662F;&#x9700;&#x8981;&#x88AB;&#x5173;&#x6CE8;&#x7684;&#xFF0C;IB &#x7684;&#x4E0B;&#x5C42;&#x534F;&#x8BAE;&#x5DF2;&#x7ECF;&#x786E;&#x4FDD;&#x4E86;&#x6570;&#x636E;&#x7684;&#x65E0;&#x635F;&#x4F20;&#x8F93;&#xFF0C;&#x800C;&#x4F20;&#x7EDF;&#x7684;&#x4E0A;&#x5C42;&#x534F;&#x8BAE;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x4E0B;&#x5C42;&#x4E0D;&#x53EF;&#x9760;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x52A0;&#x5165;&#x4E86;&#x5927;&#x91CF;&#x5BF9;&#x4E8E;&#x57FA;&#x4E8E; IB &#x7684;&#x4E0A;&#x5C42;&#x5E94;&#x7528;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x65E0;&#x6CD5;&#x91CA;&#x653E; IB &#x7684;&#x5168;&#x90E8;&#x6F5C;&#x529B;&#x3002;<br>&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6709;&#x4E00;&#x7CFB;&#x5217;&#x57FA;&#x4E8E; IB &#x7279;&#x6027;&#xFF0C;&#x4E3A; IB &#x91CF;&#x8EAB;&#x5B9A;&#x5236;&#x7684;&#x4E00;&#x4E9B;&#x534F;&#x8BAE;&#xFF0C;&#x5982; RDMA&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[Django CORS 策略配置]]></title><description><![CDATA[一般来说，前后端分离模式的开发均需要对CORS进行配置，本文将讲解django框架下CORS的配置。]]></description><link>https://blog.jnn.icu/django-cors/</link><guid isPermaLink="false">64412c1bb2ef5100019488f1</guid><category><![CDATA[CORS]]></category><category><![CDATA[Django]]></category><category><![CDATA[后端]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Sun, 10 Jan 2021 21:01:01 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2022/07/What-is-CORS-.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><h1>Django CORS &#x7B56;&#x7565;&#x914D;&#x7F6E;</h1>
<img src="https://blog.jnn.icu/content/images/2022/07/What-is-CORS-.png" alt="Django CORS &#x7B56;&#x7565;&#x914D;&#x7F6E;"><p>CORS: Cross-origin resource sharing &#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5171;&#x4EAB;</p>
<p>&#x6BD4;&#x5982;&#x4E0D;&#x540C;&#x57DF;&#x540D;&#x6216;&#x8005;&#x4E0D;&#x540C;&#x7AEF;&#x53E3;&#xFF0C;&#x90FD;&#x4F1A;&#x6216;&#x591A;&#x6216;&#x5C11;&#x9047;&#x5230;CORS&#x7684;&#x60C5;&#x51B5;&#xFF0C;Django &#x9ED8;&#x8BA4;&#x662F;&#x4E0D;&#x5141;&#x8BB8; CORS &#x7684;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x6A21;&#x5757;&#x53BB;&#x914D;&#x7F6E;&#x7B56;&#x7565;</p>
<p>&#x6BD4;&#x8F83;&#x4E3B;&#x6D41;&#x7684;&#x65B9;&#x6848;&#x662F;&#x4F7F;&#x7528; django-cors-headers &#x6A21;&#x5757;</p>
<h2>&#x5B89;&#x88C5; django-cors-headers &#x6A21;&#x5757;</h2>
<pre><code class="language-shell line-numbers">pip install django-cors-headers
</code></pre>
<p>&#x4FEE;&#x6539; settings.py</p>
<pre><code class="language-python line-numbers"># &#x5B89;&#x88C5;&#x6A21;&#x5757;
INSTALLED_APPS = [
    ...
    &apos;corsheaders&apos;,
    ...
]

#&#x6DFB;&#x52A0;&#x4E2D;&#x95F4;&#x4EF6;
MIDDLEWARE = [
    ...
    &apos;django.middleware.common.CommonMiddleware&apos;,
    &apos;corsheaders.middleware.CorsMiddleware&apos;,
    # &#x6211;&#x7684;&#x914D;&#x7F6E;&#x4E0B;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x5F00;&#x4E86;&#x4F1A;403 &#x8FD8;&#x6CA1;&#x7814;&#x7A76; &#x53CD;&#x6B63;&#x90E8;&#x7F72;&#x7684;&#x65F6;&#x5019;&#x8BB0;&#x5F97;&#x53BB;&#x6CE8;&#x91CA;
    #&apos;django.middleware.csrf.CsrfViewMiddleware&apos;,
    ...
]
</code></pre>
<h2>&#x914D;&#x7F6E; CORS &#x7B56;&#x7565;</h2>
<p>django-cors-headers &#x6A21;&#x5757;&#x63D0;&#x4F9B;&#x4E86;&#x4EE5;&#x4E0B;&#x4E09;&#x4E2A;&#x914D;&#x7F6E;&#x9879;</p>
<ul>
<li>&#x2460;<code>CORS_ALLOWED_ORIGINS</code></li>
<li>&#x2461;<code>CORS_ALLOWED_ORIGIN_REGEXES</code></li>
<li>&#x2462;<code>CORS_ALLOW_ALL_ORIGINS</code></li>
</ul>
<h3>&#x2460; &#x767D;&#x540D;&#x5355;</h3>
<p>&#x5141;&#x8BB8;&#x7684;&#x6765;&#x6E90;&#xFF0C;&#x53C2;&#x8003;&#x5982;&#x4E0B;&#x586B;&#x5199;</p>
<pre><code class="language-python line-numbers">CORS_ALLOWED_ORIGINS = [
    &quot;https://example.com&quot;,
    &quot;https://sub.example.com&quot;,
    &quot;http://localhost:8080&quot;,
    &quot;http://127.0.0.1:9000&quot;
]
</code></pre>
<h3>&#x2461; &#x6B63;&#x5219;&#x5339;&#x914D;&#x6765;&#x6E90;</h3>
<p>&#x4F7F;&#x7528;&#x6B63;&#x5219;&#x5339;&#x914D;&#x6765;&#x6E90; URI&#xFF0C;&#x5339;&#x914D;&#x6210;&#x529F;&#x5219;&#x5141;&#x8BB8; CORS&#xFF0C;&#x53C2;&#x8003;&#x5982;&#x4E0B;&#x586B;&#x5199;</p>
<pre><code class="language-python line-numbers">CORS_ALLOWED_ORIGIN_REGEXES = [
    r&quot;^https://\w+\.example\.com$&quot;,
]
</code></pre>
<h3>&#x2462; &#x5141;&#x8BB8;&#x5168;&#x90E8;&#x6765;&#x6E90;&#x2B50;</h3>
<p>&#x5141;&#x8BB8;&#x6240;&#x6709;&#x6765;&#x6E90;&#xFF0C;<strong>&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x5343;&#x4E07;&#x4E0D;&#x8981;&#x5F00;&#x542F;</strong>&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; <code>False</code></p>
<p>&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x53EF;&#x4EE5;&#x6253;&#x5F00;&#xFF0C;&#x914D;&#x7F6E;&#x5982;&#x4E0B;</p>
<pre><code class="language-python line-numbers">CORS_ALLOW_ALL_ORIGINS = True # &#x8FD9;&#x662F;&#x5F00;&#x53D1;&#x73AF;&#x5883; &#x751F;&#x4EA7;&#x73AF;&#x5883;&#x8BF7;&#x586B; False
</code></pre>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Python 字符串语法糖]]></title><description><![CDATA[<!--kg-card-begin: html--><h2>1.Raw String: r&#x2019;some content here&#x2019;</h2>
<p>string&#x524D;&#x9762;&#x52A0;&#x2018;r&#x2019;&#xFF0C; &#x544A;&#x8BC9;&#x89E3;&#x91CA;&#x5668;&#x8FD9;&#x4E2A;string&#x662F;&#x4E2A;raw string&#xFF0C;&#x4E0D;&#x8981;&#x8F6C;&#x4E49;&#x3002; &#x4F8B;&#x5982;&#xFF0C;\n &#x5728;raw string&#x4E2D;&#xFF0C;&#x662F;&#x4E24;&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;</p>]]></description><link>https://blog.jnn.icu/python--e5-ad-97-e7-ac-a6-e4-b8-b2-e8-af-ad-e6-b3-95-e7-b3-96/</link><guid isPermaLink="false">64412c1bb2ef5100019488f4</guid><category><![CDATA[python]]></category><category><![CDATA[语法糖]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Tue, 16 Feb 2021 22:00:15 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2022/07/1-frqKS5AHTuLDyuugGywtsg.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><h2>1.Raw String: r&#x2019;some content here&#x2019;</h2>
<img src="https://blog.jnn.icu/content/images/2022/07/1-frqKS5AHTuLDyuugGywtsg.jpeg" alt="Python &#x5B57;&#x7B26;&#x4E32;&#x8BED;&#x6CD5;&#x7CD6;"><p>string&#x524D;&#x9762;&#x52A0;&#x2018;r&#x2019;&#xFF0C; &#x544A;&#x8BC9;&#x89E3;&#x91CA;&#x5668;&#x8FD9;&#x4E2A;string&#x662F;&#x4E2A;raw string&#xFF0C;&#x4E0D;&#x8981;&#x8F6C;&#x4E49;&#x3002; &#x4F8B;&#x5982;&#xFF0C;\n &#x5728;raw string&#x4E2D;&#xFF0C;&#x662F;&#x4E24;&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;\&#x548C;n&#xFF0C; &#x800C;&#x4E0D;&#x4F1A;&#x8F6C;&#x610F;&#x4E3A;&#x6362;&#x884C;&#x7B26;&#x3002;&#x7531;&#x4E8E;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x548C; \ &#x4F1A;&#x6709;&#x51B2;&#x7A81;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x5F53;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x4F7F;&#x7528;&#x4E86;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x540E;&#xFF0C;&#x6700;&#x597D;&#x5728;&#x524D;&#x9762;&#x52A0;&#x4E0A;&#x2019;r&#x2019;&#x3002;</p>
<p>&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x5F88;&#x591A; Intellisense &#x4F1A;&#x628A;&#x52A0;r&#x7684;string&#x6807;&#x8BB0;&#x6210;&#x6B63;&#x5219;&#x6A21;&#x5F0F;&#x4E32;</p>
<pre><code class="language-python line-numbers">print(r&apos;hello world\n&apos;)
# &gt; hello world\n
</code></pre>
<h2>2. Format String: f&#x2019;some content here&#x2019;</h2>
<p>&#x610F;&#x4E3A;&#x5D4C;&#x5957;&#x53D8;&#x91CF;&#xFF0C;&#x683C;&#x5F0F;&#x5316;&#xFF0C;&#x6BD4;&#x5982;</p>
<pre><code class="language-python line-numbers">name = &apos;Jimmy&apos;
f&apos;Hello {name}!&apos;
# &gt; Hello Jimmy!
</code></pre>
<p>&#x7B49;&#x4EF7;&#x4E8E;</p>
<pre><code class="language-python line-numbers">&apos;Hello {name}!&apos;.format(name=&apos;Jimmy&apos;)
# &gt; Hello Jimmy!
</code></pre>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Django ORM 入门笔记]]></title><description><![CDATA[<!--kg-card-begin: html--><p>&#x524D;&#x7F6E;&#x77E5;&#x8BC6; <a class="wp-editor-md-post-content-link" href="https://blog.jnn.icu/%e5%90%8e%e7%ab%af%e5%85%a5%e9%97%a8/">&#x540E;&#x7AEF;&#x5165;&#x95E8;</a> <a class="wp-editor-md-post-content-link" href>Django &#x9879;&#x76EE;&#x57FA;&#x7840;&#x914D;&#x7F6E;</a></p>
<p>&#x672C;&#x7B14;&#x8BB0;&#x9ED8;&#x8BA4;&#x8BFB;&#x8005;&#x5DF2;&#x7ECF;&#x5BF9;&#x6570;&#x636E;&#x5E93;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x8BA4;&#x8BC6;</p>
<p><strong>&#x6700;&#x5C11;&#x9700;&#x8981;&#x7406;&#x89E3;&#x5982;&#x4F55;&#x5728;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5EFA;&#x7ACB;&#x4E00;</strong></p>]]></description><link>https://blog.jnn.icu/basic-concepts-of-orm-in-django/</link><guid isPermaLink="false">64412c1bb2ef5100019488f5</guid><category><![CDATA[Django]]></category><category><![CDATA[ORM]]></category><category><![CDATA[python]]></category><category><![CDATA[后端]]></category><category><![CDATA[教程]]></category><dc:creator><![CDATA[Noam Chi]]></dc:creator><pubDate>Mon, 08 Mar 2021 23:59:51 GMT</pubDate><media:content url="https://blog.jnn.icu/content/images/2022/07/big-data-featured.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://blog.jnn.icu/content/images/2022/07/big-data-featured.png" alt="Django ORM &#x5165;&#x95E8;&#x7B14;&#x8BB0;"><p>&#x524D;&#x7F6E;&#x77E5;&#x8BC6; <a class="wp-editor-md-post-content-link" href="https://blog.jnn.icu/%e5%90%8e%e7%ab%af%e5%85%a5%e9%97%a8/">&#x540E;&#x7AEF;&#x5165;&#x95E8;</a> <a class="wp-editor-md-post-content-link" href>Django &#x9879;&#x76EE;&#x57FA;&#x7840;&#x914D;&#x7F6E;</a></p>
<p>&#x672C;&#x7B14;&#x8BB0;&#x9ED8;&#x8BA4;&#x8BFB;&#x8005;&#x5DF2;&#x7ECF;&#x5BF9;&#x6570;&#x636E;&#x5E93;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x8BA4;&#x8BC6;</p>
<p><strong>&#x6700;&#x5C11;&#x9700;&#x8981;&#x7406;&#x89E3;&#x5982;&#x4F55;&#x5728;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5EFA;&#x7ACB;&#x4E00;&#x5BF9;&#x4E00;&#x3001;&#x4E00;&#x5BF9;&#x591A;&#x3001;&#x591A;&#x5BF9;&#x591A;&#x5173;&#x7CFB;</strong></p>
<p>&#x672C;&#x7B14;&#x8BB0;&#x5EFA;&#x7ACB;&#x5728;&#x5DF2;&#x7ECF;&#x77E5;&#x6653;&#x5E76;&#x914D;&#x7F6E;&#x5B8C;&#x6570;&#x636E;&#x5E93;&#x8FDE;&#x63A5;&#x7684;&#x524D;&#x63D0;&#x4E0B;</p>
<p>&#x672C;&#x7B14;&#x8BB0;&#x4E2D;&#x4F7F;&#x7528;&#x7684;&#x6570;&#x636E;&#x5E93;&#x662F; MySQL 8.0</p>
<p>&#x4F7F;&#x7528;<code>pymysql</code>&#x6A21;&#x5757;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#x65F6;&#xFF0C;<code>manage.py</code> &#x5728;&#x6267;&#x884C;&#x6570;&#x636E;&#x5E93;&#x76F8;&#x5173;&#x6307;&#x4EE4;&#x65F6;&#x8981;&#x6C42;&#x8BA1;&#x7B97;&#x673A;shell&#x4E2D;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;<code>mysql</code>&#x6307;&#x4EE4;</p>
<h2>ORM &#x57FA;&#x7840;&#x6982;&#x5FF5;</h2>
<h3>&#x7B80;&#x5355;&#x4E86;&#x89E3; ORM</h3>
<p>Object Relational Mapping &#x5BF9;&#x8C61;&#x5173;&#x7CFB;&#x6620;&#x5C04;&#xFF0C;&#x7B80;&#x79F0;ORM&#x3002;</p>
<p>ORM&#x901A;&#x8FC7;&#x4F7F;&#x7528;&#x63CF;&#x8FF0;&#x5BF9;&#x8C61;&#x548C;&#x6570;&#x636E;&#x5E93;&#x4E4B;&#x95F4;&#x6620;&#x5C04;&#x7684;&#x5143;&#x6570;&#x636E;&#xFF0C;&#x5C06;&#x7A0B;&#x5E8F;&#x4E2D;&#x7684;&#x5BF9;&#x8C61;&#x81EA;&#x52A8;&#x6301;&#x4E45;&#x5316;&#x5230;&#x5173;&#x7CFB;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;ORM&#x5728;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x5C42;&#x548C;&#x6570;&#x636E;&#x5E93;&#x5C42;&#x4E4B;&#x95F4;&#x5145;&#x5F53;&#x4E86;&#x6865;&#x6881;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>
<p>&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;&#x4EE5;&#x5F80;&#x6211;&#x4EEC;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#x65F6;&#x4F7F;&#x7528;&#x7684;&#x662F; SQL &#x8BED;&#x53E5;&#xFF0C;&#x4F46;&#x6709;&#x4E86; ORM &#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#x53EA;&#x9700;&#x8981;&#x64CD;&#x4F5C;&#x5728; ORM &#x6846;&#x67B6;&#x4E0B;&#x5EFA;&#x7ACB;&#x7684;&#x6570;&#x636E;&#x6A21;&#x578B;&#x5BF9;&#x8C61;&#xFF0C;&#x7136;&#x540E; ORM &#x66FF;&#x6211;&#x4EEC;&#x6267;&#x884C;&#x80CC;&#x540E;&#x7684; SQL &#x8BED;&#x53E5;&#x3002;&#x7B26;&#x5408;&#x6211;&#x4EEC;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x7F16;&#x7A0B;&#x7684;&#x4E60;&#x60EF;&#xFF0C;&#x4E5F;&#x6709;&#x6548;&#x9632;&#x6B62;&#x4E86; SQL &#x6CE8;&#x5165;&#x653B;&#x51FB;&#x7684;&#x53D1;&#x751F;&#x3002;</p>
<h3>ORM &#x5BF9;&#x8C61;&#x548C;&#x6570;&#x636E;&#x5E93;&#x7ED3;&#x6784;&#x7684;&#x5BF9;&#x5E94;&#x5173;&#x7CFB;</h3>
<p>&#x8FD9;&#x91CC;&#x4EE5; Django &#x4E3A;&#x4F8B;&#x3002;</p>
<p>&#x4EE5;&#x4E0B;&#x662F;&#x6211;&#x4EEC;&#x5927;&#x521B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x8868;&#x7684;&#x6A21;&#x578B;&#x4E0E;&#x8BBE;&#x8BA1;&#x3002;</p>
<pre><code class="language-python line-numbers">class SiteAllPeriod(models.Model):
    periodid = models.AutoField(db_column=&apos;periodID&apos;, primary_key=True)
    week = models.IntegerField()
    siteperiodid = models.IntegerField(db_column=&apos;sitePeriodID&apos;)
    siteid = models.ForeignKey(Site, models.DO_NOTHING, db_column=&apos;siteID&apos;, related_name=&apos;%(class)s_siteid&apos;)
    sitename = models.ForeignKey(Site, models.DO_NOTHING, db_column=&apos;siteName&apos;, related_name=&apos;%(class)s_sitename&apos;)
    date = models.DateField()
    childsiteid = models.ForeignKey(&apos;SiteChild&apos;, models.DO_NOTHING, db_column=&apos;childSiteID&apos;, blank=True, null=True, related_name=&apos;%(class)s_childsiteid&apos;)
    childsitename = models.ForeignKey(&apos;SiteChild&apos;, models.DO_NOTHING, db_column=&apos;childSiteName&apos;, blank=True, null=True, related_name=&apos;%(class)s_childsitename&apos;)
    starttime = models.TimeField(db_column=&apos;startTime&apos;, blank=True, null=True)
    endtime = models.TimeField(db_column=&apos;endTime&apos;, blank=True, null=True)
    stateid = models.ForeignKey(&apos;SitePeriodState&apos;, models.DO_NOTHING, db_column=&apos;stateID&apos;, blank=True, null=True, related_name=&apos;%(class)s_stateid&apos;)
    prompt = models.CharField(max_length=50, blank=True, null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    studentprice = models.DecimalField(db_column=&apos;studentPrice&apos;, max_digits=10, decimal_places=2, blank=True, null=True)
    staffprice = models.DecimalField(db_column=&apos;staffPrice&apos;, max_digits=10, decimal_places=2, blank=True, null=True)lowercase.
    orderusername = models.CharField(db_column=&apos;orderUserName&apos;, max_length=30, blank=True, null=True)
    orderuserpaymethod = models.CharField(db_column=&apos;orderUserPayMethod&apos;, max_length=30, blank=True, null=True)
    needsubcard = models.IntegerField(db_column=&apos;needSubcard&apos;, blank=True, null=True)
    teachingperiodname = models.CharField(db_column=&apos;teachingPeriodName&apos;, max_length=30, blank=True, null=True) 
    teacher = models.CharField(max_length=30, blank=True, null=True)

    class Meta:
        managed = False
        db_table = &apos;site_all_period&apos;
</code></pre>
<p><img src="https://blog.jnn.icu/content/images/wordpress/2021/03/image-20210308202542918.png" alt="Django ORM &#x5165;&#x95E8;&#x7B14;&#x8BB0;"><img src="https://blog.jnn.icu/content/images/wordpress/2021/03/image-20210308202619123.png" alt="Django ORM &#x5165;&#x95E8;&#x7B14;&#x8BB0;"></p>
<p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x6765;&#xFF0C;Django &#x7684; ORM &#x7684;&#x6A21;&#x578B;&#x4E2D;&#xFF1A;</p>
<ul>
<li>&#x7C7B;&#x5BF9;&#x5E94;&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x8868;</li>
<li>&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x5BF9;&#x5E94;&#x7740;&#x4E00;&#x6761;&#x8BB0;&#x5F55;</li>
<li>&#x7C7B;&#x7684;&#x5C5E;&#x6027;&#x5BF9;&#x5E94;&#x7740;&#x8868;&#x5185;&#x7684;&#x5B57;&#x6BB5;</li>
<li>&#x7C7B;&#x5C5E;&#x6027;&#x7684;&#x7C7B;&#x578B;&#x5BF9;&#x5E94;&#x7740;&#x8868;&#x5185;&#x5B57;&#x6BB5;&#x7684;&#x7C7B;&#x578B;</li>
<li>&#x7C7B;&#x5C5E;&#x6027;&#x7C7B;&#x578B;&#x6784;&#x9020;&#x65F6;&#x7684;&#x53C2;&#x6570;&#x4E0E;&#x5B57;&#x6BB5;&#x7684;&#x53C2;&#x6570;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;</li>
<li>&#x5916;&#x952E;&#x62E5;&#x6709;&#x7279;&#x6B8A;&#x7684;&#x7C7B;&#x578B;</li>
<li>&#x5916;&#x952E;&#x7C7B;&#x578B;&#x76F4;&#x63A5;&#x6307;&#x5411;&#x53E6;&#x4E00;&#x4E2A; ORM &#x6A21;&#x578B;&#xFF08;&#x5982;&#x679C;&#x53E6;&#x4E00;&#x4E2A;&#x6A21;&#x578B;&#x5728;&#x672C;&#x6A21;&#x578B;&#x4E0B;&#x65B9;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x5355;&#x5F15;&#x53F7;&#x5305;&#x88F9;&#xFF09;</li>
</ul>
<p>&#x53EF;&#x89C1; ORM &#x7684;&#x6A21;&#x578B;&#x65E2;&#x80FD;&#x548C;&#x6570;&#x636E;&#x5E93;&#x5F62;&#x6210;&#x826F;&#x597D;&#x7684;&#x5BF9;&#x5E94;&#x5173;&#x7CFB;&#x3001;&#x80FD;&#x4F53;&#x73B0;&#x51FA;&#x6570;&#x636E;&#x5E93;&#x4E0D;&#x540C;&#x8868;&#x4E4B;&#x95F4;&#x7684;&#x5BF9;&#x5E94;&#x5173;&#x7CFB;&#x3002;</p>
<p><strong>&#x3010;&#x77E5;&#x8BC6;&#x94FE;&#x63A5;&#x3011;</strong>&#x1F447;</p>
<p><a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/topics/db/models/?ref=blog.jnn.icu">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM &#x4E2D;&#x7684;&#x6A21;&#x578B;</a></p>
<p><a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/models/fields/?ref=blog.jnn.icu">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM &#x4E2D;&#x7684;&#x5B57;&#x6BB5;</a></p>
<h3>Django ORM &#x7279;&#x6027; &#x2014; &#x53CD;&#x5411;&#x67E5;&#x8BE2;</h3>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5B57;&#x6BB5;&#x7C7B;&#x578B;&#x6784;&#x9020;&#x7684;&#x53C2;&#x6570;&#x4E2D;&#xFF0C;&#x6709;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;<code>related_name</code>&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x5B83;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x4E3A; ORM &#x6A21;&#x578B;&#x63D0;&#x4F9B;&#x53CD;&#x5411;&#x67E5;&#x8BE2;&#x652F;&#x6301;&#x3002;</p>
<h4>&#x4EC0;&#x4E48;&#x662F;&#x53CD;&#x5411;&#x67E5;&#x8BE2;</h4>
<p>&#x5728;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x5E38;&#x5916;&#x952E;(Foreign Key)&#x6765;&#x5B9E;&#x73B0;&#x5173;&#x7CFB;&#xFF0C;&#x53CD;&#x5411;&#x67E5;&#x8BE2;&#x662F;&#x4F7F;&#x7528;&#x5916;&#x952E;&#x5BFB;&#x627E;&#x53E6;&#x4E00;&#x8868;&#x4E2D;&#x8BB0;&#x5F55;&#x7684;&#x53CD;&#x8FC7;&#x7A0B;&#x3002;</p>
<p>&#x62FF;&#x5230;&#x4E00;&#x4E2A;&#x8BB0;&#x5F55;&#x540E;&#xFF0C;&#x53CD;&#x5411;&#x67E5;&#x8BE2;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x4F7F;&#x7528;&#x5916;&#x952E;&#x6307;&#x5411;&#x8BE5;&#x8BB0;&#x5F55;&#x7684;&#x5176;&#x4ED6;&#x8868;&#x4E2D;&#x7684;&#x8BB0;&#x5F55;&#x3002;</p>
<h4>related_name &#x9700;&#x8981;&#x72EC;&#x4E00;&#x65E0;&#x4E8C;&#xFF1F;</h4>
<p>&#x5982;&#x679C;&#x4F60;&#x5C06;&#x4E24;&#x4E2A;<code>related_name</code>&#x8BBE;&#x4E3A;&#x76F8;&#x540C;&#x503C;&#xFF0C;&#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#x6846;&#x67B6;&#x65E0;&#x6CD5;&#x6B63;&#x5E38;&#x542F;&#x52A8;&#x3002;</p>
<p>&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#xFF0C;&#x77E5;&#x9053;&#x5916;&#x952E;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#x552F;&#x4E00;&#x7684;&#x8BB0;&#x5F55;&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x80FD;&#x6709;&#x4E0D;&#x540C;&#x8868;&#x7684;&#x591A;&#x4E2A;&#x5916;&#x952E;&#x6307;&#x5411;&#x540C;&#x4E00;&#x8BB0;&#x5F55;&#x3002;&#x5982;&#x679C;&#x5B58;&#x5728;&#x76F8;&#x540C;&#x7684;<code>related_name</code>&#xFF0C;&#x7A0B;&#x5E8F;&#x5C31;&#x65E0;&#x6CD5;&#x77E5;&#x6653;&#x5E94;&#x8BE5;&#x53BB;&#x54EA;&#x4E00;&#x4E2A;&#x8868;&#x5BFB;&#x627E;&#x5916;&#x952E;&#x4E86;&#xFF0C;&#x5C31;&#x65E0;&#x6CD5;&#x53CD;&#x5411;&#x83B7;&#x5F97;&#x90A3;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x8BB0;&#x5F55;&#x3002;</p>
<hr>
<h2>&#x5728; Django &#x4E2D;&#x914D;&#x7F6E; ORM &#x6A21;&#x578B;</h2>
<h3>&#x521B;&#x5EFA;&#x4E00;&#x4E2A; ORM &#x6A21;&#x578B;</h3>
<p>&#x4E3A;&#x4E86;<del>&#x5077;&#x61D2;</del>&#x5BB9;&#x6613;&#x7406;&#x89E3;&#xFF0C;&#x8FD9;&#x91CC;&#x5F15;&#x5165;&#x4E00;&#x4E2A;&#x6765;&#x81EA; Django &#x5B98;&#x65B9;&#x6587;&#x6863;&#x7684;&#x6837;&#x4F8B;</p>
<p>&#x8FD9;&#x4E2A;&#x6837;&#x4F8B;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A; <code>Person</code> &#x6A21;&#x578B;&#xFF0C;&#x62E5;&#x6709; <code>first_name</code> &#x548C; <code>last_name</code>:</p>
<pre><code class="language-python line-numbers">from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
</code></pre>
<p><code>first_name</code> &#x548C; <code>last_name</code> &#x662F;&#x6A21;&#x578B;&#x7684; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/topics/db/models/?ref=blog.jnn.icu#fields">&#x5B57;&#x6BB5;</a>&#x3002;&#x6BCF;&#x4E2A;&#x5B57;&#x6BB5;&#x90FD;&#x88AB;&#x6307;&#x5B9A;&#x4E3A;&#x4E00;&#x4E2A;&#x7C7B;&#x5C5E;&#x6027;&#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x4E2A;&#x5C5E;&#x6027;&#x6620;&#x5C04;&#x4E3A;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x5217;&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x7684; <code>Person</code> &#x6A21;&#x578B;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5982;&#x4E0B;&#x7684;&#x6570;&#x636E;&#x5E93;&#x8868;&#xFF1A;</p>
<pre><code class="language-sql line-numbers">CREATE TABLE myapp_person (
    &quot;id&quot; serial NOT NULL PRIMARY KEY,
    &quot;first_name&quot; varchar(30) NOT NULL,
    &quot;last_name&quot; varchar(30) NOT NULL
);
</code></pre>
<p>&#x82E5;&#x60F3;&#x8BE6;&#x7EC6;&#x4E86;&#x89E3;&#x5404;&#x79CD;&#x5B57;&#x6BB5;&#xFF0C;&#x8BF7;&#x79FB;&#x6B65;<a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/topics/db/models/?ref=blog.jnn.icu#field-options">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM &#x5B57;&#x6BB5;&#x9009;&#x9879;</a></p>
<h3>&#x4F7F;&#x7528;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x6A21;&#x578B;</h3>
<p><span class="text-highlighted-inline" style="background-color: #fffd38;">&#x5047;&#x8BBE;&#x4E0A;&#x9762;&#x7684;&#x6A21;&#x578B;&#x4F4D;&#x4E8E;<code>myapp</code>&#x9879;&#x76EE;&#x7684;<code>models.py</code>&#x6A21;&#x5757;&#x5185;</span></p>
<p>&#x4E00;&#x65E6;&#x4F60;&#x5B9A;&#x4E49;&#x4E86;&#x4F60;&#x7684;&#x6A21;&#x578B;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x544A;&#x8BC9; Django &#x4F60;&#x51C6;&#x5907; <em>&#x4F7F;&#x7528;</em> &#x8FD9;&#x4E9B;&#x6A21;&#x578B;&#x3002;&#x4F60;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x8BBE;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x7684; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/settings/?ref=blog.jnn.icu#std:setting-INSTALLED_APPS"><code>INSTALLED_APPS</code></a> &#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x8BBE;&#x7F6E;&#x4E2D;&#x6DFB;&#x52A0;&#x5305;&#x542B; <code>models.py</code> &#x6587;&#x4EF6;&#x7684;&#x6A21;&#x5757;&#x540D;&#x79F0;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x82E5;&#x6A21;&#x578B;&#x4F4D;&#x4E8E;&#x9879;&#x76EE;&#x4E2D;&#x7684; <code>myapp.models</code> &#x6A21;&#x5757;&#xFF08; &#x6B64;&#x5305;&#x7ED3;&#x6784;&#x7531; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/django-admin/?ref=blog.jnn.icu#django-admin-startapp"><code>manage.py startapp</code></a> &#x547D;&#x4EE4;&#x521B;&#x5EFA;&#xFF09;&#xFF0C; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/settings/?ref=blog.jnn.icu#std:setting-INSTALLED_APPS"><code>INSTALLED_APPS</code></a> &#x5E94;&#x8BBE;&#x7F6E;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python line-numbers">INSTALLED_APPS = [
    #...
    &apos;myapp&apos;,
    #...
]
</code></pre>
<p>&#x5F53;&#x4F60;&#x5411; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/settings/?ref=blog.jnn.icu#std:setting-INSTALLED_APPS"><code>INSTALLED_APPS</code></a> &#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x5E94;&#x7528;&#x540E;&#x3002;</p>
<p>&#x8FD0;&#x884C; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/django-admin/?ref=blog.jnn.icu#django-admin-migrate"><code>manage.py migrate</code></a>&#xFF0C;&#x4F60;&#x7684;&#x6A21;&#x578B;&#x4F1A;&#x88AB;&#x81EA;&#x52A8;&#x6620;&#x5C04;&#x5230;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#xFF08;&#x65B0;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7B26;&#x5408;&#x6A21;&#x578B;&#x7684;&#x8868;&#xFF09;</p>
<p>&#x8FD9;&#x65F6;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; myapp_person &#x7684;&#x8868;</p>
<h3>&#x4F7F;&#x7528; Meta &#x4FE1;&#x606F;&#x6307;&#x5B9A;&#x547D;&#x540D;&#x8868;</h3>
<p>&#x5982;&#x679C;&#x6211;&#x60F3;&#x8BA9;&#x4E0A;&#x9762;&#x7684;&#x6A21;&#x578B;&#x5BF9;&#x5E94;&#x7684;&#x8868;&#x62E5;&#x6709;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x8868;&#x540D;&#x5462;&#xFF1F;</p>
<p>&#x7B54;&#x6848;&#x662F;&#xFF1A;&#x5B9A;&#x4E49; Meta &#x5B50;&#x7C7B;</p>
<pre><code class="language-python line-numbers">from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    class Meta:
        db_table = &apos;person&apos;
</code></pre>
<p>&#x6DFB;&#x52A0;&#x4E86;&#x8BE5; Meta &#x5B50;&#x7C7B;&#x540E;&#xFF0C;&#x4F7F;&#x7528;<code>manage.py migrate</code>&#x8FC1;&#x79FB;&#x5B8C;&#x6210;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x8868;&#x5C31;&#x540D;&#x4E3A; person &#x4E86;&#x3002;</p>
<p>&#x5143;&#x6570;&#x636E;&#x8FD8;&#x6709;&#x5176;&#x4ED6;&#x5F88;&#x591A;&#x53C2;&#x6570;&#x53EF;&#x9009;&#xFF0C;&#x5177;&#x4F53;&#x8BF7;&#x79FB;&#x6B65; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/?ref=blog.jnn.icu">&#x6A21;&#x578B;&#x53EF;&#x9009;&#x53C2;&#x6570;&#x53C2;&#x8003;</a></p>
<h3>&#x4F7F;&#x7528;&#x5DF2;&#x6709;&#x6570;&#x636E;&#x5E93;&#x81EA;&#x52A8;&#x5EFA;&#x7ACB; ORM &#x6A21;&#x578B;</h3>
<ul>
<li><strong>Django ORM &#x7684;&#x53E6;&#x4E00;&#x5F3A;&#x5927;&#x4E4B;&#x5904;&#x5728;&#x4E8E;&#x5B83;&#x53EF;&#x4EE5;&#x53CC;&#x5411;&#x6784;&#x9020;&#x6620;&#x5C04;</strong></li>
<li>&#x521B;&#x5EFA;&#x4E86;&#x6A21;&#x578B;&#xFF0C;&#x53EF;&#x4EE5;&#x751F;&#x6210;&#x8868;&#xFF1B;&#x540C;&#x6837;&#x7684;&#xFF0C;&#x8BBE;&#x8BA1;&#x4E86;&#x8868;&#xFF0C;&#x53EF;&#x4EE5;&#x751F;&#x6210;&#x6A21;&#x578B;</li>
</ul>
<p>&#x9996;&#x5148;&#xFF0C;&#x5728;<code>settings.py</code>&#x914D;&#x7F6E;&#x6570;&#x636E;&#x5E93;</p>
<p>&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x8FD0;&#x884C;&#x6307;&#x4EE4;</p>
<pre><code class="language-bash line-numbers">python manage.py dbshell
</code></pre>
<p>&#x5982;&#x679C;&#x6267;&#x884C;&#x540E;&#xFF0C;&#x4F60;&#x8FDB;&#x5165;&#x4E86;&#x6570;&#x636E;&#x5E93;&#x7684;&#x547D;&#x4EE4;&#x884C;&#xFF0C;&#x5C31;&#x8BF4;&#x660E;&#x914D;&#x7F6E;&#x6210;&#x529F;&#x4E86;</p>
<pre><code class="language-bash line-numbers">python manage.py inspectdb &gt; models.py
</code></pre>
<p>&#x9759;&#x5F85;&#x4E24;&#x5206;&#x949F;&#xFF0C;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x8F93;&#x51FA;&#xFF0C;&#x8FD0;&#x884C;&#x7ED3;&#x675F;&#xFF0C;&#x5219;&#x8BF4;&#x660E;<code>models.py</code>&#x751F;&#x6210;&#x6210;&#x529F;</p>
<p>&#x53BB;&#x6839;&#x76EE;&#x5F55;&#x5BFB;&#x627E;<code>models.py</code>&#x6587;&#x4EF6;&#xFF0C;&#x653E;&#x5230;&#x559C;&#x6B22;&#x7684;&#x5730;&#x65B9;&#xFF08;&#xFF1F;&#xFF09;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x4F7F;&#x7528;&#x4E86;&#x3002;</p>
<hr>
<h2>&#x5728; Django &#x4E2D;&#x4F7F;&#x7528; ORM &#x5B8C;&#x6210;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;</h2>
<p>&#x5982;&#x679C;&#x65F6;&#x95F4;&#x5145;&#x88D5;&#xFF0C;&#x5EFA;&#x8BAE;&#x5148;&#x53BB;&#x6E29;&#x4E60;&#x4E00;&#x4E0B;<a class="wp-editor-md-post-content-link" href="https://www.runoob.com/sql/sql-tutorial.html?ref=blog.jnn.icu">SQL</a>&#xFF0C;Django &#x7684; ORM &#x4F7F;&#x7528;&#x4E86;&#x5F88;&#x591A;&#x9AD8;&#x7EA7;&#x7684; SQL &#x8BED;&#x53E5;&#xFF0C;&#x62E5;&#x6709;&#x76F8;&#x5173;&#x77E5;&#x8BC6;&#x6709;&#x52A9;&#x4E8E;&#x7406;&#x89E3; ORM &#x7684;&#x8FD0;&#x884C;<del>&#x5426;&#x5219;&#x5C31;&#x662F;&#x7384;&#x5B66;</del></p>
<p>&#x4E0B;&#x9762;&#x4F1A;&#x5C55;&#x793A;&#x4E00;&#x4E9B;&#x5E38;&#x7528; SQL &#x8BED;&#x53E5;&#x7684; ORM &#x5BF9;&#x5E94;</p>
<p>&#x7EE7;&#x7EED;&#x4EE5;&#x7B14;&#x8BB0;&#x5F00;&#x5934;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x6A21;&#x578B;&#x4E3A;&#x4F8B;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x89C2;&#x5BDF;&#xFF0C;&#x8FD9;&#x91CC;&#x518D;&#x8D34;&#x4E00;&#x4E2A;&#x62F7;&#x8D1D;</p>
<pre><code class="language-python line-numbers">class SiteAllPeriod(models.Model):
    periodid = models.AutoField(db_column=&apos;periodID&apos;, primary_key=True)
    week = models.IntegerField()
    siteperiodid = models.IntegerField(db_column=&apos;sitePeriodID&apos;)
    siteid = models.ForeignKey(Site, models.DO_NOTHING, db_column=&apos;siteID&apos;, related_name=&apos;%(class)s_siteid&apos;)
    sitename = models.ForeignKey(Site, models.DO_NOTHING, db_column=&apos;siteName&apos;, related_name=&apos;%(class)s_sitename&apos;)
    date = models.DateField()
    childsiteid = models.ForeignKey(&apos;SiteChild&apos;, models.DO_NOTHING, db_column=&apos;childSiteID&apos;, blank=True, null=True, related_name=&apos;%(class)s_childsiteid&apos;)
    childsitename = models.ForeignKey(&apos;SiteChild&apos;, models.DO_NOTHING, db_column=&apos;childSiteName&apos;, blank=True, null=True, related_name=&apos;%(class)s_childsitename&apos;)
    starttime = models.TimeField(db_column=&apos;startTime&apos;, blank=True, null=True)
    endtime = models.TimeField(db_column=&apos;endTime&apos;, blank=True, null=True)
    stateid = models.ForeignKey(&apos;SitePeriodState&apos;, models.DO_NOTHING, db_column=&apos;stateID&apos;, blank=True, null=True, related_name=&apos;%(class)s_stateid&apos;)
    prompt = models.CharField(max_length=50, blank=True, null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    studentprice = models.DecimalField(db_column=&apos;studentPrice&apos;, max_digits=10, decimal_places=2, blank=True, null=True)
    staffprice = models.DecimalField(db_column=&apos;staffPrice&apos;, max_digits=10, decimal_places=2, blank=True, null=True)lowercase.
    orderusername = models.CharField(db_column=&apos;orderUserName&apos;, max_length=30, blank=True, null=True)
    orderuserpaymethod = models.CharField(db_column=&apos;orderUserPayMethod&apos;, max_length=30, blank=True, null=True)
    needsubcard = models.IntegerField(db_column=&apos;needSubcard&apos;, blank=True, null=True)
    teachingperiodname = models.CharField(db_column=&apos;teachingPeriodName&apos;, max_length=30, blank=True, null=True) 
    teacher = models.CharField(max_length=30, blank=True, null=True)

    class Meta:
        managed = False
        db_table = &apos;site_all_period&apos;
</code></pre>
<h3>1. SELECT * FROM site_all_period</h3>
<p><span class="text-highlighted-inline" style="background-color: #fffd38;">&#x8BA4;&#x771F;&#x770B;&#x672C;&#x6761;&#xFF01;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E9B;&#x8BB2;&#x89E3;&#xFF01;</span></p>
<p>&#x9009;&#x62E9; site_all_period &#x4E2D;&#x5168;&#x90E8;&#x7684;&#x8BB0;&#x5F55;</p>
<p>ORM&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x8BED;&#x53E5;&#x83B7;&#x53D6;&#x8BB0;&#x5F55;</p>
<pre><code class="language-python line-numbers">querySet = SiteAllPeriod.objects.all()
</code></pre>
<p>SQL &#x8BED;&#x53E5;&#x67E5;&#x8BE2;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x8BB0;&#x5F55;&#x5217;&#x8868;&#xFF0C;&#x800C; ORM &#x67E5;&#x8BE2;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x662F;<code>QuerySet</code>&#xFF0C;&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x50A8;&#x5B58;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x7684;&#x96C6;&#x5408;&#x3002;</p>
<h4>&#x4E86;&#x89E3; <code>QuerySet</code></h4>
<p><code>QuerySet</code>&#x548C; Python &#x6807;&#x51C6;&#x7684; list &#x7C7B;&#x578B;&#x6709;&#x4E9B;&#x76F8;&#x4F3C;&#xFF0C;&#x4F7F;&#x7528;&#x65F6;&#x5F88;&#x591A;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x5F53;&#x4F5C;&#x4E00;&#x4E2A; list &#x6765;&#x5904;&#x7406;&#xFF0C;&#x6BD4;&#x5982;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>for ... in ...</code>&#x904D;&#x5386;&#x9009;&#x62E9;&#x5230;&#x7684;&#x8BB0;&#x5F55;&#xFF0C;&#x6216;&#x8005;&#x4F7F;&#x7528;&#x4E0B;&#x6807;&#x8BBF;&#x95EE;<code>index</code>&#x4F4D;&#x7F6E;&#x7684;&#x8BB0;&#x5F55;&#xFF08;&#x5982;&#x679C;&#x8BB0;&#x5F55;&#x6709;&#x5E8F;&#xFF0C;&#x8FD9;&#x4E2A;&#x7684;&#x7528;&#x5904;&#x5C31;&#x6BD4;&#x8F83;&#x5927;&#x4E86;&#xFF09;&#x3002;</p>
<ul>
<li><strong>&#x4EC5;&#x4EC5;&#x521B;&#x5EFA;<code>QuerySet</code>&#x4E0D;&#x4F1A;&#x89E6;&#x53D1;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;</strong>&#xFF0C;&#x53EA;&#x6709;&#x5728;<code>QuerySet</code>&#x88AB;&#x4F7F;&#x7528;&#xFF08;&#x8BFB;&#x53D6;&#x5177;&#x4F53;&#x5185;&#x5BB9;&#xFF09;&#x65F6;&#xFF0C;&#x624D;&#x4F1A;&#x6267;&#x884C;&#x5BF9;&#x5E94;&#x7684; SQL &#x8BED;&#x53E5;&#x3002;<p></p>
</li>
<li>
<p><strong><code>QuerySet</code>&#x662F;&#x53EF;&#x4EE5;&#x8FED;&#x4EE3;&#x7684;</strong>&#xFF0C;&#x6BD4;&#x5982;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>records = SiteAllPeriod.objects.all().all().all().all().all()</code>&#xFF08;&#x9003;&#xFF09;</p>
<p><strong>&#x8BF7;&#x7262;&#x8BB0;&#x5B83;&#x53EF;&#x4EE5;&#x88AB;&#x8FED;&#x4EE3;&#xFF0C;&#x5B83;&#x7684;&#x8FED;&#x4EE3;&#x7279;&#x6027;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x7EC4;&#x88C5;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684; SQL &#x8BED;&#x53E5;</strong>&#x3002;&#x770B;&#x6587;&#x6863;&#x5E94;&#x8BE5;&#x662F;&#x4F1A;&#x5408;&#x5E76;&#x6210;&#x5355; SQL &#x8BED;&#x53E5;&#xFF0C;&#x6709;&#x5F85;&#x9A8C;&#x8BC1;&#xFF0C;&#x597D;&#x5947;&#x53EF;&#x4EE5;QQ&#x8054;&#x7EDC;&#x6211;&#x8BA9;&#x6211;&#x9A8C;&#x8BC1;&#x3002;</p>
</li>
<li>
<p><strong><code>QuerySet</code>&#x5177;&#x6709;&#x7F13;&#x5B58;&#x529F;&#x80FD;</strong>&#xFF0C;&#x5982;&#x679C;&#x4E8B;&#x5148;&#x521B;&#x5EFA;&#x4E86;<code>QuerySet</code>&#x5BF9;&#x8C61;&#xFF0C;&#x90A3;&#x4E48;&#x5BF9;&#x5B83;&#x8FDB;&#x884C;&#x904D;&#x5386;&#x4E0D;&#x4F1A;&#x53CD;&#x590D;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#xFF0C;&#x800C;&#x662F;&#x4F1A;&#x5BF9;&#x5DF2;&#x6709;&#x7684;<code>QuerySet</code>&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x904D;&#x5386;&#x3002;</p>
<p>&#x5177;&#x4F53;&#x7F13;&#x5B58;&#x673A;&#x5236;&#x8BF7;&#x53C2;&#x9605; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/?ref=blog.jnn.icu#caching-and-querysets">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM QuerySet &#x7F13;&#x5B58;&#x673A;&#x5236;</a></p>
</li>
</ul>
<p>&#x82E5;&#x60F3;&#x66F4;&#x5168;&#x9762;&#x7684;&#x4E86;&#x89E3;<code>QuerySet</code>&#xFF0C;&#x8BF7;&#x9605;&#x8BFB; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/ref/models/querysets/?ref=blog.jnn.icu">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM &#x4E2D;&#x7684; QuerySet</a></p>
<h3>2. SELECT * FROM site_all_period WHERE week=1</h3>
<p>&#x9009;&#x62E9; site_all_period &#x4E2D;week=1&#x7684;&#x5168;&#x90E8;&#x8BB0;&#x5F55;</p>
<p>ORM&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x8BED;&#x53E5;&#x83B7;&#x53D6;&#x8BB0;&#x5F55;</p>
<pre><code class="language-python line-numbers">querySet = SiteAllPeriod.objects.filter(week=1) # &#x4F7F;&#x7528;&#x53C2;&#x6570;&#x540D;&#x786E;&#x5B9A;&#x5BF9;&#x8C61;&#x5C5E;&#x6027;(&#x5B57;&#x6BB5;)
</code></pre>
<h4>TIP</h4>
<p>&#x5047;&#x8BBE;&#x4F60;&#x60F3;&#x8981;&#x50CF;<strong>2</strong>&#x4E2D;&#x9009;&#x62E9;<code>week=1</code>&#x7684;&#x8BB0;&#x5F55;&#x90A3;&#x6837;&#xFF0C;&#x9009;&#x62E9;<code>siteid=1</code>&#x7684;&#x8BB0;&#x5F55;&#x3002;&#x4E3A;&#x6B64;&#x4F60;&#x4F7F;&#x7528;&#x4E86;&#x5982;&#x4E0B;&#x8BED;&#x53E5;&#xFF0C;&#x4F1A;&#x600E;&#x4E48;&#x6837;&#xFF1F;</p>
<pre><code class="language-python line-numbers">querySet = SiteAllPeriod.objects.filter(siteid=1)
</code></pre>
<p>&#x7B54;&#x6848;&#x662F;&#x65E0;&#x6CD5;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#xFF0C;&#x56E0;&#x4E3A;<code>siteid</code>&#x662F;&#x4E00;&#x4E2A;&#x5916;&#x952E;&#xFF0C;&#x4F60;&#x5C06;&#x5B83;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x540D;&#x79F0;&#xFF0C;ORM &#x4F1A;&#x5C1D;&#x8BD5;&#x53BB;&#x5BFB;&#x627E;&#x5916;&#x952E;&#x5BF9;&#x5E94;&#x7684;&#x5BF9;&#x8C61;&#x3002;</p>
<p>&#x90A3;&#x5982;&#x679C;&#x786E;&#x5B9E;&#x60F3;&#x8981;&#x83B7;&#x5F97;<code>siteid=1</code>&#x7684;&#x8BB0;&#x5F55;&#x5462;&#xFF1F;</p>
<p>&#x8BF7;&#x5728;&#x8BE5;&#x5C5E;&#x6027;&#x540D;&#x79F0;&#x540E;&#x65B9;&#x52A0;&#x4E0A;<code>_id</code>&#xFF0C;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x8BED;&#x53E5;&#xFF1A;</p>
<pre><code class="language-python line-numbers">querySet = SiteAllPeriod.objects.filter(siteid_id=1) # &#x5916;&#x952E;&#x5C5E;&#x6027;+_id&#x624D;&#x80FD;&#x83B7;&#x53D6;&#x5230;&#x5B57;&#x6BB5;&#x7684;&#x503C;
</code></pre>
<h3>3. SELECT JOIN &#x8FDE;&#x63A5;&#x67E5;&#x8BE2;/&#x8DE8;&#x8868;&#x67E5;&#x8BE2;</h3>
<p>&#x5982;&#x679C;&#x8981;&#x5B9E;&#x73B0;&#x5BF9;&#x5173;&#x7CFB;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x4EE5;&#x5F80;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F7F;&#x7528; JOIN SQL &#x8BED;&#x53E5;&#x6765;&#x8FDB;&#x884C;&#x8FDE;&#x63A5;&#x67E5;&#x8BE2;&#xFF0C;Django &#x7684; ORM &#x540C;&#x6837;&#x63D0;&#x4F9B;&#x4E86;&#x6781;&#x5176;&#x7B80;&#x4FBF;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5373;&#x201C;&#x53CC;&#x4E0B;&#x5212;&#x7EBF;&#x201D;</p>
<p>&#x9898;&#x5916;&#x8BDD;&#xFF1A;&#x8FD9;&#x4E2A;&#x7B14;&#x8BB0;&#x53EA;&#x80FD;&#x5E2E;&#x52A9;&#x8BFB;&#x8005;&#x5BF9; ORM &#x5EFA;&#x7ACB;&#x4E00;&#x5B9A;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x9274;&#x4E8E;&#x8FD9;&#x4E1C;&#x897F;&#x7684;&#x590D;&#x6742;&#x6027;&#xFF0C;&#x53EA;&#x80FD;&#x4E3E;&#x4E00;&#x4E9B;&#x4F8B;&#x5B50;&#xFF0C;&#x4E0D;&#x53EF;&#x80FD;&#x5B8C;&#x6574;&#x5448;&#x73B0; ORM &#x7684;&#x795E;&#x5947;&#x529F;&#x80FD;&#xFF0C;&#x8FD8;&#x662F;&#x9700;&#x8981;&#x8BFB;&#x8005;&#x5B8C;&#x6574;&#x9605;&#x8BFB;&#x6587;&#x6863;&#x3002;</p>
<p>&#x6BD4;&#x5982;&#x4E0A;&#x9762;&#x7684;<code>SiteAllPeriod</code>&#xFF0C;&#x91CC;&#x9762;&#x6709;&#x4E00;&#x4E9B;&#x5916;&#x952E;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x8FD9;&#x4E9B;&#x5916;&#x952E;&#x5B9E;&#x73B0;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;</p>
<p>&#x6BD4;&#x5982;&#x5916;&#x952E;<code>siteid</code>&#xFF0C;Site&#x7C7B;&#x578B;&#x91CC;&#x9762;&#x6709;&#x4E2A;<code>courtid</code>&#x5B57;&#x6BB5;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x60F3;&#x9009;&#x62E9;<code>SiteAllPeriod</code>&#x4E2D;(&#x6B64;&#x5904;&#x65AD;&#x53E5;)&#x6240;&#x6709;&#x5916;&#x952E;<code>siteid</code>&#x6307;&#x5411;&#x7684;Site&#x5BF9;&#x8C61;&#x7684;<code>courtid</code>&#x5B57;&#x6BB5;&#x4E3A;1&#x7684;&#x8BB0;&#x5F55;</p>
<p>&#x8FD9;&#x65F6;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x8BED;&#x53E5;</p>
<pre><code class="language-python line-numbers">querySet = SiteAllPeriod.objects.filter(siteid__courtid_id=1)
</code></pre>
<p>&#x8FD9;&#x884C;&#x8BED;&#x53E5;&#x7684;&#x80CC;&#x540E;&#x5C31;&#x662F; SQL &#x7684; JOIN &#x8FDE;&#x63A5;&#x67E5;&#x8BE2;&#xFF0C;Django &#x4F1A;&#x5E2E;&#x4F60;&#x5B8C;&#x6210;&#x8BE5;&#x8BED;&#x53E5;&#x7684;&#x6784;&#x9020;&#x548C;&#x6267;&#x884C;&#x3002;</p>
<h3>4. &#x6A21;&#x578B;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x8BBF;&#x95EE;</h3>
<p>Django &#x7684; ORM &#x6A21;&#x578B;&#x8FD8;&#x6709;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x5730;&#x65B9;&#x5C31;&#x662F;&#xFF1A;</p>
<pre><code class="language-python line-numbers">siteAllPeriod_record = SiteAllPeriod.objects.filter(siteid_id=1).first() # &#x9009;&#x62E9; siteid = 1 &#x7684;&#x8BB0;&#x5F55;&#xFF0C;&#x5E76;&#x62FF;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#xFF08;&#x5F53;&#x7136;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E5F;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#xFF09;
courtid_of_this_period = siteAllPeriod_record.siteid.courtid_id
&quot;&quot;&quot;
siteid &#x662F;&#x5916;&#x952E;&#x5C5E;&#x6027;&#xFF0C;&#x8BBF;&#x95EE;&#x8BE5;&#x5C5E;&#x6027;&#x4F1A;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x5BF9;&#x5E94;&#x7684;&#x5BF9;&#x8C61;
&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x83B7;&#x5F97; siteAllPeriod &#x5F52;&#x5C5E;&#x7684; site &#x5BF9;&#x8C61;&#x7684; courtid &#xFF08;site-siteAllPeriod &#x662F;&#x4E2A;&#x4E00;&#x5BF9;&#x591A;&#x5173;&#x7CFB;&#xFF09;
&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x6837;&#x5199;&#x770B;&#x8D77;&#x6765;&#x5F88;&#x7F8E;&#x597D;&#xFF0C;&#x4F46;&#x662F;&#x8BBF;&#x95EE;&#x53E6;&#x4E00;&#x4E2A;&#x8868;&#x7684;&#x8BB0;&#x5F55;&#x5BF9;&#x8C61;&#xFF0C;&#x662F;&#x4F1A;&#x6267;&#x884C;&#x4E00;&#x6B21; SQL &#x8BED;&#x53E5;&#x7684;&#xFF0C;&#x6027;&#x80FD;&#x635F;&#x8017;&#x5F88;&#x5927;&#xFF01;
&quot;&quot;&quot;
</code></pre>
<h3>5. &#x8BB0;&#x5F55;&#x7684;&#x4FDD;&#x5B58;</h3>
<p>&#x8FD9;&#x4E2A;&#x5F88;&#x5BB9;&#x6613;&#xFF0C;&#x62FF;&#x5230;&#x5BF9;&#x8C61;&#xFF0C;&#x76F4;&#x63A5;&#x6539;&#x5C5E;&#x6027;&#xFF0C;&#x6539;&#x5B8C;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;<code>save()</code>&#x65B9;&#x6CD5;&#x5C31;&#x4FDD;&#x5B58;&#x4E86;</p>
<p>&#x5F53;&#x7136;&#xFF0C;&#x5BF9;<code>QuerySet</code>&#x4E5F;&#x53EF;&#x4EE5;&#x50CF;&#x4E0A;&#x9762;&#x90A3;&#x6837;&#x5E72;&#xFF08;python&#x7684;&#x5BF9;&#x8C61;&#x9ED8;&#x8BA4;&#x90FD;&#x662F;&#x5F15;&#x7528;&#xFF0C;&#x6240;&#x4EE5;&#x61C2;&#x7684;&#x90FD;&#x61C2;&#xFF09;</p>
<h3>6. &#x8BB0;&#x5F55;&#x7684;&#x5220;&#x9664;</h3>
<p>&#x548C;<strong>5</strong>&#x4E00;&#x6A21;&#x4E00;&#x6837;&#xFF0C;&#x5C31;&#x662F;&#x628A;<code>save()</code>&#x6362;&#x6210;<code>delete()</code></p>
<hr>
<h2>&#x7ED3;&#x8BED;</h2>
<p>&#x4E0A;&#x9762;&#x53EA;&#x63D0;&#x4F9B;&#x4E86;&#x90E8;&#x5206;&#x4F8B;&#x5B50;&#xFF0C;&#x4E5F;&#x662F;&#x6211;&#x8BA4;&#x4E3A;&#x7684;&#x5165;&#x95E8;&#x6700;&#x9700;&#x8981;&#x7406;&#x89E3;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>
<p>&#x5982;&#x679C;&#x60F3;&#x67E5;&#x770B;&#x8BE6;&#x7EC6;&#x7684;&#x6837;&#x4F8B;&#x4E0E;&#x89E3;&#x91CA;&#xFF0C;&#x8BF7;&#x53C2;&#x9605; <a class="wp-editor-md-post-content-link" href="https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/?ref=blog.jnn.icu">Django &#x5B98;&#x65B9;&#x6587;&#x6863; &#x2013; ORM &#x6267;&#x884C;&#x67E5;&#x8BE2;</a></p>
<p><strong>&#x540E;&#x7AEF;&#x9053;&#x963B;&#x4E14;&#x957F;&#xFF0C;&#x5E0C;&#x671B;&#x5927;&#x5BB6;&#x4E00;&#x8D77;&#x52A0;&#x6CB9;&#x5440;&#xFF01;</strong></p>
<!--kg-card-end: html-->]]></content:encoded></item></channel></rss>