<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>醉后的星星</title><link>https://kizx.github.io/</link><description>Recent content on 醉后的星星</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>kizx</copyright><lastBuildDate>Sun, 13 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kizx.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Win32_API修改EXE文件ICON图标</title><link>https://kizx.github.io/post/win32_api%E4%BF%AE%E6%94%B9exe%E6%96%87%E4%BB%B6icon%E5%9B%BE%E6%A0%87/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><guid>https://kizx.github.io/post/win32_api%E4%BF%AE%E6%94%B9exe%E6%96%87%E4%BB%B6icon%E5%9B%BE%E6%A0%87/</guid><description>&lt;h2 id="说明">&lt;a href="#%e8%af%b4%e6%98%8e" class="header-anchor">&lt;/a>说明
&lt;/h2>&lt;p>EXE文件的ICON图标一般由数个图标组成，在更新ICON图标时需要逐一添加每个图标，再添加ICON_GROUP目录，可以使用&lt;code>ResourceHacker&lt;/code>软件进行查看。&lt;/p>
&lt;p>EXE文件中的图标数据结构和ICON图标文件结构很相似，唯一区别在于ICON图标的&lt;code>ICONDIRENTRY&lt;/code>最后一个字段标注的是图像数据首地址，EXE文件的&lt;code>GRPICONDIRENTRY&lt;/code>最后一个字段标注的是图标的ID。&lt;/p>
&lt;h2 id="代码">&lt;a href="#%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>代码
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#pragma pack(push, 2) &lt;/span>&lt;span style="color:#75715e">//结构体需要双字节对齐
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> WORD idReserved; &lt;span style="color:#75715e">// Reserved (must be 0)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD idType; &lt;span style="color:#75715e">// Resource Type (1 for icons)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD idCount; &lt;span style="color:#75715e">// How many images?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of &amp;#39;em)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>} ICONDIR;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BYTE bWidth; &lt;span style="color:#75715e">// Width, in pixels, of the image
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bHeight; &lt;span style="color:#75715e">// Height, in pixels, of the image
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bColorCount; &lt;span style="color:#75715e">// Number of colors in image (0 if &amp;gt;=8bpp)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bReserved; &lt;span style="color:#75715e">// Reserved ( must be 0)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD wPlanes; &lt;span style="color:#75715e">// Color Planes
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD wBitCount; &lt;span style="color:#75715e">// Bits per pixel
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> DWORD dwBytesInRes; &lt;span style="color:#75715e">// How many bytes in this resource?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> DWORD dwImageOffset; &lt;span style="color:#75715e">// Where in the file is this image?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>} ICONDIRENTRY;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BITMAPINFOHEADER icHeader; &lt;span style="color:#75715e">// DIB header
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> RGBQUAD icColors[&lt;span style="color:#ae81ff">1&lt;/span>]; &lt;span style="color:#75715e">// Color table
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE icXOR[&lt;span style="color:#ae81ff">1&lt;/span>]; &lt;span style="color:#75715e">// DIB bits for XOR mask
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE icAND[&lt;span style="color:#ae81ff">1&lt;/span>]; &lt;span style="color:#75715e">// DIB bits for AND mask
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>} ICONIMAGE;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> WORD idReserved; &lt;span style="color:#75715e">// Reserved (must be 0)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD idType; &lt;span style="color:#75715e">// Resource type (1 for icons)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD idCount; &lt;span style="color:#75715e">// How many images?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// GRPICONDIRENTRY idEntries[1]; // The entries for each image
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>} GRPICONDIR;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BYTE bWidth; &lt;span style="color:#75715e">// Width, in pixels, of the image
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bHeight; &lt;span style="color:#75715e">// Height, in pixels, of the image
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bColorCount; &lt;span style="color:#75715e">// Number of colors in image (0 if &amp;gt;=8bpp)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE bReserved; &lt;span style="color:#75715e">// Reserved
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD wPlanes; &lt;span style="color:#75715e">// Color Planes
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD wBitCount; &lt;span style="color:#75715e">// Bits per pixel
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> DWORD dwBytesInRes; &lt;span style="color:#75715e">// how many bytes in this resource?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> WORD nID; &lt;span style="color:#75715e">// the ID
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>} GRPICONDIRENTRY;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#pragma pack(pop)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> argc, &lt;span style="color:#66d9ef">char&lt;/span> &lt;span style="color:#f92672">*&lt;/span>argv[]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// if (argc != 3) {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// printf(&amp;#34;Usage: %s &amp;lt;target_exe&amp;gt; &amp;lt;new_icon.ico&amp;gt;\n&amp;#34;, argv[0]);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// return 1;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// }
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">//
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// const char *exePath = argv[1];
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// const char *iconPath = argv[2];
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span> exePath[] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;pip.exe&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span> iconPath[] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;app.ico&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 打开图标文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> HANDLE hIcon &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">CreateFile&lt;/span>(iconPath, GENERIC_READ, &lt;span style="color:#ae81ff">0&lt;/span>, NULL,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (hIcon &lt;span style="color:#f92672">==&lt;/span> INVALID_HANDLE_VALUE) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]Error opening icon file&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 获取图标文件大小
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> DWORD iconSize &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">GetFileSize&lt;/span>(hIcon, NULL);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (iconSize &lt;span style="color:#f92672">==&lt;/span> INVALID_FILE_SIZE) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]Error getting icon file size&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">CloseHandle&lt;/span>(hIcon);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 读取图标文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> BYTE&lt;span style="color:#f92672">*&lt;/span> iconData &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">malloc&lt;/span>(iconSize);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD bytesRead;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">ReadFile&lt;/span>(hIcon, iconData, iconSize, &lt;span style="color:#f92672">&amp;amp;&lt;/span>bytesRead, NULL) &lt;span style="color:#f92672">||&lt;/span> bytesRead &lt;span style="color:#f92672">!=&lt;/span> iconSize) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]Error reading icon file&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">CloseHandle&lt;/span>(hIcon);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">CloseHandle&lt;/span>(hIcon);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 解析图标文件目录
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> ICONDIR&lt;span style="color:#f92672">*&lt;/span> iconDir &lt;span style="color:#f92672">=&lt;/span> (ICONDIR&lt;span style="color:#f92672">*&lt;/span>)iconData;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idReserved &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#f92672">||&lt;/span> iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idType &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Invalid icon file format&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 计算图标组资源大小
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> DWORD groupSize &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">sizeof&lt;/span>(GRPICONDIR) &lt;span style="color:#f92672">+&lt;/span> iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idCount &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#66d9ef">sizeof&lt;/span>(GRPICONDIRENTRY);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BYTE&lt;span style="color:#f92672">*&lt;/span> groupData &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">malloc&lt;/span>(groupSize);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GRPICONDIR&lt;span style="color:#f92672">*&lt;/span> grpIconDir &lt;span style="color:#f92672">=&lt;/span> (GRPICONDIR&lt;span style="color:#f92672">*&lt;/span>)groupData;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpIconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idReserved &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpIconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idType &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; &lt;span style="color:#75715e">// RT_ICON
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> grpIconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idCount &lt;span style="color:#f92672">=&lt;/span> iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idCount;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 创建图标组资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> ICONDIRENTRY&lt;span style="color:#f92672">*&lt;/span> iconEntries &lt;span style="color:#f92672">=&lt;/span> (ICONDIRENTRY&lt;span style="color:#f92672">*&lt;/span>)(iconData &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#66d9ef">sizeof&lt;/span>(ICONDIR));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GRPICONDIRENTRY&lt;span style="color:#f92672">*&lt;/span> grpEntries &lt;span style="color:#f92672">=&lt;/span> (GRPICONDIRENTRY&lt;span style="color:#f92672">*&lt;/span>)(groupData &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#66d9ef">sizeof&lt;/span>(GRPICONDIR));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idCount; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].bWidth &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].bWidth;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].bHeight &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].bHeight;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].bColorCount &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].bColorCount;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].bReserved &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].bReserved;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].wPlanes &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].wPlanes;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].wBitCount &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].wBitCount;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].dwBytesInRes &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].dwBytesInRes;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> grpEntries[i].nID &lt;span style="color:#f92672">=&lt;/span> i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; &lt;span style="color:#75715e">// 资源ID从1开始
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 开始更新EXE资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> HANDLE hUpdate &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">BeginUpdateResource&lt;/span>(exePath, FALSE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (hUpdate &lt;span style="color:#f92672">==&lt;/span> NULL) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;BeginUpdateResource failed: %lu&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(groupData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 删除现有的图标组资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">UpdateResource&lt;/span>(hUpdate, RT_GROUP_ICON, &lt;span style="color:#a6e22e">MAKEINTRESOURCE&lt;/span>(&lt;span style="color:#ae81ff">101&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MAKELANGID&lt;/span>(LANG_NEUTRAL, SUBLANG_NEUTRAL), NULL, &lt;span style="color:#ae81ff">0&lt;/span>)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]Warning: Failed to remove old icon group ID-101&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 删除现有的图标资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span>; i&lt;span style="color:#f92672">++&lt;/span>) { &lt;span style="color:#75715e">// 删除ID 1-7的图标资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">UpdateResource&lt;/span>(hUpdate, RT_ICON, &lt;span style="color:#a6e22e">MAKEINTRESOURCE&lt;/span>(i),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MAKELANGID&lt;/span>(LANG_NEUTRAL, SUBLANG_NEUTRAL), NULL, &lt;span style="color:#ae81ff">0&lt;/span>)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]Warning: Failed to remove old icon ID-%d&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>(), i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 添加新的图标组资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">UpdateResource&lt;/span>(hUpdate, RT_GROUP_ICON, &lt;span style="color:#a6e22e">MAKEINTRESOURCE&lt;/span>(&lt;span style="color:#ae81ff">101&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MAKELANGID&lt;/span>(LANG_NEUTRAL, SUBLANG_NEUTRAL),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> groupData, groupSize)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]UpdateResource (group icon) failed&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(groupData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">EndUpdateResource&lt;/span>(hUpdate, TRUE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 添加各个图标资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> iconDir&lt;span style="color:#f92672">-&amp;gt;&lt;/span>idCount; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD offset &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].dwImageOffset;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD size &lt;span style="color:#f92672">=&lt;/span> iconEntries[i].dwBytesInRes;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (offset &lt;span style="color:#f92672">+&lt;/span> size &lt;span style="color:#f92672">&amp;gt;&lt;/span> iconSize) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Icon data out of bounds: entry %d&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">continue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">UpdateResource&lt;/span>(hUpdate, RT_ICON, &lt;span style="color:#a6e22e">MAKEINTRESOURCE&lt;/span>(i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MAKELANGID&lt;/span>(LANG_NEUTRAL, SUBLANG_NEUTRAL),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> iconData &lt;span style="color:#f92672">+&lt;/span> offset, size)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]UpdateResource (icon %d) failed&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, i, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 完成资源更新
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">EndUpdateResource&lt;/span>(hUpdate, FALSE)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[%lu]EndUpdateResource failed&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">GetLastError&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(groupData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Icon group updated successfully!&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(iconData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">free&lt;/span>(groupData);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Hugo博客搭建及stack主题设置</title><link>https://kizx.github.io/post/hugo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</link><pubDate>Sun, 06 Jul 2025 08:38:00 +0000</pubDate><guid>https://kizx.github.io/post/hugo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</guid><description>&lt;h2 id="安装hugo">&lt;a href="#%e5%ae%89%e8%a3%85hugo" class="header-anchor">&lt;/a>安装Hugo
&lt;/h2>&lt;p>Hugo有标准版、扩展版（extended），还有一个部署版（extended_withdeploy）,扩展板多了图像和Sass处理器，部署版支持直接部署到google、AWS云等。&lt;/p>
&lt;p>直接下载扩展版：&lt;a class="link" href="https://github.com/gohugoio/hugo/releases/" target="_blank" rel="noopener"
>https://github.com/gohugoio/hugo/releases/&lt;/a>&lt;/p>
&lt;p>解压后将&lt;code>hugo.exe&lt;/code>目录添加到全局环境变量中。&lt;/p>
&lt;ul>
&lt;li>新建站点&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>hugo new site quickstart&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>初始化git&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>git init&lt;/p>&lt;/blockquote>
&lt;p>hugo命令见官方指南：&lt;a class="link" href="https://hugo.opendocs.io/getting-started/" target="_blank" rel="noopener"
>https://hugo.opendocs.io/getting-started/&lt;/a>&lt;/p>
&lt;h2 id="安装主题">&lt;a href="#%e5%ae%89%e8%a3%85%e4%b8%bb%e9%a2%98" class="header-anchor">&lt;/a>安装主题
&lt;/h2>&lt;p>hugo主题网站：&lt;a class="link" href="https://themes.gohugo.com.cn/" target="_blank" rel="noopener"
>https://themes.gohugo.com.cn/&lt;/a>&lt;/p>
&lt;p>这里使用stack主题：&lt;a class="link" href="https://stack.jimmycai.com/" target="_blank" rel="noopener"
>https://stack.jimmycai.com/&lt;/a>&lt;/p>
&lt;ul>
&lt;li>安装主题&lt;/li>
&lt;/ul>
&lt;p>直接使用git命令或者手动下载放到themes目录下&lt;/p>
&lt;blockquote>
&lt;p>git submodule add &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack/" target="_blank" rel="noopener"
>https://github.com/CaiJimmy/hugo-theme-stack/&lt;/a> themes/hugo-theme-stack&lt;/p>&lt;/blockquote>
&lt;h2 id="主题设置">&lt;a href="#%e4%b8%bb%e9%a2%98%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>主题设置
&lt;/h2>&lt;p>stack主题设置参考：&lt;a class="link" href="https://stack.jimmycai.com/config/" target="_blank" rel="noopener"
>https://stack.jimmycai.com/config/&lt;/a>&lt;/p>
&lt;p>以下本站设置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">baseURL&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;http://kizx.gitee.io/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">languageCode&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;zh-cn&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">title&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;醉后的星星&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">theme&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;hugo-theme-stack&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">copyright&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;kizx&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DefaultContentLanguage&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;zh-cn&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">favicon&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;/favicon.ico&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">sidebar&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#compact = true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">emoji&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;🔞&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">subtitle&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;我好菜啊&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">avatar&lt;/span>.&lt;span style="color:#a6e22e">enabled&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">avatar&lt;/span>.&lt;span style="color:#a6e22e">local&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">avatar&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;img/avatar.gif&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">Footer&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">since&lt;/span> = &lt;span style="color:#ae81ff">2019&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#customText = &amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">Article&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">headingAnchor&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">math&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">readingTime&lt;/span> = &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">widgets&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">homepage&lt;/span> = [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#a6e22e">type&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;search&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#a6e22e">type&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;archives&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#a6e22e">type&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;tag-cloud&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">page&lt;/span> = [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#a6e22e">type&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;toc&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#a6e22e">type&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;categories&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">opengraph&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">twitter&lt;/span>.&lt;span style="color:#a6e22e">site&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;kizx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">twitter&lt;/span>.&lt;span style="color:#a6e22e">card&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">enabled&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">src&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;img/default.jpg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">local&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">menu&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[[&lt;span style="color:#a6e22e">menu&lt;/span>.&lt;span style="color:#a6e22e">social&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">identifier&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;github&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;https://github.com/kizx&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">icon&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;brand-github&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[[&lt;span style="color:#a6e22e">menu&lt;/span>.&lt;span style="color:#a6e22e">social&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">identifier&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;bilibili&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;https://space.bilibili.com/22411920&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">icon&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;brand-bilibili&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>左侧菜单页设置：&lt;/p>
&lt;p>直接将&lt;code>hugo-theme-stack\exampleSite\content\page&lt;/code>拷贝到网页的&lt;code>content\page&lt;/code>中&lt;/p>
&lt;p>需要出现在菜单栏中的页面通过在md文件的Front Matter中添加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">menu&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">main&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">title (optional)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">weight&lt;/span>: -&lt;span style="color:#ae81ff">90&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">params&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">icon&lt;/span>: &lt;span style="color:#ae81ff">icon-name&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者直接在配置文件中添加，但在配置文件中添加会缺少当前惨淡选中高亮显示。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://liuhouliang.com/post/hugo_theme/" target="_blank" rel="noopener"
>使用hugo stack主题快速搭建博客&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://serennan.github.io/post/hugo-config/" target="_blank" rel="noopener"
>【Hugo】配置 (stack 主题)&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://tabler.io/icons" target="_blank" rel="noopener"
>图标下载&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://krislinzhao.github.io/docs/create-a-wesite-using-github-pages-and-hugo/" target="_blank" rel="noopener"
>如何用 GitHub Pages + Hugo 搭建个人博客&lt;/a>&lt;/p></description></item><item><title>javascript中文按拼音顺序排序</title><link>https://kizx.github.io/post/javascript%E4%B8%AD%E6%96%87%E6%8C%89%E6%8B%BC%E9%9F%B3%E9%A1%BA%E5%BA%8F%E6%8E%92%E5%BA%8F/</link><pubDate>Wed, 15 Mar 2023 15:52:01 +0000</pubDate><guid>https://kizx.github.io/post/javascript%E4%B8%AD%E6%96%87%E6%8C%89%E6%8B%BC%E9%9F%B3%E9%A1%BA%E5%BA%8F%E6%8E%92%E5%BA%8F/</guid><description>&lt;p>js的sort函数的默认排序方法是将排序对象转成字符串，然后根据字符串中每个字符的ascll码依次进行排序，对于不在ascll表中的中文无法进行排序。&lt;/p>
&lt;h2 id="localecompare">&lt;a href="#localecompare" class="header-anchor">&lt;/a>localeCompare
&lt;/h2>&lt;p>localeCompare函数可以比较两个中文的顺序，用该方法配合sort方法可以实现中文排序：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">names&lt;/span>.&lt;span style="color:#a6e22e">sort&lt;/span>((&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span>.&lt;span style="color:#a6e22e">username&lt;/span>.&lt;span style="color:#a6e22e">localeCompare&lt;/span>(&lt;span style="color:#a6e22e">b&lt;/span>.&lt;span style="color:#a6e22e">username&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;zh&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进一步，如果想获得中文首字母，可以依次和每个字母的第一个中文进行比较，进而得出该中文字符的首字母：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">getFirstLetter&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span>(&lt;span style="color:#a6e22e">word&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">letters&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;ABCDEFGHJKLMNOPQRSTWXYZ#&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">zh&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;阿八嚓哒妸发旮哈讥咔垃呣拏噢妑七呥扨它穵夕丫帀糳&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">letters&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">word&lt;/span>.&lt;span style="color:#a6e22e">localeCompare&lt;/span>(&lt;span style="color:#a6e22e">zh&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;zh&amp;#39;&lt;/span>) &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">word&lt;/span>.&lt;span style="color:#a6e22e">localeCompare&lt;/span>(&lt;span style="color:#a6e22e">zh&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;zh&amp;#39;&lt;/span>) &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">letters&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#39;#&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意有些字母没有对应的姓氏，因此不在比较之列。
本方法最大的问题是，微信小程序和很多浏览器内核都不支持该函数，用之前先做好测试。&lt;/p>
&lt;h2 id="第三方库">&lt;a href="#%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93" class="header-anchor">&lt;/a>第三方库
&lt;/h2>&lt;p>若不能使用上述方法，发现一个第三方库jian-pinyin，体积不大，可以直接给出汉字的拼音，很棒。
地址：&lt;a class="link" href="https://github.com/xinglie/pinyin" target="_blank" rel="noopener"
>https://github.com/xinglie/pinyin&lt;/a>
通过该库直接获取汉字的拼音，然后通过sort函数进行排序，注意js中字符串之间是可以直接比较大小的，比较的依据仍然是ascll。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">sp&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span>(&lt;span style="color:#a6e22e">word&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">getSpell&lt;/span>(&lt;span style="color:#a6e22e">word&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span>(&lt;span style="color:#a6e22e">charactor&lt;/span>, &lt;span style="color:#a6e22e">spell&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">spell&lt;/span>[&lt;span style="color:#ae81ff">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">names&lt;/span>.&lt;span style="color:#a6e22e">sort&lt;/span>((&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">sp&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>.&lt;span style="color:#a6e22e">username&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">b&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">sp&lt;/span>(&lt;span style="color:#a6e22e">b&lt;/span>.&lt;span style="color:#a6e22e">username&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>VS2019配置pthread多线程</title><link>https://kizx.github.io/post/vs2019%E9%85%8D%E7%BD%AEpthread%E5%A4%9A%E7%BA%BF%E7%A8%8B/</link><pubDate>Tue, 28 Jun 2022 15:32:00 +0000</pubDate><guid>https://kizx.github.io/post/vs2019%E9%85%8D%E7%BD%AEpthread%E5%A4%9A%E7%BA%BF%E7%A8%8B/</guid><description>&lt;p>在VS里用MS编译器不能直接调用pthread库，需要先自行下载该库：
&lt;a class="link" href="http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip" target="_blank" rel="noopener"
>http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip&lt;/a>
解压后用的到的只有&lt;code>Pre-built.2&lt;/code>文件夹下的文件。&lt;/p>
&lt;h2 id="配置">&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>配置
&lt;/h2>&lt;p>如下图分别配置三大项：&lt;/p>
&lt;ul>
&lt;li>包含目录&amp;ndash;&amp;gt;&amp;hellip;\pthreads-w32-2-9-1-release\Pre-built.2\include&lt;/li>
&lt;li>库目录&amp;ndash;&amp;gt;&amp;hellip;\pthreads-w32-2-9-1-release\Pre-built.2\lib\x86&lt;/li>
&lt;li>附加依赖项&amp;ndash;&amp;gt;pthreadVC2.lib&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2022/06/1673997423.png"
loading="lazy"
>
&lt;img src="https://www.2bboy.com/usr/uploads/2022/06/743816291.png"
loading="lazy"
>&lt;/p>
&lt;ul>
&lt;li>如果代码运行报错：“timespec”;”struct”类型重定义。
解决方法：在pthread.h在第35行加入如下代码：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-C" data-lang="C">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#define HAVE_STRUCT_TIMESPEC
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者在项目属性-&amp;gt;C\C++-&amp;gt;预处理器-&amp;gt;预处理器定义添加&lt;code>HAVE_STRUCT_TIMESPEC&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>如果代码运行报错：找不到pthreadVC2.dll。
解决方法：将pthreadVC2.dll拷贝到项目的Debug目录下&lt;/li>
&lt;/ul>
&lt;h2 id="示例代码">&lt;a href="#%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>示例代码
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;Windows.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;pthread.h&amp;gt; //使用多线程时需要添加&amp;lt;pthread.h&amp;gt;这个头文件&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> s &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">transmit&lt;/span>(&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> name &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)args;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">1000&lt;/span>; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s&lt;span style="color:#f92672">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;----------%s : s = %d----------&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, name, s);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Sleep&lt;/span>(&lt;span style="color:#ae81ff">1000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">receive&lt;/span>(&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> name &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)args;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;%s : s = %d&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, name, s);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Sleep&lt;/span>(&lt;span style="color:#ae81ff">100&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pthread_t&lt;/span> tx, rx;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">pthread_create&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>tx, NULL, transmit, &lt;span style="color:#e6db74">&amp;#34;TX&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">pthread_create&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>rx, NULL, receive, &lt;span style="color:#e6db74">&amp;#34;RX&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">pthread_join&lt;/span>(tx, NULL);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">pthread_join&lt;/span>(rx, NULL);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.cnblogs.com/maycpou/p/13895295.html" target="_blank" rel="noopener"
>https://www.cnblogs.com/maycpou/p/13895295.html&lt;/a>
&lt;a class="link" href="https://zhuanlan.zhihu.com/p/97418361" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/97418361&lt;/a>&lt;/p></description></item><item><title>关于找工作的那些事</title><link>https://kizx.github.io/post/%E5%85%B3%E4%BA%8E%E6%89%BE%E5%B7%A5%E4%BD%9C%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/</link><pubDate>Mon, 25 Apr 2022 17:27:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%85%B3%E4%BA%8E%E6%89%BE%E5%B7%A5%E4%BD%9C%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/</guid><description>&lt;h2 id="时间节点">&lt;a href="#%e6%97%b6%e9%97%b4%e8%8a%82%e7%82%b9" class="header-anchor">&lt;/a>时间节点
&lt;/h2>&lt;ul>
&lt;li>一般三四月份就会有春招，春招是找暑期实习的时机，就算不去实习，也可以投投简历，面面试积累一些经验，可以提前了解一些岗位要求、面试流程和自身所欠缺的部分。&lt;/li>
&lt;li>五月份开始，可能就会有一些研究所开始提前批招聘，有中意单位的，需要特别留意。&lt;/li>
&lt;li>暑假七八月份是各个大厂提前批招聘的黄金时期，准备做的差不多了就可以正式应聘了，越早投递，机会越大，很多公司研究所或岗位前面人招满了后面就没有HC了，很多人提前批拿到offer后面压力就会小很多，不过相对来说毕前批的招聘要求都会高一些。&lt;/li>
&lt;li>金九银十是正式批的黄金时期，但就个人经验来看关键是九月份，九月份一开学就会有大批研究所和大厂开始招聘，九月份无疑是最忙的一个月份，如果采取海投策略的话，几乎每天都有不止一场面试或笔试，而十月份研究所和大厂招聘就会见少，主要是一些小公司较多，一般人九月份都能拿到offer。&lt;/li>
&lt;li>至于后面的时间本人就没有参与了，所以最理想的找工作节奏就是三四月份一边面试试水积攒经验，一边查漏补缺，到了七八月份就应该学习准备的差不多了，提前批争取拿到一个offer，没拿到其实也没关系，经过提前批的磨练，在九月份的正式批里就能更得心应手了，九十月份拿到offer后，后面就能安心写论文了。&lt;/li>
&lt;/ul>
&lt;h2 id="求职准备">&lt;a href="#%e6%b1%82%e8%81%8c%e5%87%86%e5%a4%87" class="header-anchor">&lt;/a>求职准备
&lt;/h2>&lt;ul>
&lt;li>所需要学习内容应该是视岗位而定的，所以说一开始就定一个目标岗位或方向是十分重要的，尤其是大厂企业招聘，都是看岗位招人的，笔试面试时都会与岗位要求息息相关；而研究所个人感觉更多的是看人招聘，他觉得你可以了，就把你招聘进去然后分配一个合适的岗位，我研究所面试经验不多，个人感觉大概就是这样的。所以企业招聘一定要选好岗位，投对岗位很重要，一旦投出去了后面再改也会比较困难。&lt;/li>
&lt;li>一般来说大厂的笔试和面试最难，大厂面试一般分为综合测试-&amp;gt;笔试-&amp;gt;2~3轮面试-&amp;gt;hr面，综合测试是大部分招聘都会有的一个项目，主要是一些性格测试题，一般如实填写即可，只有华为的性格测试需要注意，可能会挂人。研究所一般没有笔试，面试也只有一两轮，面试更偏好问项目，因此此时简历和发挥就很重要了，能力、项目、学历至少要占两项才能脱颖而出。&lt;/li>
&lt;li>数据结构与算法是所有程序向的岗位的公共基础，也是花费时间最久最见基本功的一项，这个除了学习外，更重要的是刷题，刷题一般上Leetcode或者牛客网上刷题，Leetcode题目比较多而全，可以按照大神推荐的顺序进行刷题，比如我觉得&lt;a class="link" href="https://programmercarl.com/" target="_blank" rel="noopener"
>代码随想录&lt;/a>就讲的很不错；牛客网上有很多企业笔试题，可以进行仿真练习，牛客网和Leetcode的代码运行方式有些不同，实际面试时一般就是以牛客网的方式，所以第一次笔试前，一定要在牛客网上做一次仿真练习，否则可能连输入输出都要琢磨半天。一般来说常见数据结构和算法专题都刷个十几道题，加一起刷个两三百题就比较保险了，当然还是得看个人学习方法和习惯，数量有时说明不了问题。然后相应的编程相关问题要具体看岗位所需的语言，这个除了自身掌握，一般就得看面经了，所谓面经，就是其他面试过的同学的经验，在牛客网和一些公众号上会有人总结，这个就看你平时关注了。其他像计算机网络、计算机组成原理等知识也会问，根据岗位侧重进行学习记忆即可。&lt;/li>
&lt;li>最难的莫过于项目准备，这个只能看你自己会不会发掘了，只要是你参与过的项目，和岗位相关的项目，哪怕是没有参与过的但是你经过了解后掌握的，也可以写进去，这个就看你自己包装了，别给自己挖坑就行，我也不会包装，我就拿我平时写的小东西放上去了，好充个场面。&lt;/li>
&lt;li>简历不用整什么花哨的模板，QQ邮箱自带的建立我看就挺好，怎么写建立这里就不细说了，后面推荐的up里有专门讲的，我想说的是建立一开始也不必写太好，写的差不多就可以投了，因为你会发现真正投递时，各家招聘网站上又得填一遍，填到后面都烦了哈哈。&lt;/li>
&lt;/ul>
&lt;h2 id="信息获取">&lt;a href="#%e4%bf%a1%e6%81%af%e8%8e%b7%e5%8f%96" class="header-anchor">&lt;/a>信息获取
&lt;/h2>&lt;ul>
&lt;li>学校就业网和公众号会每天推送一些信息，尤其是九月开学之后，每天都有很多研究所的校招信息，每天关注校招日历以便及时投递。&lt;/li>
&lt;li>大厂的校招一般都是线上的，所以学校招聘信息上可能不多，需要自己关注一些内推的公众号，或者牛客网上也有招聘信息，一般大厂都有招聘专用的公众号，一般叫XX招聘或者XX校招，可自行搜索。&lt;/li>
&lt;li>可以加一些校招群多和别人了解一些招聘和应聘动态。&lt;/li>
&lt;li>研究所的招聘信息一般都不会太公开，都是到学校了来了才发通知，或者有内部消息，可以关注这些所的公众号（如果有的话），也可以关注其他学校的就业网信息作为补充。&lt;/li>
&lt;li>大厂薪酬信息一般有迹可循，可以上Offershow小程序搜索或者脉脉App上看看评价，研究所的信息较为封闭，有内部信息自然最好，大部分时候只能从网上的零碎信息去推测。&lt;/li>
&lt;/ul>
&lt;h2 id="部分收藏推荐资源">&lt;a href="#%e9%83%a8%e5%88%86%e6%94%b6%e8%97%8f%e6%8e%a8%e8%8d%90%e8%b5%84%e6%ba%90" class="header-anchor">&lt;/a>部分收藏推荐资源
&lt;/h2>&lt;h3 id="编程资料">&lt;a href="#%e7%bc%96%e7%a8%8b%e8%b5%84%e6%96%99" class="header-anchor">&lt;/a>编程资料
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://programmercarl.com/" target="_blank" rel="noopener"
>https://programmercarl.com/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.iamshuaidi.com/" target="_blank" rel="noopener"
>https://www.iamshuaidi.com/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.cyc2018.xyz/" target="_blank" rel="noopener"
>http://www.cyc2018.xyz/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://codetop.cc/home" target="_blank" rel="noopener"
>https://codetop.cc/home&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/jwasham/coding-interview-university/blob/main/translations/README-cn.md" target="_blank" rel="noopener"
>https://github.com/jwasham/coding-interview-university/blob/main/translations/README-cn.md&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/MisterBooo/LeetCodeAnimation" target="_blank" rel="noopener"
>https://github.com/MisterBooo/LeetCodeAnimation&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="b站的一些up主">&lt;a href="#b%e7%ab%99%e7%9a%84%e4%b8%80%e4%ba%9bup%e4%b8%bb" class="header-anchor">&lt;/a>B站的一些Up主
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://space.bilibili.com/384068749/" target="_blank" rel="noopener"
>https://space.bilibili.com/384068749/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://space.bilibili.com/245645656/" target="_blank" rel="noopener"
>https://space.bilibili.com/245645656/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://space.bilibili.com/327247876/" target="_blank" rel="noopener"
>https://space.bilibili.com/327247876/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://space.bilibili.com/525438321/" target="_blank" rel="noopener"
>https://space.bilibili.com/525438321/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://space.bilibili.com/522846737/" target="_blank" rel="noopener"
>https://space.bilibili.com/522846737/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="公众号小程序">&lt;a href="#%e5%85%ac%e4%bc%97%e5%8f%b7%e5%b0%8f%e7%a8%8b%e5%ba%8f" class="header-anchor">&lt;/a>公众号/小程序
&lt;/h3>&lt;ul>
&lt;li>OfferShow&lt;/li>
&lt;li>内推指南&lt;/li>
&lt;li>低并发编程&lt;/li>
&lt;li>labuladong&lt;/li>
&lt;li>小K算法&lt;/li>
&lt;/ul></description></item><item><title>npm基本命令</title><link>https://kizx.github.io/post/npm%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4/</link><pubDate>Sat, 12 Feb 2022 14:26:00 +0000</pubDate><guid>https://kizx.github.io/post/npm%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>初始化&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm init
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>默认参数
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm init -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>查看已安装包&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>当前环境中的包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>系统环境中的包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm list -g
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>安装&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm install &amp;lt;Module Name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>or
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>安装到系统坏境中
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt; -g
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>安装到生产环境
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt; --save
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>or
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt; -S
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>安装到开发坏境
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt; --save-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>or
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i &amp;lt;Module Name&amp;gt; -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>淘宝cnpm&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm install -g cnpm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>运行&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm run &amp;lt;Script Name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>帮助&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm help
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm -l
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>设置镜像&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm config set registry https://registry.npm.taobao.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>查看镜像
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm config get registry
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Win10开机自动拨号上网方法</title><link>https://kizx.github.io/post/win10%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E6%8B%A8%E5%8F%B7%E4%B8%8A%E7%BD%91%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 14 Jan 2022 05:14:00 +0000</pubDate><guid>https://kizx.github.io/post/win10%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E6%8B%A8%E5%8F%B7%E4%B8%8A%E7%BD%91%E6%96%B9%E6%B3%95/</guid><description>&lt;p>校园网是需要通过PPOPE拨号上网的，每次开机都需要在网络里点击连接才能上网，很是令人讨厌，应该让电脑自动联网。&lt;/p>
&lt;h2 id="拨号上网命令">&lt;a href="#%e6%8b%a8%e5%8f%b7%e4%b8%8a%e7%bd%91%e5%91%bd%e4%bb%a4" class="header-anchor">&lt;/a>拨号上网命令
&lt;/h2>&lt;p>Windows系统里拨号上网的命令是&lt;code>rasdial&lt;/code>，用法如下所示&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="display:flex;">&lt;span>PS C:\Users\kizx&amp;gt; rasdial /h
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>用法&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> C:\Windows\system32\rasdial.exe entryname [username [password|*]] [/DOMAIN&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span>domain]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [/PHONE&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span>phonenumber] [/CALLBACK&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span>callbacknumber]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [/PHONEBOOK&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span>phonebookfile] [/PREFIXSUFFIX]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> C:\Windows\system32\rasdial.exe [&lt;span style="color:#66d9ef">entryname&lt;/span>] /DISCONNECT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> C:\Windows\system32\rasdial.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>简单来说就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="display:flex;">&lt;span>rasdial.exe &lt;span style="color:#e6db74">&amp;#34;连接名称&amp;#34;&lt;/span> 账号 密码
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="任务计划">&lt;a href="#%e4%bb%bb%e5%8a%a1%e8%ae%a1%e5%88%92" class="header-anchor">&lt;/a>任务计划
&lt;/h2>&lt;p>通过设置任务计划来开机自动运行&lt;code>rasdial&lt;/code>命令，这也是网上能查到的最普遍的方法，下面给出一个参考，这里不再赘述。
&lt;a class="link" href="https://zhuanlan.zhihu.com/p/359897141" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/359897141&lt;/a>&lt;/p>
&lt;h2 id="命令脚本">&lt;a href="#%e5%91%bd%e4%bb%a4%e8%84%9a%e6%9c%ac" class="header-anchor">&lt;/a>命令脚本
&lt;/h2>&lt;p>任务计划有时设置了并不起效，这里我给出一种通过开机自动运行脚本的方法，先新建一个&lt;code>开机运行.bat&lt;/code>的脚本，然后写入如下内容，注意替换名称、账号和密码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bat" data-lang="bat">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">echo&lt;/span> off
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chcp 65001
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">echo&lt;/span> 正在连接 . . .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rasdial &lt;span style="color:#e6db74">&amp;#34;连接名称&amp;#34;&lt;/span> 账号 密码
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">echo&lt;/span> 连接成功！
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上面只有第四行是真正有用的，其他行只是我为了美观加上的，让运行起来好看点。&lt;/p>
&lt;p>然后将上述bat文件放到开机自启文件夹下，这个文件夹一般在下面这个目录里&lt;/p>
&lt;pre tabindex="0">&lt;code>C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
&lt;/code>&lt;/pre>&lt;p>设置完后，在任务管理器的启动项里就应该会多出一个&lt;code>开机运行.bat&lt;/code>启动项。&lt;/p>
&lt;h2 id="免密开机">&lt;a href="#%e5%85%8d%e5%af%86%e5%bc%80%e6%9c%ba" class="header-anchor">&lt;/a>免密开机
&lt;/h2>&lt;p>顺带一提，如果想设置自动免密开机的话，&lt;code>win&lt;/code>+&lt;code>R&lt;/code>运行&lt;code>netplwiz&lt;/code>命令后勾选取消开机密码。
如果没有这个选项，需要修改注册表&lt;code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device&lt;/code>，双击&lt;code>DevicePasswordLessBuildVersion&lt;/code>，把值改成0确定，然后再运行&lt;code>netplwiz&lt;/code>。
参考：https://zhidao.baidu.com/question/364115147169595652.html&lt;/p></description></item><item><title>Pyside6使用指南</title><link>https://kizx.github.io/post/pyside6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Fri, 10 Dec 2021 02:47:00 +0000</pubDate><guid>https://kizx.github.io/post/pyside6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;p>Pyside6是Qt6对应的官方python库，官方有较全面的使用文档：https://doc.qt.io/qtforpython/contents.html。
本文使用Python3.7版本，从头安装使用Pyside6。&lt;/p>
&lt;h2 id="安装">&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>安装
&lt;/h2>&lt;p>python版安装只需要一句命令即可：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>pip install pyside6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装包有点大，建议手动下载whl直接安装。
安装后会多两个库：PySide6和shiboken。
在Python环境下的Scripts文件夹下还会多出&lt;code>pyside6-designer.exe&lt;/code>、&lt;code>pyside6-uic.exe&lt;/code>等几个exe程序。&lt;/p>
&lt;h2 id="界面设计工具设置">&lt;a href="#%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1%e5%b7%a5%e5%85%b7%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>界面设计工具设置
&lt;/h2>&lt;p>打开&lt;code>pyside6-designer.exe&lt;/code>，是qt的界面设计程序，可以拖拽设计界面并保存为ui文件。
使用pyside6-uic.exe，通过以下程序命令可以将ui文件转成py文件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>pyside6-uic.exe ui_mainwindow.ui -o ui_mainwindow.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果用的是Pycharm，可以添加右键工具直接在文件右键快速打开，添加工具的方法参考以下文章。
[post cid=&amp;ldquo;119&amp;rdquo; /]&lt;/p>
&lt;h2 id="初始代码">&lt;a href="#%e5%88%9d%e5%a7%8b%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>初始代码
&lt;/h2>&lt;p>参考官方文档：https://doc.qt.io/qtforpython/tutorials/basictutorial/uifiles.html&lt;/p>
&lt;h3 id="直接使用ui文件">&lt;a href="#%e7%9b%b4%e6%8e%a5%e4%bd%bf%e7%94%a8ui%e6%96%87%e4%bb%b6" class="header-anchor">&lt;/a>直接使用ui文件
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> sys
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide6.QtUiTools &lt;span style="color:#f92672">import&lt;/span> QUiLoader
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide6.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QApplication
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide6.QtCore &lt;span style="color:#f92672">import&lt;/span> QFile, QIODevice
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> app &lt;span style="color:#f92672">=&lt;/span> QApplication(sys&lt;span style="color:#f92672">.&lt;/span>argv)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ui_file_name &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;mainwindow.ui&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ui_file &lt;span style="color:#f92672">=&lt;/span> QFile(ui_file_name)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> ui_file&lt;span style="color:#f92672">.&lt;/span>open(QIODevice&lt;span style="color:#f92672">.&lt;/span>ReadOnly):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Cannot open &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>ui_file_name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>ui_file&lt;span style="color:#f92672">.&lt;/span>errorString()&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sys&lt;span style="color:#f92672">.&lt;/span>exit(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> loader &lt;span style="color:#f92672">=&lt;/span> QUiLoader()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window &lt;span style="color:#f92672">=&lt;/span> loader&lt;span style="color:#f92672">.&lt;/span>load(ui_file)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ui_file&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> window:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(loader&lt;span style="color:#f92672">.&lt;/span>errorString())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sys&lt;span style="color:#f92672">.&lt;/span>exit(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window&lt;span style="color:#f92672">.&lt;/span>show()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sys&lt;span style="color:#f92672">.&lt;/span>exit(app&lt;span style="color:#f92672">.&lt;/span>exec())
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="转成py文件再加载">&lt;a href="#%e8%bd%ac%e6%88%90py%e6%96%87%e4%bb%b6%e5%86%8d%e5%8a%a0%e8%bd%bd" class="header-anchor">&lt;/a>转成py文件再加载
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> sys
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide6.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QApplication, QMainWindow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide6.QtCore &lt;span style="color:#f92672">import&lt;/span> QFile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> ui_mainwindow &lt;span style="color:#f92672">import&lt;/span> Ui_MainWindow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MainWindow&lt;/span>(QMainWindow):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super(MainWindow, self)&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> Ui_MainWindow()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>setupUi(self)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> app &lt;span style="color:#f92672">=&lt;/span> QApplication(sys&lt;span style="color:#f92672">.&lt;/span>argv)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window &lt;span style="color:#f92672">=&lt;/span> MainWindow()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window&lt;span style="color:#f92672">.&lt;/span>show()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sys&lt;span style="color:#f92672">.&lt;/span>exit(app&lt;span style="color:#f92672">.&lt;/span>exec())
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建议转成py文件再打开，感觉IDE提示更准确，不过直接加载更方便就是了。&lt;/p>
&lt;h2 id="打包">&lt;a href="#%e6%89%93%e5%8c%85" class="header-anchor">&lt;/a>打包
&lt;/h2>&lt;p>打包建议使用auto-py-to-exe，这是一个基于pyinstaller的带Ui界面的打包程序，对新手极其友好。
使用以下命令安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>pip install auto-py-to-exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过以下命令启动程序：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>auto-py-to-exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Bezier曲线、B样条曲线、NURBS曲线</title><link>https://kizx.github.io/post/bezier%E6%9B%B2%E7%BA%BFb%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BFnurbs%E6%9B%B2%E7%BA%BF/</link><pubDate>Mon, 25 Oct 2021 12:37:00 +0000</pubDate><guid>https://kizx.github.io/post/bezier%E6%9B%B2%E7%BA%BFb%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BFnurbs%E6%9B%B2%E7%BA%BF/</guid><description>&lt;h3 id="bezier曲线">&lt;a href="#bezier%e6%9b%b2%e7%ba%bf" class="header-anchor">&lt;/a>Bezier曲线
&lt;/h3>&lt;p>&lt;strong>定义&lt;/strong>：对于n+1个控制点V_i(i=0,1,2,&amp;hellip;,n)V_i(i=0,1,2,&amp;hellip;,n)，n次Bezier曲线为：
$$
\begin{align}
P_n(t) &amp;amp;= \sum_{i=0}^{n} B_{n,i}(t)V_i,0\le t\le 1v \
B_{n,i} &amp;amp;=\frac{n!}{(n-i)!i!}(1-t)^{n-i}t^i
\end{align}
$$
其中B_{n,i}B_{n,i}称为n次Bernstein基函数。
例如，当n=3时，即3次Bezier曲线为：;
$$
\begin{align}
P_3(t) &amp;amp;= B_{3,0}(t)V_0+B_{3,1}(t)V_1+B_{3,2}(t)V_2+B_{3,3}(t)V_3,0\le t\le 1v \
B_{3,i} &amp;amp;= \left{\begin{matrix}
B_{3,0}(t)=(1-t)^3 \
B_{3,1}(t)=3(1-t)^2t \
B_{3,2}(t)=3(1-t)t^2 \
B_{3,3}(t)=t^3
\end{matrix}\right.
\end{align}
$$&lt;/p>
&lt;p>&lt;strong>性质&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>两端重合：Bezier曲线和控制多边形起始两端点重合，P(0)=V_0,P(1)=V_nP(0)=V_0,P(1)=V_n&lt;/li>
&lt;li>两端相切：Bezier曲线和控制多边形起始两端点相切，且切矢模长为n倍，P&amp;rsquo;(0)=n(V_1-V_0),P&amp;rsquo;(1)=n(V_n-V_{n-1})P&amp;rsquo;(0)=n(V_1-V_0),P&amp;rsquo;(1)=n(V_n-V_{n-1})&lt;/li>
&lt;li>对称性：控制点反序够早的曲线一致，只是参数化相反&lt;/li>
&lt;li>凸包性：曲线落在控制多边形形成的凸包内&lt;/li>
&lt;li>几何不变形：曲线仅取决于控制点，与坐标系无关&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>递归分割de Casteljau算法&lt;/strong>
在控制多边形每条边上按比例t:(1-t)进行分割，初始n+1个点，第一次分割得到n个点，n个点连起来组成新的控制点，第二次分割得到n-1个点，直到最后只剩一个点，该点即Bezier曲线上的点。
de Casteljau建立的递归公式如下：
$$
\begin{array}{c}
\left{\begin{matrix}
&amp;amp;V_i^r(t) = (1-t)V_i^{r-1}+tV_{i+1}^{r-1} ,r = 0,1,2,&amp;hellip;,n\
&amp;amp;V_i^0(t) = V_i,i = 0,1,2,&amp;hellip;,n
\end{matrix}\right.
\end{array}
$$
该方法适合于编程几何作图。&lt;/p>
&lt;h3 id="有理bezier曲线">&lt;a href="#%e6%9c%89%e7%90%86bezier%e6%9b%b2%e7%ba%bf" class="header-anchor">&lt;/a>有理Bezier曲线
&lt;/h3>&lt;p>&lt;strong>定义&lt;/strong>：比Bezier曲线多了个顶点权重系数，至于哪里有理了不清楚。
$$
P_(t)=\frac{\sum_{i=0}^{n}B_{n,i}(t)w_iV_i}{B_{n,i}(t)w_i} , 0\le t\le 1
$$
例如，3次有理Bezier曲线表示为：
$$
P_3(t)=\frac{(1-t)^3w_0V_0+3t(1-t)^2w_1V_1+3t^2(1-t)w_2V_2+t^3w_3V_3}{(1-t)^3w_0+3t(1-t)^2w_1+3t^2(1-t)w_2+t^3w_3}
$$
权重$w_i$可以一般取大于零的实数。&lt;/p>
&lt;p>&lt;strong>递归分割Farin算法&lt;/strong>
和上述过程类似：
$$
\begin{array}{c}
\left{\begin{matrix}
&amp;amp;V_i^r(t) = (1-t)\frac{W_i^{r-1}(t)}{W_i^r(t)} V_i^{r-1}+t\frac{W_{i-1}^{r-1}(t)}{W_i^r(t)}V_{i+1}^{r-1} ,r = 0,1,2,&amp;hellip;,n\
&amp;amp;V_i^0(t) = V_i,i = 0,1,2,&amp;hellip;,n
\end{matrix}\right.\
\left{\begin{matrix}
W_i^0=w_i \
W_i^r(t)=\sum_{j=0}^{r}W_{i+j}^{r-1}B_{r,j}(t),r=1,2,&amp;hellip;,n
\end{matrix}\right.
\end{array}
$$&lt;/p>
&lt;h2 id="b样条方法">&lt;a href="#b%e6%a0%b7%e6%9d%a1%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>B样条方法
&lt;/h2>&lt;p>B样条方法是Bezier方法的的一种一般化，给定n+1个控制点和阶次k，以及节点向量${t_0,t_1,&amp;hellip;,t_{n+k+1}}$:
$$
\begin{array}{c}
P_n(t) = \sum_{i = 0}^{n}N_{i,k}(t)V_i=\sum_{i = j-k}^{j}N_{i,k}(t)V_i,t_j\le t\le t_{j+1}\
N_{j,0}=\left{\begin{matrix}
1,t_j\le t\le t_{j+1} \
0,otherwise
\end{matrix}\right.\
N_{i,k}(t)=\frac{t-t_i}{t_{i+k}-t_i}N_{i,k-1}(t)+\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}} N_{i+1,k-1}(t)
\end{array}\
*约定 frac{0}{0}=0
$$
其中$N_{i,k}(t)$为k阶( k-1次 )B样条基函数，${t_0,t_1,&amp;hellip;,t_{n+k+1}}$为节点矢量，B样条按其节点矢量分布可分为以下三类：&lt;/p>
&lt;ul>
&lt;li>均匀B样条：均匀分布或等距分布。&lt;/li>
&lt;li>准均匀分布：与均匀B样条区别在于两端端点为重节点。&lt;/li>
&lt;li>非均匀B样条：任意分布。
例如三次均匀B样条基函数为：
$$
\left{\begin{matrix}
N_{0,3}(t)=\frac{1}{6}(1-t)^3 \
N_{1,3}(t)=\frac{1}{6}(3t^3-6t^2+4) \
N_{2,3}(t)=\frac{1}{6}(-3t^3+3t^2+3t+1) \
N_{3,3}(t)=\frac{1}{6}t^3
\end{matrix}\right.
$$
B样条具有局部性：改变一个控制点时，只会对附近曲线段的形状产生影响。
对于一个k次的n+1个控制点的B样条，当k=n时，退化为Bezier曲线。&lt;/li>
&lt;/ul>
&lt;h2 id="nurbs方法">&lt;a href="#nurbs%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>NURBS方法
&lt;/h2>&lt;p>NURBS曲线全称非均匀有理B样条，是B样条的一般化，非均匀指节点的选取可以是不均匀的，有理主要体现在每个控制点有个权因子。
$$
R_n(t)=\frac{\sum_{i=0}^{n}N_{i,k}(t)w_iV_i}{N_{i,k}(t)w_i}
$$&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/johnhany/article/details/8830928" target="_blank" rel="noopener"
>https://blog.csdn.net/johnhany/article/details/8830928&lt;/a>
《形状可调的参数曲线曲面造型方法研究》
《Bezier曲线曲面的造型设计理论研究》&lt;/p></description></item><item><title>最小二乘法和移动最小二乘法</title><link>https://kizx.github.io/post/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95%E5%92%8C%E7%A7%BB%E5%8A%A8%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/</link><pubDate>Thu, 14 Oct 2021 10:59:00 +0000</pubDate><guid>https://kizx.github.io/post/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95%E5%92%8C%E7%A7%BB%E5%8A%A8%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/</guid><description>&lt;h1 id="endbmatrix">&lt;a href="#endbmatrix" class="header-anchor">&lt;/a>已知未知系数的方程$ f(x)=p(x)^{T}*\alpha $，以及一系列数据点$(x_{i},y_{i})$，其中$p(x)$是基函数，$\alpha$是系数向量，求解该方程的系数向量，使得损失函数$J=\sum_{i=0}^{n} (f(x_{i})-y_{i})^2$值最小。联立所有方程，一般是一个超定方程组（等式个数大于未知数），一般可以表示为$Ax=b$形式，这里的$x$是指待求系数。
以方程$f(x)=a+bx+cx^{2}$为例，可以表示成如下形式：
$$
\begin{bmatrix}
1 &amp;amp; x_{1} &amp;amp; x_{1}^{2}\
1 &amp;amp; x_{2} &amp;amp; x_{2}^{2}\
&amp;hellip; &amp;amp; &amp;hellip; &amp;amp; &amp;hellip;\
1 &amp;amp; x_{n} &amp;amp; x_{n}^{2}
\end{bmatrix}
*
\begin{bmatrix}
a\
b\
c
\end{bmatrix}
&lt;/h1>&lt;p>\begin{bmatrix}
y_{1}\
y_{2}\
&amp;hellip;\
y_{n}
\end{bmatrix}
$$&lt;/p>
&lt;ul>
&lt;li>求解上述问题，可以有两种思路，一种是从投影的角度，另一种是对损失函数求偏导数令其等于0。结果都是$x=(A^{T}A)^{-1}A^{T}b$，用法线方程法公式计算有个前提就是式中有个逆矩阵，必须保证可逆，否则得用别的方法求解。&lt;/li>
&lt;li>上述方法解出来的解误差分布不一定理想，可以通过计算$Cond(A^TA)$条件数判断方程是否是病态的，必要时可以考虑QR分解等解法。&lt;/li>
&lt;li>如果方程自变量个数不止一个，或者方程形式较复杂，一般都是通过化简和变量组合向上面的线性形式凑齐然后求解。&lt;/li>
&lt;li>至于为什么损失函数是平方和，需要从概率论角度解释，大概意思是残差满足正态分布的最大似然估计就是最小二乘形式。&lt;/li>
&lt;/ul>
&lt;h2 id="移动最小二乘法mls-moving-least-square">&lt;a href="#%e7%a7%bb%e5%8a%a8%e6%9c%80%e5%b0%8f%e4%ba%8c%e4%b9%98%e6%b3%95mls-moving-least-square" class="header-anchor">&lt;/a>移动最小二乘法MLS (Moving Least Square)
&lt;/h2>&lt;p>MLS的拟合方程：$f(x)=p(x)^{T}&lt;em>\alpha(x)$，其中$p(x)$是基函数列向量，$\alpha(x)$不再是常数，而是基于$x$的函数。常见的基函数有线性基：$[1,x]^T$，二次基：$[1,x,x^2]^T$，三次基：$[1,x,x^2，x^3]^T$，而$\alpha(x)$是我们欲求的未知函数。
另外MLS引入了紧支概念：即某点处的函数值只受附近点的影响，或者说每个数据点只对自己影响区域内的拟合结果有影响，由此引入权函数$w(x)$，此时损失函数为$J=\sum_{i=0}^{n} w(x-x_i)(f(x_{i})-y_{i})^2=\sum_{i=0}^{n} w(x-x_i)(p(x)^{T}&lt;/em>\alpha(x)-y_{i})^2$。
比如三次样条函数权函数如下：
$$
\begin{array}{c}
s=\frac{|x-x_i|}{r}\
w(s)=\left{\begin{matrix}
\frac{2}{3}-4s^2+4s^3, &amp;amp;s\le 0.5 \
\frac{4}{3}-4s+4s^2-\frac{4s^2}{3}, &amp;amp;0.5&amp;lt;s\le1\
0,&amp;amp; s&amp;gt;1
\end{matrix}\right.
\end{array}
$$
其中$r$表示影响范围半径。
对损失函数求偏导等于0可得$\alpha(x)$：
$$
\begin{align}
\frac{\partial J}{\partial \alpha(x)} &amp;amp;= A(x)\alpha(x)-B(x)y = 0 \
\alpha(x) &amp;amp;= A^{-1}(x)B(x)y \
&amp;amp; 其中: \
w_i(x) &amp;amp;= w(\frac{|x-x_i|}{r})\
P &amp;amp;= \begin{bmatrix}
p_1(x_1)&amp;amp; p_2(x_1)&amp;amp; &amp;hellip;&amp;amp; p_m(x_1)\
p_1(x_2)&amp;amp; p_2(x_2)&amp;amp; &amp;hellip;&amp;amp; p_m(x_2)\
&amp;hellip;&amp;amp; &amp;hellip;&amp;amp; &amp;hellip;&amp;amp; &amp;hellip;\
p_1(x_n)&amp;amp; p_2(x_n)&amp;amp; &amp;hellip;&amp;amp; p_m(x_n)
\end{bmatrix}\
w(x) &amp;amp;= \begin{bmatrix}
w_1(x) &amp;amp; 0&amp;amp; &amp;hellip;&amp;amp; 0\
0&amp;amp; w_2(x)&amp;amp; &amp;hellip;&amp;amp; 0\
&amp;hellip;&amp;amp; &amp;hellip;&amp;amp; &amp;hellip;&amp;amp; &amp;hellip;\
0&amp;amp; 0&amp;amp; &amp;hellip;&amp;amp; w_n(x)
\end{bmatrix}\
A(x) &amp;amp;= P^TW(x)P \
B(x) &amp;amp;= P^TW(x) \
\end{align}
$$&lt;/p>
&lt;ul>
&lt;li>权函数$w(s)$应该是非负的，并伴随着$||x-x_i||_2$增大而减小。&lt;/li>
&lt;li>实际应用过程中，取不同基函数可以获得不同的拟合精度，取不同的权函数可以获得不同的平滑度。&lt;/li>
&lt;li>一般基函数次数越高，曲线越平滑；影响半径越大，曲线越平滑。&lt;/li>
&lt;li>影响半径不能太小，太小的话局部点数不够会造成奇异矩阵不可解。&lt;/li>
&lt;/ul>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>最小二乘：
&lt;a class="link" href="https://zhuanlan.zhihu.com/p/38128785" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/38128785&lt;/a>
&lt;a class="link" href="https://www.zhihu.com/question/37031188/answer/2041682439" target="_blank" rel="noopener"
>https://www.zhihu.com/question/37031188/answer/2041682439&lt;/a>
&lt;a class="link" href="https://ww2.mathworks.cn/help/matlab/ref/lsqr.html" target="_blank" rel="noopener"
>https://ww2.mathworks.cn/help/matlab/ref/lsqr.html&lt;/a>
移动最小二乘：
&lt;a class="link" href="https://wenku.baidu.com/view/fe7a74976f1aff00bed51eb1.html" target="_blank" rel="noopener"
>https://wenku.baidu.com/view/fe7a74976f1aff00bed51eb1.html&lt;/a>
&lt;a class="link" href="https://www.doc88.com/p-8778611828185.html" target="_blank" rel="noopener"
>https://www.doc88.com/p-8778611828185.html&lt;/a>
&lt;a class="link" href="https://www.freesion.com/article/7962225749/" target="_blank" rel="noopener"
>https://www.freesion.com/article/7962225749/&lt;/a>
&lt;a class="link" href="https://www.freesion.com/article/991733680/" target="_blank" rel="noopener"
>https://www.freesion.com/article/991733680/&lt;/a>
&lt;a class="link" href="https://www.doc88.com/p-8778611828185.html" target="_blank" rel="noopener"
>https://www.doc88.com/p-8778611828185.html&lt;/a>
&lt;a class="link" href="https://d.wanfangdata.com.cn/periodical/szjsyyy201510082" target="_blank" rel="noopener"
>https://d.wanfangdata.com.cn/periodical/szjsyyy201510082&lt;/a>&lt;/p></description></item><item><title>JS类型转换</title><link>https://kizx.github.io/post/js%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/</link><pubDate>Fri, 27 Aug 2021 15:04:00 +0000</pubDate><guid>https://kizx.github.io/post/js%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/</guid><description>&lt;p>首先会判断两者类型，相同直接比较是否全等，类型不相同的话，就会进行类型转换，按以下规则：&lt;/p>
&lt;ul>
&lt;li>布尔-&amp;gt;数值&lt;/li>
&lt;li>字符+数值-&amp;gt;数值&lt;/li>
&lt;li>对象-&amp;gt;valueof&lt;/li>
&lt;li>null==undefined&lt;/li>
&lt;li>遇到NaN直接不等&lt;/li>
&lt;/ul>
&lt;h2 id="全等不全等">&lt;a href="#%e5%85%a8%e7%ad%89%e4%b8%8d%e5%85%a8%e7%ad%89" class="header-anchor">&lt;/a>全等&lt;code>===&lt;/code>不全等&lt;code>!==&lt;/code>
&lt;/h2>&lt;p>类型不相同时不会转换类型，直接返回false&lt;/p>
&lt;ul>
&lt;li>null===undefined //true&lt;/li>
&lt;/ul>
&lt;h2 id="objectis">&lt;a href="#objectis" class="header-anchor">&lt;/a>Object.is()
&lt;/h2>&lt;p>除了特殊情况一般和===相同&lt;/p>
&lt;ul>
&lt;li>Object.is(NaN,NaN) //true&lt;/li>
&lt;li>Object.is(0,-0) //false&lt;/li>
&lt;/ul>
&lt;h2 id="转为数值">&lt;a href="#%e8%bd%ac%e4%b8%ba%e6%95%b0%e5%80%bc" class="header-anchor">&lt;/a>转为数值
&lt;/h2>&lt;ul>
&lt;li>null-&amp;gt;0&lt;/li>
&lt;li>undefined-&amp;gt;NaN&lt;/li>
&lt;li>true-&amp;gt;1 false-&amp;gt;0&lt;/li>
&lt;li>数字字符串-&amp;gt;数字&lt;/li>
&lt;li>字符串包含非数字-&amp;gt;NaN&lt;/li>
&lt;li>&amp;ldquo;&amp;rdquo;-&amp;gt;0&lt;/li>
&lt;li>Symbol-&amp;gt;报错&lt;/li>
&lt;li>对象-&amp;gt;valueOf()??toString() []-&amp;gt;0 [1]-&amp;gt;1 [1,1]-&amp;gt;NaN {}-&amp;gt;NaN&lt;/li>
&lt;/ul>
&lt;h2 id="转为布尔">&lt;a href="#%e8%bd%ac%e4%b8%ba%e5%b8%83%e5%b0%94" class="header-anchor">&lt;/a>转为布尔
&lt;/h2>&lt;p>记住以下false假值：&lt;/p>
&lt;ul>
&lt;li>undefined&lt;/li>
&lt;li>null&lt;/li>
&lt;li>+0、-0&lt;/li>
&lt;li>NaN&lt;/li>
&lt;/ul>
&lt;h2 id="转为字符串">&lt;a href="#%e8%bd%ac%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2" class="header-anchor">&lt;/a>转为字符串
&lt;/h2>&lt;ul>
&lt;li>null-&amp;gt;&amp;ldquo;null&amp;rdquo;&lt;/li>
&lt;li>undefined-&amp;gt;&amp;ldquo;undefined&amp;rdquo;&lt;/li>
&lt;li>true-&amp;gt;&amp;ldquo;true&amp;rdquo;、false-&amp;gt;&amp;ldquo;false&amp;rdquo;&lt;/li>
&lt;li>数值-&amp;gt;&amp;ldquo;数值&amp;rdquo;&lt;/li>
&lt;li>对象-&amp;gt;toString()方法，该方法会被重写，未重写Object.prototype.toString-&amp;gt;&amp;quot;[object 具体类型]&amp;quot;&lt;/li>
&lt;li>Symbol-&amp;gt;只能强制转换，隐式转换报错&lt;/li>
&lt;/ul>
&lt;h2 id="加法">&lt;a href="#%e5%8a%a0%e6%b3%95" class="header-anchor">&lt;/a>加法
&lt;/h2>&lt;p>数值+数值：&lt;/p>
&lt;ul>
&lt;li>NaN+*=NaN&lt;/li>
&lt;li>Infinity+-Infinity=NaN&lt;/li>
&lt;li>-Infinity+-Infinity=-Infinity&lt;/li>
&lt;li>-0+-0=-0&lt;/li>
&lt;li>0+-0=0
只要有一个操作数是字符串，则转换为字符串进行拼接&lt;/li>
&lt;li>[]+{}=&amp;quot;[object Object]&amp;quot; {}+[]=0&lt;/li>
&lt;/ul>
&lt;h2 id="减法">&lt;a href="#%e5%87%8f%e6%b3%95" class="header-anchor">&lt;/a>减法
&lt;/h2>&lt;ul>
&lt;li>NaN-*=NaN&lt;/li>
&lt;li>Infinity-Infinity=NaN&lt;/li>
&lt;li>-Infinity&amp;ndash;Infinity=NaN&lt;/li>
&lt;li>操作数是字符串、布尔、null、undefined-&amp;gt;数值&lt;/li>
&lt;li>对象-&amp;gt;valueOf()??toString()&lt;/li>
&lt;/ul>
&lt;h2 id="和">&lt;a href="#%e5%92%8c" class="header-anchor">&lt;/a>&amp;gt;和&amp;lt;
&lt;/h2>&lt;ul>
&lt;li>字符串比较-&amp;gt;逐个比较字母编码&lt;/li>
&lt;li>有一个是数值-&amp;gt;将另一个转为数值&lt;/li>
&lt;li>对象-》valueof().toString()&lt;/li>
&lt;li>布尔-&amp;gt;数值&lt;/li>
&lt;li>NaN-&amp;gt;返回false&lt;/li>
&lt;/ul>
&lt;h2 id="valueoftostring">&lt;a href="#valueoftostring" class="header-anchor">&lt;/a>valueOf()、toString()
&lt;/h2>&lt;ul>
&lt;li>[1,&amp;lsquo;a&amp;rsquo;].valueOf() -&amp;gt; [1,&amp;lsquo;a&amp;rsquo;]&lt;/li>
&lt;li>[1,&amp;lsquo;a&amp;rsquo;].toString() -&amp;gt; &amp;lsquo;1,a&amp;rsquo;&lt;/li>
&lt;li>{}.valueOf() -&amp;gt; {}&lt;/li>
&lt;li>{}.toString() -&amp;gt; &amp;lsquo;[Object Object]&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;h2 id="arguments">&lt;a href="#arguments" class="header-anchor">&lt;/a>arguments
&lt;/h2>&lt;p>在严格模式或使用&lt;code>...args&lt;/code>的的情况下arguments不再追踪参数的变化。&lt;/p></description></item><item><title>JS常见设计模式</title><link>https://kizx.github.io/post/js%E5%B8%B8%E8%A7%81%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><pubDate>Mon, 23 Aug 2021 13:44:00 +0000</pubDate><guid>https://kizx.github.io/post/js%E5%B8%B8%E8%A7%81%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</guid><description>&lt;p>将创建对象的具体逻辑封装在?个函数中，创建后返回这个对象，那么这个函数就可以被视为?个??。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 简单??模式：只需要?个正确的参数，就可以获取到你所需要的对象，?于?成实例
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 比如对象工厂，函数工厂
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>(&lt;span style="color:#a6e22e">opts&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Object();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">opts&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">opts&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">getInfo&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;名称：&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;， 颜?：&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">cat&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>({ &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;波斯猫&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">color&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;??&amp;#34;&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ???法模式：本意是将实际创建对象的?作推迟到?类中，这样核?类就变成了抽象类，
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ???法只是?个实例化对象的??，只做实例化对象这?件事情，?于?成实例
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">viewPage&lt;/span> &lt;span style="color:#f92672">=&lt;/span> []) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#66d9ef">new&lt;/span>.&lt;span style="color:#a6e22e">target&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">throw&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Error(&lt;span style="color:#e6db74">&amp;#34;抽象类不能实例化!&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">viewPage&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">viewPage&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">UserFactory&lt;/span> &lt;span style="color:#66d9ef">extends&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>, &lt;span style="color:#a6e22e">viewPage&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">super&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>, &lt;span style="color:#a6e22e">viewPage&lt;/span>); &lt;span style="color:#75715e">// 调??类的constructor(name, viewPage)，继承?类的this对象
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// let user = new User(); // 不允许直接实例化
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">userFactory&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">UserFactory&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//抽象??模式：并不直接?成实例，?是?于对产品类簇的创建
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">getAbstractUserFactory&lt;/span>(&lt;span style="color:#a6e22e">type&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">switch&lt;/span> (&lt;span style="color:#a6e22e">type&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> &lt;span style="color:#e6db74">&amp;#34;wechat&amp;#34;&lt;/span>&lt;span style="color:#f92672">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">UserOfWechat&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> &lt;span style="color:#e6db74">&amp;#34;qq&amp;#34;&lt;/span>&lt;span style="color:#f92672">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">UserOfQq&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> &lt;span style="color:#e6db74">&amp;#34;weibo&amp;#34;&lt;/span>&lt;span style="color:#f92672">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">UserOfWeibo&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">default&lt;/span>&lt;span style="color:#f92672">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">throw&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Error(&lt;span style="color:#e6db74">&amp;#34;参数错误, 可选参数:wechat、qq、weibo&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">WechatUserClass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">getAbstractUserFactory&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;wechat&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">QqUserClass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">getAbstractUserFactory&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;qq&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">WeiboUserClass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">getAbstractUserFactory&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;weibo&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">wechatUser&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">WechatUserClass&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;微信?李&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">qqUser&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">QqUserClass&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;QQ?李&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">weiboUser&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">WeiboUserClass&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;微博?李&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="单例模式">&lt;a href="#%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>单例模式
&lt;/h2>&lt;p>保证?个类仅有?个实例，并提供?个访问它的全局访问点。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Singleton&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#a6e22e">getInstance&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">instance&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">instance&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">instance&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Singleton&lt;/span>(...&lt;span style="color:#a6e22e">arguments&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">instance&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">s1&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">Singleton&lt;/span>.&lt;span style="color:#a6e22e">getInstance&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;lisi&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">s1&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>); &lt;span style="color:#75715e">//lisi
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">s2&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">Singleton&lt;/span>.&lt;span style="color:#a6e22e">getInstance&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;san&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">s1&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>); &lt;span style="color:#75715e">//lisi
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">s1&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">s2&lt;/span>); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="观察者模式">&lt;a href="#%e8%a7%82%e5%af%9f%e8%80%85%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>观察者模式
&lt;/h2>&lt;p>定义了对象间?对多的依赖关系，当?标对象的状态发?改变时，所有依赖它的对象都会得到通知。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ?标者类
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Subject&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">constructor&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">observers&lt;/span> &lt;span style="color:#f92672">=&lt;/span> []; &lt;span style="color:#75715e">// 观察者列表
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 添加
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">observer&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">observers&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#a6e22e">observer&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 删除
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">remove&lt;/span>(&lt;span style="color:#a6e22e">observer&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">idx&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">observers&lt;/span>.&lt;span style="color:#a6e22e">findIndex&lt;/span>((&lt;span style="color:#a6e22e">item&lt;/span>) =&amp;gt; &lt;span style="color:#a6e22e">item&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">observer&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">idx&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">observers&lt;/span>.&lt;span style="color:#a6e22e">splice&lt;/span>(&lt;span style="color:#a6e22e">idx&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 通知
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">notify&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">observer&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">observers&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">observer&lt;/span>.&lt;span style="color:#a6e22e">update&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 观察者类
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Observer&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// ?标对象更新时触发的回调
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">update&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`?标者通知我更新了，我是：&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 实例化?标者
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">subject&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Subject&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 实例化两个观察者
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">obs1&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Observer&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;前端开发者&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">obs2&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Observer&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;后端开发者&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 向?标者添加观察者
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">subject&lt;/span>.&lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">obs1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">subject&lt;/span>.&lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">obs2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ?标者通知更新
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">subject&lt;/span>.&lt;span style="color:#a6e22e">notify&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 输出：
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ?标者通知我更新了，我是前端开发者
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// ?标者通知我更新了，我是后端开发者
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="发布订阅模式">&lt;a href="#%e5%8f%91%e5%b8%83%e8%ae%a2%e9%98%85%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>发布订阅模式
&lt;/h2>&lt;p>实现了对象间多对多的依赖关系，通过事件中?管理多个事件。?标对象并不直接通知观察者，?是通过事件中?来派发通知。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 事件中?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">pubSub&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">list&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {}, &lt;span style="color:#75715e">// {onwork:[fn1,fn2],offwork:[fn1,fn2],launch:[fn1,fn2]}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">subscribe&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 订阅
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#a6e22e">key&lt;/span>]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#a6e22e">key&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#a6e22e">key&lt;/span>].&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#a6e22e">fn&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">publish&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">key&lt;/span>, ...&lt;span style="color:#a6e22e">arg&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 发布
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#a6e22e">key&lt;/span>]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, ...&lt;span style="color:#a6e22e">arg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">unSubscribe&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 取消订阅
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">fnList&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#a6e22e">key&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">fnList&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 不传?指定取消的订阅?法，则清空所有key下的订阅
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">fnList&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> (&lt;span style="color:#a6e22e">fnList&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">fnList&lt;/span>.&lt;span style="color:#a6e22e">forEach&lt;/span>((&lt;span style="color:#a6e22e">item&lt;/span>, &lt;span style="color:#a6e22e">index&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">item&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">fnList&lt;/span>.&lt;span style="color:#a6e22e">splice&lt;/span>(&lt;span style="color:#a6e22e">index&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 订阅
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">subscribe&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;onwork&amp;#34;&lt;/span>, (&lt;span style="color:#a6e22e">time&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`上班了：&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">time&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">subscribe&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;offwork&amp;#34;&lt;/span>, (&lt;span style="color:#a6e22e">time&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`下班了：&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">time&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">subscribe&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;launch&amp;#34;&lt;/span>, (&lt;span style="color:#a6e22e">time&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`吃饭了：&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">time&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 发布
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">publish&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;onwork&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;9:00:00&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">publish&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;offwork&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;18:00:00&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">publish&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;launch&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;12:00:00&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 取消订阅
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">unSubscribe&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;onwork&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">pubSub&lt;/span>.&lt;span style="color:#a6e22e">publish&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;onwork&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;9:00:00&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="适配器模式">&lt;a href="#%e9%80%82%e9%85%8d%e5%99%a8%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>适配器模式
&lt;/h2>&lt;p>适配器?来解决两个接?不兼容的情况，不需要改变已有的接?，通过包装?层的?式实现两个接?的正常协作。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 已有的地图接?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">googleMap&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">show&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;开始渲染?歌地图&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">baiduMap&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">display&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;开始渲染百度地图&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 已有的渲染接?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">renderMap&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">map&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">map&lt;/span>.&lt;span style="color:#a6e22e">show&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> Function) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">map&lt;/span>.&lt;span style="color:#a6e22e">show&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 适配器
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">baiduMapAdapter&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">show&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">baiduMap&lt;/span>.&lt;span style="color:#a6e22e">display&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">renderMap&lt;/span>(&lt;span style="color:#a6e22e">googleMap&lt;/span>); &lt;span style="color:#75715e">// 开始渲染?歌地图
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">renderMap&lt;/span>(&lt;span style="color:#a6e22e">baiduMapAdapter&lt;/span>); &lt;span style="color:#75715e">// 开始渲染百度地图
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="代理模式">&lt;a href="#%e4%bb%a3%e7%90%86%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>代理模式
&lt;/h2>&lt;p>不直接引?另?个对象，通过代理对象间接引用，起到中介的作?。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">proxy&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Proxy(&lt;span style="color:#a6e22e">obj&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">get&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">target&lt;/span>, &lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">receiver&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`getting &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">key&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">!`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">Reflect&lt;/span>.&lt;span style="color:#a6e22e">get&lt;/span>(&lt;span style="color:#a6e22e">target&lt;/span>, &lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">receiver&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">set&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">target&lt;/span>, &lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">value&lt;/span>, &lt;span style="color:#a6e22e">receiver&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`setting &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">key&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">=&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">value&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">!`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">Reflect&lt;/span>.&lt;span style="color:#a6e22e">set&lt;/span>(&lt;span style="color:#a6e22e">target&lt;/span>, &lt;span style="color:#a6e22e">key&lt;/span>, &lt;span style="color:#a6e22e">value&lt;/span>, &lt;span style="color:#a6e22e">receiver&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">proxy&lt;/span>.&lt;span style="color:#a6e22e">count&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">proxy&lt;/span>.&lt;span style="color:#a6e22e">count&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="装饰模式">&lt;a href="#%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f" class="header-anchor">&lt;/a>装饰模式
&lt;/h2>&lt;p>不改变已有的函数，给函数添加额外的功能，?如ES7中的装饰器。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://refactoringguru.cn/design-patterns/catalog" target="_blank" rel="noopener"
>https://refactoringguru.cn/design-patterns/catalog&lt;/a>&lt;/p></description></item><item><title>学习资料</title><link>https://kizx.github.io/post/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/</link><pubDate>Tue, 13 Jul 2021 07:55:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/</guid><description>&lt;p>&lt;a class="link" href="https://doc.houdunren.com/" target="_blank" rel="noopener"
>后盾人&lt;/a>
&lt;a class="link" href="http://www.cyc2018.xyz/" target="_blank" rel="noopener"
>CS-Note&lt;/a>&lt;/p>
&lt;h2 id="算法">&lt;a href="#%e7%ae%97%e6%b3%95" class="header-anchor">&lt;/a>算法
&lt;/h2>&lt;p>&lt;a class="link" href="https://programmercarl.com/" target="_blank" rel="noopener"
>代码随想录&lt;/a>&lt;/p>
&lt;h2 id="知识点">&lt;a href="#%e7%9f%a5%e8%af%86%e7%82%b9" class="header-anchor">&lt;/a>知识点
&lt;/h2>&lt;p>&lt;a class="link" href="https://mp.weixin.qq.com/s/StIo-eC-7UeBr-fb6lIZkQ" target="_blank" rel="noopener"
>Cookies,Session和Token&lt;/a>
&lt;a class="link" href="https://mp.weixin.qq.com/s/djhGnfxeuhIOtSHy2in8NA" target="_blank" rel="noopener"
>TCP 三次握手源码&lt;/a>
&lt;a class="link" href="https://yuanrengu.blog.csdn.net/article/details/102366854" target="_blank" rel="noopener"
>TCP握手挥手&lt;/a>
&lt;a class="link" href="https://mp.weixin.qq.com/s/3Ep5pJULvP7WHJvVJNDV-g" target="_blank" rel="noopener"
>Service Worker&lt;/a>
&lt;a class="link" href="https://view.inews.qq.com/a/20210812A0FIIR00" target="_blank" rel="noopener"
>HTTPS 加密、证书、签名与握手&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/weixin_43698328/article/details/110742906" target="_blank" rel="noopener"
>4种常见的内存泄露&lt;/a>
&lt;a class="link" href="https://www.ruanyifeng.com/blog/2012/11/require_js.html" target="_blank" rel="noopener"
>JS模块化&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/u013108007/article/details/107804387" target="_blank" rel="noopener"
>简单了解二叉树diff算法&lt;/a>
&lt;a class="link" href="https://github.com/livoras/blog/issues/13" target="_blank" rel="noopener"
>如何实现一个 Virtual DOM 算法&lt;/a>
&lt;a class="link" href="https://imtaotao.github.io/co-share/#/title" target="_blank" rel="noopener"
>js 异步历史与 co.js 解读&lt;/a>&lt;/p>
&lt;h2 id="面试相关">&lt;a href="#%e9%9d%a2%e8%af%95%e7%9b%b8%e5%85%b3" class="header-anchor">&lt;/a>面试相关
&lt;/h2>&lt;p>&lt;a class="link" href="https://mp.weixin.qq.com/s/NnbpJQM3du2ovsV2SKKcMg" target="_blank" rel="noopener"
>vue2,vue3面试汇总&lt;/a>
&lt;a class="link" href="https://github.com/whylisa/front-end-interview" target="_blank" rel="noopener"
>前端面试资源&lt;/a>
&lt;a class="link" href="https://www.iamshuaidi.com/673.html" target="_blank" rel="noopener"
>计算机网络面试真题&lt;/a>
&lt;a class="link" href="https://www.nowcoder.com/tutorial/96/e38c9c9efd254bd694e5dcaffa0f879c" target="_blank" rel="noopener"
>前端面试宝典&lt;/a>
&lt;a class="link" href="https://barryyeee.github.io/InterviewGuide/" target="_blank" rel="noopener"
>前端面试小本本&lt;/a>&lt;/p>
&lt;h2 id="博客">&lt;a href="#%e5%8d%9a%e5%ae%a2" class="header-anchor">&lt;/a>博客
&lt;/h2>&lt;p>&lt;a class="link" href="https://78.al/" target="_blank" rel="noopener"
>https://78.al/&lt;/a>
&lt;a class="link" href="https://jerryzou.com/posts/rxjs-practice-01/" target="_blank" rel="noopener"
>https://jerryzou.com/posts/rxjs-practice-01/&lt;/a>
&lt;a class="link" href="https://gongchenghuigch.github.io/tags/%E9%9D%A2%E8%AF%95%E9%A2%98/" target="_blank" rel="noopener"
>前端面试题&lt;/a>
&lt;a class="link" href="https://www.ruanyifeng.com/blog/javascript/" target="_blank" rel="noopener"
>阮一峰的网络日志&lt;/a>&lt;/p></description></item><item><title>腾讯云函数、阿里云函数Python创建HTTP函数示例</title><link>https://kizx.github.io/post/%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E9%98%BF%E9%87%8C%E4%BA%91%E5%87%BD%E6%95%B0python%E5%88%9B%E5%BB%BAhttp%E5%87%BD%E6%95%B0%E7%A4%BA%E4%BE%8B/</link><pubDate>Sun, 13 Jun 2021 14:03:32 +0000</pubDate><guid>https://kizx.github.io/post/%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E9%98%BF%E9%87%8C%E4%BA%91%E5%87%BD%E6%95%B0python%E5%88%9B%E5%BB%BAhttp%E5%87%BD%E6%95%B0%E7%A4%BA%E4%BE%8B/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> urllib &lt;span style="color:#f92672">import&lt;/span> parse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">get_url&lt;/span>(type&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;pivix&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">main_handler&lt;/span>(event, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> event[&lt;span style="color:#e6db74">&amp;#39;httpMethod&amp;#39;&lt;/span>] &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;GET&amp;#39;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span> &lt;span style="color:#f92672">in&lt;/span> event[&lt;span style="color:#e6db74">&amp;#39;queryString&amp;#39;&lt;/span>]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> imgtype &lt;span style="color:#f92672">=&lt;/span> event[&lt;span style="color:#e6db74">&amp;#39;queryString&amp;#39;&lt;/span>][&lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> url &lt;span style="color:#f92672">=&lt;/span> get_url(imgtype)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> url &lt;span style="color:#f92672">=&lt;/span> get_url()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> url:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;code&amp;#39;&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>: url, &lt;span style="color:#e6db74">&amp;#39;msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;成功&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;code&amp;#39;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;失败&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> event[&lt;span style="color:#e6db74">&amp;#39;httpMethod&amp;#39;&lt;/span>] &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;POST&amp;#39;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> body &lt;span style="color:#f92672">=&lt;/span> parse&lt;span style="color:#f92672">.&lt;/span>parse_qs(event[&lt;span style="color:#e6db74">&amp;#39;body&amp;#39;&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(body)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span> &lt;span style="color:#f92672">in&lt;/span> body:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> imgtype &lt;span style="color:#f92672">=&lt;/span> body[&lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span>][&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> url &lt;span style="color:#f92672">=&lt;/span> get_url(imgtype)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> url &lt;span style="color:#f92672">=&lt;/span> get_url()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> url:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;code&amp;#39;&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>: url, &lt;span style="color:#e6db74">&amp;#39;msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;成功&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;code&amp;#39;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;失败&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="阿里云">&lt;a href="#%e9%98%bf%e9%87%8c%e4%ba%91" class="header-anchor">&lt;/a>阿里云
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> logging
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> urllib &lt;span style="color:#f92672">import&lt;/span> parse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># To enable the initializer feature (https://help.aliyun.com/document_detail/158208.html)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># please implement the initializer function as below：&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># def initializer(context):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># logger = logging.getLogger()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># logger.info(&amp;#39;initializing&amp;#39;)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">handler&lt;/span>(environ, start_response):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context &lt;span style="color:#f92672">=&lt;/span> environ[&lt;span style="color:#e6db74">&amp;#39;fc.context&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request_uri &lt;span style="color:#f92672">=&lt;/span> environ[&lt;span style="color:#e6db74">&amp;#39;fc.request_uri&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> k, v &lt;span style="color:#f92672">in&lt;/span> environ&lt;span style="color:#f92672">.&lt;/span>items():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> k&lt;span style="color:#f92672">.&lt;/span>startswith(&lt;span style="color:#e6db74">&amp;#39;HTTP_&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># process custom request headers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># do something here&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request_body_size &lt;span style="color:#f92672">=&lt;/span> int(environ&lt;span style="color:#f92672">.&lt;/span>get(&lt;span style="color:#e6db74">&amp;#39;CONTENT_LENGTH&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">except&lt;/span> (&lt;span style="color:#a6e22e">ValueError&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request_body_size &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request_body &lt;span style="color:#f92672">=&lt;/span> environ[&lt;span style="color:#e6db74">&amp;#39;wsgi.input&amp;#39;&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>read(request_body_size)&lt;span style="color:#f92672">.&lt;/span>decode(encoding&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;utf-8&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> body &lt;span style="color:#f92672">=&lt;/span> parse&lt;span style="color:#f92672">.&lt;/span>parse_qs(request_body)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> body:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> body[i] &lt;span style="color:#f92672">=&lt;/span> body[i][&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;200 OK&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response_headers &lt;span style="color:#f92672">=&lt;/span> [(&lt;span style="color:#e6db74">&amp;#39;Content-type&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;application/json&amp;#39;&lt;/span>)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start_response(status, response_headers)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> [json&lt;span style="color:#f92672">.&lt;/span>dumps(body)&lt;span style="color:#f92672">.&lt;/span>encode(encoding&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;utf-8&amp;#34;&lt;/span>)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>TypeScript基础</title><link>https://kizx.github.io/post/typescript%E5%9F%BA%E7%A1%80/</link><pubDate>Sat, 05 Jun 2021 14:09:00 +0000</pubDate><guid>https://kizx.github.io/post/typescript%E5%9F%BA%E7%A1%80/</guid><description>&lt;p>&lt;a class="link" href="https://www.tslang.cn/docs/home.html" target="_blank" rel="noopener"
>https://www.tslang.cn/docs/home.html&lt;/a>&lt;/p>
&lt;h2 id="变量">&lt;a href="#%e5%8f%98%e9%87%8f" class="header-anchor">&lt;/a>变量
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-typescript" data-lang="typescript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 布尔
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">isDone&lt;/span>: &lt;span style="color:#66d9ef">boolean&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 数字
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">decLiteral&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">hexLiteral&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0xf00d&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">binaryLiteral&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#a6e22e">b1010&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">octalLiteral&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#a6e22e">o744&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 字符串
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">fname&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;bob&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">sentence&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">`Hello, my name is &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">fname&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">.`&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 数组
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">list1&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>[] &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">list2&lt;/span>: &lt;span style="color:#66d9ef">Array&lt;/span>&amp;lt;&lt;span style="color:#f92672">number&lt;/span>&amp;gt; &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 元组
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [&lt;span style="color:#66d9ef">string&lt;/span>, &lt;span style="color:#66d9ef">number&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;hello&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">10&lt;/span>]; &lt;span style="color:#75715e">// OK
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// x = [10, &amp;#34;hello&amp;#34;]; // Error
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 枚举
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">enum&lt;/span> &lt;span style="color:#a6e22e">Color&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Red&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Green&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Blue&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>: &lt;span style="color:#66d9ef">Color&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">Color&lt;/span>.&lt;span style="color:#a6e22e">Green&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">c&lt;/span>); &lt;span style="color:#75715e">//1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">colorName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">Color&lt;/span>[&lt;span style="color:#ae81ff">2&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">colorName&lt;/span>); &lt;span style="color:#75715e">//Blue
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Any
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">notSure&lt;/span>: &lt;span style="color:#66d9ef">any&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">notSure&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;maybe a string instead&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">notSure&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>; &lt;span style="color:#75715e">// ok
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">list&lt;/span>: &lt;span style="color:#66d9ef">any&lt;/span>[] &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;free&amp;#34;&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">list&lt;/span>[&lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">some&lt;/span>; &lt;span style="color:#75715e">//声明时未指定类型时默认any
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">some&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">some&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// void
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">warnUser&lt;/span>()&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;This is my warning message&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// undefined null 可以赋给其他类型变量
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">u&lt;/span>: &lt;span style="color:#66d9ef">undefined&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">undefined&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">n&lt;/span>: &lt;span style="color:#66d9ef">null&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// never
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">error&lt;/span>(&lt;span style="color:#a6e22e">message&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">never&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">throw&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Error(&lt;span style="color:#a6e22e">message&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">infiniteLoop&lt;/span>()&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">never&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (&lt;span style="color:#66d9ef">true&lt;/span>) {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Object
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>: &lt;span style="color:#66d9ef">object&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 类型断言 规避类型检查
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">someValue&lt;/span>: &lt;span style="color:#66d9ef">any&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;this is a string&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">strLength1&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&amp;lt;&lt;span style="color:#f92672">string&lt;/span>&amp;gt;&lt;span style="color:#a6e22e">someValue&lt;/span>).&lt;span style="color:#a6e22e">length&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">strLength&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#a6e22e">someValue&lt;/span> &lt;span style="color:#66d9ef">as&lt;/span> &lt;span style="color:#66d9ef">string&lt;/span>).&lt;span style="color:#a6e22e">length&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 类型推断
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">somea&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; &lt;span style="color:#75715e">//类型自动推断为number
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// somea = &amp;#34;1&amp;#34;; //报错
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//联合类型
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">star&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">star&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 别名
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#a6e22e">mytype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">number&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#a6e22e">Eventname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Click&amp;#34;&lt;/span> &lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#e6db74">&amp;#34;scroll&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="接口">&lt;a href="#%e6%8e%a5%e5%8f%a3" class="header-anchor">&lt;/a>接口
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 对象接口
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">person&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">age&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">readonly&lt;/span> &lt;span style="color:#a6e22e">gender&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>; &lt;span style="color:#75715e">//只读属性
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">like?&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>; &lt;span style="color:#75715e">//可选属性
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> [&lt;span style="color:#a6e22e">propName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>]&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">any&lt;/span>; &lt;span style="color:#75715e">//任意属性
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 索引
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">numberArr&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e22e">index&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>]&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">number&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 函数接口
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">SearchFunc&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#a6e22e">source&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>, &lt;span style="color:#a6e22e">subString&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">boolean&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">mySearch&lt;/span>: &lt;span style="color:#66d9ef">SearchFunc&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">mySearch&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">src&lt;/span>, &lt;span style="color:#a6e22e">sub&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>.&lt;span style="color:#a6e22e">search&lt;/span>(&lt;span style="color:#a6e22e">sub&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 类接口
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">ClockInterface&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">currentTime&lt;/span>: &lt;span style="color:#66d9ef">Date&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">setTime&lt;/span>(&lt;span style="color:#a6e22e">d&lt;/span>: &lt;span style="color:#66d9ef">Date&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Clock&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> &lt;span style="color:#a6e22e">ClockInterface&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">currentTime&lt;/span>: &lt;span style="color:#66d9ef">Date&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">setTime&lt;/span>(&lt;span style="color:#a6e22e">d&lt;/span>: &lt;span style="color:#66d9ef">Date&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">currentTime&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">d&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">constructor&lt;/span>(&lt;span style="color:#a6e22e">h&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>, &lt;span style="color:#a6e22e">m&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">currentTime&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Date();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 接口继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">Shape&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">color&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">PenStroke&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">penWidth&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">interface&lt;/span> &lt;span style="color:#a6e22e">Square&lt;/span> &lt;span style="color:#66d9ef">extends&lt;/span> &lt;span style="color:#a6e22e">Shape&lt;/span>, &lt;span style="color:#a6e22e">PenStroke&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">sideLength&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">square&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &amp;lt;&lt;span style="color:#f92672">Square&lt;/span>&amp;gt;{};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">square&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;blue&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">square&lt;/span>.&lt;span style="color:#a6e22e">sideLength&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">square&lt;/span>.&lt;span style="color:#a6e22e">penWidth&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">5.0&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="面向对象">&lt;a href="#%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1" class="header-anchor">&lt;/a>面向对象
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 继承类可以访问
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">protected&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 构造函数里可以使用 public name 来简写
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">move&lt;/span>(&lt;span style="color:#a6e22e">distanceInMeters&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`Animal moved &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">distanceInMeters&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">m.`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#a6e22e">isAnimal&lt;/span>(&lt;span style="color:#a6e22e">animal&lt;/span>: &lt;span style="color:#66d9ef">object&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">boolean&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span> &lt;span style="color:#66d9ef">extends&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 私有属性，只读
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">private&lt;/span> &lt;span style="color:#66d9ef">readonly&lt;/span> &lt;span style="color:#a6e22e">color&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;blackack&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">constructor&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">super&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">move&lt;/span>(&lt;span style="color:#a6e22e">distanceInMeters&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> moved &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">distanceInMeters&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">m.`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">bark() {&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: Woof! Woof!`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dog&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">move&lt;/span>(&lt;span style="color:#ae81ff">10&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">bark&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">isAnimal&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//抽象类
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">abstract&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">absAnimal&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">abstract&lt;/span> &lt;span style="color:#a6e22e">makeSound&lt;/span>()&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span>; &lt;span style="color:#75715e">// 必须在派生类中实现
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">move&lt;/span>()&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;roaming the earch...&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="函数">&lt;a href="#%e5%87%bd%e6%95%b0" class="header-anchor">&lt;/a>函数
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//可选参数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">buildName1&lt;/span>(&lt;span style="color:#a6e22e">firstName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>, &lt;span style="color:#a6e22e">lastName?&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">lastName&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">firstName&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">lastName&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">firstName&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//默认参数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">buildName2&lt;/span>(&lt;span style="color:#a6e22e">firstName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>, &lt;span style="color:#a6e22e">lastName&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Smith&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">lastName&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">firstName&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">lastName&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">firstName&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//收集参数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">buildName3&lt;/span>(&lt;span style="color:#a6e22e">firstName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>, ...&lt;span style="color:#a6e22e">restOfName&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>[]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">firstName&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">restOfName&lt;/span>.&lt;span style="color:#a6e22e">join&lt;/span>(&lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//函数重载
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">getInfo&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>: &lt;span style="color:#66d9ef">string&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">getInfo&lt;/span>(&lt;span style="color:#a6e22e">age&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">getInfo&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>: &lt;span style="color:#66d9ef">any&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#a6e22e">str&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;string&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;名字:&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">str&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#a6e22e">str&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;number&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;年龄&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">str&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="泛型">&lt;a href="#%e6%b3%9b%e5%9e%8b" class="header-anchor">&lt;/a>泛型
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">createArray&lt;/span>&amp;lt;&lt;span style="color:#f92672">T&lt;/span>&amp;gt;(&lt;span style="color:#a6e22e">value&lt;/span>: &lt;span style="color:#66d9ef">T&lt;/span>, &lt;span style="color:#a6e22e">length&lt;/span>: &lt;span style="color:#66d9ef">number&lt;/span>)&lt;span style="color:#f92672">:&lt;/span> Array&amp;lt;&lt;span style="color:#f92672">T&lt;/span>&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>: &lt;span style="color:#66d9ef">T&lt;/span>[] &lt;span style="color:#f92672">=&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">length&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">value&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">createArray&lt;/span>([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>], &lt;span style="color:#ae81ff">3&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">GenericNumber&lt;/span>&amp;lt;&lt;span style="color:#f92672">T&lt;/span>&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">zeroValue&lt;/span>: &lt;span style="color:#66d9ef">T&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">add&lt;/span>&lt;span style="color:#f92672">:&lt;/span> (&lt;span style="color:#a6e22e">x&lt;/span>: &lt;span style="color:#66d9ef">T&lt;/span>, &lt;span style="color:#a6e22e">y&lt;/span>: &lt;span style="color:#66d9ef">T&lt;/span>) &lt;span style="color:#f92672">=&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">T&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">myGenericNumber&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">GenericNumber&lt;/span>&amp;lt;&lt;span style="color:#f92672">number&lt;/span>&amp;gt;();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">myGenericNumber&lt;/span>.&lt;span style="color:#a6e22e">zeroValue&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">myGenericNumber&lt;/span>.&lt;span style="color:#a6e22e">add&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">x&lt;/span>, &lt;span style="color:#a6e22e">y&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">y&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>阿里云OSS自动上传部署静态网站</title><link>https://kizx.github.io/post/%E9%98%BF%E9%87%8C%E4%BA%91oss%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E9%83%A8%E7%BD%B2%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/</link><pubDate>Sat, 29 May 2021 13:44:00 +0000</pubDate><guid>https://kizx.github.io/post/%E9%98%BF%E9%87%8C%E4%BA%91oss%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E9%83%A8%E7%BD%B2%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/</guid><description>&lt;h2 id="准备">&lt;a href="#%e5%87%86%e5%a4%87" class="header-anchor">&lt;/a>准备
&lt;/h2>&lt;p>现要利用阿里云OSS部署一个静态网页，通过本地编译生成静态网页后实现自动上传更新部署。&lt;/p>
&lt;ol>
&lt;li>首先开通阿里OSS服务，然后新建一个存储桶，权限设为公共可读，地域选择香港，因为国内域名需备案。&lt;/li>
&lt;li>去存储桶基础设置-&amp;gt;静态页面设置首页为index.html；然后去传输管理-&amp;gt;绑定域名，最后去DNS设置cname，也可以自行配置CDN加速。&lt;/li>
&lt;li>然后去阿里云控制台新建一个RAM访问控制用户，记住accessKeyId和accessKeySecret，然后为该用户添加OSS权限。&lt;/li>
&lt;/ol>
&lt;h2 id="本地上传代码">&lt;a href="#%e6%9c%ac%e5%9c%b0%e4%b8%8a%e4%bc%a0%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>本地上传代码
&lt;/h2>&lt;p>本地安装&lt;code>npm i ali-oss -D&lt;/code>，我们要实现将本地dist目录下所有的文件原封不动的上传至OSS上，为了保持OSS文件清洁，上传前最好先清空OSS，最终代码如下。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">OSS&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ali-oss&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">path&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">fs&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;fs&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">client&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">OSS&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">region&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;oss-cn-hongkong&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">accessKeyId&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;xxxxxxxxxxxx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">accessKeySecret&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;xxxxxxxxxxxx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">bucket&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;xxxxxx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">list&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">client&lt;/span>.&lt;span style="color:#a6e22e">list&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">objects&lt;/span> &lt;span style="color:#f92672">||&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">file_list&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">map&lt;/span>(&lt;span style="color:#a6e22e">i&lt;/span> =&amp;gt; &lt;span style="color:#a6e22e">i&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">file_list&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">catch&lt;/span> (&lt;span style="color:#a6e22e">err&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">err&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">deleteMulti&lt;/span>(&lt;span style="color:#a6e22e">filelist&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">client&lt;/span>.&lt;span style="color:#a6e22e">deleteMulti&lt;/span>(&lt;span style="color:#a6e22e">filelist&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">verbose&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;deleted:\n&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">deleted&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">catch&lt;/span> (&lt;span style="color:#a6e22e">e&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">e&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">put&lt;/span>(&lt;span style="color:#a6e22e">filename&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">client&lt;/span>.&lt;span style="color:#a6e22e">put&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">filename&lt;/span>.&lt;span style="color:#a6e22e">slice&lt;/span>(&lt;span style="color:#ae81ff">5&lt;/span>).&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#e6db74">/\\/g&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;/&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">path&lt;/span>.&lt;span style="color:#a6e22e">normalize&lt;/span>(&lt;span style="color:#a6e22e">filename&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;upload: &amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">catch&lt;/span> (&lt;span style="color:#a6e22e">e&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">e&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">getAllfiles&lt;/span>(&lt;span style="color:#a6e22e">dir&lt;/span>, &lt;span style="color:#a6e22e">filelist&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">files&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">fs&lt;/span>.&lt;span style="color:#a6e22e">readdirSync&lt;/span>(&lt;span style="color:#a6e22e">dir&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">files&lt;/span>.&lt;span style="color:#a6e22e">forEach&lt;/span>(&lt;span style="color:#a6e22e">file&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">filepath&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">path&lt;/span>.&lt;span style="color:#a6e22e">join&lt;/span>(&lt;span style="color:#a6e22e">dir&lt;/span>, &lt;span style="color:#a6e22e">file&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">stat&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">fs&lt;/span>.&lt;span style="color:#a6e22e">statSync&lt;/span>(&lt;span style="color:#a6e22e">filepath&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">stat&lt;/span>.&lt;span style="color:#a6e22e">isFile&lt;/span>()) &lt;span style="color:#a6e22e">filelist&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#a6e22e">filepath&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">stat&lt;/span>.&lt;span style="color:#a6e22e">isDirectory&lt;/span>()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">filelist&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">filelist&lt;/span>.&lt;span style="color:#a6e22e">concat&lt;/span>(&lt;span style="color:#a6e22e">getAllfiles&lt;/span>(&lt;span style="color:#a6e22e">filepath&lt;/span>, []));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">filelist&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">file_list&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">list&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;quire result:\n&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">file_list&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">file_list&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">deleteMulti&lt;/span>(&lt;span style="color:#a6e22e">file_list&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">files&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">getAllfiles&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;./dist&amp;#34;&lt;/span>, []);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">files&lt;/span>.&lt;span style="color:#a6e22e">forEach&lt;/span>(&lt;span style="color:#a6e22e">file&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">put&lt;/span>(&lt;span style="color:#a6e22e">file&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">main&lt;/span>();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行结果
&lt;img src="https://www.2bboy.com/usr/uploads/2021/05/2576308873.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://help.aliyun.com/document_detail/32068.html?spm=a2c4g.11186623.6.1058.42b92a220SHC2F" target="_blank" rel="noopener"
>https://help.aliyun.com/document_detail/32068.html?spm=a2c4g.11186623.6.1058.42b92a220SHC2F&lt;/a>
&lt;a class="link" href="https://help.aliyun.com/document_detail/39630.html?spm=a2c4g.11186623.6.666.1b263331Q5jiQY" target="_blank" rel="noopener"
>https://help.aliyun.com/document_detail/39630.html?spm=a2c4g.11186623.6.666.1b263331Q5jiQY&lt;/a>&lt;/p></description></item><item><title>gulp入门</title><link>https://kizx.github.io/post/gulp%E5%85%A5%E9%97%A8/</link><pubDate>Fri, 28 May 2021 12:30:00 +0000</pubDate><guid>https://kizx.github.io/post/gulp%E5%85%A5%E9%97%A8/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>// 全局安装以便可以命令行调用gulp命令
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm install -g gulp-cli
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm init -y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm i gulp -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="gulpfilejs">&lt;a href="#gulpfilejs" class="header-anchor">&lt;/a>gulpfile.js
&lt;/h2>&lt;ul>
&lt;li>旧task写法&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">imagemin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-imagemin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">uglify&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-uglify&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">sass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-sass&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">concat&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-concat&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> { &lt;span style="color:#a6e22e">series&lt;/span> } &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 复制文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.html&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 压缩图片 得用cnpm安装
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;img&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.{jpg,png,gif}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">imagemin&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/imgs&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 压缩合并js
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;js&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.js&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">concat&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;index.js&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">uglify&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/js&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// sass处理
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;css&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.scss&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">sass&lt;/span>().&lt;span style="color:#a6e22e">on&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;error&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">sass&lt;/span>.&lt;span style="color:#a6e22e">logError&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/css&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 监听文件变化
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;watch&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">watch&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.js&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;js&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">watch&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.html&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 组合任务
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">task&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;default&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;img&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;js&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>推荐写法&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">imagemin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-imagemin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">uglify&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-uglify&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">sass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-sass&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">concat&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-concat&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">babel&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp-babel&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;gulp&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">del&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;del&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 复制文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">html&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.html&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 压缩图片 得用cnpm安装
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">img&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.{jpg,png,gif}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">imagemin&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/imgs&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 压缩合并js
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">js&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.js&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">concat&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;index.js&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">babel&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">uglify&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/js&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// sass处理
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">css&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">src&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.scss&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">sass&lt;/span>().&lt;span style="color:#a6e22e">on&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;error&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">sass&lt;/span>.&lt;span style="color:#a6e22e">logError&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">pipe&lt;/span>(&lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">dest&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/css&amp;#34;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 清空输出
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">clean&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">del&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dist/**/*&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 监听文件变化
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">watch&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">watch&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.js&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#a6e22e">js&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">watch&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;src/*.html&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#a6e22e">html&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 组合任务
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">exports&lt;/span>.&lt;span style="color:#66d9ef">default&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">gulp&lt;/span>.&lt;span style="color:#a6e22e">series&lt;/span>(&lt;span style="color:#a6e22e">clean&lt;/span>, &lt;span style="color:#a6e22e">html&lt;/span>, &lt;span style="color:#a6e22e">css&lt;/span>, &lt;span style="color:#a6e22e">js&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">exports&lt;/span>.&lt;span style="color:#a6e22e">watch&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">watch&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">exports&lt;/span>.&lt;span style="color:#a6e22e">clean&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">clean&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">exports&lt;/span>.&lt;span style="color:#a6e22e">img&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">img&lt;/span>; &lt;span style="color:#75715e">//测试时这个插件有问题
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>启动&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>//编译
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gulp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>//监听
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gulp watch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="其他">&lt;a href="#%e5%85%b6%e4%bb%96" class="header-anchor">&lt;/a>其他
&lt;/h2>&lt;ul>
&lt;li>新版sass需要安装&lt;code>npm i -D sass gulp-sass&lt;/code>并如下引用&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">sass&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;gulp-sass&amp;#39;&lt;/span>)(&lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;sass&amp;#39;&lt;/span>));
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.gulpjs.com.cn/docs/getting-started/quick-start/" target="_blank" rel="noopener"
>https://www.gulpjs.com.cn/docs/getting-started/quick-start/&lt;/a>&lt;/p></description></item><item><title>webpack5基础</title><link>https://kizx.github.io/post/webpack5%E5%9F%BA%E7%A1%80/</link><pubDate>Thu, 27 May 2021 10:25:00 +0000</pubDate><guid>https://kizx.github.io/post/webpack5%E5%9F%BA%E7%A1%80/</guid><description>&lt;p>下面均已 webpack5 为例&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm init -y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm install webpack webpack-cli --save-dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="运行命令">&lt;a href="#%e8%bf%90%e8%a1%8c%e5%91%bd%e4%bb%a4" class="header-anchor">&lt;/a>运行命令
&lt;/h2>&lt;p>可以使用 webpack 初始化命令快速生成一个项目&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npx webpack-cli init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下是自动生成的&lt;code>webpack.config.js&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Generated using webpack-cli https://github.com/webpack/webpack-cli
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">path&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html-webpack-plugin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;mini-css-extract-plugin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">isProduction&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">env&lt;/span>.&lt;span style="color:#a6e22e">NODE_ENV&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;production&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">stylesHandler&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">isProduction&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span>.&lt;span style="color:#a6e22e">loader&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;style-loader&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">config&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">entry&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./src/index.js&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">output&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">path&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">path&lt;/span>.&lt;span style="color:#a6e22e">resolve&lt;/span>(&lt;span style="color:#a6e22e">__dirname&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;dist&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">devServer&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">open&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">host&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;localhost&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">template&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;index.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Add your plugins here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// Learn more about plugins from https://webpack.js.org/configuration/plugins/
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">module&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">rules&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.(js|jsx)$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">loader&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;babel-loader&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.css$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">use&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [&lt;span style="color:#a6e22e">stylesHandler&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css-loader&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.s[ac]ss$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">use&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [&lt;span style="color:#a6e22e">stylesHandler&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css-loader&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;sass-loader&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;asset&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Add your rules for custom modules here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// Learn more about loaders from https://webpack.js.org/loaders/
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">module&lt;/span>.&lt;span style="color:#a6e22e">exports&lt;/span> &lt;span style="color:#f92672">=&lt;/span> () =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">isProduction&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">config&lt;/span>.&lt;span style="color:#a6e22e">mode&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;production&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">config&lt;/span>.&lt;span style="color:#a6e22e">plugins&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">config&lt;/span>.&lt;span style="color:#a6e22e">mode&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;development&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">config&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也可以手动新建一个 webpack.config.js 文件手动配置
可以配置 npm run script 命令运行 webpack，也可以手动 &lt;code>npx webpack xxx&lt;/code> 运行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;test&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;echo \&amp;#34;Error: no test specified\&amp;#34; &amp;amp;&amp;amp; exit 1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;build&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webpack --mode=production --node-env=production&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;build:dev&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webpack --mode=development&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;build:prod&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webpack --mode=production --node-env=production&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;watch&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webpack --watch&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;serve&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webpack serve&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="入口">&lt;a href="#%e5%85%a5%e5%8f%a3" class="header-anchor">&lt;/a>入口
&lt;/h2>&lt;p>入口可以是一个文件或多个 js 文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">module&lt;/span>.&lt;span style="color:#a6e22e">exports&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">entry&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">home&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./home.js&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">about&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./about.js&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">contact&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./contact.js&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a class="link" href="https://webpack.docschina.org/configuration/entry-context/#entry" target="_blank" rel="noopener"
>https://webpack.docschina.org/configuration/entry-context/#entry&lt;/a>&lt;/p>
&lt;h2 id="输出">&lt;a href="#%e8%be%93%e5%87%ba" class="header-anchor">&lt;/a>输出
&lt;/h2>&lt;p>设置输出的文件，设置&lt;code>clean: true&lt;/code>输出前先清空输出目录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">output:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">filename:&lt;/span> &lt;span style="color:#f92672">&amp;#34;[name].[contenthash].js&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">path:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">path.resolve(__dirname,&lt;/span> &lt;span style="color:#f92672">&amp;#34;dist&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">)&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">clean:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">true,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以用多种方式设置输出文件的名称
&lt;a class="link" href="https://webpack.docschina.org/configuration/output/#outputfilename" target="_blank" rel="noopener"
>https://webpack.docschina.org/configuration/output/#outputfilename&lt;/a>&lt;/p>
&lt;h2 id="加载-html-模板">&lt;a href="#%e5%8a%a0%e8%bd%bd-html-%e6%a8%a1%e6%9d%bf" class="header-anchor">&lt;/a>加载 html 模板
&lt;/h2>&lt;p>使用&lt;code>html-webpack-plugin&lt;/code>插件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html-webpack-plugin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">template&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./src/index.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">filename&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;index.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>];
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="加载-css">&lt;a href="#%e5%8a%a0%e8%bd%bd-css" class="header-anchor">&lt;/a>加载 CSS
&lt;/h2>&lt;p>需要先 npm 安装相应包，&lt;code>sass-loader&lt;/code>将 sass 文件转换为 css 文件，&lt;code>css-loader&lt;/code>加载 css 文件，&lt;code>style-loader&lt;/code>将 css 文件通过 js 的方式将 css 加载到页面中。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">module&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">rules&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.s[ac]ss$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">use&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;style-loader&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css-loader&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;sass-loader&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>},
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果要分离 css 文件，可以使用&lt;code>MiniCssExtractPlugin&lt;/code>，会自动 link 到 HtmlWebpackPlugin 中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;html-webpack-plugin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;mini-css-extract-plugin&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">test&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">/\.s[ac]ss$/i&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">use&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [&lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span>.&lt;span style="color:#a6e22e">loader&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css-loader&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;sass-loader&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">//...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">HtmlWebpackPlugin&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">template&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./src/index.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">filename&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;index.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">MiniCssExtractPlugin&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">filename&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;style.min.css&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>],
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="加载静态文件">&lt;a href="#%e5%8a%a0%e8%bd%bd%e9%9d%99%e6%80%81%e6%96%87%e4%bb%b6" class="header-anchor">&lt;/a>加载静态文件
&lt;/h2>&lt;p>webpack5 使用&lt;code>asset-modules&lt;/code>模块来管理静态文件
&lt;a class="link" href="https://webpack.docschina.org/guides/asset-modules/" target="_blank" rel="noopener"
>https://webpack.docschina.org/guides/asset-modules/&lt;/a>&lt;/p>
&lt;h2 id="环境分离">&lt;a href="#%e7%8e%af%e5%a2%83%e5%88%86%e7%a6%bb" class="header-anchor">&lt;/a>环境分离
&lt;/h2>&lt;p>使用&lt;code>webpack-merge&lt;/code>模块实现生产开发环境分开设置
&lt;a class="link" href="https://webpack.docschina.org/guides/production/" target="_blank" rel="noopener"
>https://webpack.docschina.org/guides/production/&lt;/a>&lt;/p>
&lt;h2 id="开发环境设置">&lt;a href="#%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>开发环境设置
&lt;/h2>&lt;p>设置 devtool 使用 source map &lt;a class="link" href="https://webpack.docschina.org/configuration/devtool/" target="_blank" rel="noopener"
>https://webpack.docschina.org/configuration/devtool/&lt;/a>
设置热更新&lt;/p>
&lt;pre tabindex="0">&lt;code>devServer: {
contentBase: &amp;#34;./dist&amp;#34;,
hot: true,
},
&lt;/code>&lt;/pre>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://webpack.docschina.org/guides/getting-started/" target="_blank" rel="noopener"
>https://webpack.docschina.org/guides/getting-started/&lt;/a>
&lt;a class="link" href="https://www.lookroot.cn/course/webpack/" target="_blank" rel="noopener"
>https://www.lookroot.cn/course/webpack/&lt;/a>
&lt;a class="link" href="https://szxio.gitee.io/hexoblog/Tool/webpack/" target="_blank" rel="noopener"
>https://szxio.gitee.io/hexoblog/Tool/webpack/&lt;/a>&lt;/p></description></item><item><title>网页中添加live2d看板娘</title><link>https://kizx.github.io/post/%E7%BD%91%E9%A1%B5%E4%B8%AD%E6%B7%BB%E5%8A%A0live2d%E7%9C%8B%E6%9D%BF%E5%A8%98/</link><pubDate>Wed, 19 May 2021 10:48:00 +0000</pubDate><guid>https://kizx.github.io/post/%E7%BD%91%E9%A1%B5%E4%B8%AD%E6%B7%BB%E5%8A%A0live2d%E7%9C%8B%E6%9D%BF%E5%A8%98/</guid><description>&lt;p>复现了大佬的操作，这里总结一下。
大佬源文章：https://nocilol.me/archives/lab/add-dynamic-poster-girl-with-live2d-to-your-blog-02/&lt;/p>
&lt;h2 id="步骤">&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor">&lt;/a>步骤
&lt;/h2>&lt;h3 id="下载live2djshttpsgithubcomjourney-adlive2d_srcreleases">&lt;a href="#%e4%b8%8b%e8%bd%bdlive2djshttpsgithubcomjourney-adlive2d_srcreleases" class="header-anchor">&lt;/a>下载live2d.js：https://github.com/journey-ad/live2d_src/releases
&lt;/h3>&lt;h3 id="新建waifu-tipsjs">&lt;a href="#%e6%96%b0%e5%bb%bawaifu-tipsjs" class="header-anchor">&lt;/a>新建&lt;code>waifu-tips.js&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">render&lt;/span>(&lt;span style="color:#a6e22e">template&lt;/span>, &lt;span style="color:#a6e22e">context&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">tokenReg&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/(\\)?\{([^\{\}\\]+)(\\)?\}/g&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">template&lt;/span>.&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#a6e22e">tokenReg&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">word&lt;/span>, &lt;span style="color:#a6e22e">slash1&lt;/span>, &lt;span style="color:#a6e22e">token&lt;/span>, &lt;span style="color:#a6e22e">slash2&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">slash1&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#a6e22e">slash2&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">word&lt;/span>.&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;\\&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">variables&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">token&lt;/span>.&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#e6db74">/\s/g&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">currentObject&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span>, &lt;span style="color:#a6e22e">length&lt;/span>, &lt;span style="color:#a6e22e">variable&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">variables&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">length&lt;/span>; &lt;span style="color:#f92672">++&lt;/span>&lt;span style="color:#a6e22e">i&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">variable&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">variables&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">currentObject&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">currentObject&lt;/span>[&lt;span style="color:#a6e22e">variable&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">currentObject&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#66d9ef">undefined&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#a6e22e">currentObject&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">currentObject&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>String.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">render&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">context&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">render&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">context&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">re&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/x/&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">re&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">re&lt;/span>.&lt;span style="color:#a6e22e">toString&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;哈哈，你打开了控制台，是想要看看我的秘密吗？&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">5000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">$&lt;/span>(document).&lt;span style="color:#a6e22e">on&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;copy&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;你都复制了些什么呀，转载要记得加上出处哦&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">5000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">$&lt;/span>.&lt;span style="color:#a6e22e">ajax&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">cache&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;path/to/waifu-tips.json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">dataType&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">success&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">result&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>.&lt;span style="color:#a6e22e">each&lt;/span>(&lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">mouseover&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">index&lt;/span>, &lt;span style="color:#a6e22e">tips&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(document).&lt;span style="color:#a6e22e">on&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;mouseover&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">selector&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (Array.&lt;span style="color:#a6e22e">isArray&lt;/span>(&lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>[
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">render&lt;/span>({ &lt;span style="color:#a6e22e">text&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>).&lt;span style="color:#a6e22e">text&lt;/span>() });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>, &lt;span style="color:#ae81ff">3000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>.&lt;span style="color:#a6e22e">each&lt;/span>(&lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">click&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">index&lt;/span>, &lt;span style="color:#a6e22e">tips&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(document).&lt;span style="color:#a6e22e">on&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;click&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">selector&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (Array.&lt;span style="color:#a6e22e">isArray&lt;/span>(&lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>[
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">tips&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">render&lt;/span>({ &lt;span style="color:#a6e22e">text&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>).&lt;span style="color:#a6e22e">text&lt;/span>() });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>, &lt;span style="color:#ae81ff">3000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (document.&lt;span style="color:#a6e22e">referrer&lt;/span> &lt;span style="color:#f92672">!==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">referrer&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">createElement&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">referrer&lt;/span>.&lt;span style="color:#a6e22e">href&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">referrer&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;Hello! 来自 &amp;lt;span style=&amp;#34;color:#0099cc;&amp;#34;&amp;gt;&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">referrer&lt;/span>.&lt;span style="color:#a6e22e">hostname&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;lt;/span&amp;gt; 的朋友&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">domain&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">referrer&lt;/span>.&lt;span style="color:#a6e22e">hostname&lt;/span>.&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.&amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">domain&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;baidu&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;Hello! 来自 百度搜索 的朋友&amp;lt;br&amp;gt;你是搜索 &amp;lt;span style=&amp;#34;color:#0099cc;&amp;#34;&amp;gt;&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">referrer&lt;/span>.&lt;span style="color:#a6e22e">search&lt;/span>.&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;&amp;amp;wd=&amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">1&lt;/span>].&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;&amp;amp;&amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;lt;/span&amp;gt; 找到的我吗？&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">domain&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;so&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;Hello! 来自 360搜索 的朋友&amp;lt;br&amp;gt;你是搜索 &amp;lt;span style=&amp;#34;color:#0099cc;&amp;#34;&amp;gt;&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">referrer&lt;/span>.&lt;span style="color:#a6e22e">search&lt;/span>.&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;&amp;amp;q=&amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">1&lt;/span>].&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;&amp;amp;&amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;lt;/span&amp;gt; 找到的我吗？&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">domain&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;google&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;Hello! 来自 谷歌搜索 的朋友&amp;lt;br&amp;gt;欢迎阅读&amp;lt;span style=&amp;#34;color:#0099cc;&amp;#34;&amp;gt;『&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document.&lt;span style="color:#a6e22e">title&lt;/span>.&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34; - &amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;』&amp;lt;/span&amp;gt;&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">href&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;https://imjad.cn/&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//如果是主页
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Date().&lt;span style="color:#a6e22e">getHours&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">23&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;你是夜猫子呀？这么晚还不睡觉，明天起的来嘛&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;早上好！一日之计在于晨，美好的一天就要开始了&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">11&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;上午好！工作顺利嘛，不要久坐，多起来走动走动哦！&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">11&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">14&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;中午了，工作了一个上午，现在是午餐时间！&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">14&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">17&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;午后很容易犯困呢，今天的运动目标完成了吗？&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">17&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">19&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;傍晚了！窗外夕阳的景色很美丽呢，最美不过夕阳红~&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">19&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">21&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;晚上好，今天过得怎么样？&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">21&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">now&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">23&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;已经这么晚了呀，早点休息吧，晚安~&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;嗨~ 快来逗我玩吧！&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;欢迎阅读&amp;lt;span style=&amp;#34;color:#0099cc;&amp;#34;&amp;gt;『&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document.&lt;span style="color:#a6e22e">title&lt;/span>.&lt;span style="color:#a6e22e">split&lt;/span>(&lt;span style="color:#e6db74">&amp;#34; - &amp;#34;&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;』&amp;lt;/span&amp;gt;&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>, &lt;span style="color:#ae81ff">6000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>window.&lt;span style="color:#a6e22e">setInterval&lt;/span>(&lt;span style="color:#a6e22e">showHitokoto&lt;/span>, &lt;span style="color:#ae81ff">30000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">showHitokoto&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>.&lt;span style="color:#a6e22e">getJSON&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://api.imjad.cn/hitokoto/?cat=&amp;amp;charset=utf-8&amp;amp;length=28&amp;amp;encode=json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">result&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#a6e22e">result&lt;/span>.&lt;span style="color:#a6e22e">hitokoto&lt;/span>, &lt;span style="color:#ae81ff">5000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">showMessage&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>, &lt;span style="color:#a6e22e">timeout&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (Array.&lt;span style="color:#a6e22e">isArray&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span>[Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.waifu-tips&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">stop&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.waifu-tips&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">html&lt;/span>(&lt;span style="color:#a6e22e">text&lt;/span>).&lt;span style="color:#a6e22e">fadeTo&lt;/span>(&lt;span style="color:#ae81ff">200&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) &lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">5000&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">hideMessage&lt;/span>(&lt;span style="color:#a6e22e">timeout&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">hideMessage&lt;/span>(&lt;span style="color:#a6e22e">timeout&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.waifu-tips&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">stop&lt;/span>().&lt;span style="color:#a6e22e">css&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;opacity&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) &lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">5000&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;.waifu-tips&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">delay&lt;/span>(&lt;span style="color:#a6e22e">timeout&lt;/span>).&lt;span style="color:#a6e22e">fadeTo&lt;/span>(&lt;span style="color:#ae81ff">200&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="新建waifu-tipsjson可以设置看板娘交互文字">&lt;a href="#%e6%96%b0%e5%bb%bawaifu-tipsjson%e5%8f%af%e4%bb%a5%e8%ae%be%e7%bd%ae%e7%9c%8b%e6%9d%bf%e5%a8%98%e4%ba%a4%e4%ba%92%e6%96%87%e5%ad%97" class="header-anchor">&lt;/a>新建&lt;code>waifu-tips.json&lt;/code>，可以设置看板娘交互文字
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mouseover&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.container a[href^=&amp;#39;http&amp;#39;]&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;要看看 &amp;lt;span style=\&amp;#34;color:#0099cc;\&amp;#34;&amp;gt;{text}&amp;lt;/span&amp;gt; 么？&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.fui-home&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;点击前往首页，想回到上一页可以使用浏览器的后退功能哦&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#tor_show&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;翻页比较麻烦吗，点击可以显示这篇文章的目录呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#comment_go,.fui-chat&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;想要去评论些什么吗？&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#night_mode&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;深夜时要爱护眼睛呀&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#qrcode&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;手机扫一下就能继续看，很方便呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.comment_reply&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;要吐槽些什么呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#back-to-top&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;回到开始的地方吧&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#author&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;该怎么称呼你呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#mail&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;留下你的邮箱，不然就是无头像人士了&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#url&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;你的家在哪里呢，好让我去参观参观&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#textarea&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;认真填写哦，垃圾评论是禁止事项&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.OwO-logo&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;要插入一个表情吗&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;#csubmit&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;要提交了吗，首次评论需要审核，请耐心等待~&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.ImageBox&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;点击图片可以放大呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;input[name=s]&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;找不到想看的内容？搜索看看吧&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.previous&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;去上一页看看吧&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.next&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;去下一页看看吧&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.dropdown-toggle&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;这里是菜单&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c-player a.play-icon&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;想要听点音乐吗&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c-player div.time&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;在这里可以调整&amp;lt;span style=\&amp;#34;color:#0099cc;\&amp;#34;&amp;gt;播放进度&amp;lt;/span&amp;gt;呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c-player div.volume&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;在这里可以调整&amp;lt;span style=\&amp;#34;color:#0099cc;\&amp;#34;&amp;gt;音量&amp;lt;/span&amp;gt;呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c-player div.list-button&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;&amp;lt;span style=\&amp;#34;color:#0099cc;\&amp;#34;&amp;gt;播放列表&amp;lt;/span&amp;gt;里都有什么呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c-player div.lyric-button&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;有&amp;lt;span style=\&amp;#34;color:#0099cc;\&amp;#34;&amp;gt;歌词&amp;lt;/span&amp;gt;的话就能跟着一起唱呢&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.waifu #live2d&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;干嘛呢你，快把手拿开&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;鼠…鼠标放错地方了！&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;click&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.waifu #live2d&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;是…是不小心碰到了吧&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;萝莉控是什么呀&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;你看到我的小熊了吗&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;再摸的话我可要报警了！?●﹏●?&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;110吗，这里有个变态一直在摸我(ó﹏ò?)&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="新建stylecss">&lt;a href="#%e6%96%b0%e5%bb%bastylecss" class="header-anchor">&lt;/a>新建&lt;code>style.css&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">waifu&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">fixed&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">bottom&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">left&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">z-index&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">font-size&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transition&lt;/span>: &lt;span style="color:#66d9ef">all&lt;/span> &lt;span style="color:#ae81ff">0.3&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span> &lt;span style="color:#66d9ef">ease-in-out&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-webkit-&lt;/span>&lt;span style="color:#66d9ef">transform&lt;/span>: translateY(&lt;span style="color:#ae81ff">3&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translateY(&lt;span style="color:#ae81ff">3&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">waifu&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-webkit-&lt;/span>&lt;span style="color:#66d9ef">transform&lt;/span>: translateY(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translateY(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">media&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">max-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">768px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">waifu&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">none&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">waifu-tips&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">opacity&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">250&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">70&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#ae81ff">-20&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">20&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">padding&lt;/span>: &lt;span style="color:#ae81ff">5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#66d9ef">solid&lt;/span> rgba(&lt;span style="color:#ae81ff">224&lt;/span>, &lt;span style="color:#ae81ff">186&lt;/span>, &lt;span style="color:#ae81ff">140&lt;/span>, &lt;span style="color:#ae81ff">0.62&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-radius&lt;/span>: &lt;span style="color:#ae81ff">12&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: rgba(&lt;span style="color:#ae81ff">236&lt;/span>, &lt;span style="color:#ae81ff">217&lt;/span>, &lt;span style="color:#ae81ff">188&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">3&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">15&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> rgba(&lt;span style="color:#ae81ff">191&lt;/span>, &lt;span style="color:#ae81ff">158&lt;/span>, &lt;span style="color:#ae81ff">118&lt;/span>, &lt;span style="color:#ae81ff">0.2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">font-size&lt;/span>: &lt;span style="color:#ae81ff">12&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">text-overflow&lt;/span>: &lt;span style="color:#66d9ef">ellipsis&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">overflow&lt;/span>: &lt;span style="color:#66d9ef">hidden&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">absolute&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation-delay&lt;/span>: &lt;span style="color:#ae81ff">5&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation-duration&lt;/span>: &lt;span style="color:#ae81ff">50&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation-iteration-count&lt;/span>: &lt;span style="color:#66d9ef">infinite&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation-name&lt;/span>: shake;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation-timing-function&lt;/span>: &lt;span style="color:#66d9ef">ease-in-out&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">waifu&lt;/span> #live2d {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">keyframes&lt;/span> &lt;span style="color:#f92672">shake&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">2&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">4&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">6&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">8&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">10&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">12&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">14&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">16&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">18&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">20&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">22&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">24&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">26&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">28&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">30&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">32&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">34&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">36&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">38&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">40&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">42&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">44&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">46&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">48&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">50&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">52&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">54&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">56&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">58&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">60&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">62&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">64&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">66&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">68&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">70&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">72&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">74&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">76&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">78&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">80&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">82&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">84&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">86&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">88&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">90&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">92&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">1.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">94&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">96&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">2.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">98&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>, &lt;span style="color:#ae81ff">-1.5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>) rotate(&lt;span style="color:#ae81ff">-0.5&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">0&lt;/span>&lt;span style="color:#f92672">%,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">100&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>) rotate(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="网页中插入以下内容">&lt;a href="#%e7%bd%91%e9%a1%b5%e4%b8%ad%e6%8f%92%e5%85%a5%e4%bb%a5%e4%b8%8b%e5%86%85%e5%ae%b9" class="header-anchor">&lt;/a>网页中插入以下内容
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">link&lt;/span> &lt;span style="color:#a6e22e">rel&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;style.css&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;waifu&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;waifu-tips&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">canvas&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;live2d&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">width&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;280&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">height&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;250&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;live2d&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">canvas&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;//cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">async&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;waifu-tips.js&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;live2d.js&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text/javascript&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 这里填写模型的model.json的地址
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">loadlive2d&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;live2d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;models/snow_miku/model.json&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="其中model需要自己制造或者下载大佬分享的">&lt;a href="#%e5%85%b6%e4%b8%admodel%e9%9c%80%e8%a6%81%e8%87%aa%e5%b7%b1%e5%88%b6%e9%80%a0%e6%88%96%e8%80%85%e4%b8%8b%e8%bd%bd%e5%a4%a7%e4%bd%ac%e5%88%86%e4%ba%ab%e7%9a%84" class="header-anchor">&lt;/a>其中model需要自己制造或者下载大佬分享的
&lt;/h3>&lt;p>这个网站有一些分享的模型：https://mx.paul.ren/&lt;/p>
&lt;h2 id="案例">&lt;a href="#%e6%a1%88%e4%be%8b" class="header-anchor">&lt;/a>案例
&lt;/h2>&lt;p>&lt;a class="link" href="https://pan.2bboy.com/home/test/live2d/" target="_blank" rel="noopener"
>https://pan.2bboy.com/home/test/live2d/&lt;/a>&lt;/p></description></item><item><title>CSS居中时内容溢出滚动显示不全的问题</title><link>https://kizx.github.io/post/css%E5%B1%85%E4%B8%AD%E6%97%B6%E5%86%85%E5%AE%B9%E6%BA%A2%E5%87%BA%E6%BB%9A%E5%8A%A8%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%85%A8%E7%9A%84%E9%97%AE%E9%A2%98/</link><pubDate>Fri, 14 May 2021 02:42:27 +0000</pubDate><guid>https://kizx.github.io/post/css%E5%B1%85%E4%B8%AD%E6%97%B6%E5%86%85%E5%AE%B9%E6%BA%A2%E5%87%BA%E6%BB%9A%E5%8A%A8%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%85%A8%E7%9A%84%E9%97%AE%E9%A2%98/</guid><description>&lt;p>当我们有如下的布局时，其中 img 是我们内容，用一个 overflow:auto 来设置一个滚动区域，当图片较长时，会发现即使滚动到顶部，图片顶部仍有部分看不到。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!DOCTYPE html&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">html&lt;/span> &lt;span style="color:#a6e22e">lang&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;zh&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">charset&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;UTF-8&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">http-equiv&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;X-UA-Compatible&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;IE=edge&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;viewport&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">title&lt;/span>&amp;gt;Document&amp;lt;/&lt;span style="color:#f92672">title&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">overflow&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">flex&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">justify-content&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">align-items&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">img&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;container&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;./static/1.jpg&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">html&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="解决方法">&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>解决方法
&lt;/h2>&lt;p>设置内容的 margin:auto 就可以滚动显示完全了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">img&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>我们换一张宽度较宽的图，并设置 height:100%，这时新的问题出现了，图片滚动到最左边，图片左边仍有部分被遮挡显示不全。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">img&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="继续解决">&lt;a href="#%e7%bb%a7%e7%bb%ad%e8%a7%a3%e5%86%b3" class="header-anchor">&lt;/a>继续解决
&lt;/h2>&lt;p>我们换一种居中布局的方式，就可是使图片左右滚动能显示全。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">overflow&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">img&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">absolute&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">top&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">right&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">bottom&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">left&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是当我们换回高度较高的图片，并设置 width:100%时，发现问题又回来了，图片顶部显示不全。
难道说说没有一种同时能满足上下滚动和左右滚动显示全的布局方式吗？&lt;/p>
&lt;h2 id="解决方案">&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="header-anchor">&lt;/a>解决方案
&lt;/h2>&lt;p>一般来说图片要么 width:100%，要么 height:100%，所以上面选一种布局方式即可，但是我写的一个页面刚好要在两种状态中进行切换，因为切换是通过 js 操作的，可以在 css 里写两个布局，然后通过 js 控制元素 class 来进行切换。
我在 flex 布局的基础上，当图片左右滚动不能显示完全时，只需要改变 flex-direction 的方向即可。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">overflow&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">flex&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">justify-content&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">align-items&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">flex-direction&lt;/span>: &lt;span style="color:#66d9ef">column&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">img&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Python调用子进程subprocess</title><link>https://kizx.github.io/post/python%E8%B0%83%E7%94%A8%E5%AD%90%E8%BF%9B%E7%A8%8Bsubprocess/</link><pubDate>Thu, 13 May 2021 03:06:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E8%B0%83%E7%94%A8%E5%AD%90%E8%BF%9B%E7%A8%8Bsubprocess/</guid><description>&lt;p>subprocess库用于在控制台中调用子进程，可以模拟控制台命令输入输出。&lt;/p>
&lt;h2 id="subprocessrun">&lt;a href="#subprocessrun" class="header-anchor">&lt;/a>subprocess.run
&lt;/h2>&lt;p>如果只是简单调用运行第三方程序的话，使用subprocess.run最为简单。
下面以调用&lt;code>ping&lt;/code>命令为例&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 直接在控制台输出 但由于编码问题中文为乱码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>subprocess&lt;span style="color:#f92672">.&lt;/span>run([&lt;span style="color:#e6db74">&amp;#39;ping&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;baidu.com&amp;#39;&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>subprocess&lt;span style="color:#f92672">.&lt;/span>run(&lt;span style="color:#e6db74">&amp;#39;ping baidu.com&amp;#39;&lt;/span>, shell&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过stdout来获取输出&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p &lt;span style="color:#f92672">=&lt;/span> subprocess&lt;span style="color:#f92672">.&lt;/span>run([&lt;span style="color:#e6db74">&amp;#39;ping&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;baidu.com&amp;#39;&lt;/span>], stdout&lt;span style="color:#f92672">=&lt;/span>subprocess&lt;span style="color:#f92672">.&lt;/span>PIPE)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(p&lt;span style="color:#f92672">.&lt;/span>stdout&lt;span style="color:#f92672">.&lt;/span>decode(&lt;span style="color:#e6db74">&amp;#39;gbk&amp;#39;&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="subprocesspopen">&lt;a href="#subprocesspopen" class="header-anchor">&lt;/a>subprocess.Popen
&lt;/h2>&lt;p>下面以下面这个相加函数为例，利用subprocess.Popen来调用它&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env python&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>n &lt;span style="color:#f92672">=&lt;/span> int(input())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nums &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">while&lt;/span> n &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a, b &lt;span style="color:#f92672">=&lt;/span> list(map(int, input()&lt;span style="color:#f92672">.&lt;/span>strip()&lt;span style="color:#f92672">.&lt;/span>split()))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> nums&lt;span style="color:#f92672">.&lt;/span>append([a, b])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> a, b &lt;span style="color:#f92672">in&lt;/span> nums:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>a&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">+&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>b&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">=&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>a &lt;span style="color:#f92672">+&lt;/span> b&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仿照牛客网上测试程序的流程来进行输入输出，注意stdin的用法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">test&lt;/span>(pyfile, datafile):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p &lt;span style="color:#f92672">=&lt;/span> subprocess&lt;span style="color:#f92672">.&lt;/span>Popen([&lt;span style="color:#e6db74">&amp;#39;python.exe&amp;#39;&lt;/span>, pyfile], stdin&lt;span style="color:#f92672">=&lt;/span>subprocess&lt;span style="color:#f92672">.&lt;/span>PIPE)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(datafile) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;..........输入..........&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> line:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(line&lt;span style="color:#f92672">.&lt;/span>strip())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>stdin&lt;span style="color:#f92672">.&lt;/span>write(line&lt;span style="color:#f92672">.&lt;/span>encode())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>stdin&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;..........输出..........&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>wait(&lt;span style="color:#ae81ff">2000&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test(&lt;span style="color:#e6db74">&amp;#39;add.py&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;data.txt&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........输入..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1 2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7 8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........输出..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1+2=3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5+6=11&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7+8=15&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果有多个测试用例，可以在输入数据时用一个标志符&lt;code>#&lt;/code>进行分割&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">tests&lt;/span>(pyfile, datafile):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(datafile) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> line&lt;span style="color:#f92672">.&lt;/span>strip()&lt;span style="color:#f92672">.&lt;/span>startswith(&lt;span style="color:#e6db74">&amp;#39;#&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p &lt;span style="color:#f92672">=&lt;/span> subprocess&lt;span style="color:#f92672">.&lt;/span>Popen([&lt;span style="color:#e6db74">&amp;#39;python.exe&amp;#39;&lt;/span>, pyfile], stdin&lt;span style="color:#f92672">=&lt;/span>subprocess&lt;span style="color:#f92672">.&lt;/span>PIPE)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;..........案例[&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>n&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">]输入..........&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> line:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(line&lt;span style="color:#f92672">.&lt;/span>strip())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>stdin&lt;span style="color:#f92672">.&lt;/span>write(line&lt;span style="color:#f92672">.&lt;/span>encode())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> line&lt;span style="color:#f92672">.&lt;/span>strip()&lt;span style="color:#f92672">.&lt;/span>startswith(&lt;span style="color:#e6db74">&amp;#39;#&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>stdin&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;..........案例[&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>n&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">]输出..........&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>wait()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tests(&lt;span style="color:#e6db74">&amp;#39;add.py&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;data.txt&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........案例[1]输入..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1 2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7 8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........案例[1]输出..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1+2=3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5+6=11&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7+8=15&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........案例[2]输入..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1 2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7 8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ..........案例[2]输出..........&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1+2=3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 5+6=11&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.runoob.com/w3cnote/python3-subprocess.html" target="_blank" rel="noopener"
>https://www.runoob.com/w3cnote/python3-subprocess.html&lt;/a>
&lt;a class="link" href="https://docs.python.org/zh-cn/3/library/subprocess.html" target="_blank" rel="noopener"
>https://docs.python.org/zh-cn/3/library/subprocess.html&lt;/a>&lt;/p></description></item><item><title>CSS盒子居中的几种方法</title><link>https://kizx.github.io/post/css%E7%9B%92%E5%AD%90%E5%B1%85%E4%B8%AD%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/</link><pubDate>Thu, 13 May 2021 02:32:35 +0000</pubDate><guid>https://kizx.github.io/post/css%E7%9B%92%E5%AD%90%E5%B1%85%E4%B8%AD%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!DOCTYPE html&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">html&lt;/span> &lt;span style="color:#a6e22e">lang&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;en&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">charset&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;UTF-8&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">http-equiv&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;X-UA-Compatible&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;IE=edge&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;viewport&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">title&lt;/span>&amp;gt;Document&amp;lt;/&lt;span style="color:#f92672">title&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#66d9ef">darkorange&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">content&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#66d9ef">cyan&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">200&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">200&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;container&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;content&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">html&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="定位布局">&lt;a href="#%e5%ae%9a%e4%bd%8d%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>定位布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">content&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">absolute&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">top&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">right&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">bottom&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">left&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="定位移动布局">&lt;a href="#%e5%ae%9a%e4%bd%8d%e7%a7%bb%e5%8a%a8%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>定位+移动布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">content&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">absolute&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">top&lt;/span>: &lt;span style="color:#ae81ff">50&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">left&lt;/span>: &lt;span style="color:#ae81ff">50&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translate(&lt;span style="color:#ae81ff">-50&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>, &lt;span style="color:#ae81ff">-50&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flex-布局">&lt;a href="#flex-%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>flex 布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">flex&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">justify-content&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">align-items&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="grid-布局">&lt;a href="#grid-%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>grid 布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">grid&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">align-items&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">justify-items&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="inline-block-布局">&lt;a href="#inline-block-%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>inline-block 布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">text-align&lt;/span>: &lt;span style="color:#66d9ef">center&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">line-height&lt;/span>: &lt;span style="color:#ae81ff">500&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">content&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">inline-block&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">vertical-align&lt;/span>: &lt;span style="color:#66d9ef">middle&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="table-cell-布局">&lt;a href="#table-cell-%e5%b8%83%e5%b1%80" class="header-anchor">&lt;/a>table-cell 布局
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">table-cell&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">vertical-align&lt;/span>: &lt;span style="color:#66d9ef">middle&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">content&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin&lt;/span>: &lt;span style="color:#66d9ef">auto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>TCP/IP协议总结</title><link>https://kizx.github.io/post/tcpip%E5%8D%8F%E8%AE%AE%E6%80%BB%E7%BB%93/</link><pubDate>Sun, 25 Apr 2021 13:58:00 +0000</pubDate><guid>https://kizx.github.io/post/tcpip%E5%8D%8F%E8%AE%AE%E6%80%BB%E7%BB%93/</guid><description>&lt;p>一般将TCP/IP分为四层，OSI参考模型分为7层
&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/4107358796.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="7-应用层">&lt;a href="#7-%e5%ba%94%e7%94%a8%e5%b1%82" class="header-anchor">&lt;/a>7 应用层
&lt;/h3>&lt;ul>
&lt;li>针对每个应用程序的协议&lt;/li>
&lt;li>如电子邮件协议、远程登录协议、文件传输协议ftp、http、DNS、URI、SSH&lt;/li>
&lt;/ul>
&lt;h3 id="6-表示层">&lt;a href="#6-%e8%a1%a8%e7%a4%ba%e5%b1%82" class="header-anchor">&lt;/a>6 表示层
&lt;/h3>&lt;ul>
&lt;li>设备固有数据格式和网络标准数据格式间的转换&lt;/li>
&lt;/ul>
&lt;h3 id="5-会话层">&lt;a href="#5-%e4%bc%9a%e8%af%9d%e5%b1%82" class="header-anchor">&lt;/a>5 会话层
&lt;/h3>&lt;ul>
&lt;li>通信管理，负责建立和断开通信连接，以及数据分割等处理&lt;/li>
&lt;/ul>
&lt;h3 id="4-传输层">&lt;a href="#4-%e4%bc%a0%e8%be%93%e5%b1%82" class="header-anchor">&lt;/a>4 传输层
&lt;/h3>&lt;ul>
&lt;li>负责管理两个节点之间的数据可靠传输（确保数据可靠地传送到目标地址）&lt;/li>
&lt;li>TCP、UDP协议&lt;/li>
&lt;/ul>
&lt;h3 id="3-网络层">&lt;a href="#3-%e7%bd%91%e7%bb%9c%e5%b1%82" class="header-anchor">&lt;/a>3 网络层
&lt;/h3>&lt;ul>
&lt;li>主要负责寻址和路由选择&lt;/li>
&lt;li>IP协议(IPv4\IPv6)、ARP、ICMP&lt;/li>
&lt;/ul>
&lt;h3 id="2-数据链路层">&lt;a href="#2-%e6%95%b0%e6%8d%ae%e9%93%be%e8%b7%af%e5%b1%82" class="header-anchor">&lt;/a>2 数据链路层
&lt;/h3>&lt;ul>
&lt;li>互联设备之间的传送和数据帧的生成与接收&lt;/li>
&lt;li>通过MAC来唯一标识(MAC,物理地址，一个主机会有一个MAC地址)&lt;/li>
&lt;/ul>
&lt;h3 id="1-物理层">&lt;a href="#1-%e7%89%a9%e7%90%86%e5%b1%82" class="header-anchor">&lt;/a>1 物理层
&lt;/h3>&lt;ul>
&lt;li>数字信号和点子信号间的转换&lt;/li>
&lt;/ul>
&lt;h2 id="数据发送和接收">&lt;a href="#%e6%95%b0%e6%8d%ae%e5%8f%91%e9%80%81%e5%92%8c%e6%8e%a5%e6%94%b6" class="header-anchor">&lt;/a>数据发送和接收
&lt;/h2>&lt;p>每个分层中，都会对所发送的数据附加一个首部，每个包首部中至少会包含两个信息：发送端地址和接收端地址。以太网用MAC地址，网络层用IP地址，TCP/UDP会用端口号。
另外每个分层包首部还包含一个标志位，用来标志上一层协议种类信息
&lt;img src="https://www.2bboy.com/usr/uploads/2021/08/1852406209.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="ip协议">&lt;a href="#ip%e5%8d%8f%e8%ae%ae" class="header-anchor">&lt;/a>IP协议
&lt;/h2>&lt;p>IPv4地址由32位数表示，ip地址由网络地址（网络标识）和主机地址（主机标识）两部分组成。网络地址和主机地址的分段以子网掩码区分，子网掩码的主要作用有两个，一是用于屏蔽IP地址的一部分以区别网络标识和主机标识，并说明该IP地址是在局域网上，还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。子网掩码可在ip地址后加上/表示，比如172.20.0.0/16或172.20/16
IP地址分类
&lt;img src="https://www.2bboy.com/usr/uploads/2021/08/613853137.png"
loading="lazy"
>&lt;/p>
&lt;blockquote>
&lt;p>A类&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>0开头&lt;/li>
&lt;li>区间：0.0.0.0~127.0.0.0&lt;/li>
&lt;li>子网掩码：255.0.0.0&lt;/li>
&lt;li>私有地址：10.0.0.0~10.255.255.255(10/8)&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>B类&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>10开头&lt;/li>
&lt;li>区间：128.0.0.0~191.255.0.0&lt;/li>
&lt;li>子网掩码：255.255.0.0&lt;/li>
&lt;li>私有地址：172.16.0.0~172.31.255.255(172.16/12)&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>C类&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>110开头&lt;/li>
&lt;li>区间：192.0.0.0~223.255.255.0&lt;/li>
&lt;li>子网掩码：255.255.255.0&lt;/li>
&lt;li>私有地址：192.168.0.0~192.168.255.255(192.168/16)&lt;/li>
&lt;li>每个网段只有254个地址，因为全0表示对应网段或地址不可知，全1表示广播地址&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>D类&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>1110开头&lt;/li>
&lt;li>区间：224.0.0.0~239.255.255.255&lt;/li>
&lt;li>子网掩码：255.255.255.255&lt;/li>
&lt;li>多拨地址&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>E类&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>区间：240.0.0.0~255.255.255.254&lt;/li>
&lt;li>保留地址&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>广播地址&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>将主机地址全部设为1，就是广播地址&lt;/li>
&lt;/ul>
&lt;h2 id="arprarp协议">&lt;a href="#arprarp%e5%8d%8f%e8%ae%ae" class="header-anchor">&lt;/a>ARP/RARP协议
&lt;/h2>&lt;ul>
&lt;li>ARP 是根据IP地址获取MAC地址的一种协议。
在以太网上发送ip包时，因为链路层需要知道MAC地址，先根据ip地址查一下ARP缓存，如果没有查到，则发送一个ARP协议广播包，这个广播包里面就有待查询的IP地址，而直接收到这份广播的包的所有主机都会查询自己的IP地址，如果收到广播包的某一个主机发现自己符合条件，那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机。广播主机拿到ARP包后会更新自己的ARP缓存。
只适用于ipv4，ipv6中用ICMPv6代替。&lt;/li>
&lt;li>RARP 是从MAC地址定位ip地址的一种协议。&lt;/li>
&lt;li>arp 命令&lt;/li>
&lt;/ul>
&lt;h2 id="icmp协议">&lt;a href="#icmp%e5%8d%8f%e8%ae%ae" class="header-anchor">&lt;/a>ICMP协议
&lt;/h2>&lt;p>ICMP的主要功能包括，确认IP包是否成功到达目标地址，通知发送过程中ip包被弃用的原因，改善网络设置等。当传送IP数据包发生错误，比如主机不可达，路由不可达等等，ICMP协议将会把错误信息封包，然后传送回给主机。
常用命令&lt;/p>
&lt;ul>
&lt;li>ping&lt;/li>
&lt;li>traceroute&lt;/li>
&lt;/ul>
&lt;h2 id="nat">&lt;a href="#nat" class="header-anchor">&lt;/a>NAT
&lt;/h2>&lt;p>NAT用于在局域网中使用私有地址，在链接互联网时使用全局ip地址，除ip地址转换外，还有可以转换TCP、UDP端口号的NAPT技术。
缺点：不能从NAT外部向内部服务器建立连接&lt;/p>
&lt;h2 id="tcpudp">&lt;a href="#tcpudp" class="header-anchor">&lt;/a>TCP/UDP
&lt;/h2>&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/1914358805.jpg"
loading="lazy"
>&lt;/p>
&lt;h3 id="tcp连接的建立与终止">&lt;a href="#tcp%e8%bf%9e%e6%8e%a5%e7%9a%84%e5%bb%ba%e7%ab%8b%e4%b8%8e%e7%bb%88%e6%ad%a2" class="header-anchor">&lt;/a>TCP连接的建立与终止
&lt;/h3>&lt;h4 id="三次握手">&lt;a href="#%e4%b8%89%e6%ac%a1%e6%8f%a1%e6%89%8b" class="header-anchor">&lt;/a>三次握手
&lt;/h4>&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/3827282675.jpg"
loading="lazy"
>&lt;/p>
&lt;ul>
&lt;li>第一次握手：建立连接。客户端发送连接请求报文段，将SYN位置为1，Sequence Number为x；然后，客户端进入SYN_SEND状态，等待服务器的确认；&lt;/li>
&lt;li>第二次握手：服务器收到SYN报文段。服务器收到客户端的SYN报文段，需要对这个SYN报文段进行确认，设置Acknowledgment Number为x+1(Sequence Number+1)；同时，自己自己还要发送SYN请求信息，将SYN位置为1，Sequence Number为Y；服务器端将上述所有信息放到一个报文段（即SYN+ACK报文段）中，一并发送给客户端，此时服务器进入SYN_RECV状态；&lt;/li>
&lt;li>第三次握手：客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1，向服务器发送ACK报文段，这个报文段发送完毕以后，客户端和服务器端都进入ESTABLISHED状态，完成TCP三次握手。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>为什么要三次握手？两报文握手可以吗？
为了防止已失效的连接请求报文段突然又传送到了服务端，因而产生错误。&lt;/p>&lt;/blockquote>
&lt;p>具体例子：“已失效的连接请求报文段”的产生在这样一种情况下：client发出的第一个连接请求报文段并没有丢失，而是在某个网络结点长时间的滞留了，以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后，就误认为是client再次发出的一个新的连接请求。&lt;/p>
&lt;p>于是就向client发出确认报文段，同意建立连接。假设不采用“三次握手”，那么只要server发出确认，新的连接就建立了。由于现在client并没有发出建立连接的请求，因此不会理睬server的确认，也不会向server发送数据。但server却以为新的运输连接已经建立，并一直等待client发来数据。这样，server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况，client不会向server的确认发出确认。server由于收不到确认，就知道client并没有要求建立连接。”&lt;/p>
&lt;h4 id="四次分手">&lt;a href="#%e5%9b%9b%e6%ac%a1%e5%88%86%e6%89%8b" class="header-anchor">&lt;/a>四次分手
&lt;/h4>&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/4106741456.jpg"
loading="lazy"
>&lt;/p>
&lt;ul>
&lt;li>第一次分手：主机1（可以使客户端，也可以是服务器端），设置Sequence Number，向主机2发送一个FIN报文段；此时，主机1进入FIN_WAIT_1状态；这表示主机1没有数据要发送给主机2了；&lt;/li>
&lt;li>第二次分手：主机2收到了主机1发送的FIN报文段，向主机1回一个ACK报文段，Acknowledgment Number为Sequence Number加1；主机1进入FIN_WAIT_2状态；主机2告诉主机1，我“同意”你的关闭请求；&lt;/li>
&lt;li>第三次分手：主机2向主机1发送FIN报文段，请求关闭连接，同时主机2进入LAST_ACK状态；&lt;/li>
&lt;li>第四次分手：主机1收到主机2发送的FIN报文段，向主机2发送ACK报文段，然后主机1进入TIME_WAIT状态；主机2收到主机1的ACK报文段以后，就关闭连接；此时，主机1等待2MSL后依然没有收到回复，则证明Server端已正常关闭，那好，主机1也可以关闭连接了。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>为什么要四次分手？
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式，这就意味着，当主机1发出FIN报文段时，只是表示主机1已经没有数据要发送了，主机1告诉主机2，它的数据已经全部发送完毕了；但是，这个时候主机1还是可以接受来自主机2的数据；当主机2返回ACK报文段时，表示它已经知道主机1没有数据发送了，但是主机2还是可以发送数据到主机1的；当主机2也发送了FIN报文段时，这个时候就表示主机2也没有数据要发送了，就会告诉主机1，我也没有数据要发送了，之后彼此就会愉快的中断这次TCP连接。
为什么要等待2MSL
MSL：报文段最大生存时间，它是任何报文段被丢弃前在网络内的最长时间。&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>保证TCP协议的全双工连接能够可靠关闭&lt;/li>
&lt;li>保证这次连接的重复数据段从网络中消失
第一点：如果主机1直接CLOSED了，那么由于IP协议的不可靠性或者是其它网络原因，导致主机2没有收到主机1最后回复的ACK。那么主机2就会在超时之后继续发送FIN，此时由于主机1已经CLOSED了，就找不到与重发的FIN对应的连接。所以，主机1不是直接进入CLOSED，而是要保持TIME_WAIT，当再次收到FIN的时候，能够保证对方收到ACK，最后正确的关闭连接。
第二点：如果主机1直接CLOSED，然后又再向主机2发起一个新连接，我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题，但是还是有特殊情况出现：假设新连接和已经关闭的老连接端口号是一样的，如果前一次连接的某些数据仍然滞留在网络中，这些延迟数据在建立新连接之后才到达主机2，由于新连接和老连接的端口号是一样的，TCP协议就认为那个延迟的数据是属于新连接的，这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL，这样可以保证本次连接的所有数据都从网络中消失。&lt;/li>
&lt;/ul>
&lt;h3 id="窗口控制">&lt;a href="#%e7%aa%97%e5%8f%a3%e6%8e%a7%e5%88%b6" class="header-anchor">&lt;/a>窗口控制
&lt;/h3>&lt;p>如果每发一个段都进行一次确认应答会很慢，于是引入窗口概念，发松端无需等待确认应答而是继续发送，窗口大小就是指无需等待确认应答的可以继续发送数据的最大值。
确认应答丢失不会重发；报文段丢失，发松端连续3次收到收到同一个确认应答就会进行重发。&lt;/p>
&lt;h3 id="流量控制">&lt;a href="#%e6%b5%81%e9%87%8f%e6%8e%a7%e5%88%b6" class="header-anchor">&lt;/a>流量控制
&lt;/h3>&lt;p>如果发送方把数据发送得过快，接收方可能会来不及接收，这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快，要让接收方来得及接收。
TCP首部中，有一个字段用来通知窗口大小。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
接收端的缓冲区一旦面临数据溢出时，窗口大的值就会设置为一个更小的值通知给发松端，发松端就会根据接收端的指示，进行流量控制。&lt;/p>
&lt;h3 id="拥塞控制">&lt;a href="#%e6%8b%a5%e5%a1%9e%e6%8e%a7%e5%88%b6" class="header-anchor">&lt;/a>拥塞控制
&lt;/h3>&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/571334133.jpg"
loading="lazy"
>
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度，并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
发送方控制拥塞窗口的原则是：只要网络没有出现拥塞，拥塞窗口就再增大一些，以便把更多的分组发送出去。但只要网络出现拥塞，拥塞窗口就减小一些，以减少注入到网络中的分组数。&lt;/p>
&lt;ol>
&lt;li>当 cwnd &amp;lt; ssthresh 时，使用上述的慢开始算法。&lt;/li>
&lt;li>当 cwnd &amp;gt; ssthresh 时，停止使用慢开始算法而改用拥塞避免算法。&lt;/li>
&lt;li>当 cwnd = ssthresh 时，既可使用慢开始算法，也可使用拥塞避免算法。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>慢开始
通常在刚刚开始发送报文段时，先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后，把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ，可以使分组注入到网络的速率更加合理。&lt;/li>
&lt;li>拥塞避免
拥塞窗口cwnd缓慢地增大，即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1，而不是加倍。&lt;/li>
&lt;li>快重传
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认（为的是使发送方及早知道有报文段没有到达对方）而不要等到自己发送数据时才进行捎带确认。
快重传算法还规定，发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段，而不必继续等待未收到的报文段设置的重传计时器到期。&lt;/li>
&lt;li>快恢复
与快重传配合使用的还有快恢复算法
当发送方连续收到三个重复确认，就执行“乘法减小”算法，把慢开始门限ssthresh减半。&lt;/li>
&lt;/ul>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://juejin.cn/post/6844903490595061767" target="_blank" rel="noopener"
>https://juejin.cn/post/6844903490595061767&lt;/a>
&lt;a class="link" href="https://www.ihewro.com/archives/913/" target="_blank" rel="noopener"
>https://www.ihewro.com/archives/913/&lt;/a>
&lt;a class="link" href="https://mp.weixin.qq.com/s/VMz2bDV5JZo0YH5fRQ9mSw" target="_blank" rel="noopener"
>https://mp.weixin.qq.com/s/VMz2bDV5JZo0YH5fRQ9mSw&lt;/a>&lt;/p></description></item><item><title>各种排序算法的Python实现</title><link>https://kizx.github.io/post/%E5%90%84%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E7%9A%84python%E5%AE%9E%E7%8E%B0/</link><pubDate>Thu, 15 Apr 2021 07:26:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%90%84%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E7%9A%84python%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p>注：排序算法的稳定性指相等的元素在排序前后相对位置是否变化，稳定排序主要用于不同键值比较，比如ACM成绩排序，先按分数排序，相同分数再按用时最短排序。&lt;/p>
&lt;h2 id="冒泡排序">&lt;a href="#%e5%86%92%e6%b3%a1%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>冒泡排序
&lt;/h2>&lt;p>不断比较相邻元素，每次遍历将最大值移至队尾。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">bubble&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapped &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#f92672">=&lt;/span> len(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> swapped:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapped &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">False&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">1&lt;/span>, end):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> arr[i&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">&amp;gt;&lt;/span> arr[i]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[i&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>], arr[i] &lt;span style="color:#f92672">=&lt;/span> arr[i], arr[i&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapped &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="选择排序">&lt;a href="#%e9%80%89%e6%8b%a9%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>选择排序
&lt;/h2>&lt;p>每次遍历找到一个最小值，将其移至队首。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">selection&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> start &lt;span style="color:#f92672">in&lt;/span> range(len(arr)&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mini &lt;span style="color:#f92672">=&lt;/span> start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(start&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, len(arr)):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> arr[i] &lt;span style="color:#f92672">&amp;lt;&lt;/span> arr[mini]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mini &lt;span style="color:#f92672">=&lt;/span> i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[start], arr[mini] &lt;span style="color:#f92672">=&lt;/span> arr[mini], arr[start]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="插入排序">&lt;a href="#%e6%8f%92%e5%85%a5%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>插入排序
&lt;/h2>&lt;p>很像打麻将，每摸到一张牌，就依次比较将其插入正确的位置。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">insertion&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> cur &lt;span style="color:#f92672">in&lt;/span> range(len(arr)):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(cur&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> arr[cur] &lt;span style="color:#f92672">&amp;lt;&lt;/span> arr[i]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[cur], arr[i] &lt;span style="color:#f92672">=&lt;/span> arr[i], arr[cur]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur &lt;span style="color:#f92672">=&lt;/span> i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="归并排序">&lt;a href="#%e5%bd%92%e5%b9%b6%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>归并排序
&lt;/h2>&lt;p>分分合合&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">merge&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> l &lt;span style="color:#f92672">=&lt;/span> len(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> l &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arrleft &lt;span style="color:#f92672">=&lt;/span> merge(arr[:l&lt;span style="color:#f92672">//&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arright &lt;span style="color:#f92672">=&lt;/span> merge(arr[l&lt;span style="color:#f92672">//&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>:])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> arrleft &lt;span style="color:#f92672">or&lt;/span> arright:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> arrleft &lt;span style="color:#f92672">and&lt;/span> arright:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res&lt;span style="color:#f92672">.&lt;/span>append(arrleft&lt;span style="color:#f92672">.&lt;/span>pop(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">0&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> arrleft[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">&amp;lt;&lt;/span> arright[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#66d9ef">else&lt;/span> arright&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> arrleft:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res&lt;span style="color:#f92672">.&lt;/span>append(arrleft&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> arright:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res&lt;span style="color:#f92672">.&lt;/span>append(arright&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> res
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="快速排序">&lt;a href="#%e5%bf%ab%e9%80%9f%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>快速排序
&lt;/h2>&lt;p>选一个基准，然后将基准放在正确的位置上，并保证左边比基准小，右边比基准大，再一直递推下去。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">quick&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">_quick&lt;/span>(i, j):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> i &lt;span style="color:#f92672">&amp;gt;=&lt;/span> j:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 这里选取左端点为参考点&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pivot &lt;span style="color:#f92672">=&lt;/span> arr[i]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> low &lt;span style="color:#f92672">=&lt;/span> i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> high &lt;span style="color:#f92672">=&lt;/span> j
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> i &lt;span style="color:#f92672">!=&lt;/span> j:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 从右往左 找小于pivot的&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> i &lt;span style="color:#f92672">&amp;lt;&lt;/span> j &lt;span style="color:#f92672">and&lt;/span> arr[j] &lt;span style="color:#f92672">&amp;gt;=&lt;/span> pivot:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> j &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[i] &lt;span style="color:#f92672">=&lt;/span> arr[j]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 从左往右 找大于pivot的&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> i &lt;span style="color:#f92672">&amp;lt;&lt;/span> j &lt;span style="color:#f92672">and&lt;/span> arr[i] &lt;span style="color:#f92672">&amp;lt;=&lt;/span> pivot:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> i &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[j] &lt;span style="color:#f92672">=&lt;/span> arr[i]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[i] &lt;span style="color:#f92672">=&lt;/span> pivot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> _quick(low, i&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> _quick(i&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, high)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> _quick(&lt;span style="color:#ae81ff">0&lt;/span>, len(arr)&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="堆排序">&lt;a href="#%e5%a0%86%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>堆排序
&lt;/h2>&lt;p>每次将堆顶元素和最后一个元素交换，交换后上浮&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">HeapSort&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>arr &lt;span style="color:#f92672">=&lt;/span> arr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>len &lt;span style="color:#f92672">=&lt;/span> len(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(len(arr)&lt;span style="color:#f92672">//&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>heapify(i)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">heapify&lt;/span>(self, i):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">*&lt;/span>i&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> right &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">*&lt;/span>i&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> largest &lt;span style="color:#f92672">=&lt;/span> i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> left &lt;span style="color:#f92672">&amp;lt;&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>len &lt;span style="color:#f92672">and&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>arr[left] &lt;span style="color:#f92672">&amp;gt;&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>arr[largest]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> largest &lt;span style="color:#f92672">=&lt;/span> left
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> right &lt;span style="color:#f92672">&amp;lt;&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>len &lt;span style="color:#f92672">and&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>arr[right] &lt;span style="color:#f92672">&amp;gt;&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>arr[largest]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> largest &lt;span style="color:#f92672">=&lt;/span> right
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> largest &lt;span style="color:#f92672">!=&lt;/span> i:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>swap(i, largest)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>heapify(largest)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">swap&lt;/span>(self, a, b):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>arr[a], self&lt;span style="color:#f92672">.&lt;/span>arr[b] &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>arr[b], self&lt;span style="color:#f92672">.&lt;/span>arr[a]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">heapSort&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> heapq &lt;span style="color:#f92672">=&lt;/span> HeapSort(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(len(arr)&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> heapq&lt;span style="color:#f92672">.&lt;/span>swap(&lt;span style="color:#ae81ff">0&lt;/span>, i)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> heapq&lt;span style="color:#f92672">.&lt;/span>len &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> heapq&lt;span style="color:#f92672">.&lt;/span>heapify(&lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> heapq&lt;span style="color:#f92672">.&lt;/span>arr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="计数排序">&lt;a href="#%e8%ae%a1%e6%95%b0%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>计数排序
&lt;/h2>&lt;p>统计每个数字出现的次数，然后依次取出，适合都是整数且数字集中的场景。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">count&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> arr:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> minn &lt;span style="color:#f92672">=&lt;/span> min(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> maxn &lt;span style="color:#f92672">=&lt;/span> max(arr)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dic &lt;span style="color:#f92672">=&lt;/span> {n: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> range(minn, maxn&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> arr:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dic[n] &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> range(minn, maxn&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res &lt;span style="color:#f92672">+=&lt;/span> [n]&lt;span style="color:#f92672">*&lt;/span>dic[n]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> res
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="基数排序">&lt;a href="#%e5%9f%ba%e6%95%b0%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>基数排序
&lt;/h2>&lt;p>先创建10个队列（0~9桶），先按个位放入桶中，然后依次清空桶，然后是十位&amp;hellip;
适合整数，数据跨度较大的场景。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">radix&lt;/span>(arr):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> buckets &lt;span style="color:#f92672">=&lt;/span> [[] &lt;span style="color:#66d9ef">for&lt;/span> _ &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">10&lt;/span>)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rad &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> flag:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">False&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> arr:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> buckets[n &lt;span style="color:#f92672">//&lt;/span> rad &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>append(n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> flag &lt;span style="color:#f92672">and&lt;/span> n &lt;span style="color:#f92672">%&lt;/span> rad &lt;span style="color:#f92672">&amp;lt;&lt;/span> n:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> bucket &lt;span style="color:#f92672">in&lt;/span> buckets:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> bucket:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[i] &lt;span style="color:#f92672">=&lt;/span> bucket&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> i &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rad &lt;span style="color:#f92672">*=&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> arr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="桶排序">&lt;a href="#%e6%a1%b6%e6%8e%92%e5%ba%8f" class="header-anchor">&lt;/a>桶排序
&lt;/h2>&lt;p>每个桶有不同的范围，桶内有自己的排序算法
&lt;img src="https://www.2bboy.com/usr/uploads/2021/09/3462124853.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://visualgo.net/zh/sorting" target="_blank" rel="noopener"
>https://visualgo.net/zh/sorting&lt;/a>&lt;/p></description></item><item><title>javascript一些方法原理实现</title><link>https://kizx.github.io/post/javascript%E4%B8%80%E4%BA%9B%E6%96%B9%E6%B3%95%E5%8E%9F%E7%90%86%E5%AE%9E%E7%8E%B0/</link><pubDate>Tue, 13 Apr 2021 10:01:00 +0000</pubDate><guid>https://kizx.github.io/post/javascript%E4%B8%80%E4%BA%9B%E6%96%B9%E6%B3%95%E5%8E%9F%E7%90%86%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p>一般认为js数据类型为7种：&lt;code>number&lt;/code>,&lt;code>string&lt;/code>,&lt;code>boolean&lt;/code>,&lt;code>undefined&lt;/code>,&lt;code>null&lt;/code>,&lt;code>symbol&lt;/code>,&lt;code>object&lt;/code>，（有的把&lt;code>bigint&lt;/code>也算一种，）其中object为引用类型，其余为基本类型。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>); &lt;span style="color:#75715e">// number
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>); &lt;span style="color:#75715e">// boolean
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#e6db74">&amp;#34;str&amp;#34;&lt;/span>); &lt;span style="color:#75715e">// string
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> []); &lt;span style="color:#75715e">// object
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> {}); &lt;span style="color:#75715e">// object
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {}); &lt;span style="color:#75715e">// function
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#66d9ef">undefined&lt;/span>); &lt;span style="color:#75715e">// undefined
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>); &lt;span style="color:#75715e">// object
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>((&lt;span style="color:#ae81ff">2&lt;/span>).&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> Number); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span>.&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> Boolean); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;str&amp;#34;&lt;/span>.&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> String); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>([].&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> Array); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>({}.&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> Object); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">function&lt;/span> () {}.&lt;span style="color:#a6e22e">constructor&lt;/span> &lt;span style="color:#f92672">===&lt;/span> Function); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">str&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Object.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">toString&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#ae81ff">2&lt;/span>)); &lt;span style="color:#75715e">//[object Number]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span>)); &lt;span style="color:#75715e">//[object Boolean]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;str&amp;#34;&lt;/span>)); &lt;span style="color:#75715e">//[object String]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>([])); &lt;span style="color:#75715e">//[object Array]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">function&lt;/span> () {})); &lt;span style="color:#75715e">//[object Function]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>({})); &lt;span style="color:#75715e">//[object Object]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">undefined&lt;/span>)); &lt;span style="color:#75715e">//[object Undefined]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">str&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">null&lt;/span>)); &lt;span style="color:#75715e">//[object Null]
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="instanceof">&lt;a href="#instanceof" class="header-anchor">&lt;/a>instanceof
&lt;/h2>&lt;p>instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置，不能用来判断包装对象。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> Number); &lt;span style="color:#75715e">// false
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> Boolean); &lt;span style="color:#75715e">// false
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;str&amp;#39;&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> String); &lt;span style="color:#75715e">// false
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>([] &lt;span style="color:#66d9ef">instanceof&lt;/span> Array); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">function&lt;/span> () {} &lt;span style="color:#66d9ef">instanceof&lt;/span> Function); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>({} &lt;span style="color:#66d9ef">instanceof&lt;/span> Object); &lt;span style="color:#75715e">// true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(Object &lt;span style="color:#66d9ef">instanceof&lt;/span> Object); &lt;span style="color:#75715e">//true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(Function &lt;span style="color:#66d9ef">instanceof&lt;/span> Object); &lt;span style="color:#75715e">//true
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 原理实现
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">myInstanceof&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#a6e22e">tar&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 获取对象的原型
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">proto&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Object.&lt;span style="color:#a6e22e">getPrototypeOf&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 获取构造函数的 prototype 对象
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">tar&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 对象原型走到头了
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">proto&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//判断原型是否相等
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">proto&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">myInstanceof&lt;/span>(&lt;span style="color:#a6e22e">proto&lt;/span>, &lt;span style="color:#a6e22e">tar&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="深拷贝">&lt;a href="#%e6%b7%b1%e6%8b%b7%e8%b4%9d" class="header-anchor">&lt;/a>深拷贝
&lt;/h2>&lt;p>数组、对象的typeof结果都为&amp;rsquo;object&amp;rsquo;，需要注意的是null的typeof结果也为&amp;rsquo;object&amp;rsquo;，函数的typeof结果为&amp;rsquo;function&amp;rsquo;，symbol无法直接遍历到。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">deepcopy&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">data&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">data&lt;/span> &lt;span style="color:#66d9ef">instanceof&lt;/span> Array &lt;span style="color:#f92672">?&lt;/span> [] &lt;span style="color:#f92672">:&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">const&lt;/span> [&lt;span style="color:#a6e22e">k&lt;/span>, &lt;span style="color:#a6e22e">v&lt;/span>] &lt;span style="color:#66d9ef">of&lt;/span> Object.&lt;span style="color:#a6e22e">entries&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span>)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>[&lt;span style="color:#a6e22e">k&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#a6e22e">v&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#e6db74">&amp;#34;object&amp;#34;&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">deepcopy&lt;/span>(&lt;span style="color:#a6e22e">v&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">v&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">k&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> Object.&lt;span style="color:#a6e22e">getOwnPropertySymbols&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span>)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>[&lt;span style="color:#a6e22e">k&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#a6e22e">data&lt;/span>[&lt;span style="color:#a6e22e">k&lt;/span>] &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#e6db74">&amp;#34;object&amp;#34;&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">deepcopy&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span>[&lt;span style="color:#a6e22e">k&lt;/span>]) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">data&lt;/span>[&lt;span style="color:#a6e22e">k&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="objectcreate">&lt;a href="#objectcreate" class="header-anchor">&lt;/a>Object.create
&lt;/h2>&lt;p>Object.create()方法创建一个新对象，使用现有的对象来提供新创建的对象的__proto__，和new有点像。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">create&lt;/span>(&lt;span style="color:#a6e22e">proto&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">__proto__&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">proto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#75715e">//直译
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">create&lt;/span>(&lt;span style="color:#a6e22e">proto&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>() {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">F&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">proto&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#75715e">//推荐
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="new">&lt;a href="#new" class="header-anchor">&lt;/a>new
&lt;/h2>&lt;p>new操作主要执行了以下操作：&lt;/p>
&lt;ol>
&lt;li>新建一个空对象obj&lt;/li>
&lt;li>将空对象的&lt;code>__proto__&lt;/code>原型链指向构造函数的原型&lt;code>prototype&lt;/code>&lt;/li>
&lt;li>将构造函数的&lt;code>this&lt;/code>指向obj，执行构造函数&lt;/li>
&lt;li>返回构造函数的返回，如果返回为空则返回obj&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">newObj&lt;/span>(&lt;span style="color:#a6e22e">p&lt;/span>, ...&lt;span style="color:#a6e22e">args&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Object.&lt;span style="color:#a6e22e">create&lt;/span>(&lt;span style="color:#a6e22e">p&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">p&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#a6e22e">args&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Person&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Person&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">person1&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Person&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;san&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">person1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">person2&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">newObj&lt;/span>(&lt;span style="color:#a6e22e">Person&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;si&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">person2&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="防抖">&lt;a href="#%e9%98%b2%e6%8a%96" class="header-anchor">&lt;/a>防抖
&lt;/h2>&lt;p>快速连续触发事件时，只有最后一次触发能成功执行。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">debounce&lt;/span>(&lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>; &lt;span style="color:#75715e">// 创建一个标记用来存放定时器的返回值
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">clearTimeout&lt;/span>(&lt;span style="color:#a6e22e">timeout&lt;/span>); &lt;span style="color:#75715e">// 每当用户输入的时候把前一个 setTimeout clear 掉
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">timeout&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">setTimeout&lt;/span>(() =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话，就不会执行 fn 函数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">arguments&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }, &lt;span style="color:#ae81ff">500&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">sayHi&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;防抖成功&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">inp&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">createElement&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">inp&lt;/span>.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">debounce&lt;/span>(&lt;span style="color:#a6e22e">sayHi&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>document.&lt;span style="color:#a6e22e">body&lt;/span>.&lt;span style="color:#a6e22e">append&lt;/span>(&lt;span style="color:#a6e22e">inp&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="节流">&lt;a href="#%e8%8a%82%e6%b5%81" class="header-anchor">&lt;/a>节流
&lt;/h2>&lt;p>一定时间内只会执行1次，上一次未处理完则不会执行。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">throttle&lt;/span>(&lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">canRun&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>; &lt;span style="color:#75715e">// 通过闭包保存一个标记
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">canRun&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span>; &lt;span style="color:#75715e">// 在函数开头判断标记是否为true，不为true则return
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">canRun&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>; &lt;span style="color:#75715e">// 立即设置为false
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">setTimeout&lt;/span>(() =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 将外部传入的函数的执行放在setTimeout中
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">arguments&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false，在开头被return掉
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">canRun&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }, &lt;span style="color:#ae81ff">500&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">sayHi&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;节流成功&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">btn&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">createElement&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;button&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">btn&lt;/span>.&lt;span style="color:#a6e22e">innerHTML&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;节流&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">btn&lt;/span>.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;click&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">throttle&lt;/span>(&lt;span style="color:#a6e22e">sayHi&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>document.&lt;span style="color:#a6e22e">body&lt;/span>.&lt;span style="color:#a6e22e">append&lt;/span>(&lt;span style="color:#a6e22e">btn&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="call">&lt;a href="#call" class="header-anchor">&lt;/a>call
&lt;/h2>&lt;p>将this挂载到目标上后执行，最后再删除&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>Function.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">myCall&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">context&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">context&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span> &lt;span style="color:#f92672">||&lt;/span> window;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">arg&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [...&lt;span style="color:#a6e22e">arguments&lt;/span>].&lt;span style="color:#a6e22e">slice&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span>(...&lt;span style="color:#a6e22e">arg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">delete&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="apply">&lt;a href="#apply" class="header-anchor">&lt;/a>apply
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>Function.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">myApply&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">context&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">context&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span> &lt;span style="color:#f92672">||&lt;/span> window;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 需要判断是否存储第二个参数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// 如果存在，就将第二个参数展开
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">arguments&lt;/span>[&lt;span style="color:#ae81ff">1&lt;/span>]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span>(...&lt;span style="color:#a6e22e">arguments&lt;/span>[&lt;span style="color:#ae81ff">1&lt;/span>]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">delete&lt;/span> &lt;span style="color:#a6e22e">context&lt;/span>.&lt;span style="color:#a6e22e">fn&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="bind">&lt;a href="#bind" class="header-anchor">&lt;/a>bind
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>Function.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">myBind&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">context&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">args&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [...&lt;span style="color:#a6e22e">arguments&lt;/span>].&lt;span style="color:#a6e22e">slice&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 返回一个函数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#a6e22e">context&lt;/span>, &lt;span style="color:#a6e22e">args&lt;/span>.&lt;span style="color:#a6e22e">concat&lt;/span>(...&lt;span style="color:#a6e22e">arguments&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="柯里化">&lt;a href="#%e6%9f%af%e9%87%8c%e5%8c%96" class="header-anchor">&lt;/a>柯里化
&lt;/h2>&lt;p>将能够接收多个参数的函数转化为接收单一参数的函数，并且返回能接收余下参数且返回结果的新函数的技术&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> Array.&lt;span style="color:#a6e22e">from&lt;/span>(&lt;span style="color:#a6e22e">arguments&lt;/span>).&lt;span style="color:#a6e22e">reduce&lt;/span>((&lt;span style="color:#a6e22e">cur&lt;/span>, &lt;span style="color:#a6e22e">item&lt;/span>) =&amp;gt; &lt;span style="color:#a6e22e">cur&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">currying&lt;/span>(&lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">args&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">args&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>(...&lt;span style="color:#a6e22e">arguments&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">args&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">add&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">currying&lt;/span>(&lt;span style="color:#a6e22e">add&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>)); &lt;span style="color:#75715e">//1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#ae81ff">2&lt;/span>)); &lt;span style="color:#75715e">//3
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>)); &lt;span style="color:#75715e">//10
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">add&lt;/span>()); &lt;span style="color:#75715e">//10
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="反柯里化">&lt;a href="#%e5%8f%8d%e6%9f%af%e9%87%8c%e5%8c%96" class="header-anchor">&lt;/a>反柯里化
&lt;/h2>&lt;p>方法借用，扩展方法使用范围，和call,apply,bind类似&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">unCurrying&lt;/span>(&lt;span style="color:#a6e22e">fn&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">obj&lt;/span>, ...&lt;span style="color:#a6e22e">args&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fn&lt;/span>.&lt;span style="color:#a6e22e">apply&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#a6e22e">args&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">push&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">unCurrying&lt;/span>(Array.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lisi&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;san&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 等同于bind方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">push&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Array.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">push&lt;/span>.&lt;span style="color:#a6e22e">bind&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">push&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;lisi&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;san&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="双向绑定">&lt;a href="#%e5%8f%8c%e5%90%91%e7%bb%91%e5%ae%9a" class="header-anchor">&lt;/a>双向绑定
&lt;/h2>&lt;p>通过Proxy实现对数据监听。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">input&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">v&lt;/span>&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#a6e22e">model&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span> &lt;span style="color:#f92672">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">input&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">v&lt;/span>&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#a6e22e">model&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span> &lt;span style="color:#f92672">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">div&lt;/span> &lt;span style="color:#a6e22e">v&lt;/span>&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#a6e22e">bind&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/div&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">script&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">data&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">proxy&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Proxy(&lt;span style="color:#a6e22e">data&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">get&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#a6e22e">property&lt;/span>) {},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">set&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>, &lt;span style="color:#a6e22e">property&lt;/span>, &lt;span style="color:#a6e22e">value&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// model赋值
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#75715e">// obj[property] = value;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">Reflect&lt;/span>.&lt;span style="color:#a6e22e">set&lt;/span>(...&lt;span style="color:#a6e22e">arguments&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//视图响应
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">els&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">querySelectorAll&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">`[v-model=&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">property&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;],[v-bind=&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">property&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;]`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">el&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> &lt;span style="color:#a6e22e">els&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">el&lt;/span>.&lt;span style="color:#a6e22e">innerHTML&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">value&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">el&lt;/span>.&lt;span style="color:#a6e22e">value&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">value&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">els&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">querySelectorAll&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[v-model]&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">el&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> &lt;span style="color:#a6e22e">els&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">el&lt;/span>.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;keyup&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">proxy&lt;/span>[&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">getAttribute&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;v-model&amp;#34;&lt;/span>)] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">value&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/script&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="数组扁平化">&lt;a href="#%e6%95%b0%e7%bb%84%e6%89%81%e5%b9%b3%e5%8c%96" class="header-anchor">&lt;/a>数组扁平化
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">flat&lt;/span>(&lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span> &lt;span style="color:#66d9ef">of&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">res&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Array.&lt;span style="color:#a6e22e">isArray&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>) &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span>.&lt;span style="color:#a6e22e">concat&lt;/span>(&lt;span style="color:#a6e22e">flat&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>)) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span>.&lt;span style="color:#a6e22e">concat&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>JS原型与继承</title><link>https://kizx.github.io/post/js%E5%8E%9F%E5%9E%8B%E4%B8%8E%E7%BB%A7%E6%89%BF/</link><pubDate>Sun, 11 Apr 2021 12:33:00 +0000</pubDate><guid>https://kizx.github.io/post/js%E5%8E%9F%E5%9E%8B%E4%B8%8E%E7%BB%A7%E6%89%BF/</guid><description>&lt;h3 id="隐式原型__proto__">&lt;a href="#%e9%9a%90%e5%bc%8f%e5%8e%9f%e5%9e%8b__proto__" class="header-anchor">&lt;/a>隐式原型__proto__
&lt;/h3>&lt;p>除了元对象Object，每个js对象都有隐式原型，但也可以通过&lt;code>Object.create(null)&lt;/code>强制创建一个没有__proto__的对象，__proto__指向该对象的构造函数的原型对象。
原型链指的就是__proto__串起来的链。&lt;/p>
&lt;h3 id="原型prototype">&lt;a href="#%e5%8e%9f%e5%9e%8bprototype" class="header-anchor">&lt;/a>原型prototype
&lt;/h3>&lt;p>函数对象拥有prototype属性，函数的原型对象包含所有实例共享的方法，包含__proto__和constructor两个属性，constructor指回函数本身，函数原型对象也有__proto__属性，指向构造函数的原型即Function.prototype。
实例的__proto__指向函数原型对象，即&lt;code>f1.__proto__ === Foo.prototype&lt;/code>。
Object.prototype.__proto__指向null。&lt;/p>
&lt;h3 id="总结">&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor">&lt;/a>总结
&lt;/h3>&lt;p>定义函数时自动创建prototype原型对象，原型对象包含constructor构造函数，构造函数指回函数本身，new出来的实例拥有__proto__指向prototype原型对象。
&lt;img src="https://www.2bboy.com/usr/uploads/2021/08/2508891233.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="类式继承原型链继承">&lt;a href="#%e7%b1%bb%e5%bc%8f%e7%bb%a7%e6%89%bf%e5%8e%9f%e5%9e%8b%e9%93%be%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>类式继承（原型链继承）
&lt;/h2>&lt;p>将父类的实例赋给子类的prototype，缺点是父类共有属性为引用对象时，所有子类实例会公用同一个对象；无法向父类传参；子类不是父类的实例，而子类的原型是父类的实例，缺少constructor属性。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;动物&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;父类属性&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Dog&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="构造函数继承">&lt;a href="#%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>构造函数继承
&lt;/h2>&lt;p>将子类的变量在父类中执行一遍，即在子类的构造函数中执行一次父类的构造函数，缺点只执行了父类的构造函数，没有继承父类原型，父类的所有方法必须在构造函数中声明才能继承。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;父类属性&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">name&lt;/span>) &lt;span style="color:#75715e">//执行父类构造函数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// dog.getname() //无法继承原型方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// dog.getsupername()
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="组合继承">&lt;a href="#%e7%bb%84%e5%90%88%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>组合继承
&lt;/h2>&lt;p>结合前面两种方法，在子类构造函数中执行父类构造函数，子类原型指向父类的实例，缺点是父类构造函数执行了两遍，子类不是父类的实例。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;父类属性&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;执行了父类构造函数&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">name&lt;/span>) &lt;span style="color:#75715e">//继承属性
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Dog&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>() &lt;span style="color:#75715e">//继承方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="原型式继承">&lt;a href="#%e5%8e%9f%e5%9e%8b%e5%bc%8f%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>原型式继承
&lt;/h2>&lt;p>和类式继承相似，创建一个新对象并使用父类对象做为新对象的原型对象，和类式继承存在一样的问题，引用值会在实例间共享。和&lt;code>Object.create()&lt;/code>方法作用一致。适合不需要单独创建构造函数，但仍需要在实例间共享属性的场合。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">o&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>() { }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">F&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;动物&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">Animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="寄生式继承">&lt;a href="#%e5%af%84%e7%94%9f%e5%bc%8f%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>寄生式继承
&lt;/h2>&lt;p>对原型继承的二次封装，对继承的对象进行了拓展。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">o&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>() { }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">F&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;动物&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">createDog&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">o&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#75715e">// 增加属性和方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">createDog&lt;/span>(&lt;span style="color:#a6e22e">Animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="寄生组合式继承">&lt;a href="#%e5%af%84%e7%94%9f%e7%bb%84%e5%90%88%e5%bc%8f%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>寄生组合式继承
&lt;/h2>&lt;p>寄生继承和构造函数继承的组合，修复子类的原型，子类的原型指向父类原型的一份实例，construction指向子类本身。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">o&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>() { }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">F&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">F&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">inheritPtototype&lt;/span>(&lt;span style="color:#a6e22e">subClass&lt;/span>, &lt;span style="color:#a6e22e">superClass&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">p&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">inherit&lt;/span>(&lt;span style="color:#a6e22e">superClass&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">p&lt;/span>.&lt;span style="color:#a6e22e">construction&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">subClass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">subClass&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">p&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;父类属性&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;执行了父类构造函数&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">name&lt;/span>) &lt;span style="color:#75715e">//构造函数式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">inheritPtototype&lt;/span>(&lt;span style="color:#a6e22e">Dog&lt;/span>, &lt;span style="color:#a6e22e">Animal&lt;/span>) &lt;span style="color:#75715e">//寄生式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">dog&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是上面左还有一个小问题，就是遍历子类实例属性时，会把construction也遍历出来，可以通过&lt;code>Object.defineProperty&lt;/code>方法禁止遍历。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">key&lt;/span> &lt;span style="color:#66d9ef">in&lt;/span> &lt;span style="color:#a6e22e">dog&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">key&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以再升级一下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">extend&lt;/span>(&lt;span style="color:#a6e22e">subClass&lt;/span>, &lt;span style="color:#a6e22e">superClass&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">subClass&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Object.&lt;span style="color:#a6e22e">create&lt;/span>(&lt;span style="color:#a6e22e">superClass&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Object.&lt;span style="color:#a6e22e">defineProperty&lt;/span>(&lt;span style="color:#a6e22e">subClass&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;constructor&amp;#34;&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">value&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">subClass&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">enumerable&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span> &lt;span style="color:#75715e">//禁止遍历
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Animal&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;父类属性&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;执行了父类构造函数&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">animal&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">name&lt;/span>) &lt;span style="color:#75715e">//构造函数式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">extend&lt;/span>(&lt;span style="color:#a6e22e">Dog&lt;/span>, &lt;span style="color:#a6e22e">Animal&lt;/span>) &lt;span style="color:#75715e">//寄生式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span>()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mixin多继承">&lt;a href="#mixin%e5%a4%9a%e7%bb%a7%e6%89%bf" class="header-anchor">&lt;/a>mixin多继承
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">Mammal&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">skill&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#39;是哺乳动物&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#75715e">// mixin类
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#a6e22e">name&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Animal&lt;/span>.&lt;span style="color:#a6e22e">call&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>, &lt;span style="color:#a6e22e">name&lt;/span>) &lt;span style="color:#75715e">//构造函数式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">extend&lt;/span>(&lt;span style="color:#a6e22e">Dog&lt;/span>, &lt;span style="color:#a6e22e">Animal&lt;/span>) &lt;span style="color:#75715e">//寄生式继承
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>Object.&lt;span style="color:#a6e22e">assign&lt;/span>(&lt;span style="color:#a6e22e">Dog&lt;/span>.&lt;span style="color:#a6e22e">prototype&lt;/span>, &lt;span style="color:#a6e22e">Mammal&lt;/span>) &lt;span style="color:#75715e">//往子类原型拓展其他类方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">dog&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;狗&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getname&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">getsupername&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">dog&lt;/span>.&lt;span style="color:#a6e22e">skill&lt;/span>()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/cc18868876837/article/details/81211729" target="_blank" rel="noopener"
>帮你彻底搞懂JS中的prototype、__proto__与constructor（图解）&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/cc18868876837/article/details/103149502" target="_blank" rel="noopener"
>JavaScript中的new操作符的原理解析&lt;/a>
&lt;a class="link" href="https://www.zhihu.com/question/34183746" target="_blank" rel="noopener"
>js中__proto__和prototype的区别和关系？&lt;/a>
&lt;a class="link" href="https://doc.houdunren.com/js/11%20%E5%8E%9F%E5%9E%8B%E4%B8%8E%E7%BB%A7%E6%89%BF.html" target="_blank" rel="noopener"
>原型基础&lt;/a>&lt;/p></description></item><item><title>数据结构与算法</title><link>https://kizx.github.io/post/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/</link><pubDate>Tue, 02 Mar 2021 08:36:00 +0000</pubDate><guid>https://kizx.github.io/post/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/</guid><description>&lt;p>查询：O(1)
插入：O(n)
删除：O(n)&lt;/p>
&lt;h2 id="链表">&lt;a href="#%e9%93%be%e8%a1%a8" class="header-anchor">&lt;/a>链表
&lt;/h2>&lt;p>查询：O(n)
插入：O(1)
删除：O(1)&lt;/p>
&lt;ol>
&lt;li>迭代&lt;/li>
&lt;li>递归&lt;/li>
&lt;/ol>
&lt;h3 id="环判断">&lt;a href="#%e7%8e%af%e5%88%a4%e6%96%ad" class="header-anchor">&lt;/a>环判断
&lt;/h3>&lt;ol>
&lt;li>set判重&lt;/li>
&lt;li>快慢指针&lt;/li>
&lt;/ol>
&lt;h2 id="栈stack">&lt;a href="#%e6%a0%88stack" class="header-anchor">&lt;/a>栈Stack
&lt;/h2>&lt;p>先进后出(FILO)&lt;/p>
&lt;h3 id="单调栈">&lt;a href="#%e5%8d%95%e8%b0%83%e6%a0%88" class="header-anchor">&lt;/a>&lt;a class="link" href="https://github.com/labuladong/fucking-algorithm/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B3%BB%E5%88%97/%E5%8D%95%E8%B0%83%E6%A0%88.md" target="_blank" rel="noopener"
>单调栈&lt;/a>
&lt;/h3>&lt;p>下一个更大的数&lt;/p>
&lt;h2 id="队列queue">&lt;a href="#%e9%98%9f%e5%88%97queue" class="header-anchor">&lt;/a>队列Queue
&lt;/h2>&lt;p>先进先出(FIFO)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> collections &lt;span style="color:#f92672">import&lt;/span> deque
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q &lt;span style="color:#f92672">=&lt;/span> deque()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q&lt;span style="color:#f92672">.&lt;/span>append(&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q&lt;span style="color:#f92672">.&lt;/span>append(&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q&lt;span style="color:#f92672">.&lt;/span>append(&lt;span style="color:#ae81ff">3&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q&lt;span style="color:#f92672">.&lt;/span>popleft()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>q&lt;span style="color:#f92672">.&lt;/span>pop()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="堆">&lt;a href="#%e5%a0%86" class="header-anchor">&lt;/a>堆
&lt;/h2>&lt;p>log(n)
&lt;img src="https://www.2bboy.com/usr/uploads/2021/03/931900376.png"
loading="lazy"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> heapq
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 小顶堆&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heap0 &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>heappush(heap0, &lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>heappush(heap0, &lt;span style="color:#ae81ff">4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heap1 &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>heapify(heap1)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 优先队列&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heap2 &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>heappush(heap2, (&lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;5&amp;#39;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>heappush(heap2, (&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;4&amp;#39;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(heapq&lt;span style="color:#f92672">.&lt;/span>heappop(heap0)) &lt;span style="color:#75715e"># 出堆&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(heapq&lt;span style="color:#f92672">.&lt;/span>heappushpop(heap0, &lt;span style="color:#ae81ff">0&lt;/span>)) &lt;span style="color:#75715e"># 先压后弹&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(heapq&lt;span style="color:#f92672">.&lt;/span>heapreplace(heap0, &lt;span style="color:#ae81ff">0&lt;/span>)) &lt;span style="color:#75715e"># 先弹后压&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 大顶堆，没法push，一般用小顶堆相反数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>data &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">8&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>heapq&lt;span style="color:#f92672">.&lt;/span>_heapify_max(data)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 优先队列，可以用heapq实现，也可以用下面的同步方法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> queue &lt;span style="color:#f92672">import&lt;/span> PriorityQueue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="二叉堆">&lt;a href="#%e4%ba%8c%e5%8f%89%e5%a0%86" class="header-anchor">&lt;/a>二叉堆
&lt;/h3>&lt;p>父节点的权值不大于儿子的权值（小顶堆），可以用数组存储数据&lt;/p>
&lt;h2 id="单调队列">&lt;a href="#%e5%8d%95%e8%b0%83%e9%98%9f%e5%88%97" class="header-anchor">&lt;/a>单调队列
&lt;/h2>&lt;p>固定大小滑动窗口，获取最值。
单独看 push 操作的复杂度确实不是 O(1)，但是算法整体的复杂度依然是 O(N) 线性时间。要这样想，nums 中的每个元素最多被 push_back 和 pop_back 一次，没有任何多余操作，所以整体的复杂度还是 O(N)。
&lt;a class="link" href="https://github.com/labuladong/fucking-algorithm/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B3%BB%E5%88%97/%E5%8D%95%E8%B0%83%E9%98%9F%E5%88%97.md" target="_blank" rel="noopener"
>单调队列&lt;/a>&lt;/p>
&lt;h2 id="映射map">&lt;a href="#%e6%98%a0%e5%b0%84map" class="header-anchor">&lt;/a>映射Map
&lt;/h2>&lt;p>HashMap/TreeMap
无序/有序&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> collections
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 有序字典&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ordmap &lt;span style="color:#f92672">=&lt;/span> collections&lt;span style="color:#f92672">.&lt;/span>OrderedDict()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ordmap&lt;span style="color:#f92672">.&lt;/span>move_to_end(key)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ordmap&lt;span style="color:#f92672">.&lt;/span>popitem(last&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">False&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 计数字典&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>countmap &lt;span style="color:#f92672">=&lt;/span> collections&lt;span style="color:#f92672">.&lt;/span>Counter()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 访问不存在的key时自动添加key值为默认值&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>defaultdict([int,list,set,str,dict])
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>散列冲突：分离链接、线性探查&lt;/p>
&lt;h2 id="集合set">&lt;a href="#%e9%9b%86%e5%90%88set" class="header-anchor">&lt;/a>集合Set
&lt;/h2>&lt;p>HashSet/TreeSet&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>set_a &lt;span style="color:#f92672">=&lt;/span> set(&lt;span style="color:#e6db74">&amp;#39;12345&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_b &lt;span style="color:#f92672">=&lt;/span> set([&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;4&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;5&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;5&amp;#39;&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_c &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_d &lt;span style="color:#f92672">=&lt;/span> set(set_a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_a&lt;span style="color:#f92672">.&lt;/span>add(&lt;span style="color:#e6db74">&amp;#39;6&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_a&lt;span style="color:#f92672">.&lt;/span>update([&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>]) &lt;span style="color:#75715e"># 可以添加列表、集合等&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_a&lt;span style="color:#f92672">.&lt;/span>remove(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 元素不存在会报错&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set_a&lt;span style="color:#f92672">.&lt;/span>discard(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 元素不存在不会报错&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(set_a&lt;span style="color:#f92672">-&lt;/span>set_b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(set_a &lt;span style="color:#f92672">|&lt;/span> set_b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(set_a &lt;span style="color:#f92672">&amp;amp;&lt;/span> set_b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(set_a &lt;span style="color:#f92672">^&lt;/span> set_b)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="树tree">&lt;a href="#%e6%a0%91tree" class="header-anchor">&lt;/a>树Tree
&lt;/h2>&lt;p>二叉树-完全二叉树-满二叉树&lt;/p>
&lt;h3 id="二叉搜索树bst">&lt;a href="#%e4%ba%8c%e5%8f%89%e6%90%9c%e7%b4%a2%e6%a0%91bst" class="header-anchor">&lt;/a>二叉搜索树BST
&lt;/h3>&lt;p>&lt;strong>左子树&lt;/strong>小于根节点
&lt;strong>右子树&lt;/strong>大于根节点
左右子书满足二叉搜索树&lt;/p>
&lt;h4 id="遍历">&lt;a href="#%e9%81%8d%e5%8e%86" class="header-anchor">&lt;/a>遍历
&lt;/h4>&lt;p>前序pre：根-左-右
中序in：左-根-右 升序返回
后续post：左-右-根
中序遍历的两种写法&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-pyhton" data-lang="pyhton"># 递归
def inorder(root):
if root:
inorder(root.left)
print(root.val)
inorder(root.right)
# 迭代
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
print(root.val)
root = root.right
&lt;/code>&lt;/pre>&lt;h2 id="字典树前缀树trie">&lt;a href="#%e5%ad%97%e5%85%b8%e6%a0%91%e5%89%8d%e7%bc%80%e6%a0%91trie" class="header-anchor">&lt;/a>字典树/前缀树Trie
&lt;/h2>&lt;h2 id="图graph">&lt;a href="#%e5%9b%begraph" class="header-anchor">&lt;/a>图Graph
&lt;/h2>&lt;h3 id="广度优先搜索bfs">&lt;a href="#%e5%b9%bf%e5%ba%a6%e4%bc%98%e5%85%88%e6%90%9c%e7%b4%a2bfs" class="header-anchor">&lt;/a>广度优先搜索BFS
&lt;/h3>&lt;p>最短路径问题&lt;/p>
&lt;h3 id="狄克斯特拉算法">&lt;a href="#%e7%8b%84%e5%85%8b%e6%96%af%e7%89%b9%e6%8b%89%e7%ae%97%e6%b3%95" class="header-anchor">&lt;/a>狄克斯特拉算法
&lt;/h3>&lt;p>有向无环加权图最小开销问题&lt;/p>
&lt;h3 id="深度优先搜索dfs">&lt;a href="#%e6%b7%b1%e5%ba%a6%e4%bc%98%e5%85%88%e6%90%9c%e7%b4%a2dfs" class="header-anchor">&lt;/a>深度优先搜索DFS
&lt;/h3>&lt;h2 id="递归">&lt;a href="#%e9%80%92%e5%bd%92" class="header-anchor">&lt;/a>递归
&lt;/h2>&lt;p>重复计算-&amp;gt;效率低&lt;/p>
&lt;h2 id="分治">&lt;a href="#%e5%88%86%e6%b2%bb" class="header-anchor">&lt;/a>分治
&lt;/h2>&lt;h2 id="贪心">&lt;a href="#%e8%b4%aa%e5%bf%83" class="header-anchor">&lt;/a>贪心
&lt;/h2>&lt;h2 id="剪枝-回溯">&lt;a href="#%e5%89%aa%e6%9e%9d-%e5%9b%9e%e6%ba%af" class="header-anchor">&lt;/a>剪枝-回溯
&lt;/h2>&lt;h2 id="位运算">&lt;a href="#%e4%bd%8d%e8%bf%90%e7%ae%97" class="header-anchor">&lt;/a>位运算
&lt;/h2>&lt;p>x^0=X
x^x=0
x&amp;amp;1==0or1 #判断奇偶
x=x&amp;amp;(x-1) #清零最低位1
x&amp;amp;(-x) #取最低位的1
补码=反码+1
&lt;img src="https://www.2bboy.com/usr/uploads/2021/04/318515197.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="动态规划">&lt;a href="#%e5%8a%a8%e6%80%81%e8%a7%84%e5%88%92" class="header-anchor">&lt;/a>动态规划
&lt;/h2>&lt;h2 id="np完全问题">&lt;a href="#np%e5%ae%8c%e5%85%a8%e9%97%ae%e9%a2%98" class="header-anchor">&lt;/a>NP完全问题
&lt;/h2>&lt;p>旅行商问题
集合覆盖问题&lt;/p>
&lt;h2 id="并查集">&lt;a href="#%e5%b9%b6%e6%9f%a5%e9%9b%86" class="header-anchor">&lt;/a>并查集
&lt;/h2>&lt;p>数组实现&lt;/p>
&lt;h3 id="lrulfu-cache-缓存替换算法">&lt;a href="#lrulfu-cache-%e7%bc%93%e5%ad%98%e6%9b%bf%e6%8d%a2%e7%ae%97%e6%b3%95" class="header-anchor">&lt;/a>LRU/LFU Cache 缓存替换算法
&lt;/h3>&lt;p>双链表实现&lt;/p>
&lt;h3 id="布隆过滤器">&lt;a href="#%e5%b8%83%e9%9a%86%e8%bf%87%e6%bb%a4%e5%99%a8" class="header-anchor">&lt;/a>布隆过滤器
&lt;/h3>&lt;p>判断在不在，肯定不在/应该在&lt;/p></description></item><item><title>字幕朗读器——利用云语音平台为视频配音</title><link>https://kizx.github.io/post/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB%E5%99%A8%E5%88%A9%E7%94%A8%E4%BA%91%E8%AF%AD%E9%9F%B3%E5%B9%B3%E5%8F%B0%E4%B8%BA%E8%A7%86%E9%A2%91%E9%85%8D%E9%9F%B3/</link><pubDate>Thu, 28 Jan 2021 07:30:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB%E5%99%A8%E5%88%A9%E7%94%A8%E4%BA%91%E8%AF%AD%E9%9F%B3%E5%B9%B3%E5%8F%B0%E4%B8%BA%E8%A7%86%E9%A2%91%E9%85%8D%E9%9F%B3/</guid><description>&lt;p>本软件集成百度云、阿里云和讯飞云的在线语音合成的功能，可以实现将SRT格式的字幕文件或TXT格式的台词文本转换为时间轴对应的语音。&lt;/p>
&lt;h2 id="下载地址">&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%9c%b0%e5%9d%80" class="header-anchor">&lt;/a>下载地址
&lt;/h2>&lt;p>当前版本：V3.0.0
[button color=&amp;ldquo;info&amp;rdquo; icon=&amp;quot;&amp;quot; url=&amp;ldquo;https://github.com/kizx/subtitle2audio&amp;rdquo; type=&amp;quot;&amp;quot;]开源地址[/button]
[button color=&amp;ldquo;success&amp;rdquo; icon=&amp;quot;&amp;quot; url=&amp;ldquo;https://kizx.lanzoui.com/b01hhub9g&amp;rdquo; type=&amp;quot;&amp;quot;]密码:gyb3[/button]&lt;/p>
&lt;h2 id="使用方法">&lt;a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>使用方法
&lt;/h2>&lt;h3 id="获取相关key">&lt;a href="#%e8%8e%b7%e5%8f%96%e7%9b%b8%e5%85%b3key" class="header-anchor">&lt;/a>获取相关KEY
&lt;/h3>&lt;p>使用前需先去相关云平台注册并开通语音合成服务，各个平台语音种类和收费策略不一样，个人轻量使用白嫖完全够用。
百度云：https://ai.baidu.com/tech/speech/tts
阿里云：https://ai.aliyun.com/nls/tts
讯飞云：https://www.xfyun.cn/services/online_tts&lt;/p>
&lt;p>各个平台具体注册和开通语音合成服务的过程这里就不赘述了，如果遇到问题可以向平台客服求助，以下是各个平台开通后密钥的位置。
[tabs]
[tab name=&amp;ldquo;百度云&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/921220331.png"
loading="lazy"
>[/tab]
[tab name=&amp;ldquo;阿里云&amp;rdquo;]
阿里云的密钥需要在两个页面分别获取
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/408608881.png"
loading="lazy"
>
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/2773965244.png"
loading="lazy"
>
[/tab]
[tab name=&amp;ldquo;讯飞云&amp;rdquo;]
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/2332581614.png"
loading="lazy"
>
[/tab]
[/tabs]&lt;/p>
&lt;h3 id="字幕生成语音">&lt;a href="#%e5%ad%97%e5%b9%95%e7%94%9f%e6%88%90%e8%af%ad%e9%9f%b3" class="header-anchor">&lt;/a>字幕生成语音
&lt;/h3>&lt;p>本软件只支持utf8编码的srt格式的字幕文件，其他格式的需要先自行转换下，生成成功后会自动打开输出目录，输出目录里包含&lt;code>输出.mp3&lt;/code>和&lt;code>audio&lt;/code>文件夹，文件夹内为一句句单独的语音供备用。
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/2091177316.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="文本生成语音">&lt;a href="#%e6%96%87%e6%9c%ac%e7%94%9f%e6%88%90%e8%af%ad%e9%9f%b3" class="header-anchor">&lt;/a>文本生成语音
&lt;/h3>&lt;p>和字幕生成语音操作没有区别，文本的格式为每行一句台词，唯一不同的是可以设置两句话之间的停顿时间。
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/442892500.png"
loading="lazy"
>&lt;/p></description></item><item><title>PyQt多行文本QPlainTextEdit拖放文件后光标不动解决方法</title><link>https://kizx.github.io/post/pyqt%E5%A4%9A%E8%A1%8C%E6%96%87%E6%9C%ACqplaintextedit%E6%8B%96%E6%94%BE%E6%96%87%E4%BB%B6%E5%90%8E%E5%85%89%E6%A0%87%E4%B8%8D%E5%8A%A8%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 26 Jan 2021 14:32:00 +0000</pubDate><guid>https://kizx.github.io/post/pyqt%E5%A4%9A%E8%A1%8C%E6%96%87%E6%9C%ACqplaintextedit%E6%8B%96%E6%94%BE%E6%96%87%E4%BB%B6%E5%90%8E%E5%85%89%E6%A0%87%E4%B8%8D%E5%8A%A8%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid><description>&lt;p>如标题所示，在重写了QPlainTextEdit的拖放方法后，发现拖放文件后光标就不动了，但编辑功能正常，就很奇怪，虽然不会报bug，但很影响使用，文档里翻了半天没有找到问题，换了个搜索姿势后找到了和我遇到相同问题的人，并且解决方法也很奇特。&lt;/p>
&lt;h2 id="解决方法">&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>解决方法
&lt;/h2>&lt;p>方法来自：&lt;a class="link" href="https://fishc.com.cn/thread-187937-1-1.html" target="_blank" rel="noopener"
>PyQt5 QTextEdit重写dropEvent方法后拖入文件光标不动的问题&lt;/a>
问题出在重写的&lt;code>dropEvent&lt;/code>方法上，只需要加一句&lt;code>super().dropEvent(event)&lt;/code>重新继承方法即可。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyQPlainTextEdit&lt;/span>(QPlainTextEdit):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;实现文件拖放功能&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, parent&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">None&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>(parent)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setAcceptDrops(&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dragEnterEvent&lt;/span>(self, e):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>endswith(&lt;span style="color:#e6db74">&amp;#39;.srt&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>accept()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>ignore()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dropEvent&lt;/span>(self, e):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path &lt;span style="color:#f92672">=&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>replace(&lt;span style="color:#e6db74">&amp;#39;file:///&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>dropEvent(e) &lt;span style="color:#75715e"># 加这一句即可&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setPlainText(path)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Windows Terminal使用配置</title><link>https://kizx.github.io/post/windows-terminal%E4%BD%BF%E7%94%A8%E9%85%8D%E7%BD%AE/</link><pubDate>Tue, 26 Jan 2021 06:29:00 +0000</pubDate><guid>https://kizx.github.io/post/windows-terminal%E4%BD%BF%E7%94%A8%E9%85%8D%E7%BD%AE/</guid><description>&lt;p>微软商店搜索&lt;code>Windows Terminal&lt;/code>下载即可，或者去github下载：https://github.com/microsoft/terminal&lt;/p>
&lt;h2 id="默认打开cmd">&lt;a href="#%e9%bb%98%e8%ae%a4%e6%89%93%e5%bc%80cmd" class="header-anchor">&lt;/a>默认打开CMD
&lt;/h2>&lt;p>打开Windows Terminal，找到设置，打开设置文件，将&lt;code>defaultProfile&lt;/code>设置为CMD的那一串值，这串值可以在设置文件下面找到。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;#34;defaultProfile&amp;#34;: &amp;#34;{0caa0dad-35be-5f56-a8ff-afceeeaa6101}&amp;#34;,
&lt;/code>&lt;/pre>&lt;h2 id="添加到右键菜单">&lt;a href="#%e6%b7%bb%e5%8a%a0%e5%88%b0%e5%8f%b3%e9%94%ae%e8%8f%9c%e5%8d%95" class="header-anchor">&lt;/a>添加到右键菜单
&lt;/h2>&lt;p>对一个文件夹右键默认是集成了右键打开的，但在空白处右键是没有的，需要手动配置注册表。
以下是注册表注册文件，其中注意替换两个地址，一个是ico图标的地址，图标可以从&lt;a class="link" href="https://raw.githubusercontent.com/microsoft/terminal/main/res/terminal.ico" target="_blank" rel="noopener"
>GitHub&lt;/a>上下载，另一个是程序&lt;code>wt.exe&lt;/code>的地址。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-reg" data-lang="reg">&lt;span style="display:flex;">&lt;span>Windows Registry Editor Version 5.00
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[&lt;/span>HKEY_CLASSES_ROOT&lt;span style="color:#66d9ef">\Directory\Background\shell\WT]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Terminal Here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">&amp;#34;Icon&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;D:\\admin\\Documents\\ICO\\terminal.ico&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">&amp;#34;Position&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Top&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[&lt;/span>HKEY_CLASSES_ROOT&lt;span style="color:#66d9ef">\Directory\Background\shell\WT\command]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;C:\\Users\\onepiece\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>地址替换后将上面保存为&lt;code>wt.reg&lt;/code>文件运行即可，以下注册表中注册后的状态。
&lt;img src="https://www.2bboy.com/usr/uploads/2021/01/573181818.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>我发现现在好像软件自己添加了右键，不需要手动配置了，而且用上面方法配置的只是打开了wt.exe，但没有自动切换到当前目录下，并没有什么卵用。
要删除注册表在上面命令的头部加上&lt;code>-&lt;/code>即可&lt;/p>
&lt;pre tabindex="0">&lt;code>[-HKEY_CLASSES_ROOT\Directory\Background\shell\WT]
&lt;/code>&lt;/pre></description></item><item><title>uni-app微信小程序登录相关方法说明</title><link>https://kizx.github.io/post/uni-app%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BB%E5%BD%95%E7%9B%B8%E5%85%B3%E6%96%B9%E6%B3%95%E8%AF%B4%E6%98%8E/</link><pubDate>Sun, 10 Jan 2021 08:53:00 +0000</pubDate><guid>https://kizx.github.io/post/uni-app%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BB%E5%BD%95%E7%9B%B8%E5%85%B3%E6%96%B9%E6%B3%95%E8%AF%B4%E6%98%8E/</guid><description>&lt;p>在uniapp中小程序登录这一块上，关于如何登录授权，获取openid，存储用户信息，网上虽然有很多范例，但都讲的很乱，很容易就把人看晕了，这里简单总结下，真正使用时应该是按需使用。&lt;/p>
&lt;h2 id="openid">&lt;a href="#openid" class="header-anchor">&lt;/a>openid
&lt;/h2>&lt;p>openid是微信小程序中由官方生成的每个账户对每个小程序唯一的一串字符，不管用户有没有授权，只要用户访问了小程序就可以获取openid，openid可以作为用户的身份识别id。获取方法是通过&lt;code>uni.login&lt;/code>获取一个code，这个code每次刷新后都是不唯一的，需要利用这个code向微信官方接口换取openid。
uni.login：https://uniapp.dcloud.net.cn/api/plugins/login?id=login
openid换取接口：https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
要注意的是，用code换取openid时需要传递小程序appid和secret，所以这个请求过程建议在后台而非前端进行，比如在云函数中请求：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#39;use strict&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">exports&lt;/span>.&lt;span style="color:#a6e22e">main&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">async&lt;/span> (&lt;span style="color:#a6e22e">event&lt;/span>, &lt;span style="color:#a6e22e">context&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">appid&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;小程序后台查看&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">secret&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;小程序后台查看&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">js_code&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">event&lt;/span>.&lt;span style="color:#a6e22e">code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">grant_type&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;authorization_code&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">url&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;https://api.weixin.qq.com/sns/jscode2session&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">uniCloud&lt;/span>.&lt;span style="color:#a6e22e">httpclient&lt;/span>.&lt;span style="color:#a6e22e">request&lt;/span>(&lt;span style="color:#a6e22e">url&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">data&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">appid&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">secret&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">js_code&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">grant_type&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">dataType&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">res&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="授权登陆">&lt;a href="#%e6%8e%88%e6%9d%83%e7%99%bb%e9%99%86" class="header-anchor">&lt;/a>授权登陆
&lt;/h2>&lt;p>我这里授权登录指的是弹出那个获取昵称和头像的授权框，准确的说只是授权，登录是上面的login，但很多小程序都把这个按钮叫做登陆按钮，也就混为一谈了。由于微信小程序政策的变化，好像现在只能通过用户点击按钮进行主动登录，通过设置&lt;code>button&lt;/code>按钮的open-type属性即可弹出授权框，触发@getuserinfo事件可以获取用户信息，网上这里案例很多。
详见：https://uniapp.dcloud.net.cn/component/button&lt;/p>
&lt;h2 id="获取用户信息">&lt;a href="#%e8%8e%b7%e5%8f%96%e7%94%a8%e6%88%b7%e4%bf%a1%e6%81%af" class="header-anchor">&lt;/a>获取用户信息
&lt;/h2>&lt;p>除了在用户授权时获取用户信息，如果用户没有登出或清除授权信息，用户是已知保持登陆状态的，可以主动通过&lt;code>uni.getUserInfo&lt;/code>来获取用户信息用于判断用户是否登录或者其他用途。
详见：https://uniapp.dcloud.net.cn/api/plugins/login?id=getuserinfo&lt;/p>
&lt;h2 id="获取平台信息">&lt;a href="#%e8%8e%b7%e5%8f%96%e5%b9%b3%e5%8f%b0%e4%bf%a1%e6%81%af" class="header-anchor">&lt;/a>获取平台信息
&lt;/h2>&lt;p>uniapp还有一个&lt;code>uni.getProvider&lt;/code>方法用来获取服务供应商信息，其实就是检测当前是小程序还是app什么的，只有在程序跨端时才会用到，因为我们前面的方法在使用时需要传入一个provider信息，该信息就可以通过本方法来获取。
详见：https://uniapp.dcloud.net.cn/api/plugins/provider?id=getprovider&lt;/p>
&lt;h2 id="存储用户信息">&lt;a href="#%e5%ad%98%e5%82%a8%e7%94%a8%e6%88%b7%e4%bf%a1%e6%81%af" class="header-anchor">&lt;/a>存储用户信息
&lt;/h2>&lt;p>货去了用户的openid或者其他信息后就需要在数据存到缓存中，这样下次用户就不用重复登录，程序也不用重复获取信息了，不论你是把信息存到全局变量还是vuex中，用户刷新后这些信息都会重置，真正应该存到的应该是本地，用到的方法是&lt;code>uni.setStorageSync&lt;/code>,与之对应的读取缓存信息的方法是&lt;code>uni.getStorage&lt;/code>。
详见：https://uniapp.dcloud.net.cn/api/storage/storage?id=setstoragesync&lt;/p></description></item><item><title>numpy.linalg中solve和lstsq的区别</title><link>https://kizx.github.io/post/numpy.linalg%E4%B8%ADsolve%E5%92%8Clstsq%E7%9A%84%E5%8C%BA%E5%88%AB/</link><pubDate>Sun, 27 Dec 2020 11:53:16 +0000</pubDate><guid>https://kizx.github.io/post/numpy.linalg%E4%B8%ADsolve%E5%92%8Clstsq%E7%9A%84%E5%8C%BA%E5%88%AB/</guid><description>&lt;p>用于求解形如&lt;code>AX=b&lt;/code>的方程组。&lt;/p>
&lt;h2 id="不同点">&lt;a href="#%e4%b8%8d%e5%90%8c%e7%82%b9" class="header-anchor">&lt;/a>不同点
&lt;/h2>&lt;p>numpy.linalg.solve需要A矩阵为方阵，求解的结果为方程准确解。
numpy.linalg.lstsq允许A矩阵为超定的，当方程数大于未知数时求解结果为最小二乘近似解。
另外在使用时注意返回值不同，lstsq返回更多信息。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>X &lt;span style="color:#f92672">=&lt;/span> numpy&lt;span style="color:#f92672">.&lt;/span>linalg&lt;span style="color:#f92672">.&lt;/span>solve(A, b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>X &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>linalg&lt;span style="color:#f92672">.&lt;/span>lstsq(A, B, rcond&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">None&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当A矩阵为方阵时，计算结果没有差别，可以认为lstsq是solve的超集。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html" target="_blank" rel="noopener"
>https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html&lt;/a>
&lt;a class="link" href="https://numpy.org/doc/stable/reference/generated/numpy.linalg.lstsq.html" target="_blank" rel="noopener"
>https://numpy.org/doc/stable/reference/generated/numpy.linalg.lstsq.html&lt;/a>&lt;/p></description></item><item><title>计算空间三角形面积</title><link>https://kizx.github.io/post/%E8%AE%A1%E7%AE%97%E7%A9%BA%E9%97%B4%E4%B8%89%E8%A7%92%E5%BD%A2%E9%9D%A2%E7%A7%AF/</link><pubDate>Sat, 26 Dec 2020 13:14:00 +0000</pubDate><guid>https://kizx.github.io/post/%E8%AE%A1%E7%AE%97%E7%A9%BA%E9%97%B4%E4%B8%89%E8%A7%92%E5%BD%A2%E9%9D%A2%E7%A7%AF/</guid><description>&lt;p>一直空间散点坐标值，计算三点组成三角形的面积。&lt;/p>
&lt;h2 id="方法1">&lt;a href="#%e6%96%b9%e6%b3%951" class="header-anchor">&lt;/a>方法1
&lt;/h2>&lt;p>利用矩阵来计算
这里是否需要加绝对值？&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">area&lt;/span>(p):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p1, p2, p3 &lt;span style="color:#f92672">=&lt;/span> p
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a &lt;span style="color:#f92672">=&lt;/span> [[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [p2[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">0&lt;/span>], p2[&lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">1&lt;/span>], p2[&lt;span style="color:#ae81ff">2&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">2&lt;/span>]],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [p3[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">0&lt;/span>], p3[&lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">1&lt;/span>], p3[&lt;span style="color:#ae81ff">2&lt;/span>] &lt;span style="color:#f92672">-&lt;/span> p1[&lt;span style="color:#ae81ff">2&lt;/span>]]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.5&lt;/span> &lt;span style="color:#f92672">*&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>linalg&lt;span style="color:#f92672">.&lt;/span>det(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="方法2">&lt;a href="#%e6%96%b9%e6%b3%952" class="header-anchor">&lt;/a>方法2
&lt;/h2>&lt;p>利用海伦公式&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">heron&lt;/span>(p):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p1, p2, p3 &lt;span style="color:#f92672">=&lt;/span> p
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a &lt;span style="color:#f92672">=&lt;/span> ((p1[&lt;span style="color:#ae81ff">0&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p2[&lt;span style="color:#ae81ff">0&lt;/span>])&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p1[&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p2[&lt;span style="color:#ae81ff">1&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p1[&lt;span style="color:#ae81ff">2&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p2[&lt;span style="color:#ae81ff">2&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> b &lt;span style="color:#f92672">=&lt;/span> ((p1[&lt;span style="color:#ae81ff">0&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">0&lt;/span>])&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p1[&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">1&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p1[&lt;span style="color:#ae81ff">2&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">2&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> c &lt;span style="color:#f92672">=&lt;/span> ((p2[&lt;span style="color:#ae81ff">0&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">0&lt;/span>])&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p2[&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">1&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">+&lt;/span>((p2[&lt;span style="color:#ae81ff">2&lt;/span>]&lt;span style="color:#f92672">-&lt;/span>p3[&lt;span style="color:#ae81ff">2&lt;/span>]))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> l &lt;span style="color:#f92672">=&lt;/span> (a&lt;span style="color:#f92672">+&lt;/span>b&lt;span style="color:#f92672">+&lt;/span>c)&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s &lt;span style="color:#f92672">=&lt;/span> (l&lt;span style="color:#f92672">*&lt;/span>(l&lt;span style="color:#f92672">-&lt;/span>a)&lt;span style="color:#f92672">*&lt;/span>(l&lt;span style="color:#f92672">-&lt;/span>b)&lt;span style="color:#f92672">*&lt;/span>(l&lt;span style="color:#f92672">-&lt;/span>c))&lt;span style="color:#f92672">**&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>blender脚本新建物体的方法</title><link>https://kizx.github.io/post/blender%E8%84%9A%E6%9C%AC%E6%96%B0%E5%BB%BA%E7%89%A9%E4%BD%93%E7%9A%84%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 08 Dec 2020 07:55:51 +0000</pubDate><guid>https://kizx.github.io/post/blender%E8%84%9A%E6%9C%AC%E6%96%B0%E5%BB%BA%E7%89%A9%E4%BD%93%E7%9A%84%E6%96%B9%E6%B3%95/</guid><description>&lt;p>blender插件脚本里新建物体的两种方法，其实本质上是一样的，这里做个记录以防日后忘记。&lt;/p>
&lt;h2 id="方法一">&lt;a href="#%e6%96%b9%e6%b3%95%e4%b8%80" class="header-anchor">&lt;/a>方法一
&lt;/h2>&lt;p>来自之前在网络上搜到的方法，是直接在data里新建物体并link到场景集合里。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">PointsImport&lt;/span>(bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Operator):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_idname &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;obj.import_points&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_label &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;导入点云&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_options &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;REGISTER&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;UNDO&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty(default&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;points&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path: bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty(subtype&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;FILE_PATH&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">execute&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> points &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>load(self&lt;span style="color:#f92672">.&lt;/span>path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> verts &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> points:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> verts&lt;span style="color:#f92672">.&lt;/span>append(tuple(i))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 新建mesh&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mymesh &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>data&lt;span style="color:#f92672">.&lt;/span>meshes&lt;span style="color:#f92672">.&lt;/span>new(self&lt;span style="color:#f92672">.&lt;/span>name)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mymesh&lt;span style="color:#f92672">.&lt;/span>from_pydata(verts, [], [])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mymesh&lt;span style="color:#f92672">.&lt;/span>update()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 新建object并添加到场景&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> myobject &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>data&lt;span style="color:#f92672">.&lt;/span>objects&lt;span style="color:#f92672">.&lt;/span>new(self&lt;span style="color:#f92672">.&lt;/span>name, mymesh)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bpy&lt;span style="color:#f92672">.&lt;/span>context&lt;span style="color:#f92672">.&lt;/span>scene&lt;span style="color:#f92672">.&lt;/span>collection&lt;span style="color:#f92672">.&lt;/span>objects&lt;span style="color:#f92672">.&lt;/span>link(myobject)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>report({&lt;span style="color:#e6db74">&amp;#39;INFO&amp;#39;&lt;/span>}, &lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;import &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>len(points)&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> points&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;FINISHED&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="方法二">&lt;a href="#%e6%96%b9%e6%b3%95%e4%ba%8c" class="header-anchor">&lt;/a>方法二
&lt;/h2>&lt;p>来自blender自带的demo，直接调用了object_data_add方法，是更正规的方法，需要注意的是需要继承AddObjectHelper&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> bpy
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> bpy.types &lt;span style="color:#f92672">import&lt;/span> Operator
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> bpy.props &lt;span style="color:#f92672">import&lt;/span> FloatVectorProperty
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> bpy_extras.object_utils &lt;span style="color:#f92672">import&lt;/span> AddObjectHelper, object_data_add
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> mathutils &lt;span style="color:#f92672">import&lt;/span> Vector
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">add_object&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> scale_x &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>scale&lt;span style="color:#f92672">.&lt;/span>x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> scale_y &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>scale&lt;span style="color:#f92672">.&lt;/span>y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> verts &lt;span style="color:#f92672">=&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Vector((&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_x, &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_y, &lt;span style="color:#ae81ff">0&lt;/span>)),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Vector((&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_x, &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_y, &lt;span style="color:#ae81ff">0&lt;/span>)),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Vector((&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_x, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_y, &lt;span style="color:#ae81ff">0&lt;/span>)),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Vector((&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_x, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">*&lt;/span> scale_y, &lt;span style="color:#ae81ff">0&lt;/span>)),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> edges &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> faces &lt;span style="color:#f92672">=&lt;/span> [[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mesh &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>data&lt;span style="color:#f92672">.&lt;/span>meshes&lt;span style="color:#f92672">.&lt;/span>new(name&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;New Object Mesh&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mesh&lt;span style="color:#f92672">.&lt;/span>from_pydata(verts, edges, faces)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># useful for development when the mesh may be invalid.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># mesh.validate(verbose=True)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> object_data_add(context, mesh, operator&lt;span style="color:#f92672">=&lt;/span>self)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">OBJECT_OT_add_object&lt;/span>(Operator, AddObjectHelper):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;Create a new Mesh Object&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_idname &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;mesh.add_object&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_label &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Add Mesh Object&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_options &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;REGISTER&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;UNDO&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> scale: FloatVectorProperty(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;scale&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default&lt;span style="color:#f92672">=&lt;/span>(&lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> subtype&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;TRANSLATION&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> description&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;scaling&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">execute&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> add_object(self, context)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;FINISHED&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>blender插件编写入门</title><link>https://kizx.github.io/post/blender%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E5%85%A5%E9%97%A8/</link><pubDate>Sat, 05 Dec 2020 14:12:00 +0000</pubDate><guid>https://kizx.github.io/post/blender%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E5%85%A5%E9%97%A8/</guid><description>&lt;p>都说blender的python脚本编写起来很简单，虽然已经能够在脚本里调用一些api实现自动化，但实际写成插件还是有很多东西需要摸索的，这里记录一些关键知识点。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>先将一些重要的和有益的参考或学习资料列一下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>一篇相当棒的入门教程
&lt;a class="link" href="https://www.bilibili.com/video/BV1kg4y1v7Um" target="_blank" rel="noopener"
>Blender Python小白向入门&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>主要是第2期和第3期杂志关于插件一节写的很棒
&lt;a class="link" href="https://www.blendercn.org/blendercn%e7%94%b5%e5%ad%90%e6%9d%82%e5%bf%97" target="_blank" rel="noopener"
>blendercn电子杂志&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>其中Quickstart部分不错，不过需要一定经验后回头看才能看的更明白，其他时候主要是当作字典查询，其中有许多example值得参考
&lt;a class="link" href="https://docs.blender.org/api/current/" target="_blank" rel="noopener"
>blenderAPI&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>blender软件中自带的Templates&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="概览">&lt;a href="#%e6%a6%82%e8%a7%88" class="header-anchor">&lt;/a>概览
&lt;/h2>&lt;p>blender插件大部分内容都是写在class中的，无论是新建一个api接口，还是绘制一个新的界面，都是新建一个class，然后继承相应的类，所以找到相应的类，是编写插件的第一步。
然后新写的类都要通过下面的注册函数register才能成为blender的一部分，有注册就有注销，注册函数在启用插件时激活，注销函数在取消启用插件时激活。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>bpy&lt;span style="color:#f92672">.&lt;/span>utils&lt;span style="color:#f92672">.&lt;/span>register_class(CLASS_NAME)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bpy&lt;span style="color:#f92672">.&lt;/span>utils&lt;span style="color:#f92672">.&lt;/span>unregister_class(CLASS_NAME)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面是一个在顶部添加语言切换功能的面板示例代码，关键的部分有继承bpy.types.Header，定义bl_space_type等内容，这些参数可以通过查阅api获取，或者从别人的代码参考过来，绘制界面就是重写draw()函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">LanguageChange&lt;/span>(bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Header):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_space_type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;TOPBAR&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_idname &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;MY_HT_LanguageChange&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">draw&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> context&lt;span style="color:#f92672">.&lt;/span>region&lt;span style="color:#f92672">.&lt;/span>alignment &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;RIGHT&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>layout&lt;span style="color:#f92672">.&lt;/span>prop(context&lt;span style="color:#f92672">.&lt;/span>preferences&lt;span style="color:#f92672">.&lt;/span>view,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;use_translate_interface&amp;#34;&lt;/span>, text&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Language&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>传入的context就表示当前上下文，通过打印dir(context)可知其包涵以下属性和方法：&lt;/p>
&lt;p>[&amp;rsquo;&lt;strong>doc&lt;/strong>&amp;rsquo;, &amp;lsquo;&lt;strong>module&lt;/strong>&amp;rsquo;, &amp;lsquo;&lt;strong>slots&lt;/strong>&amp;rsquo;, &amp;lsquo;active_annotation_layer&amp;rsquo;, &amp;lsquo;active_base&amp;rsquo;, &amp;lsquo;active_bone&amp;rsquo;, &amp;lsquo;active_editable_fcurve&amp;rsquo;, &amp;lsquo;active_gpencil_frame&amp;rsquo;, &amp;lsquo;active_gpencil_layer&amp;rsquo;, &amp;lsquo;active_object&amp;rsquo;, &amp;lsquo;active_operator&amp;rsquo;, &amp;lsquo;active_pose_bone&amp;rsquo;, &amp;lsquo;annotation_data&amp;rsquo;, &amp;lsquo;annotation_data_owner&amp;rsquo;, &amp;lsquo;area&amp;rsquo;, &amp;lsquo;bl_rna&amp;rsquo;, &amp;lsquo;blend_data&amp;rsquo;, &amp;lsquo;collection&amp;rsquo;, &amp;lsquo;copy&amp;rsquo;, &amp;rsquo;edit_object&amp;rsquo;, &amp;rsquo;editable_bones&amp;rsquo;, &amp;rsquo;editable_fcurves&amp;rsquo;, &amp;rsquo;editable_gpencil_layers&amp;rsquo;, &amp;rsquo;editable_gpencil_strokes&amp;rsquo;, &amp;rsquo;editable_objects&amp;rsquo;, &amp;rsquo;engine&amp;rsquo;, &amp;rsquo;evaluated_depsgraph_get&amp;rsquo;, &amp;lsquo;gizmo_group&amp;rsquo;, &amp;lsquo;gpencil_data&amp;rsquo;, &amp;lsquo;gpencil_data_owner&amp;rsquo;, &amp;lsquo;image_paint_object&amp;rsquo;, &amp;rsquo;layer_collection&amp;rsquo;, &amp;lsquo;mode&amp;rsquo;, &amp;lsquo;object&amp;rsquo;, &amp;lsquo;objects_in_mode&amp;rsquo;, &amp;lsquo;objects_in_mode_unique_data&amp;rsquo;, &amp;lsquo;particle_edit_object&amp;rsquo;, &amp;lsquo;pose_object&amp;rsquo;, &amp;lsquo;preferences&amp;rsquo;, &amp;lsquo;region&amp;rsquo;, &amp;lsquo;region_data&amp;rsquo;, &amp;lsquo;rna_type&amp;rsquo;, &amp;lsquo;scene&amp;rsquo;, &amp;lsquo;screen&amp;rsquo;, &amp;lsquo;sculpt_object&amp;rsquo;, &amp;lsquo;selectable_objects&amp;rsquo;, &amp;lsquo;selected_bones&amp;rsquo;, &amp;lsquo;selected_editable_bones&amp;rsquo;, &amp;lsquo;selected_editable_fcurves&amp;rsquo;, &amp;lsquo;selected_editable_objects&amp;rsquo;, &amp;lsquo;selected_editable_sequences&amp;rsquo;, &amp;lsquo;selected_nla_strips&amp;rsquo;, &amp;lsquo;selected_objects&amp;rsquo;, &amp;lsquo;selected_pose_bones&amp;rsquo;, &amp;lsquo;selected_pose_bones_from_active_object&amp;rsquo;, &amp;lsquo;selected_sequences&amp;rsquo;, &amp;lsquo;selected_visible_fcurves&amp;rsquo;, &amp;lsquo;sequences&amp;rsquo;, &amp;lsquo;space_data&amp;rsquo;, &amp;rsquo;tool_settings&amp;rsquo;, &amp;lsquo;vertex_paint_object&amp;rsquo;, &amp;lsquo;view_layer&amp;rsquo;, &amp;lsquo;visible_bones&amp;rsquo;, &amp;lsquo;visible_fcurves&amp;rsquo;, &amp;lsquo;visible_gpencil_layers&amp;rsquo;, &amp;lsquo;visible_objects&amp;rsquo;, &amp;lsquo;visible_pose_bones&amp;rsquo;, &amp;lsquo;weight_paint_object&amp;rsquo;, &amp;lsquo;window&amp;rsquo;, &amp;lsquo;window_manager&amp;rsquo;, &amp;lsquo;workspace&amp;rsquo;]&lt;/p>
&lt;p>界面布局layout就不细说了，&lt;code>prop&lt;/code>和&lt;code>operator&lt;/code>两个控件用的比较多，前者用于显示各种属性值，后者就是一个按钮，按下可以执行关联的的api，这两个控件也不细说了，可以查阅api文档。&lt;/p>
&lt;h2 id="自定义方法">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>自定义方法
&lt;/h2>&lt;p>到目前位置我们还只能调用blender已有的属性和方法的api，我们实现自己的功能必然需要新建一个自己的api，同样新建api也是新写一个类，如下所示，继承bpy.types.Operator，然后定义bl_idname等内容，执行的具体代码在execute()函数中编写，同样这个类写完后记得注册后才能调用。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">PointsImport&lt;/span>(bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Operator):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_idname &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;obj.import_points&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_label &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;导入点云&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_options &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;REGISTER&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;UNDO&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">execute&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;我的代码&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;FINISHED&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>调用的方法是在界面类里调用&lt;code>layout.operator(&amp;quot;obj.import_points&amp;quot;)&lt;/code>，可以看到，bl_idname 就是注册后api的名字。&lt;/p>
&lt;h2 id="自定义变量">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%98%e9%87%8f" class="header-anchor">&lt;/a>自定义变量
&lt;/h2>&lt;p>除了自定义方法，有时候我们还需要自定义变量，可以参考文档 &lt;a class="link" href="https://docs.blender.org/api/current/bpy.props.html" target="_blank" rel="noopener"
>https://docs.blender.org/api/current/bpy.props.html&lt;/a> 这一节，就是在方法的类中通过&lt;code>bpy.props.FloatProperty&lt;/code>等函数定义变量，调用的时候需要将实例赋值给一个变量，然后通过变量去调用和修改，可以参考文档的示例代码。&lt;/p>
&lt;p>有时候我们希望从界面视图中输入一个值，然后将这个值作为自定义api的一个输入参数，如果在界面中直接调用我们创建的方法的属性变量，你就会发现在界面中这个值只能显示出来而不能修改。&lt;/p>
&lt;p>要想获得一个可以在界面中修改的属性，需要在blender的data中创建一个数据，方法如下，在Scene中加入了一个变量，或者在WindowManager中添加一个变量，当然在其他数据块中添加变量也可以，添加的变量可以在blender api data面板中进行查看。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Scene&lt;span style="color:#f92672">.&lt;/span>points_name &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>WindowManager&lt;span style="color:#f92672">.&lt;/span>points_name &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后将这个值再赋值给方法的属性就可以了，参考我的下面代码。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyPanel&lt;/span>(bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Panel):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_label &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;面板&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 面板显示的名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_idname &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;MY_PT_Import&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 面板的id，每个面版类的id应保持唯一，建议格式大写NAME_PT_id&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_space_type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;VIEW_3D&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 面板所处的模式，&amp;#34;VIEW_3D&amp;#34;=3D视窗&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_region_type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;UI&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 面板所在的位置，&amp;#34;UI&amp;#34;=N面板&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bl_category &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;点云&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 面板所在的标签页&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Scene&lt;span style="color:#f92672">.&lt;/span>points_name &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty(default&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;yp&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bpy&lt;span style="color:#f92672">.&lt;/span>types&lt;span style="color:#f92672">.&lt;/span>Scene&lt;span style="color:#f92672">.&lt;/span>points_file_path &lt;span style="color:#f92672">=&lt;/span> bpy&lt;span style="color:#f92672">.&lt;/span>props&lt;span style="color:#f92672">.&lt;/span>StringProperty(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;C:\Users\kizx\Desktop\Projects\cv\ypa.npy&amp;#39;&lt;/span>, subtype&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;FILE_PATH&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">draw&lt;/span>(self, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> layout &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>layout
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> row &lt;span style="color:#f92672">=&lt;/span> layout&lt;span style="color:#f92672">.&lt;/span>row()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> row&lt;span style="color:#f92672">.&lt;/span>prop(context&lt;span style="color:#f92672">.&lt;/span>scene, &lt;span style="color:#e6db74">&amp;#34;points_name&amp;#34;&lt;/span>, text&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;名称&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> row &lt;span style="color:#f92672">=&lt;/span> layout&lt;span style="color:#f92672">.&lt;/span>row()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> row&lt;span style="color:#f92672">.&lt;/span>prop(context&lt;span style="color:#f92672">.&lt;/span>scene, &lt;span style="color:#e6db74">&amp;#34;points_file_path&amp;#34;&lt;/span>, text&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;点云文件&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> row &lt;span style="color:#f92672">=&lt;/span> layout&lt;span style="color:#f92672">.&lt;/span>row()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pc &lt;span style="color:#f92672">=&lt;/span> row&lt;span style="color:#f92672">.&lt;/span>operator(&lt;span style="color:#e6db74">&amp;#34;obj.import_points&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pc&lt;span style="color:#f92672">.&lt;/span>path &lt;span style="color:#f92672">=&lt;/span> context&lt;span style="color:#f92672">.&lt;/span>scene&lt;span style="color:#f92672">.&lt;/span>points_file_path
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pc&lt;span style="color:#f92672">.&lt;/span>name &lt;span style="color:#f92672">=&lt;/span> context&lt;span style="color:#f92672">.&lt;/span>scene&lt;span style="color:#f92672">.&lt;/span>points_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>blender脚本python代码自动补全方法</title><link>https://kizx.github.io/post/blender%E8%84%9A%E6%9C%ACpython%E4%BB%A3%E7%A0%81%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 19 Aug 2020 12:13:16 +0000</pubDate><guid>https://kizx.github.io/post/blender%E8%84%9A%E6%9C%ACpython%E4%BB%A3%E7%A0%81%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8%E6%96%B9%E6%B3%95/</guid><description>&lt;p>只要安装&lt;code>fake-bpy-module&lt;/code>这个模块就可以实现代码自动补全了，正如其名，这个库只用于代码提示补全作用，并不具备任何实质可运行代码。&lt;/p>
&lt;h2 id="pip安装">&lt;a href="#pip%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>pip安装
&lt;/h2>&lt;p>如果你编程时使用的是自己的python坏境，那么使用以下的pip命令安装即可。&lt;/p>
&lt;pre tabindex="0">&lt;code>pip install fake-bpy-module- &amp;lt;version&amp;gt;
# version: 2.78|2.79|2.80|2.81|2.82|2.83
# e.g.
pip install fake-bpy-module-2.80
&lt;/code>&lt;/pre>&lt;h2 id="手动安装">&lt;a href="#%e6%89%8b%e5%8a%a8%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>手动安装
&lt;/h2>&lt;p>如果你用的是blender自带的python坏境，不好用pip进行安装，此时只能手动安装了。&lt;/p>
&lt;h3 id="vscode">&lt;a href="#vscode" class="header-anchor">&lt;/a>vscode
&lt;/h3>&lt;p>从 &lt;a class="link" href="https://github.com/nutti/fake-bpy-module/releases" target="_blank" rel="noopener"
>https://github.com/nutti/fake-bpy-module/releases&lt;/a> 页面下载对应版本的包并解压，打开vscode，&lt;code>Ctrl+Shift+P&lt;/code>搜索&lt;code>Settings&lt;/code>打开工作区设置（打开设置文件setting.json），设置以下内容，其中填写刚才解压的路径。&lt;/p>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;python.autoComplete.extraPaths&amp;#34;: [
&amp;#34;&amp;lt;path-to-generated-modules&amp;gt;&amp;#34;
]
}
&lt;/code>&lt;/pre>&lt;p>保存后重启vscode就行了。&lt;/p>
&lt;h3 id="pycharm">&lt;a href="#pycharm" class="header-anchor">&lt;/a>pycharm
&lt;/h3>&lt;p>日后补充&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://github.com/nutti/fake-bpy-module" target="_blank" rel="noopener"
>https://github.com/nutti/fake-bpy-module&lt;/a>&lt;/p></description></item><item><title>在vscode中开发blender插件和脚本</title><link>https://kizx.github.io/post/%E5%9C%A8vscode%E4%B8%AD%E5%BC%80%E5%8F%91blender%E6%8F%92%E4%BB%B6%E5%92%8C%E8%84%9A%E6%9C%AC/</link><pubDate>Tue, 18 Aug 2020 14:50:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%9C%A8vscode%E4%B8%AD%E5%BC%80%E5%8F%91blender%E6%8F%92%E4%BB%B6%E5%92%8C%E8%84%9A%E6%9C%AC/</guid><description>&lt;p>用blender内置的文本编辑器来编写代码体验实在是太糟糕了，利用JacquesLucke大神编写的vscode插件&lt;code>Blender Development&lt;/code>就可以开心的在vscode里编写代码了。
打开vscode在插件市场里搜索&lt;code>Blender Development&lt;/code>安装即可，该插件依赖于&lt;code>python&lt;/code>和&lt;code>C/C++&lt;/code>插件，安装时会自动安装依赖，如果没有安装请手动安装。&lt;/p>
&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2020/08/615827561.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="使用">&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>使用
&lt;/h2>&lt;h3 id="插件">&lt;a href="#%e6%8f%92%e4%bb%b6" class="header-anchor">&lt;/a>插件
&lt;/h3>&lt;p>&lt;code>ctrl+shift+P&lt;/code>打开控制台，输入&lt;code>blender&lt;/code>就能看到本插件的所有命令，点击&lt;code>Blender: New Addon&lt;/code>，弹出模板选项，可以选择&lt;code>Simple&lt;/code>简单模板或者&lt;code>WithAutoLoad&lt;/code>模板。然后输入插件名和作者名，最后给插件选择一个目录，一个插件模板就新建成功了。&lt;/p>
&lt;p>如果你选的是&lt;code>Simple&lt;/code>模板，那么就只会生成一个&lt;code>__init__.py&lt;/code>，如果你选择的是&lt;code>WithAutoLoad&lt;/code>模板，会生成&lt;code>__init__.py&lt;/code>、&lt;code>auto_load.py&lt;/code>、&lt;code>operators.py&lt;/code>三个文件，两个模板的主要区别在于后者会自动注册&lt;code>register()&lt;/code>和注销&lt;code>unregister()&lt;/code>operators.py中的类，当然我们我们自己写一下注册方法也不是多麻烦。&lt;/p>
&lt;p>代码有了，下面就是如何联合blender了，我们都知道blender里自带一个python解释器，首先我们应该在vscode中点击左下角的python解释器选择blender安装文件夹里的python.exe作为解释器，这个路径一般形如 &lt;code>\blender-2.83.0-windows64\2.83\python\bin\python.exe&lt;/code>。当然你不用blender自带的解释器也行，但是需要在vscode设置里打开&lt;code>blender.allowModifyExternalPython&lt;/code>，允许后面自动下载依赖库。&lt;/p>
&lt;p>然后&lt;code>ctrl+shift+P&lt;/code>打开控制台，搜索执行&lt;code>Blender: Start&lt;/code>命令，这时选择你的blender.exe，一切正常的话，程序会自动下载&lt;code>ptvsd&lt;/code>、&lt;code>flask&lt;/code>、&lt;code>requests&lt;/code>几个库，所以第一次启动会慢点，如果你卡在这里的话，一般是网络原因，请尝试更新pip、更换pip镜像源，再不济手动安装这些库。&lt;/p>
&lt;p>[post cid=&amp;ldquo;156&amp;rdquo; cover=&amp;ldquo;http://&amp;rdquo;/]&lt;/p>
&lt;p>启动blender后，打开N面板有一个Dev的面板就说明成功了。&lt;/p>
&lt;p>&lt;img src="https://www.2bboy.com/usr/uploads/2020/08/2078653010.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="保存自动刷新">&lt;a href="#%e4%bf%9d%e5%ad%98%e8%87%aa%e5%8a%a8%e5%88%b7%e6%96%b0" class="header-anchor">&lt;/a>保存自动刷新
&lt;/h3>&lt;p>当我们更改代码后，我们总是希望已保存代码blender那边就立马更新，只需要在vscode设置里打开&lt;code>blender.addon.reloadOnSave&lt;/code>即可。&lt;/p>
&lt;h3 id="脚本">&lt;a href="#%e8%84%9a%e6%9c%ac" class="header-anchor">&lt;/a>脚本
&lt;/h3>&lt;p>插件还提供了快速脚本功能，脚本就是类似于直接在blender交互式命令行直接输入命令，不用像写插件一样那么麻烦了，&lt;code>ctrl+shift+P&lt;/code>打开控制台选择&lt;code>Blender: New Script&lt;/code>就可以新建一个脚本，然后通过&lt;code>Blender: Start&lt;/code>打开blender，运行脚本用&lt;code>Blender: Run Script&lt;/code>命令，不过我测试了下这个脚本命令写的一不留神一运行就闪退了，感觉不如在blender的文本编辑器里好用。&lt;/p>
&lt;h3 id="更改上下文">&lt;a href="#%e6%9b%b4%e6%94%b9%e4%b8%8a%e4%b8%8b%e6%96%87" class="header-anchor">&lt;/a>更改上下文
&lt;/h3>&lt;p>有时脚本需要特定的模式下，通过&lt;code>Blender: Set Script Context&lt;/code>命令可以设置形如&lt;code>#context.area: VIEW_3D&lt;/code>的注释来达到控制上下文的作用。&lt;/p>
&lt;h3 id="debug">&lt;a href="#debug" class="header-anchor">&lt;/a>Debug
&lt;/h3>&lt;p>用vscode的一大好处在于可以打断点进行debug，这些都是vscode的基本操作就不说了。&lt;/p>
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>vscode插件更新到0.0.15版本后，只能适配blender2.92及以上版本，如果还用小于2.92的版本，就需要安装0.0.14版本的插件，并禁用vscode插件自动更新功能。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://github.com/JacquesLucke/blender_vscode" target="_blank" rel="noopener"
>https://github.com/JacquesLucke/blender_vscode&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.bilibili.com/video/BV1EJ41187hT" target="_blank" rel="noopener"
>https://www.bilibili.com/video/BV1EJ41187hT&lt;/a>&lt;/p></description></item><item><title>image.png</title><link>https://kizx.github.io/post/image.png/</link><pubDate>Tue, 18 Aug 2020 14:24:52 +0000</pubDate><guid>https://kizx.github.io/post/image.png/</guid><description>&lt;p>a:5:{s:4:&amp;ldquo;name&amp;rdquo;;s:9:&amp;ldquo;image.png&amp;rdquo;;s:4:&amp;ldquo;path&amp;rdquo;;s:35:&amp;quot;/usr/uploads/2020/08/2078653010.png&amp;quot;;s:4:&amp;ldquo;size&amp;rdquo;;i:17900;s:4:&amp;ldquo;type&amp;rdquo;;s:3:&amp;ldquo;png&amp;rdquo;;s:4:&amp;ldquo;mime&amp;rdquo;;s:9:&amp;ldquo;image/png&amp;rdquo;;}&lt;/p></description></item><item><title>numpy数组拼接</title><link>https://kizx.github.io/post/numpy%E6%95%B0%E7%BB%84%E6%8B%BC%E6%8E%A5/</link><pubDate>Tue, 11 Aug 2020 10:36:00 +0000</pubDate><guid>https://kizx.github.io/post/numpy%E6%95%B0%E7%BB%84%E6%8B%BC%E6%8E%A5/</guid><description>&lt;p>numpy中可用于拼接的函数有：&lt;/p>
&lt;ul>
&lt;li>append(arr, values, axis=None)&lt;/li>
&lt;li>concatenate((a1, a2, &amp;hellip;), axis=0, out=None)&lt;/li>
&lt;li>stack(arrays, axis=0, out=None)&lt;/li>
&lt;li>hstack(tup)&lt;/li>
&lt;li>vstack(tup)&lt;/li>
&lt;li>dstack(tup)&lt;/li>
&lt;/ul>
&lt;p>使用时需要注意的是除了append都需要以tup形式传入，axis=0表示按行拼接，axis=1表示按列拼接，拼接时需要注意数组形状要匹配。&lt;/p>
&lt;h2 id="测试代码">&lt;a href="#%e6%b5%8b%e8%af%95%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>测试代码
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>append(a, b) &lt;span style="color:#75715e"># 其实底层调用concatenate()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([1, 2, 3, 1, 2, 3, 4, 5, 6])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>append(a, b, axis&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>) &lt;span style="color:#75715e"># 必须保证列数一样&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [4, 5, 6]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>append(a, a, axis&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#75715e"># 必须保证行数一样&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3, 1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3, 1, 2, 3]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>concatenate((a, b)) &lt;span style="color:#75715e"># 默认axis=0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>concatenate((a, b), axis&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [4, 5, 6]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>concatenate((a, a), axis&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3, 1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3, 1, 2, 3]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>stack((a, a)) &lt;span style="color:#75715e"># 会增加一个维度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[[1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3]],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [[1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3]]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>stack((b, b), axis&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[[4, 5, 6],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [4, 5, 6]]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>hstack((a, a)) &lt;span style="color:#75715e"># 水平拼接&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3, 1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3, 1, 2, 3]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>vstack((a, a)) &lt;span style="color:#75715e"># 垂直拼接&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [1, 2, 3]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>dstack((a, a)) &lt;span style="color:#75715e"># 会增加维度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[[1, 1],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [2, 2],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [3, 3]],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [[1, 1],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [2, 2],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [3, 3]]])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>np&lt;span style="color:#f92672">.&lt;/span>dstack((b, b))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># array([[[4, 4],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [5, 5],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># [6, 6]]])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/guofei_fly/article/details/85485173" target="_blank" rel="noopener"
>https://blog.csdn.net/guofei_fly/article/details/85485173&lt;/a>&lt;/p></description></item><item><title>电脑连接手机摄像头</title><link>https://kizx.github.io/post/%E7%94%B5%E8%84%91%E8%BF%9E%E6%8E%A5%E6%89%8B%E6%9C%BA%E6%91%84%E5%83%8F%E5%A4%B4/</link><pubDate>Wed, 29 Jul 2020 07:01:19 +0000</pubDate><guid>https://kizx.github.io/post/%E7%94%B5%E8%84%91%E8%BF%9E%E6%8E%A5%E6%89%8B%E6%9C%BA%E6%91%84%E5%83%8F%E5%A4%B4/</guid><description>&lt;p>台式机没有摄像头，有时候有些代码会调用摄像头，比如下面的项目有用到面部捕捉，这时候拿手机充当摄像头是个不错的选择。&lt;/p>
&lt;p>[post cid=&amp;ldquo;147&amp;rdquo; cover=&amp;quot;&amp;quot;/]&lt;/p>
&lt;h2 id="软件">&lt;a href="#%e8%bd%af%e4%bb%b6" class="header-anchor">&lt;/a>软件
&lt;/h2>&lt;p>百度搜索 &lt;code>iVCam&lt;/code> 下载安装即可，手机上也要扫码安装相应的客户端。连接前必须保证手机和电脑处在同一个局域网中，如果手机搜索不到电脑，可以手动输入电脑的局域网ipv4地址（通过cmd窗口 &lt;code>ipconfig&lt;/code>命令可以查看）。&lt;/p>
&lt;h2 id="捕获">&lt;a href="#%e6%8d%95%e8%8e%b7" class="header-anchor">&lt;/a>捕获
&lt;/h2>&lt;p>之前的那个项目是使用OpenCV的api捕获摄像头的，默认摄像头的设备id为0，但用这个软件进行捕获时可能也为1或者更大的数字。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>video_capture &lt;span style="color:#f92672">=&lt;/span> cv2&lt;span style="color:#f92672">.&lt;/span>VideoCapture(&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#75715e"># 摄像头id可能不为0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>单层离散Hopfield神经网络(DHNN)程序实现</title><link>https://kizx.github.io/post/%E5%8D%95%E5%B1%82%E7%A6%BB%E6%95%A3hopfield%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9Cdhnn%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%8E%B0/</link><pubDate>Fri, 03 Jul 2020 08:09:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%8D%95%E5%B1%82%E7%A6%BB%E6%95%A3hopfield%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9Cdhnn%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p>DHNN网络由n个神经元组成，每个神经元取值为1或-1。
&lt;img src="https://pan.2bboy.com/img/2020/07/0703152535.png"
loading="lazy"
>&lt;/p>
&lt;p>每个神经元既是输入，也是输出，如果采用异步更新的策略，每次只更新一个神经元，更新顺序可以任意。激活函数为符号函数，大于等于零激活为1，反之为-1，每个神经元没有自反馈，即权重矩阵对角线为零。
&lt;img src="https://pan.2bboy.com/img/2020/07/0703152908.png"
loading="lazy"
>&lt;/p>
&lt;p>DHNN输入一个值后，神经元状态不断更新后最终会收敛于某个“吸引子”。“吸引子”就是网络存储的记忆，是通过网络权重存储的。网络权重的计算方法一般有下面两种：联立方程求解法和外积和法。一般后面的方法用得较多。
DHNN网络是批学习网络，一次性输入样本一次性学习。输入的样本即“吸引子”，若样本值两两正交，则网络最稳定，理论上样本数上限为n。但一般很难做到两两正交，减少样本数（p&amp;lt;0.14n）可以提高抗畸变性，否则会出现“伪吸引子”。
&lt;img src="https://pan.2bboy.com/img/2020/07/0703153451.png"
loading="lazy"
>&lt;/p>
&lt;p>DHNN网络可以靠下面的能量函数判断收敛状态，随着网络更新，能量函数处于递减趋势。
&lt;img src="https://pan.2bboy.com/img/2020/07/0703154113.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="程序实现">&lt;a href="#%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0" class="header-anchor">&lt;/a>程序实现
&lt;/h2>&lt;p>下面是一个简单的python实现程序，可以输入简单样本和预测目标后进行不断更新。
[button color=&amp;ldquo;primary&amp;rdquo; icon=&amp;ldquo;fa fa-github&amp;rdquo; url=&amp;ldquo;https://github.com/kizx/DHNN&amp;rdquo; type=&amp;quot;&amp;quot;]Github地址[/button]&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">sgn&lt;/span>(x):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;激活函数&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> y &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> x &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">DHNN&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, v0, tra):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;初始化&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>n &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>size(v0) &lt;span style="color:#75715e"># 神经元个数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>W &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>diag(np&lt;span style="color:#f92672">.&lt;/span>zeros(self&lt;span style="color:#f92672">.&lt;/span>n)) &lt;span style="color:#75715e"># 权矩阵 对角线元素为零的对称矩阵&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>V &lt;span style="color:#f92672">=&lt;/span> v0 &lt;span style="color:#75715e"># 神经元状态 取值:{-1,1}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>Ip &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>zeros(self&lt;span style="color:#f92672">.&lt;/span>n) &lt;span style="color:#75715e"># 偏置矢量&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>T &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>zeros(self&lt;span style="color:#f92672">.&lt;/span>n) &lt;span style="color:#75715e"># 阈值矢量&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>train(tra)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">update&lt;/span>(self, i):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;网络更新&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> net &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dot(self&lt;span style="color:#f92672">.&lt;/span>V, self&lt;span style="color:#f92672">.&lt;/span>W[:, i]) &lt;span style="color:#f92672">+&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>Ip[i] &lt;span style="color:#f92672">-&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>T[i]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>V[i] &lt;span style="color:#f92672">=&lt;/span> sgn(net)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> E &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">*&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dot(np&lt;span style="color:#f92672">.&lt;/span>dot(self&lt;span style="color:#f92672">.&lt;/span>V&lt;span style="color:#f92672">.&lt;/span>T, self&lt;span style="color:#f92672">.&lt;/span>W), self&lt;span style="color:#f92672">.&lt;/span>V) &lt;span style="color:#f92672">-&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dot(self&lt;span style="color:#f92672">.&lt;/span>Ip&lt;span style="color:#f92672">.&lt;/span>T, self&lt;span style="color:#f92672">.&lt;/span>V) &lt;span style="color:#f92672">+&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dot(self&lt;span style="color:#f92672">.&lt;/span>T&lt;span style="color:#f92672">.&lt;/span>T, self&lt;span style="color:#f92672">.&lt;/span>V)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># print(&amp;#39;能量&amp;#39;, E)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># print(&amp;#39;状态&amp;#39;, self.V)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> E, sgn(net)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">train&lt;/span>(self, sample):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;网络权重计算（记忆存储）&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> S &lt;span style="color:#f92672">=&lt;/span> sample
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(self&lt;span style="color:#f92672">.&lt;/span>n):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> j &lt;span style="color:#f92672">in&lt;/span> range(self&lt;span style="color:#f92672">.&lt;/span>n):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> delta &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> i &lt;span style="color:#f92672">==&lt;/span> j &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> m &lt;span style="color:#f92672">in&lt;/span> S:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a_ &lt;span style="color:#f92672">=&lt;/span> m[i] &lt;span style="color:#f92672">*&lt;/span> m[j]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a&lt;span style="color:#f92672">.&lt;/span>append(a_)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>W[i, j] &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">-&lt;/span> delta) &lt;span style="color:#f92672">*&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>sum(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;权重&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>, self&lt;span style="color:#f92672">.&lt;/span>W)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;__main__&amp;#39;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> St &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test &lt;span style="color:#f92672">=&lt;/span> DHNN(np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>]), St)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test&lt;span style="color:#f92672">.&lt;/span>update(&lt;span style="color:#ae81ff">3&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上面这个程序我还做了一个gui界面用于上课演示。
&lt;img src="https://pan.2bboy.com/img/2020/07/0703155000.png"
loading="lazy"
>
当我将上面的程序用于手写数字识别时，图片采用16*16共256个神经元，当样本数量小于4个时，还有点效果，当样本数多了之后，某些“伪吸引子”和样本的吸引力实在太强导致网络效果极差。想必用于实际用途需要更多的改进算法。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://zhuanlan.zhihu.com/p/144624580" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/144624580&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/qq_41185868/article/details/80789989" target="_blank" rel="noopener"
>https://blog.csdn.net/qq_41185868/article/details/80789989&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/weixin_42398658/article/details/84027012" target="_blank" rel="noopener"
>https://blog.csdn.net/weixin_42398658/article/details/84027012&lt;/a>
&lt;a class="link" href="https://space.bilibili.com/529985682/video" target="_blank" rel="noopener"
>https://space.bilibili.com/529985682/video&lt;/a>&lt;/p></description></item><item><title>再谈Python读取stl模型</title><link>https://kizx.github.io/post/%E5%86%8D%E8%B0%88python%E8%AF%BB%E5%8F%96stl%E6%A8%A1%E5%9E%8B/</link><pubDate>Sun, 14 Jun 2020 14:28:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%86%8D%E8%B0%88python%E8%AF%BB%E5%8F%96stl%E6%A8%A1%E5%9E%8B/</guid><description>&lt;p>[post cid=&amp;ldquo;184&amp;rdquo; /]
前面借助vtk库实现读取stl模型，不过这有点杀鸡牛刀了，因为stl模型本身并不复杂，参考&lt;a class="link" href="https://blog.csdn.net/qq_28249373/article/details/75368441" target="_blank" rel="noopener"
>这篇文章&lt;/a>。自己手写一个读取stl的程序也很简单，但我就是懒得写怎么办 ::aru:cryingface::&lt;/p>
&lt;h2 id="stl库">&lt;a href="#stl%e5%ba%93" class="header-anchor">&lt;/a>stl库
&lt;/h2>&lt;p>其实前面已经尝试过用这个库了，但是当时总是报错。这个库还有个&lt;a class="link" href="https://python-stl.readthedocs.io/en/latest/reading.html" target="_blank" rel="noopener"
>官方文档&lt;/a>，之所以报错是因为这个库太老了，也没人维护。但知道了读取stl的原理后就好办了，把源码修改几处就可以在py3环境下使用了，以下是测试代码 。&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-pyhton" data-lang="pyhton">import stl
with open(&amp;#39;kiki.stl&amp;#39;, &amp;#39;rb&amp;#39;) as f:
kiki = stl.read_binary_file(f)
print(kiki.facets[0].normal, kiki.facets[0].vertices)
print(kiki.name)
&lt;/code>&lt;/pre>&lt;p>其实修改也很简单，把下面后面的strip去掉后，再将两处xrange改成range就行了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># return struct.unpack(&amp;#39;80s&amp;#39;, bytes)[0].strip(&amp;#39;\0&amp;#39;)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">return&lt;/span> struct&lt;span style="color:#f92672">.&lt;/span>unpack(&lt;span style="color:#e6db74">&amp;#39;80s&amp;#39;&lt;/span>, bytes)[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="numpy-stl库">&lt;a href="#numpy-stl%e5%ba%93" class="header-anchor">&lt;/a>numpy-stl库
&lt;/h2>&lt;p>最好用的东西当然得放最后面，这个库依赖于numpy，功能丰富，可读取、修改、保存stl模型，不过要注意的是这里import的包名也是stl，和上面的包名是一样的，要先卸载上面的stl包再安装numpy-stl。
官方文档：https://pythonhosted.org/numpy-stl/usage.html&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> stl &lt;span style="color:#f92672">import&lt;/span> mesh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>your_mesh &lt;span style="color:#f92672">=&lt;/span> mesh&lt;span style="color:#f92672">.&lt;/span>Mesh&lt;span style="color:#f92672">.&lt;/span>from_file(&lt;span style="color:#e6db74">&amp;#39;cube.stl&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;法线&amp;#39;&lt;/span>, your_mesh&lt;span style="color:#f92672">.&lt;/span>normals)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;点&amp;#39;&lt;/span>, your_mesh&lt;span style="color:#f92672">.&lt;/span>points)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;v0表示三角面第一个点&amp;#39;&lt;/span>, your_mesh&lt;span style="color:#f92672">.&lt;/span>v0)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;x表示所有点的x坐标&amp;#39;&lt;/span>, your_mesh&lt;span style="color:#f92672">.&lt;/span>x)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Python读取stl模型并获取点坐标值</title><link>https://kizx.github.io/post/python%E8%AF%BB%E5%8F%96stl%E6%A8%A1%E5%9E%8B%E5%B9%B6%E8%8E%B7%E5%8F%96%E7%82%B9%E5%9D%90%E6%A0%87%E5%80%BC/</link><pubDate>Sat, 13 Jun 2020 16:03:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E8%AF%BB%E5%8F%96stl%E6%A8%A1%E5%9E%8B%E5%B9%B6%E8%8E%B7%E5%8F%96%E7%82%B9%E5%9D%90%E6%A0%87%E5%80%BC/</guid><description>&lt;p>本来以为python应该有个专门的库用来读取stl模型，实际上也的确有个叫 &lt;code>stl&lt;/code>的库，不过经测试这个库完全没法用(或许是我不会用？)。
后来发现vtk库可以读取并显示stl模型，查了一下vtk无法直接pip安装，需要手动下载whl &lt;a class="link" href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#vtk" target="_blank" rel="noopener"
>https://www.lfd.uci.edu/~gohlke/pythonlibs/#vtk&lt;/a>，下载时根据自己python版本下载就行了，下载完进入工程venv环境进行pip安装。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>pip install VTK&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span>&lt;span style="color:#ae81ff">8.2.0&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span>cp37&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span>cp37m&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span>win32&lt;span style="color:#f92672">.&lt;/span>whl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="读取代码">&lt;a href="#%e8%af%bb%e5%8f%96%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>读取代码
&lt;/h2>&lt;p>关于vtk库，我只是听说过但从来没用过，反正照着下面的代码可以正常读取stl模型，然后输出所有顶点坐标并显示出来。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> vtk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Read from file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stlreader &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkSTLReader()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stlreader&lt;span style="color:#f92672">.&lt;/span>SetFileName(&lt;span style="color:#e6db74">&amp;#34;cube.stl&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 输出所有点坐标&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stlreader&lt;span style="color:#f92672">.&lt;/span>Update()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stlMapper &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkPolyDataMapper()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stlMapper&lt;span style="color:#f92672">.&lt;/span>SetInputConnection(stlreader&lt;span style="color:#f92672">.&lt;/span>GetOutputPort())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>polydata &lt;span style="color:#f92672">=&lt;/span> stlreader&lt;span style="color:#f92672">.&lt;/span>GetOutput()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(polydata&lt;span style="color:#f92672">.&lt;/span>GetNumberOfPoints()):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> polydata&lt;span style="color:#f92672">.&lt;/span>GetPoint(i, p)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(p)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cylinderMapper &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkPolyDataMapper() &lt;span style="color:#75715e"># 渲染多边形几何数据&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cylinderMapper&lt;span style="color:#f92672">.&lt;/span>SetInputConnection(stlreader&lt;span style="color:#f92672">.&lt;/span>GetOutputPort()) &lt;span style="color:#75715e"># VTK可视化管线的输入数据接口 ，对应的可视化管线输出数据的接口为GetOutputPort()；&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cylinderActor &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkActor()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cylinderActor&lt;span style="color:#f92672">.&lt;/span>SetMapper(cylinderMapper) &lt;span style="color:#75715e"># 设置生成几何图元的Mapper。即连接一个Actor到可视化管线的末端(可视化管线的末端就是Mapper)。&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renderer &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkRenderer() &lt;span style="color:#75715e"># 负责管理场景的渲染过程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renderer&lt;span style="color:#f92672">.&lt;/span>AddActor(cylinderActor)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renderer&lt;span style="color:#f92672">.&lt;/span>SetBackground(&lt;span style="color:#ae81ff">0.1&lt;/span>, &lt;span style="color:#ae81ff">0.2&lt;/span>, &lt;span style="color:#ae81ff">0.4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renWin &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkRenderWindow() &lt;span style="color:#75715e"># 将操作系统与VTK渲染引擎连接到一起。&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renWin&lt;span style="color:#f92672">.&lt;/span>AddRenderer(renderer)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>renWin&lt;span style="color:#f92672">.&lt;/span>SetSize(&lt;span style="color:#ae81ff">300&lt;/span>, &lt;span style="color:#ae81ff">300&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iren &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkRenderWindowInteractor() &lt;span style="color:#75715e"># 提供平台独立的响应鼠标、键盘和时钟事件的交互机制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iren&lt;span style="color:#f92672">.&lt;/span>SetRenderWindow(renWin)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 交互器样式的一种，该样式下，用户是通过控制相机对物体作旋转、放大、缩小等操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>style &lt;span style="color:#f92672">=&lt;/span> vtk&lt;span style="color:#f92672">.&lt;/span>vtkInteractorStyleTrackballCamera()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iren&lt;span style="color:#f92672">.&lt;/span>SetInteractorStyle(style)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iren&lt;span style="color:#f92672">.&lt;/span>Initialize()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iren&lt;span style="color:#f92672">.&lt;/span>Start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Clean up&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># del cylinder&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> stlreader
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> cylinderMapper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> cylinderActor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> renderer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> renWin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">del&lt;/span> iren
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>其实stl文件有两种编码，一种是Ascall模式，可以直接用记事本打开，其中按规定记录了模型信息，如果能掌握这种规定的话，直接通过文本读取就可以获取坐标信息了，另外一种格式是二进制格式，这个就没法用记事本打开了，不过肯定也是按某种规定编码的。
[post cid=&amp;ldquo;185&amp;rdquo; /]&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/weixin_33850890/article/details/86395967" target="_blank" rel="noopener"
>VTK中获取STL模型点的坐标以及对其进行变换&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/genispan/article/details/79593913?utm_source=blogxgwz5" target="_blank" rel="noopener"
>从文件读取STL数据&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/donglany/article/details/78583380" target="_blank" rel="noopener"
>Python配置VTK库&lt;/a>&lt;/p></description></item><item><title>CLion编译运行OpenGL项目</title><link>https://kizx.github.io/post/clion%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8Copengl%E9%A1%B9%E7%9B%AE/</link><pubDate>Thu, 04 Jun 2020 13:31:51 +0000</pubDate><guid>https://kizx.github.io/post/clion%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8Copengl%E9%A1%B9%E7%9B%AE/</guid><description>&lt;p>前面已经用Visual Studio成功运行了OpenGL了，但是VS的界面比较丑，而且代码提示和补全等各方面不够人性化（主要是我不习惯），相比之下，JB家的CLion虽然运行上慢一点，bug多一点，配置麻烦一点（喂！这缺点太多了吧），但是为了颜值和流畅的编程体验，用一下也不是不可以。&lt;/p>
&lt;h2 id="配置">&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>配置
&lt;/h2>&lt;p>安装什么的就不说了，新建一个项目，Clion会自动生成一个&lt;code>CMakeLists.txt&lt;/code>和&lt;code>main.cpp&lt;/code>，点击运行没毛病，那就进入opengl的环境配置。
我这里用的是glut库，别的库参照着配置问题应该不大。在vs里我们是通过右键项目属性设置“三大件”的，但CLion是通过cmake来管理编译和链接的，只能通过手写CMakelists来进行配置。其实配置思路都差不多，手写配置还可以更清晰。
以下是&lt;code>CMakeLists.txt&lt;/code>内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmake" data-lang="cmake">&lt;span style="display:flex;">&lt;span>cmake_minimum_required(&lt;span style="color:#e6db74">VERSION&lt;/span> &lt;span style="color:#e6db74">3.16&lt;/span>)&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>project(&lt;span style="color:#e6db74">gl_demo&lt;/span>)&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>set(&lt;span style="color:#e6db74">CMAKE_CXX_STANDARD&lt;/span> &lt;span style="color:#e6db74">14&lt;/span>)&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>include_directories(&lt;span style="color:#e6db74">C:/dev/glut/include&lt;/span>) &lt;span style="color:#75715e"># 添加include头文件目录
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>link_directories(&lt;span style="color:#e6db74">C:/dev//glut/lib&lt;/span>) &lt;span style="color:#75715e"># 添加lib库目录
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>add_executable(&lt;span style="color:#e6db74">gl_demo&lt;/span> &lt;span style="color:#e6db74">main.cpp&lt;/span>)&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>target_link_libraries(&lt;span style="color:#e6db74">gl_demo&lt;/span> &lt;span style="color:#e6db74">glut32.lib&lt;/span> &lt;span style="color:#e6db74">opengl32.lib&lt;/span>) &lt;span style="color:#75715e"># 添加链接的具体lib项
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下是demo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Lines.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// OpenGL SuperBible, Chapter 4
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Demonstrates primitive GL_LINES
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Program by Richard S. Wright Jr.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;gl/glut.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;math.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Define a constant for the value of PI
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#75715e">#define GL_PI 3.1415f
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Rotation amounts
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">static&lt;/span> GLfloat xRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">static&lt;/span> GLfloat yRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Called to draw scene
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">RenderScene&lt;/span>(&lt;span style="color:#66d9ef">void&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLfloat x, y, z, angle; &lt;span style="color:#75715e">// Storage for coordinates and angles
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Clear the window with current clearing color
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glClear(GL_COLOR_BUFFER_BIT);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Save matrix state and do the rotation
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glPushMatrix();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glRotatef(xRot, &lt;span style="color:#ae81ff">1.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glRotatef(yRot, &lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">1.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Call only once for all remaining points
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glBegin(GL_LINES);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> z &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (angle &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>; angle &lt;span style="color:#f92672">&amp;lt;=&lt;/span> GL_PI &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">3.0f&lt;/span>; angle &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">0.5f&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Top half of the circle
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> x &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">50.0f&lt;/span> &lt;span style="color:#f92672">*&lt;/span> cos(angle);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> y &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">50.0f&lt;/span> &lt;span style="color:#f92672">*&lt;/span> sin(angle);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(x, y, z);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Bottom half of the circle
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> x &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">50.0f&lt;/span> &lt;span style="color:#f92672">*&lt;/span> cos(angle &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">3.1415f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> y &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">50.0f&lt;/span> &lt;span style="color:#f92672">*&lt;/span> sin(angle &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">3.1415f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(x, y, z);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Done drawing points
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glEnd();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Restore transformations
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glPopMatrix();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Flush drawing commands
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glutSwapBuffers();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// This function does any needed initialization on the rendering
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">SetupRC&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Black background
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glClearColor(&lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">1.0f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Set drawing color to green
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glColor3f(&lt;span style="color:#ae81ff">0.0f&lt;/span>, &lt;span style="color:#ae81ff">1.0f&lt;/span>, &lt;span style="color:#ae81ff">0.0f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">SpecialKeys&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> key, &lt;span style="color:#66d9ef">int&lt;/span> x, &lt;span style="color:#66d9ef">int&lt;/span> y) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> GLUT_KEY_UP)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> GLUT_KEY_DOWN)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> GLUT_KEY_LEFT)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> GLUT_KEY_RIGHT)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">356.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">355.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">356.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">355.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Refresh the Window
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glutPostRedisplay();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">KeyPressFunc&lt;/span>(&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">char&lt;/span> key, &lt;span style="color:#66d9ef">int&lt;/span> x, &lt;span style="color:#66d9ef">int&lt;/span> y) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">97&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">98&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">-=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">99&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#ae81ff">5.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">356.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">355.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">356.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (key &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1.0f&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> yRot &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">355.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Refresh the Window
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glutPostRedisplay();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">ChangeSize&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> w, &lt;span style="color:#66d9ef">int&lt;/span> h) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLfloat nRange &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">100.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Prevent a divide by zero
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (h &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> h &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Set Viewport to window dimensions
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glViewport(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>, w, h);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Reset coordinate system
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> glMatrixMode(GL_PROJECTION);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glLoadIdentity();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Establish clipping volume (left, right, bottom, top, near, far)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (w &lt;span style="color:#f92672">&amp;lt;=&lt;/span> h)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glOrtho(&lt;span style="color:#f92672">-&lt;/span>nRange, nRange, &lt;span style="color:#f92672">-&lt;/span>nRange &lt;span style="color:#f92672">*&lt;/span> h &lt;span style="color:#f92672">/&lt;/span> w, nRange &lt;span style="color:#f92672">*&lt;/span> h &lt;span style="color:#f92672">/&lt;/span> w, &lt;span style="color:#f92672">-&lt;/span>nRange, nRange);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glOrtho(&lt;span style="color:#f92672">-&lt;/span>nRange &lt;span style="color:#f92672">*&lt;/span> w &lt;span style="color:#f92672">/&lt;/span> h, nRange &lt;span style="color:#f92672">*&lt;/span> w &lt;span style="color:#f92672">/&lt;/span> h, &lt;span style="color:#f92672">-&lt;/span>nRange, nRange, &lt;span style="color:#f92672">-&lt;/span>nRange, nRange);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glMatrixMode(GL_MODELVIEW);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glLoadIdentity();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> argc, &lt;span style="color:#66d9ef">char&lt;/span> &lt;span style="color:#f92672">*&lt;/span>argv[]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLsizei h &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">500&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLsizei w &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">500&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLsizei x &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">200&lt;/span>, y &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInit(&lt;span style="color:#f92672">&amp;amp;&lt;/span>argc, argv);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitDisplayMode(GLUT_DOUBLE &lt;span style="color:#f92672">|&lt;/span> GLUT_RGB &lt;span style="color:#f92672">|&lt;/span> GLUT_DEPTH);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitWindowSize(h, w);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitWindowPosition(x, y);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutCreateWindow(&lt;span style="color:#e6db74">&amp;#34;Lines Example&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutDisplayFunc(RenderScene);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutReshapeFunc(ChangeSize);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutSpecialFunc(SpecialKeys);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutKeyboardFunc(KeyPressFunc);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> SetupRC();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutMainLoop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Python运行OpenGL示例</title><link>https://kizx.github.io/post/python%E8%BF%90%E8%A1%8Copengl%E7%A4%BA%E4%BE%8B/</link><pubDate>Tue, 02 Jun 2020 15:10:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E8%BF%90%E8%A1%8Copengl%E7%A4%BA%E4%BE%8B/</guid><description>&lt;p>python的opengl库叫&lt;code>PyOpenGL&lt;/code>，安装这个库的时候要注意位数版本要正确，比如我的python37是32位的，安装&lt;code>PyOpenGL-3.1.5-cp37-cp37m-win32.whl&lt;/code>才行，默认pip安装的运行时可能会有问题，所以需要手动下载安装对应版本的whl。&lt;/p>
&lt;h2 id="demo">&lt;a href="#demo" class="header-anchor">&lt;/a>demo
&lt;/h2>&lt;p>这是一个直接运行的demo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># !/usr/bin/python&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># quidam_01.py 三维空间的世界坐标系和三角形&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> OpenGL.GL &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">*&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> OpenGL.GLUT &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">*&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">draw&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># ---------------------------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glBegin(GL_LINES) &lt;span style="color:#75715e"># 开始绘制线段（世界坐标系）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以红色绘制x轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为红色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置x轴顶点（x轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置x轴顶点（x轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以绿色绘制y轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为绿色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置y轴顶点（y轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置y轴顶点（y轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以蓝色绘制z轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为蓝色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>) &lt;span style="color:#75715e"># 设置z轴顶点（z轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.8&lt;/span>) &lt;span style="color:#75715e"># 设置z轴顶点（z轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glEnd() &lt;span style="color:#75715e"># 结束绘制线段&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># ---------------------------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glBegin(GL_TRIANGLES) &lt;span style="color:#75715e"># 开始绘制三角形（z轴负半区）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为红色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.366&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>) &lt;span style="color:#75715e"># 设置三角形顶点&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为绿色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.5&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.366&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>) &lt;span style="color:#75715e"># 设置三角形顶点&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为蓝色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.5&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span>) &lt;span style="color:#75715e"># 设置三角形顶点&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glEnd() &lt;span style="color:#75715e"># 结束绘制三角形&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># ---------------------------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glFlush() &lt;span style="color:#75715e"># 清空缓冲区，将指令送往硬件立即执行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInit() &lt;span style="color:#75715e"># 1. 初始化glut库&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutCreateWindow(&lt;span style="color:#e6db74">&amp;#39;Quidam Of OpenGL&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 2. 创建glut窗口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutDisplayFunc(draw) &lt;span style="color:#75715e"># 3. 注册回调函数draw()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutMainLoop() &lt;span style="color:#75715e"># 4. 进入glut主循环&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="pyqtopengl">&lt;a href="#pyqtopengl" class="header-anchor">&lt;/a>pyqtopengl
&lt;/h2>&lt;p>这是pyqt中QOpenGLWidget的demo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># !/usr/bin/python&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide2.QtWidgets &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">*&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> OpenGL.GL &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">*&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> OpenGL.GLUT &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">*&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyOpenglWidget&lt;/span>(QOpenGLWidget):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, parent&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">None&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>(parent)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">initializeGL&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">paintGL&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glBegin(GL_LINES) &lt;span style="color:#75715e"># 开始绘制线段（世界坐标系）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以红色绘制x轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为红色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置x轴顶点（x轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置x轴顶点（x轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以绿色绘制y轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为绿色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置y轴顶点（y轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.8&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>) &lt;span style="color:#75715e"># 设置y轴顶点（y轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 以蓝色绘制z轴&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glColor4f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>, &lt;span style="color:#ae81ff">1.0&lt;/span>) &lt;span style="color:#75715e"># 设置当前颜色为蓝色不透明&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.8&lt;/span>) &lt;span style="color:#75715e"># 设置z轴顶点（z轴负方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glVertex3f(&lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.0&lt;/span>, &lt;span style="color:#ae81ff">0.8&lt;/span>) &lt;span style="color:#75715e"># 设置z轴顶点（z轴正方向）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glEnd() &lt;span style="color:#75715e"># 结束绘制线段&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">resizeGL&lt;/span>(self, w, h):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">pass&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/xufive/article/details/86565130" target="_blank" rel="noopener"
>https://blog.csdn.net/xufive/article/details/86565130&lt;/a>
&lt;a class="link" href="https://doc.qt.io/qtforpython/PySide2/QtWidgets/QOpenGLWidget.html?highlight=qopenglwidget" target="_blank" rel="noopener"
>https://doc.qt.io/qtforpython/PySide2/QtWidgets/QOpenGLWidget.html?highlight=qopenglwidget&lt;/a>&lt;/p></description></item><item><title>Visual Studio配置glut/freeglut开发环境</title><link>https://kizx.github.io/post/visual-studio%E9%85%8D%E7%BD%AEglutfreeglut%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link><pubDate>Mon, 01 Jun 2020 08:17:00 +0000</pubDate><guid>https://kizx.github.io/post/visual-studio%E9%85%8D%E7%BD%AEglutfreeglut%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</guid><description>&lt;p>glut/freeglut是opengl的一个封装库，虽然现在一般都是用glfw了，但一些教材和课堂上仍旧采用glut库，没办法，那就来配置一下吧。其中glut比较古老，而且好像闭源且早已不再维护了，其官网首页也直接推荐到freeglut库。freeglut是glut的开源版，且一直有人维护。
glut官网：https://www.opengl.org/resources/libraries/glut/
freeglut官网下载：https://www.transmissionzero.co.uk/software/freeglut-devel/&lt;/p>
&lt;blockquote>
&lt;p>ps:其实网上也有不少教程，但那些教程都是直接把下载好的库复制到系统文件夹和VS文件夹下，这种做法实在不优雅，更正常的做法应该是在VS的工程里进行属性配置才对。&lt;/p>&lt;/blockquote>
&lt;h2 id="freeglut配置">&lt;a href="#freeglut%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>freeglut配置
&lt;/h2>&lt;p>从上面的官网点击&lt;code>Download freeglut 3.0.0 for MSVC&lt;/code>下载二进制库下载解压到一个你喜欢的目录。
然后配置三大件：
添加include头文件
&lt;img src="https://pan.2bboy.com/img/2020/06/0601154913.png"
loading="lazy"
>
添加lib目录
&lt;img src="https://pan.2bboy.com/img/2020/06/0601155127.png"
loading="lazy"
>
添加lib项，其中&lt;code>opengl32.lib&lt;/code>不添加好像也行，我是配置glfw时看要加上，所以这里顺手也加上了。
&lt;img src="https://pan.2bboy.com/img/2020/06/0601155521.png"
loading="lazy"
>
ps：如果是vs2019，include和lib位置放到这里也可以
&lt;img src="https://www.2bboy.com/usr/uploads/2021/08/3686625392.png"
loading="lazy"
>
如果此时运行会报无法找到dll的错误，将&lt;code>C:\dev\freeglut\bin&lt;/code>的目录添加到系统Path变量下就行了(添加后工程得重启才能生效)
测试代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;GL/glut.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">Show&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glClear(GL_COLOR_BUFFER_BIT);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glRectf(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5f&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">0.5f&lt;/span>, &lt;span style="color:#ae81ff">0.5f&lt;/span>, &lt;span style="color:#ae81ff">0.5f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glFlush();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> argc, &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> argv[])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInit(&lt;span style="color:#f92672">&amp;amp;&lt;/span>argc, argv);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitDisplayMode(GLUT_RGB &lt;span style="color:#f92672">|&lt;/span> GLUT_SINGLE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitWindowPosition(&lt;span style="color:#ae81ff">100&lt;/span>, &lt;span style="color:#ae81ff">100&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutInitWindowSize(&lt;span style="color:#ae81ff">500&lt;/span>, &lt;span style="color:#ae81ff">500&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutCreateWindow(&lt;span style="color:#e6db74">&amp;#34;OpenGL-窗口&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutDisplayFunc(Show);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glutMainLoop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>官方的Hello-GLUT测试代码：https://github.com/TransmissionZero/Hello-GLUT
建议自己复制粘贴这些代码运行&lt;/p>
&lt;h2 id="glut配置">&lt;a href="#glut%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>glut配置
&lt;/h2>&lt;p>如果非要用glut也不是不行，官方下载地址：https://www.opengl.org/resources/libraries/glut/glut_downloads.php#windows 选择&lt;code>Download the GLUT 3.6 headers and pre-compiled libraries: glutdlls36.zip&lt;/code>下载应该就可以。
下载解压后就5个文件和一个readme，这怎么用？网上的教程都是分别塞到系统目录和VS安装目录下的，这里我觉得可以像上面freeglut一样进行配置，手动将这5个文件安排成和freeglut相似的目录结构：新建三个&lt;code>bin&lt;/code>,&lt;code>include/GL&lt;/code>,&lt;code>lib&lt;/code>目录然后将5个文件一一放进去，将&lt;code>bin&lt;/code>的目录添加到系统&lt;code>path&lt;/code>环境变量。
然后后面在VS里的设置就和上面freeglut一样了，只需要将相应名称改一下就行了，测试代码也是一样的。&lt;/p></description></item><item><title>Visual Studio保存工程环境配置</title><link>https://kizx.github.io/post/visual-studio%E4%BF%9D%E5%AD%98%E5%B7%A5%E7%A8%8B%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</link><pubDate>Sun, 31 May 2020 15:44:00 +0000</pubDate><guid>https://kizx.github.io/post/visual-studio%E4%BF%9D%E5%AD%98%E5%B7%A5%E7%A8%8B%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</guid><description>&lt;p>要说到VS(C/C++)最麻烦的地方就是各种环境，各种库配置来配置去，因此将配置好的工程设置保存下来，以备下次新建工程时直接引用很有必要。&lt;/p>
&lt;h2 id="方法">&lt;a href="#%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>方法
&lt;/h2>&lt;p>切到属性管理器窗口，右键选择添加一个新的属性表。
&lt;img src="https://pan.2bboy.com/img/2020/05/0531233207.png"
loading="lazy"
>
比如我们新建一个名为&lt;code>opengl&lt;/code>的属性表，然后打开任一个文件，右键点击&lt;code>opengl&lt;/code>选择属性。
&lt;img src="https://pan.2bboy.com/img/2020/05/0531233522.png"
loading="lazy"
>
然后就是对项目属性进行配置。
另外在配置时选择所有配置和所有平台可以避免各种模式都要配一遍的烦恼。
&lt;img src="https://pan.2bboy.com/img/2020/06/0601184836.png"
loading="lazy"
>&lt;/p>
&lt;hr>
&lt;p>当新建一个工程时只需要在同样的地方添加现有属性表即可。&lt;/p></description></item><item><title>OPENGL环境配置</title><link>https://kizx.github.io/post/opengl%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</link><pubDate>Sun, 31 May 2020 04:57:00 +0000</pubDate><guid>https://kizx.github.io/post/opengl%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</guid><description>&lt;p>基于glfw和glew进行开发配置。&lt;/p>
&lt;h2 id="下载安装库">&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85%e5%ba%93" class="header-anchor">&lt;/a>下载安装库
&lt;/h2>&lt;p>下载32位glfw二进制包：https://www.glfw.org/download.html
下载glew二进制包：http://glew.sourceforge.net/
上面的两个包下载解压到一个固定目录。&lt;/p>
&lt;h2 id="vs2019配置">&lt;a href="#vs2019%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>VS2019配置
&lt;/h2>&lt;p>添加include目录
&lt;img src="https://pan.2bboy.com/img/2020/05/0531125116.png"
loading="lazy"
>
添加lib目录
&lt;img src="https://pan.2bboy.com/img/2020/05/0531125324.png"
loading="lazy"
>
添加附加依赖项
&lt;img src="https://pan.2bboy.com/img/2020/05/0531125443.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="运行测试">&lt;a href="#%e8%bf%90%e8%a1%8c%e6%b5%8b%e8%af%95" class="header-anchor">&lt;/a>运行测试
&lt;/h2>&lt;p>生成一个窗口&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#define GLEW_STATIC
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;GL/glew.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;GLFW/glfw3.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">processInput&lt;/span>(GLFWwindow&lt;span style="color:#f92672">*&lt;/span> window) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (glfwGetKey(window, GLFW_KEY_ESCAPE) &lt;span style="color:#f92672">==&lt;/span> GLFW_PRESS) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwSetWindowShouldClose(window, true);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwInit();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, &lt;span style="color:#ae81ff">3&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, &lt;span style="color:#ae81ff">3&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GLFWwindow&lt;span style="color:#f92672">*&lt;/span> window &lt;span style="color:#f92672">=&lt;/span> glfwCreateWindow(&lt;span style="color:#ae81ff">800&lt;/span>,&lt;span style="color:#ae81ff">600&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;First Window&amp;#34;&lt;/span>,NULL,NULL);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (window &lt;span style="color:#f92672">==&lt;/span> NULL)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Failed to create GLFW window&amp;#34;&lt;/span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>endl;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwTerminate();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwMakeContextCurrent(window);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glewExperimental &lt;span style="color:#f92672">=&lt;/span> true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (glewInit() &lt;span style="color:#f92672">!=&lt;/span> GLEW_OK) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Failed&amp;#34;&lt;/span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>endl;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwTerminate();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glViewport(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">800&lt;/span>, &lt;span style="color:#ae81ff">600&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>glfwWindowShouldClose(window)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> processInput(window);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glClearColor(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0.5f&lt;/span>, &lt;span style="color:#ae81ff">0.5f&lt;/span>, &lt;span style="color:#ae81ff">1.0f&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glClear(GL_COLOR_BUFFER_BIT);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwSwapBuffers(window);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwPollEvents();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> glfwTerminate();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.bilibili.com/video/BV11W411N7b9" target="_blank" rel="noopener"
>https://www.bilibili.com/video/BV11W411N7b9&lt;/a>&lt;/p></description></item><item><title>Windows编译安装CGAL</title><link>https://kizx.github.io/post/windows%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85cgal/</link><pubDate>Mon, 25 May 2020 18:11:00 +0000</pubDate><guid>https://kizx.github.io/post/windows%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85cgal/</guid><description>&lt;p>CGAL是一个C++计算几何算法库，官方安装说明：https://doc.cgal.org/latest/Manual/windows.html
我的配置是win10+vs2019，已安装有CMake。
[button color=&amp;ldquo;success&amp;rdquo; icon=&amp;ldquo;fa fa-download&amp;rdquo; url=&amp;ldquo;https://pan.2bboy.com/Public/Software/CGAL/&amp;rdquo; type=&amp;quot;&amp;quot;]我用到的所有安装文件[/button]&lt;/p>
&lt;h2 id="下载安装boost">&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85boost" class="header-anchor">&lt;/a>下载安装boost
&lt;/h2>&lt;p>CGAL依赖于boost库，因此需要先安装boost，二进制boost下载地址：https://sourceforge.net/projects/boost/files/boost-binaries/
根据官网说明选择1.17.0版本即可，然后下载具体版本根据vs版本和位数来选择，14.0对应VC2015，14.1对应VC2017，14.2对应VC2019，因此我选择boost_1_71_0-msvc-14.2-64.exe下载即可。
下载解压到硬盘，比如解压到C:\dev\目录下，然后设置环境变量。&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>BOOST_LIBRARYDIR = C:\dev\libboost_1_71_0\lib64-msvc-XX.Y&lt;/li>
&lt;li>BOOST_INCLUDEDIR = C:\dev\libboost_1_71_0&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/05/0526010253.png"
loading="lazy"
>
最后将&lt;code>C:\dev\libboost_1_71_0\lib64-msvc-XX.Y&lt;/code>添加到系统环境变量&lt;code>PATH&lt;/code>中。&lt;/p>
&lt;hr>
&lt;h3 id="自己编译">&lt;a href="#%e8%87%aa%e5%b7%b1%e7%bc%96%e8%af%91" class="header-anchor">&lt;/a>自己编译
&lt;/h3>&lt;p>如果不直接下载二进制文件，自己来编译也是可以的（我刚开始就这么干的(ー_ー)!!）
下载解压boost源文件：https://sourceforge.net/projects/boost/files/boost-binaries/
解压过程比较慢，解压后得到一堆文件，运行解压目录下的bootstrap.bat文件进行编译。
第一次运行会报下面的错误：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;#39;cl&amp;#39; 不是内部或外部命令，也不是可运行的程序或批处理文件。
&lt;/code>&lt;/pre>&lt;p>解决方法是将&lt;code>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\Hostx64\x64&lt;/code>添加到系统变量，然后运行vs的命令行工具&lt;code>x64 Native Tools Command Prompt for VS 2019&lt;/code>(用系统的命令行会报错)，这个命令行不能直接cd切到另一个盘符下，需要先输入&lt;code>d:&lt;/code>切换盘符才行。
然后&lt;code>cd d:\boost\boost_1_66_0&lt;/code>切换到文件目录，输入&lt;code>bootstrap.bat&lt;/code>运行，然后目录下就会生成几个文件，其中有个b2.exe，直接运行会报错。
解决方法是打开&lt;code>project-config.jam&lt;/code>，修改为&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>import option ;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>using msvc : 16.0 : &amp;#34;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\Hostx64\x64\c1.exe&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>option.set keep-going : false ;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后输入&lt;code>b2.exe --with-system --with-thread&lt;/code>进行编译，不带后面参数会编译所有库，相当费时间，只编译需要的库就好。
编译好的lib库在&amp;quot;/stage/lib&amp;quot;下，将根目录和lib目录添加到系统变量。&lt;/p>
&lt;h2 id="下载安装cgal">&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85cgal" class="header-anchor">&lt;/a>下载安装CGAL
&lt;/h2>&lt;p>从github上下载CGAL-5.0.2-Setup.exe：https://github.com/CGAL/cgal/releases
点击安装，安装到最后应该会有一个弹窗提醒手动设置环境变量，那就将&lt;code>C:\dev\CGAL-5.0.2\auxiliary\gmp\lib&lt;/code>添加到环境变量&lt;code>PATH&lt;/code>中。&lt;/p>
&lt;h2 id="其他可选依赖">&lt;a href="#%e5%85%b6%e4%bb%96%e5%8f%af%e9%80%89%e4%be%9d%e8%b5%96" class="header-anchor">&lt;/a>其他可选依赖
&lt;/h2>&lt;h3 id="qt">&lt;a href="#qt" class="header-anchor">&lt;/a>Qt
&lt;/h3>&lt;p>下载地址：https://www.qt.io/offline-installers 或 &lt;a class="link" href="http://download.qt.io/official_releases/" target="_blank" rel="noopener"
>http://download.qt.io/official_releases/&lt;/a>
安装时勾选MSVC2017的编译器和Qt Script(有些demo可能会用到)，如果硬盘够大的话，把下面几个Qt都勾了也没什么不好。如果现在不勾选，后面再想安装就会很麻烦，具体方法可以自行百度。
&lt;img src="https://pan.2bboy.com/img/2020/05/0526224650.png"
loading="lazy"
>
完成后添加&lt;code>QTDIR&lt;/code>的系统变量，路径为根目录&lt;code>C:\Qt\Qt5.12.8&lt;/code>，然后添加之前勾选的编译器系统坏境路径&lt;code>C:\Qt\Qt5.12.8\5.12.8\msvc2017_64\bin&lt;/code>到&lt;code>PATH&lt;/code>中。&lt;/p>
&lt;h3 id="eigen">&lt;a href="#eigen" class="header-anchor">&lt;/a>Eigen
&lt;/h3>&lt;p>下载地址：http://eigen.tuxfamily.org/index.php?title=Main_Page&lt;/p>
&lt;h2 id="cmake编译运行">&lt;a href="#cmake%e7%bc%96%e8%af%91%e8%bf%90%e8%a1%8c" class="header-anchor">&lt;/a>Cmake编译运行
&lt;/h2>&lt;p>然后我们按照官网上的说明进入examples\Triangulation_2目录，新建一个build文件夹，然后启动Cmake，设置源文件夹和输出文件夹，如果用下面的命令行启动的话会自动设置好。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>C:\dev\CGAL-5.0.2&lt;span style="color:#75715e">&amp;gt; cd examples\Triangulation_2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>C:\dev\CGAL-5.0.2\examples\Triangulation_2&lt;span style="color:#75715e">&amp;gt; mkdir build&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>C:\dev\CGAL-5.0.2\examples\Triangulation_2&lt;span style="color:#75715e">&amp;gt; cd build&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>C:\dev\CGAL-5.0.2\examples\Triangulation_2\build&lt;span style="color:#75715e">&amp;gt; cmake-gui ..&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/05/0526015343.png"
loading="lazy"
>
点击左下角&lt;code>Configure&lt;/code>进行配置，一般要点两次。
&lt;img src="https://pan.2bboy.com/img/2020/05/0526015403.png"
loading="lazy"
>
继续点击&lt;code>Generate&lt;/code>。
&lt;img src="https://pan.2bboy.com/img/2020/05/0526013040.png"
loading="lazy"
>
生成成功的话在build目录下会生成&lt;code>Triangulation_2_Examples.sln&lt;/code>文件，点击打开或者点击&lt;code>Open Project&lt;/code>也可以直接打开，在vs里生成不报错应该就没问题。
但是直接点击(ctrl)F5会报错无法启动程序，那是因为当前项目是CMake自动生成的ALL_BUILD，需要将别的项目切换为当前项目（不会用vs的我被这个给坑了好久。。。）
&lt;img src="https://pan.2bboy.com/img/2020/05/0526214519.png"
loading="lazy"
>&lt;/p>
&lt;hr>
&lt;p>官网上面是一个编译了一个三角剖分Triangulation的example，运行起来没有什么意思。
其实我们可以对CGAL里的任何一个demo或者example进行编译，当然也可以对整个CGAL文件夹或demo/examples文件夹进行编译，只要文件夹下有CMakeLists.txt文件就能被CMake编译，不过整个编译文件夹容易出错，因为包含了更多的库，可能这些库我们并没有装全，而且全部编译后的工程文件太大对电脑性能要求也更高。
下面是编译demo文件夹后，运行P4HDT2的界面。
&lt;img src="https://pan.2bboy.com/img/2020/05/0526220507.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/u013094443/article/details/51106015" target="_blank" rel="noopener"
>https://blog.csdn.net/u013094443/article/details/51106015&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/s_lisheng/article/details/72871218" target="_blank" rel="noopener"
>https://blog.csdn.net/s_lisheng/article/details/72871218&lt;/a>
&lt;a class="link" href="https://zhuanlan.zhihu.com/p/99814130" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/99814130&lt;/a>&lt;/p></description></item><item><title>Onedrive云盘程序——OneManager小白设置指南</title><link>https://kizx.github.io/post/onedrive%E4%BA%91%E7%9B%98%E7%A8%8B%E5%BA%8Fonemanager%E5%B0%8F%E7%99%BD%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</link><pubDate>Sun, 24 May 2020 08:06:00 +0000</pubDate><guid>https://kizx.github.io/post/onedrive%E4%BA%91%E7%9B%98%E7%A8%8B%E5%BA%8Fonemanager%E5%B0%8F%E7%99%BD%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</guid><description>&lt;h2 id="onemanager是什么">&lt;a href="#onemanager%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor">&lt;/a>OneManager是什么
&lt;/h2>&lt;p>这是一个利用微软onedrive api将onedrive目录映射成一个云盘的程序，类似的程序有很多，比如OneIndex、Pyone、OnePoint等等。这个程序的特点是支持多种onedrive类型，可以部署在vps，heroku，以及腾讯云scf上。
[button color=&amp;ldquo;info&amp;rdquo; icon=&amp;quot;&amp;quot; url=&amp;ldquo;https://github.com/qkqpttgf/OneManager-php&amp;rdquo; type=&amp;quot;&amp;quot;]项目地址[/button]
[button color=&amp;ldquo;info&amp;rdquo; icon=&amp;quot;&amp;quot; url=&amp;ldquo;https://pan.2bboy.com/&amp;rdquo; type=&amp;quot;&amp;quot;]我的Demo[/button]&lt;/p>
&lt;h2 id="部署教程">&lt;a href="#%e9%83%a8%e7%bd%b2%e6%95%99%e7%a8%8b" class="header-anchor">&lt;/a>部署教程
&lt;/h2>&lt;p>参考项目readme说明，网上一些博客也有不少教程，这不是本文的重点，本文主要讲的是部署好后的设置问题。
部署成功后在设置-&amp;gt;首页里添加相应的盘，可以添加多个盘，同一个盘也可以添加多次。&lt;/p>
&lt;h2 id="平台变量">&lt;a href="#%e5%b9%b3%e5%8f%b0%e5%8f%98%e9%87%8f" class="header-anchor">&lt;/a>平台变量
&lt;/h2>&lt;p>登录后，在&lt;code>管理&lt;/code>&amp;gt;&lt;code>设置&lt;/code>里有一些自定义设置，有些人不清楚这些设置是干嘛的，这可以理解，毕竟项目的说明写的太简单了。
注意本文的操作都是针对程序默认主题来说的，其他主题由于是第三方人员开发，不保证所有功能都能正常使用。&lt;/p>
&lt;h3 id="adminloginpage">&lt;a href="#adminloginpage" class="header-anchor">&lt;/a>adminloginpage
&lt;/h3>&lt;p>自定义登录地址，设置后就会隐藏登录按钮(有些主题本来就没有登录按钮)，登录时需要手动在网盘地址后加上&lt;code>?你设置的值&lt;/code>进行登录。
比如设置为&lt;code>abc&lt;/code>，那么你只能通过&lt;code>http://xxx.com/xxx?abc&lt;/code>地址来登录 。所以一旦设置就要记住你设置的值，不然连你自己也没法知道登录地址那就麻烦了。
这个设置是为了防止别人通过默认的登录界面尝试登录你的网盘，设置本项后只要猜不到登录界面，即使别人知道登录密码也没用，多一道防护墙，让网盘更安全。&lt;/p>
&lt;h3 id="autojumpfirstdisk">&lt;a href="#autojumpfirstdisk" class="header-anchor">&lt;/a>autoJumpFirstDisk
&lt;/h3>&lt;p>设置点击网盘标题时跳转到绑定的第一个盘还是当前绑定的网盘根目录。&lt;/p>
&lt;h3 id="background">&lt;a href="#background" class="header-anchor">&lt;/a>background
&lt;/h3>&lt;p>自定义背景图片，填入一个图片的url地址，因为图片加载通常需要更多时间，为了速度考虑不建议放入大体积图片。&lt;/p>
&lt;h3 id="backgroundm">&lt;a href="#backgroundm" class="header-anchor">&lt;/a>backgroundm
&lt;/h3>&lt;p>手机端显示的背景图片地址。&lt;/p>
&lt;h3 id="customcss">&lt;a href="#customcss" class="header-anchor">&lt;/a>customCss
&lt;/h3>&lt;p>设置自定义css的地方，这里设置的css会作用于网盘所有页面。
比如我想隐藏语言选项框：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">style&lt;/span>&amp;gt;.&lt;span style="color:#a6e22e">changelanguage&lt;/span>{&lt;span style="color:#66d9ef">display&lt;/span>:&lt;span style="color:#66d9ef">none&lt;/span>}&amp;lt;/&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时隐藏复制下载链接按钮&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">style&lt;/span>&amp;gt;.&lt;span style="color:#a6e22e">file&lt;/span> &lt;span style="color:#f92672">button&lt;/span>{&lt;span style="color:#66d9ef">display&lt;/span>:&lt;span style="color:#66d9ef">none&lt;/span>}.&lt;span style="color:#a6e22e">changelanguage&lt;/span>{&lt;span style="color:#66d9ef">display&lt;/span>:&lt;span style="color:#66d9ef">none&lt;/span>}&amp;lt;/&lt;span style="color:#f92672">style&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="customscript">&lt;a href="#customscript" class="header-anchor">&lt;/a>customScript
&lt;/h3>&lt;p>设置自定义js，会作用于所有页面。
比如设置http重定向到https：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text/javascript&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">targetProtocol&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;https:&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">protocol&lt;/span> &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#a6e22e">targetProtocol&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">href&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">targetProtocol&lt;/span> &lt;span style="color:#f92672">+&lt;/span> window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">href&lt;/span>.&lt;span style="color:#a6e22e">substring&lt;/span>(window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">protocol&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="customtheme">&lt;a href="#customtheme" class="header-anchor">&lt;/a>customTheme
&lt;/h3>&lt;p>通过url的方式引用html主题，比如你可以通过设置下面的地址来使用我的主题。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>https://cdn.jsdelivr.net/gh/kizx/onemoe-theme/onemoe.html
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="disablechangetheme">&lt;a href="#disablechangetheme" class="header-anchor">&lt;/a>disableChangeTheme
&lt;/h3>&lt;p>设置为&lt;code>1&lt;/code>后游客浏览时将不显示右下角的主题切换功能。&lt;/p>
&lt;h3 id="disableshowthumb">&lt;a href="#disableshowthumb" class="header-anchor">&lt;/a>disableShowThumb
&lt;/h3>&lt;p>设置为&lt;code>1&lt;/code>后将不显示缩略图的按钮和功能，对于云函数用户来说，建议设为&lt;code>1&lt;/code>来关闭该功能，因为该功能可能点一下就是一分钱。&lt;/p>
&lt;h3 id="hidefunctionalityfile">&lt;a href="#hidefunctionalityfile" class="header-anchor">&lt;/a>hideFunctionalityFile
&lt;/h3>&lt;p>设置为&lt;code>1&lt;/code>后，游客浏览网盘时就会看不到read.md，head.md，head.ofm，foo.omf这些文件，这些文件是干嘛的后面会说。&lt;/p>
&lt;h3 id="passfile">&lt;a href="#passfile" class="header-anchor">&lt;/a>passfile
&lt;/h3>&lt;p>设置密码文件名，比如这里设置为password.txt，那么在某一个目录下新建一个password.txt文件，其中写入密码，这样任何人在浏览这个网盘目录时都需要输入相应密码后才能访问。&lt;/p>
&lt;h3 id="sitename">&lt;a href="#sitename" class="header-anchor">&lt;/a>sitename
&lt;/h3>&lt;p>设置网站名称。&lt;/p>
&lt;h3 id="theme">&lt;a href="#theme" class="header-anchor">&lt;/a>theme
&lt;/h3>&lt;p>切换主题。&lt;/p>
&lt;h3 id="timezone">&lt;a href="#timezone" class="header-anchor">&lt;/a>timezone
&lt;/h3>&lt;p>设置时区，国内可设置为8。&lt;/p>
&lt;h2 id="每个盘独立变量">&lt;a href="#%e6%af%8f%e4%b8%aa%e7%9b%98%e7%8b%ac%e7%ab%8b%e5%8f%98%e9%87%8f" class="header-anchor">&lt;/a>每个盘独立变量
&lt;/h2>&lt;h3 id="diskname">&lt;a href="#diskname" class="header-anchor">&lt;/a>diskname
&lt;/h3>&lt;p>多盘在网盘界面显示的名称。&lt;/p>
&lt;h3 id="domain_path">&lt;a href="#domain_path" class="header-anchor">&lt;/a>domain_path
&lt;/h3>&lt;p>当绑定多个域名时，可以使不同域名打开时访问不同目录。当然如果你只有一个域名也可以用，通过这种方式可以使当前域名访问一个指定子目录，和后面的public_path起到一样的作用。
下面是两个域名的设置方法，中间用&lt;code>|&lt;/code>隔开，如果有多个域名只设置一个域名时，未设置的域名好像也会只访问该目录，要访问根目录dirname设置为&lt;code>/&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>domain1.com:/dir1name|domain2.com:/dir2name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="downloadencrypt">&lt;a href="#downloadencrypt" class="header-anchor">&lt;/a>downloadencrypt
&lt;/h3>&lt;p>设置为&lt;code>1&lt;/code>时启用该功能，这样在设置了密码的目录下的文件虽然无法在网页端浏览，但可以通过具体的文件链接进行下载。&lt;/p>
&lt;h3 id="guestup_path">&lt;a href="#guestup_path" class="header-anchor">&lt;/a>guestup_path
&lt;/h3>&lt;p>设置图床路径或者叫游客上传路径，设置后游客只能看到上传按钮看不到目录下的文件。&lt;/p>
&lt;h3 id="public_path">&lt;a href="#public_path" class="header-anchor">&lt;/a>public_path
&lt;/h3>&lt;p>设置该盘的显示的根目录，默认为&lt;code>/&lt;/code>，换个说法就是可以显示指定的文件夹，默认显示全部。
比如我们只想将网盘下的public文件夹内容作为网盘，可以设置为&lt;code>/public/&lt;/code>。
有了这个功能，即使只有一个onedrive账号，我们也可以通过重复绑定同一个账号来生成多盘，然后每个盘的public_path设置为不同的路径，这样可以将一个盘的功能分开。&lt;/p>
&lt;hr>
&lt;p>还有一种特殊情况是我既想让游客上传文件，又想让游客看见上传后的文件目录，目前就只能通过这种方法将该目录设置到两个盘，一个盘作上传，一个盘作目录展示。&lt;/p>
&lt;h2 id="进阶设置">&lt;a href="#%e8%bf%9b%e9%98%b6%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>进阶设置
&lt;/h2>&lt;h3 id="设置网站ico图标">&lt;a href="#%e8%ae%be%e7%bd%ae%e7%bd%91%e7%ab%99ico%e5%9b%be%e6%a0%87" class="header-anchor">&lt;/a>设置网站ico图标
&lt;/h3>&lt;p>将favicon.ico图片放在网盘根目录下，&lt;del>如果你设置了多盘的的话，则需要在每个盘的根目录下都放置一个favicon.ico文件&lt;/del>，新版的html主题只需要在绑定的第一个盘下面设置就行了。
当然你也可以在customCss或customScript中进行全局设置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">link&lt;/span> &lt;span style="color:#a6e22e">rel&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;icon&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://cloud.tencent.com/favicon.ico&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;image/x-icon&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>这里我使用了腾讯云的网站图标，你应该改为自己的favicon.ico图片地址。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="刷新自动切换背景图片">&lt;a href="#%e5%88%b7%e6%96%b0%e8%87%aa%e5%8a%a8%e5%88%87%e6%8d%a2%e8%83%8c%e6%99%af%e5%9b%be%e7%89%87" class="header-anchor">&lt;/a>刷新自动切换背景图片
&lt;/h3>&lt;p>这个是通过设置特殊的图片api来实现的，这些api每次刷新都会返回一张不同的图片，将后台background设置为这些api的url即可。
网上类似的api有很多，以下是群友收集的免费图片api：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>https://api.ixiaowai.cn/api/api.php (二次元动漫)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://www.dmoe.cc/random.php（二次元随机图）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://api.ixiaowai.cn/mcapi/mcapi.php （menhera酱）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://api.ixiaowai.cn/gqapi/gqapi.php （风景）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://acg.yanwz.cn/wallpaper/api.php（二次元随机图）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="利用indexhtml设置自定义页面">&lt;a href="#%e5%88%a9%e7%94%a8indexhtml%e8%ae%be%e7%bd%ae%e8%87%aa%e5%ae%9a%e4%b9%89%e9%a1%b5%e9%9d%a2" class="header-anchor">&lt;/a>利用index.html设置自定义页面
&lt;/h3>&lt;p>如果一个目录下有名为index.html的文件，则直接显示该文件，可以利用这个功能设置一个自定义页面或者用于隐藏一个特定页面，相当于部署了一个静态页面。&lt;/p>
&lt;h3 id="设置顶部和底部说明文字">&lt;a href="#%e8%ae%be%e7%bd%ae%e9%a1%b6%e9%83%a8%e5%92%8c%e5%ba%95%e9%83%a8%e8%af%b4%e6%98%8e%e6%96%87%e5%ad%97" class="header-anchor">&lt;/a>设置顶部和底部说明文字
&lt;/h3>&lt;p>在需要展示顶部说明的目录下新建一个&lt;code>head.md&lt;/code>文件，在文件里写入说明内容即可，这是一个markdown文件，可以使用markdown语言进行书写。
底部说明说明文字对应的是&lt;code>readme.md&lt;/code>文件，规则与顶部文字一样。&lt;/p>
&lt;h3 id="利用headomf设置一言">&lt;a href="#%e5%88%a9%e7%94%a8headomf%e8%ae%be%e7%bd%ae%e4%b8%80%e8%a8%80" class="header-anchor">&lt;/a>利用head.omf设置一言
&lt;/h3>&lt;p>head.omf作用和head.md一样，区别是他不支持markdonw语言，但是支持html语言，可以写入html、css、js内容。
在想展示一言的目录新建&lt;code>head.omf&lt;/code>文件，然后写入以下内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">p&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;hitokoto&amp;#34;&lt;/span>&amp;gt;:D 获取中...&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">fetch&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;https://v1.hitokoto.cn&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">then&lt;/span>(&lt;span style="color:#a6e22e">response&lt;/span> =&amp;gt; &lt;span style="color:#a6e22e">response&lt;/span>.&lt;span style="color:#a6e22e">json&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">then&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">hitokoto&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">getElementById&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;hitokoto&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">hitokoto&lt;/span>.&lt;span style="color:#a6e22e">innerText&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">hitokoto&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#66d9ef">catch&lt;/span>(&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">error&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以上是使用了https://developer.hitokoto.cn/ 的一言接口，你也可以尝试更换其他接口或者自建接口。&lt;/p>
&lt;h3 id="利用footomf设置valine评论">&lt;a href="#%e5%88%a9%e7%94%a8footomf%e8%ae%be%e7%bd%aevaline%e8%af%84%e8%ae%ba" class="header-anchor">&lt;/a>利用foot.omf设置Valine评论
&lt;/h3>&lt;p>使用Valine需要先注册&lt;a class="link" href="https://www.leancloud.cn/" target="_blank" rel="noopener"
>LeanCloud&lt;/a>并实名认证，然后新建应用获取AppID和AppKey。
具体过程参考：https://valine.js.org/quickstart.html
然后新建&lt;code>foot.omf&lt;/code>，写入以下内容（注意填入替换自己的AppID和AppKey）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;//unpkg.com/valine/dist/Valine.min.js&amp;#39;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;vcomments&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Valine&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">el&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;#vcomments&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">appId&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;你获取的AppID&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">appKey&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;你获取的AppKey&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ps: 上面的js用的是unpkg的cdn，国内速度完全不行，建议改用jsdelivr的cdn&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;//cdn.jsdelivr.net/npm/valine/dist/Valine.min.js&amp;#39;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>展示Demo见：https://pan.2bboy.com/home/&lt;/p>
&lt;ul>
&lt;li>如果对样式不满意，建议直接在omf文件写css美化。&lt;/li>
&lt;/ul>
&lt;h3 id="设置动态背景">&lt;a href="#%e8%ae%be%e7%bd%ae%e5%8a%a8%e6%80%81%e8%83%8c%e6%99%af" class="header-anchor">&lt;/a>设置动态背景
&lt;/h3>&lt;p>这里的动态背景指我们经常在一些网页见到的那种下雪、粒子线条、彩条等动态背景，一般是通过js实现的，可以自己在网上找找现成的教程，js我不会，这里只展示一种我找到的动态彩条背景。
我将下面的代码写在了foot.omf中，可以访问 &lt;a class="link" href="https://pan.2bboy.com/home/test/colored-ribbon/" target="_blank" rel="noopener"
>https://pan.2bboy.com/home/test/colored-ribbon/&lt;/a> 查看其效果。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">size&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;90&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alpha&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;0.5&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">zIndex&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;0&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://pan.2bboy.com/ppx/test/ribbon.js&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text/javascript&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">charset&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;utf-8&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中最重要的是 ribbon.js 这个js文件，我将他放在网盘目录下，你应该下载该文件放在自己的云空间里，然后替换引用的地址。
如果将代码放在omf文件里则只能在当前目录有效果，设置在后台的customScript中就可以全局生效了。&lt;/p>
&lt;p>当然只要你懂点js，利用omf文件可以玩出很多东西，比我这里有一些示例：https://pan.2bboy.com/home/test/&lt;/p>
&lt;h3 id="美化自定义登录页面">&lt;a href="#%e7%be%8e%e5%8c%96%e8%87%aa%e5%ae%9a%e4%b9%89%e7%99%bb%e5%bd%95%e9%a1%b5%e9%9d%a2" class="header-anchor">&lt;/a>美化自定义登录页面
&lt;/h3>&lt;p>修改common.php相应地方，添加style和br&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span>$html &lt;span style="color:#f92672">.=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;style&amp;gt;body{background-image:linear-gradient(60deg,#343b44 0%,#485563 100%);background-attachment:fixed;color:#343b44}body&amp;gt;div{position:absolute;text-align:center;background-color:rgba(221,221,221,.5);border-radius:20px;width:75vw;max-width:500px;height:350px;margin:auto;top:25%;bottom:50%;left:0;right:0}body&amp;gt;div:hover{box-shadow:3px 3px 6px 3px rgba(0,0,0,.3)}h4{font-size:40px}input{font-size:20px;margin:2%auto;border:#343b44 2px solid;border-radius:10px;padding:10px;height:50px;text-align:center}input:last-of-type{color:#343b44;height:50px;width:80px;font-weight:800}input:hover:last-of-type{cursor:pointer;color:#ddd;background-color:#485563}&amp;lt;/style&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;body&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;div&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;&amp;#39;&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">getconstStr&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;InputPassword&amp;#39;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;lt;/h4&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;form action=&amp;#34;&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;div&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;input name=&amp;#34;password1&amp;#34; type=&amp;#34;password&amp;#34;/&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;/br&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;input type=&amp;#34;submit&amp;#34; value=&amp;#34;&amp;#39;&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">getconstStr&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;Login&amp;#39;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;/div&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;/form&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;/center&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> &amp;lt;/div&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/05/0530183122.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="提示">&lt;a href="#%e6%8f%90%e7%a4%ba" class="header-anchor">&lt;/a>提示
&lt;/h3>&lt;ul>
&lt;li>游客上传文件时只能单个上传，不能批量上传。&lt;/li>
&lt;li>由于scf的缓存系统，在scf上进行某项改动后有时候不会立马生效，或者刷新后时而生效时而不生效，只要多等一会儿，等旧缓存自己失效就好了。&lt;/li>
&lt;li>php格式的主题为旧版主题，许多功能不支持，html格式的主题为新版主题，不同主题的作者更新频率和支持功能都可能不同，功能测试请以最新版本的默认主题为准。&lt;/li>
&lt;/ul></description></item><item><title>使用百度统计和百度搜索为网站增加小功能</title><link>https://kizx.github.io/post/%E4%BD%BF%E7%94%A8%E7%99%BE%E5%BA%A6%E7%BB%9F%E8%AE%A1%E5%92%8C%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2%E4%B8%BA%E7%BD%91%E7%AB%99%E5%A2%9E%E5%8A%A0%E5%B0%8F%E5%8A%9F%E8%83%BD/</link><pubDate>Thu, 21 May 2020 06:13:00 +0000</pubDate><guid>https://kizx.github.io/post/%E4%BD%BF%E7%94%A8%E7%99%BE%E5%BA%A6%E7%BB%9F%E8%AE%A1%E5%92%8C%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2%E4%B8%BA%E7%BD%91%E7%AB%99%E5%A2%9E%E5%8A%A0%E5%B0%8F%E5%8A%9F%E8%83%BD/</guid><description>&lt;p>百度统计平台：https://tongji.baidu.com/web/28991244/welcome/login&lt;/p>
&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/05/0521131515.png"
loading="lazy"
>
其实对于个人网站来说，统计功能也就是看个乐，不过说实话百度的统计功能至少看起来还不错。&lt;/p>
&lt;blockquote>
&lt;p>使用方法：在管理页面找到代码获取，handsome主题在后台将获取到的代码粘贴到自定义head里就行了，反正就是放在网站所有页面的head标签前，获取代码的地方有安装方式和检测是否安装成功的按钮。&lt;/p>&lt;/blockquote>
&lt;p>而且百度统计还有高级统计代码，针对一些特别站点的特别功能，我是用不上也不会用啦。
&lt;img src="https://pan.2bboy.com/img/2020/05/0521132044.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="小应用功能">&lt;a href="#%e5%b0%8f%e5%ba%94%e7%94%a8%e5%8a%9f%e8%83%bd" class="header-anchor">&lt;/a>小应用功能
&lt;/h2>&lt;p>在应用功能里可以看到一些应用功能，这才是百度统计有趣的地方。
&lt;img src="https://pan.2bboy.com/img/2020/05/0521132903.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="置顶工具">&lt;a href="#%e7%bd%ae%e9%a1%b6%e5%b7%a5%e5%85%b7" class="header-anchor">&lt;/a>置顶工具
&lt;/h3>&lt;p>开通后会在网站右下角出现一个返回顶部的按钮，当然大部分主题基本都有这个功能了，不过不失为一种添加返回顶部按钮的方法
&lt;img src="https://pan.2bboy.com/img/2020/05/0521181205.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="地图名片">&lt;a href="#%e5%9c%b0%e5%9b%be%e5%90%8d%e7%89%87" class="header-anchor">&lt;/a>地图名片
&lt;/h3>&lt;p>开通后会在网站右下角出现，但我试了由于包含非https请求地图没显示出来，不过这功能感觉一般人也用不到。
&lt;img src="https://pan.2bboy.com/img/2020/05/0521181547.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="反馈工具">&lt;a href="#%e5%8f%8d%e9%a6%88%e5%b7%a5%e5%85%b7" class="header-anchor">&lt;/a>反馈工具
&lt;/h3>&lt;p>添加后在网站右下角添加一个建议反馈的功能，这个功能经常能在一些文档页面能看到，感觉还是很不错的，但是我试了收不到邮件(╯°A°)╯︵○○○。
&lt;img src="https://pan.2bboy.com/img/2020/05/0521181800.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="专题推送">&lt;a href="#%e4%b8%93%e9%a2%98%e6%8e%a8%e9%80%81" class="header-anchor">&lt;/a>专题推送
&lt;/h3>&lt;p>类似公告功能，可以推送一个指定页面或一张二维码，如果有微信公众号的话挂个二维码在这里不错。&lt;/p>
&lt;h3 id="百度推荐">&lt;a href="#%e7%99%be%e5%ba%a6%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>百度推荐
&lt;/h3>&lt;p>应该是一个类似随机文章推荐的功能，可以像弹窗广告一样弹出来，看起来很有意思不过我没开通成功。φ(￣?￣o)&lt;/p>
&lt;h2 id="百度搜索">&lt;a href="#%e7%99%be%e5%ba%a6%e6%90%9c%e7%b4%a2" class="header-anchor">&lt;/a>百度搜索
&lt;/h2>&lt;p>这是一个由百度提供的网站页面搜索工具：https://ziyuan.baidu.com/cse/wiki/index?category_id=17
可以在网站页面提供一个搜索框，搜索框可以是浮动的，也可以是嵌入页面的，点击搜索后会跳转到一个类似百度搜索的页面，这些页面都是可以进行一定自定义的，使用起来很方便，如果你的网站还没有搜索功能的话，用这个也不是不可以，很多论坛的搜索功能就和这个有点像。
不过默认生成的链接包含http链接，https站点需要想办法将中间的链接替换下。
&lt;img src="https://pan.2bboy.com/img/2020/05/0521190352.png"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/05/0521191015.png"
loading="lazy"
>&lt;/p></description></item><item><title>Pyqt提升控件为自定义控件的方法(动态加载ui文件)</title><link>https://kizx.github.io/post/pyqt%E6%8F%90%E5%8D%87%E6%8E%A7%E4%BB%B6%E4%B8%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BDui%E6%96%87%E4%BB%B6/</link><pubDate>Tue, 12 May 2020 16:43:00 +0000</pubDate><guid>https://kizx.github.io/post/pyqt%E6%8F%90%E5%8D%87%E6%8E%A7%E4%BB%B6%E4%B8%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BDui%E6%96%87%E4%BB%B6/</guid><description>&lt;p>[post cid=&amp;ldquo;159&amp;rdquo; /]
我之前需要对一个QLineEdit控件实现文件拖拽的功能，在折腾一番后发现只有继承QLineEdit类重写方法才能实现我的功能，但我是用动态加载ui文件的方法，所以没办法直接加载我写的自定义控件，当时是用把原控件删除了再把自己的控件加进去的野蛮方法，但后来我看了黑羽的新教程才知道Qt设计师里右键有个提升控件功能就是专门解决这个问题的。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MainWindow&lt;/span>(QObject):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> QUiLoader()&lt;span style="color:#f92672">.&lt;/span>load(&lt;span style="color:#e6db74">&amp;#39;static/mainwindow.ui&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path&lt;span style="color:#f92672">.&lt;/span>deleteLater() &lt;span style="color:#75715e"># 删除原有的路径框&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path &lt;span style="color:#f92672">=&lt;/span> MyQLine() &lt;span style="color:#75715e"># 新建自己的替换原有的&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path&lt;span style="color:#f92672">.&lt;/span>setPlaceholderText(&lt;span style="color:#e6db74">&amp;#39;浏览或拖拽SRT字幕文件到这里&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>horizontalLayout_2&lt;span style="color:#f92672">.&lt;/span>addWidget(self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>horizontalLayout_2&lt;span style="color:#f92672">.&lt;/span>addWidget(self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="方法">&lt;a href="#%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>方法
&lt;/h2>&lt;p>先新建一个MyWidget.py文件用于写自定义控件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide2.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QLineEdit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyQLine&lt;/span>(QLineEdit):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;实现文件拖放功能&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, parent&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">None&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>(parent)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setAcceptDrops(&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dragEnterEvent&lt;/span>(self, e):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>endswith(&lt;span style="color:#e6db74">&amp;#39;.srt&amp;#39;&lt;/span>): &lt;span style="color:#75715e"># 这里只接受拖入srt文件，别的文件拖入无效&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>accept()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>ignore()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dropEvent&lt;/span>(self, e):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path &lt;span style="color:#f92672">=&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>replace(&lt;span style="color:#e6db74">&amp;#39;file:///&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setText(path)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>先在Qt设计师里右键提升控件，提升控件的基类一般就是控件自身本来的类，提升的类名称就是自定义的类名称，头文件是指自定义的类所在的库的名称。如果搞不清这里，可以将ui文件转为py文件，然后查看import部分就明白了。
&lt;img src="https://pan.2bboy.com/img/2020/05/0513002609.jpg"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/05/0513003251.jpg"
loading="lazy"
>&lt;/p>
&lt;p>这里就要注意了，这个提升的类名的路径是基于我们ui文件而言的，所以我这里ui文件必须和MyWidget.py在同一目录下，而且必须保证这里不能有报错，比如我之前在自定义MyQLine时没有传入parent参数就会报错。&lt;/p>
&lt;hr>
&lt;p>然后就是在主程序里加载界面就行了，如果用的是Pyside2还需要加一步注册&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MainWindow&lt;/span>(QObject):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> loader &lt;span style="color:#f92672">=&lt;/span> QUiLoader()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> loader&lt;span style="color:#f92672">.&lt;/span>registerCustomWidget(MyQLine) &lt;span style="color:#75715e"># 注册&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> loader&lt;span style="color:#f92672">.&lt;/span>load(&lt;span style="color:#e6db74">&amp;#39;mainwindow.ui&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">···&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="http://www.python3.vip/tut/py/gui/pyqtgraph-2/" target="_blank" rel="noopener"
>http://www.python3.vip/tut/py/gui/pyqtgraph-2/&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/qq937772489/article/details/81332037" target="_blank" rel="noopener"
>https://blog.csdn.net/qq937772489/article/details/81332037&lt;/a>&lt;/p></description></item><item><title>点云球面最小二乘拟合的python实现</title><link>https://kizx.github.io/post/%E7%82%B9%E4%BA%91%E7%90%83%E9%9D%A2%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%8B%9F%E5%90%88%E7%9A%84python%E5%AE%9E%E7%8E%B0/</link><pubDate>Wed, 29 Apr 2020 04:44:00 +0000</pubDate><guid>https://kizx.github.io/post/%E7%82%B9%E4%BA%91%E7%90%83%E9%9D%A2%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%8B%9F%E5%90%88%E7%9A%84python%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p>现有近似分布在球面上的点云，试进行球面拟合，求出球心坐标和半径。&lt;/p>
&lt;h2 id="解">&lt;a href="#%e8%a7%a3" class="header-anchor">&lt;/a>解
&lt;/h2>&lt;p>球面方程为：
$$
(x-x_0)^{2}+(y-y_0)^{2}+(z-z_0)^{2}=r^{2}
$$
其中 $ x_0, y_0, z_0, r $是我们要求的参数。&lt;/p>
&lt;h3 id="利用求偏导的方式求最小值">&lt;a href="#%e5%88%a9%e7%94%a8%e6%b1%82%e5%81%8f%e5%af%bc%e7%9a%84%e6%96%b9%e5%bc%8f%e6%b1%82%e6%9c%80%e5%b0%8f%e5%80%bc" class="header-anchor">&lt;/a>利用求偏导的方式求最小值
&lt;/h3>&lt;p>构造方程：
$$
E(x_0,y_0,z_0,r)=\sum_{i=0}^n((x-x_0)^2+(y-y_0)^2+(z-z_0)^2-r^2)^2
$$
使方程 $E$ 值最小的参数 $x_0, y_0, z_0, r$ 就是我们的所求。
求偏导并使其等于0：
$$
\frac{\partial E}{\partial x_0}=-4\sum_{i=0}^n(x_i-x_0)((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\frac{\partial E}{\partial y_0}=-4\sum_{i=0}^n(x_i-y_0)((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\frac{\partial E}{\partial z_0}=-4\sum_{i=0}^n(z_i-z_0)((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\frac{\partial E}{\partial r}=-4\sum_{i=0}^nr((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$&lt;/p>
&lt;p>化简得：
$$
\sum_{i=0}^nx_i((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\sum_{i=0}^ny_i((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\sum_{i=0}^nz_i((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$
$$
\sum_{i=0}^n((x_i-x_0)^2+(y_i-y_0)^2+(z_i-z_0)^2-r^2)=0
$$&lt;/p>
&lt;p>整理得：
$$
\frac{\overline{x^3}}{\overline{x}}-2x_0\frac{\overline{x^2}}{\overline{x}}+x_0^2+\frac{\overline{xy^2}}{\overline{x}}-2y_0\frac{\overline{xy}}{\overline{x}}+y_0^2+\frac{\overline{xz^2}}{\overline{x}}-2z_0\frac{\overline{xz}}{\overline{x}}+z_0^2=r^2
\tag{1}
$$
$$
\frac{\overline{xy^2}}{\overline{y}}-2x_0\frac{\overline{xy}}{\overline{y}}+x_0^2+\frac{\overline{y^3}}{\overline{y}}-2y_0\frac{\overline{y^2}}{\overline{y}}+y_0^2+\frac{\overline{yz^2}}{\overline{y}}-2z_0\frac{\overline{yz}}{\overline{y}}+z_0^2=r^2\tag{2}
$$
$$
\frac{\overline{x^2z}}{\overline{z}}-2x_0\frac{\overline{xz}}{\overline{z}}+x_0^2+\frac{\overline{y^2z}}{\overline{z}}-2y_0\frac{\overline{yz}}{\overline{z}}+y_0^2+\frac{\overline{z^3}}{\overline{x}}-2z_0\frac{\overline{yz}}{\overline{z}}+z_0^2=r^2\tag{3}
$$
$$
\overline{x^2}-2x_0\overline{x}+x_0^2+\overline{y^2}-2y_0\overline{y}+y_0^2+\overline{z^2}-2z_0\overline{z}+z_0^2=r^2\tag{4}
$$&lt;/p>
&lt;p>分别减去 (4) 式最终可以得到如下线性方程组：&lt;/p>
&lt;p>$$
\begin{bmatrix}
\overline{x^2}-\bar{x}^2 &amp;amp; \overline{xy}-\bar{x}\cdot \bar{y} &amp;amp; \overline{xz}-\bar{x}&lt;em>\bar{z} \
\overline{xy}-\bar{x}&lt;/em>\bar{y} &amp;amp; \overline{y^2}-\bar{y}^2 &amp;amp; \overline{yz}-\bar{y}&lt;em>\bar{z} \
\overline{xz}-\bar{x}&lt;/em>\bar{z} &amp;amp; \overline{yz}-\bar{y}&lt;em>\bar{z} &amp;amp; \overline{z^2}-\bar{z}^2 \
\end{bmatrix}
\begin{bmatrix}
x_0\
y_0\
z_0\
\end{bmatrix}=\frac{1}{2}
\begin{bmatrix}
(\overline{x^3}-\bar{x}&lt;/em>\overline{x^2})+(\overline{x y^2}-\bar{x}&lt;em>\overline{y^2})+(\overline{xz^2}-\bar{x}&lt;/em>\overline{z^2}) \
(\overline{x^2y}-\overline{x^2}&lt;em>\bar{y})+(\overline{y^3}-\bar{y}&lt;/em>\overline{y^2})+(\overline{yz^2}-\bar{y}&lt;em>\overline{z^2}) \
(\overline{x^2z}-\overline{x^2}&lt;/em>\bar{z})+(\overline{zy^2}-\bar{z}*\overline{y^2})+(\overline{z^3}-\bar{z} * \overline{z^2})\
\end{bmatrix}
$$&lt;/p>
&lt;p>解此线性方程组即可得到坐标 $(x_0, y_0, z_0)$，再代回 (4) 式求出 $r$ 即可。&lt;/p>
&lt;h3 id="利用法方程求解矩阵">&lt;a href="#%e5%88%a9%e7%94%a8%e6%b3%95%e6%96%b9%e7%a8%8b%e6%b1%82%e8%a7%a3%e7%9f%a9%e9%98%b5" class="header-anchor">&lt;/a>利用法方程求解矩阵
&lt;/h3>&lt;p>也可以直接对球面的方程进行拟合，每一个点云坐标对应一个方程，方程数显然大于未知数，可以利用最小二乘法进行求解出一个最小值。&lt;/p>
&lt;p>将方程稍微化简可得：
$$
2ax+2by+2cz+r^2-(a^2+b^2+c^2)=x^2+y^2+z^2
$$&lt;/p>
&lt;p>将每一个点坐标代入得到一个 $n\times4$ 的矩阵 A：
$$
\begin{bmatrix}
x_1&amp;amp;y_1&amp;amp;z_1&amp;amp;1\
x_2&amp;amp;y_2&amp;amp;z_2&amp;amp;1\
\vdots&amp;amp;\vdots&amp;amp;\vdots&amp;amp;\vdots\
x_n&amp;amp;y_n&amp;amp;z_n&amp;amp;1\
\end{bmatrix}\begin{bmatrix}2a\2b\2c\r^2-(a^2+b^2+c^2)\end{bmatrix}=
\begin{bmatrix}x_1^2+y_1^2+z_1^2\\vdots\x_n^2+y_n^2+z_n^2\end{bmatrix}
$$
方程两边同时左乘以 $A^T$ 可以得到和第一种方法一样的方程，或者直接用公式 $x=(A^TA)^{-1}A^Tb$ 进行求解，这两种方法在本质上是完全一样的。&lt;/p>
&lt;h2 id="python实现">&lt;a href="#python%e5%ae%9e%e7%8e%b0" class="header-anchor">&lt;/a>python实现
&lt;/h2>&lt;p>针对第一种方法的具体代码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>points &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array(coor) &lt;span style="color:#75715e"># coor为点云坐标的列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>points &lt;span style="color:#f92672">=&lt;/span> points&lt;span style="color:#f92672">.&lt;/span>astype(np&lt;span style="color:#f92672">.&lt;/span>float64) &lt;span style="color:#75715e"># 防止溢出&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>num_points &lt;span style="color:#f92672">=&lt;/span> points&lt;span style="color:#f92672">.&lt;/span>shape[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(num_points)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> points[:, &lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y &lt;span style="color:#f92672">=&lt;/span> points[:, &lt;span style="color:#ae81ff">1&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>z &lt;span style="color:#f92672">=&lt;/span> points[:, &lt;span style="color:#ae81ff">2&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x_avr &lt;span style="color:#f92672">=&lt;/span> sum(x) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y_avr &lt;span style="color:#f92672">=&lt;/span> sum(y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>z_avr &lt;span style="color:#f92672">=&lt;/span> sum(z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xx_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> x) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yy_avr &lt;span style="color:#f92672">=&lt;/span> sum(y &lt;span style="color:#f92672">*&lt;/span> y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>zz_avr &lt;span style="color:#f92672">=&lt;/span> sum(z &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xy_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xz_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yz_avr &lt;span style="color:#f92672">=&lt;/span> sum(y &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xxx_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> x &lt;span style="color:#f92672">*&lt;/span> x) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xxy_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> x &lt;span style="color:#f92672">*&lt;/span> y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xxz_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> x &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xyy_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> y &lt;span style="color:#f92672">*&lt;/span> y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xzz_avr &lt;span style="color:#f92672">=&lt;/span> sum(x &lt;span style="color:#f92672">*&lt;/span> z &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yyy_avr &lt;span style="color:#f92672">=&lt;/span> sum(y &lt;span style="color:#f92672">*&lt;/span> y &lt;span style="color:#f92672">*&lt;/span> y) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yyz_avr &lt;span style="color:#f92672">=&lt;/span> sum(y &lt;span style="color:#f92672">*&lt;/span> y &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yzz_avr &lt;span style="color:#f92672">=&lt;/span> sum(y &lt;span style="color:#f92672">*&lt;/span> z &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>zzz_avr &lt;span style="color:#f92672">=&lt;/span> sum(z &lt;span style="color:#f92672">*&lt;/span> z &lt;span style="color:#f92672">*&lt;/span> z) &lt;span style="color:#f92672">/&lt;/span> num_points
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>A &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[xx_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> x_avr, xy_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> y_avr, xz_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> z_avr],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [xy_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> y_avr, yy_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> y_avr, yz_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> z_avr],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [xz_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> z_avr, yz_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> z_avr, zz_avr &lt;span style="color:#f92672">-&lt;/span> z_avr &lt;span style="color:#f92672">*&lt;/span> z_avr]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([xxx_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> xx_avr &lt;span style="color:#f92672">+&lt;/span> xyy_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> yy_avr &lt;span style="color:#f92672">+&lt;/span> xzz_avr &lt;span style="color:#f92672">-&lt;/span> x_avr &lt;span style="color:#f92672">*&lt;/span> zz_avr,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xxy_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> xx_avr &lt;span style="color:#f92672">+&lt;/span> yyy_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> yy_avr &lt;span style="color:#f92672">+&lt;/span> yzz_avr &lt;span style="color:#f92672">-&lt;/span> y_avr &lt;span style="color:#f92672">*&lt;/span> zz_avr,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xxz_avr &lt;span style="color:#f92672">-&lt;/span> z_avr &lt;span style="color:#f92672">*&lt;/span> xx_avr &lt;span style="color:#f92672">+&lt;/span> yyz_avr &lt;span style="color:#f92672">-&lt;/span> z_avr &lt;span style="color:#f92672">*&lt;/span> yy_avr &lt;span style="color:#f92672">+&lt;/span> zzz_avr &lt;span style="color:#f92672">-&lt;/span> z_avr &lt;span style="color:#f92672">*&lt;/span> zz_avr])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># print(A, b)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> b &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>center &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>linalg&lt;span style="color:#f92672">.&lt;/span>solve(A, b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x0 &lt;span style="color:#f92672">=&lt;/span> center[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y0 &lt;span style="color:#f92672">=&lt;/span> center[&lt;span style="color:#ae81ff">1&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>z0 &lt;span style="color:#f92672">=&lt;/span> center[&lt;span style="color:#ae81ff">2&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>r2 &lt;span style="color:#f92672">=&lt;/span> xx_avr &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">*&lt;/span> x0 &lt;span style="color:#f92672">*&lt;/span> x_avr &lt;span style="color:#f92672">+&lt;/span> x0 &lt;span style="color:#f92672">*&lt;/span> x0 &lt;span style="color:#f92672">+&lt;/span> yy_avr &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">*&lt;/span> y0 &lt;span style="color:#f92672">*&lt;/span> y_avr &lt;span style="color:#f92672">+&lt;/span> y0 &lt;span style="color:#f92672">*&lt;/span> y0 &lt;span style="color:#f92672">+&lt;/span> zz_avr &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">*&lt;/span> z0 &lt;span style="color:#f92672">*&lt;/span> z_avr &lt;span style="color:#f92672">+&lt;/span> z0 &lt;span style="color:#f92672">*&lt;/span> z0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>r &lt;span style="color:#f92672">=&lt;/span> r2 &lt;span style="color:#f92672">**&lt;/span> &lt;span style="color:#ae81ff">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(center, r)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/sunshine_zoe/article/details/78852978" target="_blank" rel="noopener"
>https://blog.csdn.net/sunshine_zoe/article/details/78852978&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/liyuanbhu/article/details/80201371" target="_blank" rel="noopener"
>https://blog.csdn.net/liyuanbhu/article/details/80201371&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/woniu199166/article/details/79459807?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1" target="_blank" rel="noopener"
>https://blog.csdn.net/woniu199166/article/details/79459807?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&lt;/a>&lt;/p></description></item><item><title>Windows本地部署3d-photo-inpainting项目</title><link>https://kizx.github.io/post/windows%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B23d-photo-inpainting%E9%A1%B9%E7%9B%AE/</link><pubDate>Mon, 27 Apr 2020 12:12:00 +0000</pubDate><guid>https://kizx.github.io/post/windows%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B23d-photo-inpainting%E9%A1%B9%E7%9B%AE/</guid><description>&lt;p>前几天我接触了一个由2D图片生成3D视频的开源项目：https://github.com/vt-vl-lab/3d-photo-inpainting
[post cid=&amp;ldquo;168&amp;rdquo; /]
当时是在谷歌的Colab平台上运行的，在线平台虽方便，但是连接性不好，时断时续的体验差。最蛋疼的是运行环境不能被保存，第二天想用就得从头安装环境，相当耽误时间。于是我就试了本地部署该项目，虽然官方给出的Linux上的部署教程，但我又不是程序员，懒得整一套Linux系统了，就仿照着在Windows上部署了一下，结果是完全可行的。&lt;/p>
&lt;h2 id="前提">&lt;a href="#%e5%89%8d%e6%8f%90" class="header-anchor">&lt;/a>前提
&lt;/h2>&lt;ol>
&lt;li>电脑已安装Anaconda&lt;/li>
&lt;li>电脑GPU支持cuda加速并安装相应版本cuda驱动&lt;/li>
&lt;/ol>
&lt;p>[post cid=&amp;ldquo;146&amp;rdquo; /]&lt;/p>
&lt;h2 id="步骤">&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor">&lt;/a>步骤
&lt;/h2>&lt;ul>
&lt;li>打开Anaconda控制台新建一个环境&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>conda create -n 3DP python=3.7 anaconda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>conda activate 3DP
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>下载项目和模型&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>git clone git@github.com:vt-vl-lab/3d-photo-inpainting.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>手动下载这里面的4个模型并放置在相应文件夹：https://github.com/vt-vl-lab/3d-photo-inpainting/blob/master/download.sh
[scode type=&amp;ldquo;blue&amp;rdquo;]这一步我下好并打包放在一起了：https://pan.2bboy.com/Public/Software/www/3d-photo-inpainting.zip[/scode]&lt;/p>
&lt;ul>
&lt;li>下载依赖库&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">cd&lt;/span> 3d-photo-inpainting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit==10.1.243 -c pytorch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下载速度感人请试着换源或代理
[post cid=&amp;ldquo;163&amp;rdquo; /]&lt;/p>
&lt;ul>
&lt;li>将jpg格式的图片放在image目录下，运行命令&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>python main.py --config argument.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="更多设置">&lt;a href="#%e6%9b%b4%e5%a4%9a%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>更多设置
&lt;/h2>&lt;p>项目默认运行的参数都写在了&lt;code>argument.yml&lt;/code>文件中，这里面的参数意义参考：https://github.com/vt-vl-lab/3d-photo-inpainting/blob/master/DOCUMENTATION.md
这里面参数可以控制输出视频大小和镜头运动等，具体设置就自己探索吧。&lt;/p></description></item><item><title>利用分层深度修补技术将2D图片3D化</title><link>https://kizx.github.io/post/%E5%88%A9%E7%94%A8%E5%88%86%E5%B1%82%E6%B7%B1%E5%BA%A6%E4%BF%AE%E8%A1%A5%E6%8A%80%E6%9C%AF%E5%B0%862d%E5%9B%BE%E7%89%873d%E5%8C%96/</link><pubDate>Wed, 22 Apr 2020 11:16:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%88%A9%E7%94%A8%E5%88%86%E5%B1%82%E6%B7%B1%E5%BA%A6%E4%BF%AE%E8%A1%A5%E6%8A%80%E6%9C%AF%E5%B0%862d%E5%9B%BE%E7%89%873d%E5%8C%96/</guid><description>&lt;p>偶然在 &lt;a class="link" href="https://mp.weixin.qq.com/s/ODx3MAnOZwecZV0zOfZZHw" target="_blank" rel="noopener"
>果壳的推送&lt;/a> 中看到这个项目：https://shihmengli.github.io/3D-Photo-Inpainting/
感觉很有意思，可以将一张普通的2D照片经过处理得到一张具有深度空间的3D照片，准确点来说这应该叫2.5D比较像。应该是基于Pytorch训练出来的模型，官网展示的效果都相当惊艳。
官网展示的都是现实中照片，下面我试着对动漫图片进行处理，看看能不能得到一个“3D老婆”。&lt;/p>
&lt;h2 id="实践">&lt;a href="#%e5%ae%9e%e8%b7%b5" class="header-anchor">&lt;/a>实践
&lt;/h2>&lt;p>官网拉到下面的Links，开发者提供了github链接和Golab链接，github链接的文档有详细的本地部署说明，用的是Anaconda部署的。
这里我笔记本不便于运行这种大项目，好在它直接提供了Golab的demo，只要你有一个谷歌账号或者说是gmail邮箱，然后能上得了人家的Colab网站，直接点击官网的Demo或者下面的链接就可以在线部署运行了。
&lt;a class="link" href="https://colab.research.google.com/drive/1706ToQrkIZshRSJSHvZ1RuCiM__YX3Bz" target="_blank" rel="noopener"
>https://colab.research.google.com/drive/1706ToQrkIZshRSJSHvZ1RuCiM__YX3Bz&lt;/a>
先点击切换到playgrand模式，当然你也可以继续点击复制到云端硬盘来创建属于你的副本。
&lt;img src="https://pan.2bboy.com/img/2020/04/0426200137.jpg"
loading="lazy"
>&lt;img src="https://pan.2bboy.com/img/2020/04/0426201157.jpg"
loading="lazy"
>
然后按顺序一路点击运行即可，中间需要的只有漫长的等待。运行前可以先看下它遗留的那一长串运行结果，我们命令执行完成后会得到与之相同的输出结果，如果哪一句运行失败继续点击重新运行直至成功。
&lt;img src="https://pan.2bboy.com/img/2020/04/0422155541.jpg"
loading="lazy"
>&lt;img src="https://pan.2bboy.com/img/2020/04/0426202208.jpg"
loading="lazy"
>&lt;img src="https://pan.2bboy.com/img/2020/04/0426202650.jpg"
loading="lazy"
>
运行下面这一句上传一张原始jpg图片，上传的图片会放在左边image目录下，上传前最好清空image目录下的图片防止后面一步读取到错误的图片。
&lt;img src="https://pan.2bboy.com/img/2020/04/0426202815.jpg"
loading="lazy"
>
有时候由于连接性问题会上传不上去，这时候可以试试手动上传然后将图片拖动到image目录下。
&lt;img src="https://pan.2bboy.com/img/2020/04/0426203729.jpg"
loading="lazy"
>
最后一步生成3D深度图片，这里也需要等待。。。
&lt;img src="https://pan.2bboy.com/img/2020/04/0422183112.jpg"
loading="lazy"
>
生成的可视化视频在video目录下，每次程序会生成四个不同角度的的视频，双击可下载到本地。
&lt;img src="https://pan.2bboy.com/img/2020/04/0422183224.jpg"
loading="lazy"
>&lt;/p>
&lt;h2 id="视频演示">&lt;a href="#%e8%a7%86%e9%a2%91%e6%bc%94%e7%a4%ba" class="header-anchor">&lt;/a>视频演示
&lt;/h2>&lt;!-- raw HTML omitted -->
&lt;p>B站上面部分图片打了码，下面是原视频。
[vplayer url=&amp;ldquo;https://pan.2bboy.com/img/video/3dpic_p2.mp4&amp;rdquo; /]&lt;/p>
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>[post cid=&amp;ldquo;170&amp;rdquo; /]&lt;/p></description></item><item><title>利用腾讯云SCF免费搭建自己的一言API接口</title><link>https://kizx.github.io/post/%E5%88%A9%E7%94%A8%E8%85%BE%E8%AE%AF%E4%BA%91scf%E5%85%8D%E8%B4%B9%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%80%E8%A8%80api%E6%8E%A5%E5%8F%A3/</link><pubDate>Thu, 16 Apr 2020 14:11:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%88%A9%E7%94%A8%E8%85%BE%E8%AE%AF%E4%BA%91scf%E5%85%8D%E8%B4%B9%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%80%E8%A8%80api%E6%8E%A5%E5%8F%A3/</guid><description>&lt;p>通常我们如果想要搭建一个API服务，最起码都需要一个服务器，但是即使是最便宜的虚拟主机价格也不一定便宜，而且就算你会用自己的语言写API接口，服务器的响应环境配置也是相当麻烦。而利用云函数则完美避开了这些坑，腾讯云函数的免费额度个人用的话基本等于免费。关于云函数的使用我之前也略微了解过，下面就用Python搭建一个简单的一言API接口来实际操作下。
[post cid=&amp;ldquo;143&amp;rdquo; /]&lt;/p>
&lt;h2 id="搭建过程">&lt;a href="#%e6%90%ad%e5%bb%ba%e8%bf%87%e7%a8%8b" class="header-anchor">&lt;/a>搭建过程
&lt;/h2>&lt;p>首先新建函数，这里我选择python3.6环境
&lt;img src="https://pan.2bboy.com/img/2020/04/0416210358.jpg"
loading="lazy"
>
函数创建完成后，去触发方式里添加一个触发方式，这里要保持默认不勾选集成响应，因为我们返回的不是网页
&lt;img src="https://pan.2bboy.com/img/2020/04/0416210657.jpg"
loading="lazy"
>
触发方式创建后会生成一个链接，这个链接就是我们的API接口，现在点击这个链接应该会返回&amp;quot;Hello World&amp;quot;
&lt;img src="https://pan.2bboy.com/img/2020/04/0416210806.jpg"
loading="lazy"
>
下面我们开始写我们自己的函数，如果你看了官方文档会本地部署的话，比如用vscode云函数插件，可以用插件把当前项目下载到本地，不会本地的话直接在网页上操作也是可以的。
新建一个yiyan.py和yiyan.txt&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> random
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">yiyan&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#34;yiyan.txt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;r&amp;#39;&lt;/span>, encoding&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;utf-8&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>readlines()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> random&lt;span style="color:#f92672">.&lt;/span>sample(lines, &lt;span style="color:#ae81ff">1&lt;/span>)[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> line &lt;span style="color:#f92672">=&lt;/span> line&lt;span style="color:#f92672">.&lt;/span>strip()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> line
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(yiyan())
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>yiyan.txt里写入所有一言语句，比如我写的燕双鹰语录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>你太情绪化，也不大冷静，不习惯用大脑思考问题。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>在行动面前，语言永远是苍白无力的。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>老子是你祖宗！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我说过，你们会付出十倍的代价！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>为什么总有人觉得自己能够杀得了我？
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>恐吓是最低级的手段，是外强中干的表现。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你通常都会把自己爱的人，引进伏击圈吗？说实话，这种表达爱情的方式太与众不同，也太令人毛骨悚然了你的心！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>不要再大喊大叫了，心疼心疼自己可怜的肺吧！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你喜欢死吗？
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>不要做个破坏气场的人，这样会受到自然的惩罚。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我会让你看到自己的脑浆。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>回答我！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我总是很快。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>谁要低估女人的能力，一定吃大亏！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>要站在敌人的背后，让敌人变成睁眼瞎。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>能够让你轻易背叛的，绝不是你真正的信仰。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>即使你拿枪对准了我的后背，我也可以在一秒钟之内让你看到自己的脑浆。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你没听到我说的话吗？
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我赌你的枪里没有子弹。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>谁要是低估女人的能力，一定会吃大亏！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>手段并不能说明什么，只有目的才能分得出正义和邪恶。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>小心背后啊。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>一个善良的人，不管他的信仰是什么，也不管他是不是有信仰，至少会做出善良的事情。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>不要制造自己解决不了的麻烦，也不要许下无法兑现的诺言。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>自信总不是坏事，只要不是盲目的。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>意志并不是空穴来风，想有就有，那里面闪烁着正义和人性的光芒。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>不要用枪指着我的头，否则你会看到自己的脑浆！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>这一点已经不重要了。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>别让我再说第二遍。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你的眼睛会欺骗你，你的直觉会误导你，只有心才是最可靠的！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你信不信，我可以在一秒钟内让你看到自己的脑浆！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你只需要知道，我所知道的比你们知道的要多得多！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你已经死了，死人能杀人吗？
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你真的不会讲故事！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>这种死法，真的是很惨。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我有个习惯，会杀死向自己开枪的人，哪怕他的枪里没有子弹。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>速度不是靠双臂和力量达到的，而是靠心。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>我的枪口再低半寸，你们就会看到自己老大的脑浆！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>这种试探才可怕是在拿自己弟兄的生命开玩笑，这种不信任更加可怕很难想象今后你我双方能够精诚合作。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>你相信自己的眼睛吗？有时眼睛会欺骗你。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>像你这样的人要怎么改变，嗯？你不会改变，只有死！
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>休息是养精蓄锐，睡觉则是懒惰松散！
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后重写index.py&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding: utf8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> logging
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> yiyan &lt;span style="color:#f92672">import&lt;/span> yiyan
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>logger &lt;span style="color:#f92672">=&lt;/span> logging&lt;span style="color:#f92672">.&lt;/span>getLogger()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">main_handler&lt;/span>(event, context):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#f92672">=&lt;/span> yiyan()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> logger&lt;span style="color:#f92672">.&lt;/span>info(result)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> result
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上传部署或者点击完成后，点击测试或者打开前面生成的API链接，应该就可以返回一言了
&lt;img src="https://pan.2bboy.com/img/2020/04/0416211232.jpg"
loading="lazy"
>&lt;/p>
&lt;h2 id="自定义域名">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89%e5%9f%9f%e5%90%8d" class="header-anchor">&lt;/a>自定义域名
&lt;/h2>&lt;p>这个默认链接太长了，我们可以自定义域名。回到上面的触发方式那里，点击这个服务名
&lt;img src="https://pan.2bboy.com/img/2020/04/0416211421.jpg"
loading="lazy"
>
点击自定义域名，然后点击新建
&lt;img src="https://pan.2bboy.com/img/2020/04/0416211508.jpg"
loading="lazy"
>
根据页面提示自行添加域名解析，如果选择https的话，还需要自行添加证书，建议在腾讯云申请证书，这样就不用再添加一遍证书密钥什么的了，最后别忘了自定义路径映射，否则访问链接都得带&lt;code>/release/&lt;/code>样的后缀
&lt;img src="https://pan.2bboy.com/img/2020/04/0416214810.jpg"
loading="lazy"
>
现在我们访问[域名]/[云函数的名称]（比如http://api.2bboy.com/api）就能访问到你的一言啦！
如果你不想要后面这个云函数的名称或者想换一个，还是那个服务界面，选择管理API，点击编辑就能自定义后缀了，修改后按照提示下一步然后重新发布就行了，现在就能通过http://api.2bboy.com/访问了
&lt;img src="https://pan.2bboy.com/img/2020/04/0416220637.jpg"
loading="lazy"
>&lt;/p></description></item><item><title>QPixmap.scaled在Pyside2和Pyqt5中的不同</title><link>https://kizx.github.io/post/qpixmap.scaled%E5%9C%A8pyside2%E5%92%8Cpyqt5%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C/</link><pubDate>Mon, 13 Apr 2020 16:23:00 +0000</pubDate><guid>https://kizx.github.io/post/qpixmap.scaled%E5%9C%A8pyside2%E5%92%8Cpyqt5%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C/</guid><description>&lt;p>这个参数有以下三个值。
&lt;img src="https://pan.2bboy.com/ppx/img/2020/04/qimage-scaling.png"
loading="lazy"
>&lt;/p>
&lt;hr>
&lt;p>对于一个单独的布局的label来说，两者参数的表现并无不同，但是当我的图片放置在一个网格布局中时，Pyside2的参数设置为&lt;code>KeepAspectRatio&lt;/code>和Pyqt5参数设置为&lt;code>KeepAspectRatioByExpanding&lt;/code>表现是一样的，很是奇怪。
以下是Pyqt5的显示结果。
&lt;img src="https://pan.2bboy.com/img/2020/04/0414001415.jpg"
loading="lazy"
alt="KeepAspectRatioByExpanding"
>
&lt;img src="https://pan.2bboy.com/img/2020/04/0414002010.jpg"
loading="lazy"
alt="KeepAspectRatio"
>
准确点来说是Pyqt5的参数在这里显示有点不对劲，具体原因有待研究。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://doc.qt.io/qtforpython/PySide2/QtGui/QPixmap.html?highlight=qpixmap#PySide2.QtGui.PySide2.QtGui.QPixmap.scaled" target="_blank" rel="noopener"
>https://doc.qt.io/qtforpython/PySide2/QtGui/QPixmap.html?highlight=qpixmap#PySide2.QtGui.PySide2.QtGui.QPixmap.scaled&lt;/a>
&lt;a class="link" href="https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/core/Qt.AspectRatioMode.html" target="_blank" rel="noopener"
>https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/core/Qt.AspectRatioMode.html&lt;/a>&lt;/p></description></item><item><title>Pyqt加载ui文件界面的方法</title><link>https://kizx.github.io/post/pyqt%E5%8A%A0%E8%BD%BDui%E6%96%87%E4%BB%B6%E7%95%8C%E9%9D%A2%E7%9A%84%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 13 Apr 2020 15:55:00 +0000</pubDate><guid>https://kizx.github.io/post/pyqt%E5%8A%A0%E8%BD%BDui%E6%96%87%E4%BB%B6%E7%95%8C%E9%9D%A2%E7%9A%84%E6%96%B9%E6%B3%95/</guid><description>&lt;p>注意我这里主界面ui文件是一个QWidget，不是一个QMainWindow，QMainWindow的稍有不同。&lt;/p>
&lt;h2 id="动态加载">&lt;a href="#%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd" class="header-anchor">&lt;/a>动态加载
&lt;/h2>&lt;p>动态加载不用将ui文件转换为py文件，边改界面就能边用，很是方便，适合绝大多数情况，这种方法唯一的缺点大概就是编程时控件不能进行自动补全，因为IDE没法知道控件继承自哪里。
[tabs]
[tab name=&amp;ldquo;Pyside2的加载方法&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide2.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QApplication
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide2.QtUiTools &lt;span style="color:#f92672">import&lt;/span> QUiLoader
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Window&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> QUiLoader()&lt;span style="color:#f92672">.&lt;/span>load(&lt;span style="color:#e6db74">&amp;#39;view.ui&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 假设我们的ui文件为view.ui&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app &lt;span style="color:#f92672">=&lt;/span> QApplication([])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>window &lt;span style="color:#f92672">=&lt;/span> Window()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>window&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>show()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app&lt;span style="color:#f92672">.&lt;/span>exec_()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>官网教程:https://doc.qt.io/qtforpython/tutorials/basictutorial/uifiles.html
[/tab]
[tab name=&amp;ldquo;Pyqt5的加载方法&amp;rdquo;]&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PyQt5.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QApplication
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PyQt5 &lt;span style="color:#f92672">import&lt;/span> uic
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Window&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> uic&lt;span style="color:#f92672">.&lt;/span>loadUi(&lt;span style="color:#e6db74">&amp;#34;view.ui&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app &lt;span style="color:#f92672">=&lt;/span> QApplication([])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>window &lt;span style="color:#f92672">=&lt;/span> Window()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>window&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>show()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app&lt;span style="color:#f92672">.&lt;/span>exec_()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>[/tab]
[/tabs]&lt;/p>
&lt;h2 id="静态加载">&lt;a href="#%e9%9d%99%e6%80%81%e5%8a%a0%e8%bd%bd" class="header-anchor">&lt;/a>静态加载
&lt;/h2>&lt;p>就是先用uic工具将ui文件转换成py文件，然后再导入ui文件，每次ui文件更新都需要重新转换一次。适合需要对控件功能进行重写的场合，一句话就是辅助手写ui而已，另一个在用pyinstaller打包时这样应该能减小打包后的体积，因为转换出来的py文件默认&lt;code>from PySide2.QtWidgets import *&lt;/code>，直接导入了所有包，如果按需导入的话应该可以减小一点体积，不过经我测试只减小了1M不到的体积，意义不大。
[tabs]
[tab name=&amp;ldquo;Pyside2的加载方法&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> PySide2.QtWidgets &lt;span style="color:#f92672">import&lt;/span> QApplication, QWidget
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> view &lt;span style="color:#f92672">import&lt;/span> Ui_Form
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> sys
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Window&lt;/span>(QWidget): &lt;span style="color:#75715e"># 这里继承QWidget,因为我的ui主界面是Widget,官网上这点不一样&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui &lt;span style="color:#f92672">=&lt;/span> Ui_Form()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>setupUi(self)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> app &lt;span style="color:#f92672">=&lt;/span> QApplication([])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window &lt;span style="color:#f92672">=&lt;/span> Window()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window&lt;span style="color:#f92672">.&lt;/span>show() &lt;span style="color:#75715e"># 这里不是self.ui&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> app&lt;span style="color:#f92672">.&lt;/span>exec_()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>[/tab]
[tab name=&amp;ldquo;Pyqt5的加载方法&amp;rdquo;]
和前面类似，注意要用Pyqt5的uic工具进行转换才行，因为生成的py文件自动导入的包名不一样。
[/tab]
[/tabs]&lt;/p>
&lt;h2 id="总结">&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor">&lt;/a>总结
&lt;/h2>&lt;p>动态加载不能进行代码自动补全，打包时ui文件也必须一同打包；静态加载每次手动转换麻烦了点，但转换后因为有了明确的代码可以自动补全代码，进行一些高级编程时有问题也可以更好的debug。
所以我觉得最好先用动态加载的方法把界面先搞定，然后写代码时再切到静态加载方法。&lt;/p></description></item><item><title>conda设置国内镜像源</title><link>https://kizx.github.io/post/conda%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/</link><pubDate>Tue, 07 Apr 2020 08:59:00 +0000</pubDate><guid>https://kizx.github.io/post/conda%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/</guid><description>&lt;p>与 &lt;a class="link" href="https://www.2bboy.com/archives/156.html" target="_blank" rel="noopener"
>pip设置pypi源&lt;/a> 不同，conda需要设置的源是anaconda的源，annaconda的国内镜像目前好像只有清华。科大那个现在直接重定向转到清华，已经不能用了。&lt;/p>
&lt;h2 id="设置">&lt;a href="#%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>设置
&lt;/h2>&lt;p>与pip设置pypi源类似，conda可以在windows用户目录下创建一个&lt;code>.condarc&lt;/code>文件，然后写入以下内容即可。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>ssl_verify: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>channels:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - defaults
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show_channel_urls: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>default_channels:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>custom_channels:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果无法创建这个文件，可以使用以下命令创建。&lt;/p>
&lt;pre tabindex="0">&lt;code>conda config --set show_channel_urls yes
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>如果命令行一个个添加源也是可以的。&lt;/p>
&lt;pre tabindex="0">&lt;code>conda config --add channels 源地址
&lt;/code>&lt;/pre>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/" target="_blank" rel="noopener"
>https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/&lt;/a>
&lt;a class="link" href="http://mirrors.ustc.edu.cn/help/anaconda.html" target="_blank" rel="noopener"
>http://mirrors.ustc.edu.cn/help/anaconda.html&lt;/a>&lt;/p></description></item><item><title>Python处理和保存json文件注意事项</title><link>https://kizx.github.io/post/python%E5%A4%84%E7%90%86%E5%92%8C%E4%BF%9D%E5%AD%98json%E6%96%87%E4%BB%B6%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/</link><pubDate>Fri, 27 Mar 2020 11:00:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E5%A4%84%E7%90%86%E5%92%8C%E4%BF%9D%E5%AD%98json%E6%96%87%E4%BB%B6%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/</guid><description>&lt;p>Python处理json文件很简单，只需要&lt;code>import json&lt;/code>即可，所需要掌握的函数也只有以下四个。
json.dumps(obj)：将python数据类型转化为str类型
json.dump(obj,fp)：将python数据写入文件fp中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dic &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;a&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;aa&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;b&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;bb&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;c&amp;#39;&lt;/span>: {&lt;span style="color:#e6db74">&amp;#39;c1&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cc&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;c2&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cc&amp;#39;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;w&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 先转换成字符串再写入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> config &lt;span style="color:#f92672">=&lt;/span> json&lt;span style="color:#f92672">.&lt;/span>dumps(dic)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(config)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 直接写入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> json&lt;span style="color:#f92672">.&lt;/span>dump(dic, f)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>为了美观，我们一般加上参数&lt;code>config = json.dumps(dic, indent=4)&lt;/code>，首行缩进4个字符。&lt;/p>
&lt;hr>
&lt;p>json.load(fp)：从json文件中读取数据
json.loas(str)：将str类型转换为python数据类型&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 一般是下面这种用法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;r&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> config &lt;span style="color:#f92672">=&lt;/span> json&lt;span style="color:#f92672">.&lt;/span>load(f)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 这种很少用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config &lt;span style="color:#f92672">=&lt;/span> json&lt;span style="color:#f92672">.&lt;/span>loads(json&lt;span style="color:#f92672">.&lt;/span>dumps(dic))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="注意事项">&lt;a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9" class="header-anchor">&lt;/a>注意事项
&lt;/h2>&lt;p>有时候我们需要读取一个json文件，文件必须确保先被创建&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> os&lt;span style="color:#f92672">.&lt;/span>path&lt;span style="color:#f92672">.&lt;/span>exists(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;w&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{}&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 写入一个空字典，确保后面读取后不会出错&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对配置进行改动后再保存，需要先清空配置文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;r+&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f: &lt;span style="color:#75715e"># 这里只能用&amp;#39;r+&amp;#39;模式打开&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> config &lt;span style="color:#f92672">=&lt;/span> json&lt;span style="color:#f92672">.&lt;/span>load(f) &lt;span style="color:#75715e"># 读取json文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> config&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#e6db74">&amp;#39;c&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 剔除参数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 不加下面两句就会在文件末尾继续续写&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>seek(&lt;span style="color:#ae81ff">0&lt;/span>) &lt;span style="color:#75715e"># 指针移到文件头&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>truncate() &lt;span style="color:#75715e"># 清空文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> json&lt;span style="color:#f92672">.&lt;/span>dump(config, f, indent&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>) &lt;span style="color:#75715e"># 写入新配置&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者采用下面的分开读取和写入的方法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;r&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> config &lt;span style="color:#f92672">=&lt;/span> json&lt;span style="color:#f92672">.&lt;/span>load(f) &lt;span style="color:#75715e"># 读取json文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config&lt;span style="color:#f92672">.&lt;/span>pop(&lt;span style="color:#e6db74">&amp;#39;c&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 剔除参数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;config.json&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;w&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f: &lt;span style="color:#75715e"># &amp;#39;w&amp;#39;模式打开文件默认先清空&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> json&lt;span style="color:#f92672">.&lt;/span>dump(config, f, indent&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>) &lt;span style="color:#75715e"># 写入新配置&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>pyqt实现文件拖放获取路径</title><link>https://kizx.github.io/post/pyqt%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E6%8B%96%E6%94%BE%E8%8E%B7%E5%8F%96%E8%B7%AF%E5%BE%84/</link><pubDate>Sat, 21 Mar 2020 14:11:00 +0000</pubDate><guid>https://kizx.github.io/post/pyqt%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E6%8B%96%E6%94%BE%E8%8E%B7%E5%8F%96%E8%B7%AF%E5%BE%84/</guid><description>&lt;p>文件拖放自动填充路径操作本应该是个很简单的操作，结果搜到的教程都在讲控件的拖拽，几经折磨后终于算是实现了这个功能吧。&lt;/p>
&lt;h2 id="操作">&lt;a href="#%e6%93%8d%e4%bd%9c" class="header-anchor">&lt;/a>操作
&lt;/h2>&lt;p>首先，要知道pyqt的控件有个setAcceptDrops(bool)方法可以设置控件是否接受拖放这个动作，如果是用qt设计师设计的界面可以看到该属性是默认打开的，既然默认打开，那么理论就应该可以实现文件拖放功能。
&lt;img src="https://pan.2bboy.com/img/2020/03/0321214758.jpg"
loading="lazy"
>
但实际操作时我却发现在IDE里可以拖放，但是到了实际的桌面却无法拖放，这一点我真是无法理解啊。。
&lt;img src="https://pan.2bboy.com/img/2020/03/0321.gif"
loading="lazy"
>&lt;/p>
&lt;hr>
&lt;p>因此我只好去看了一些拖拽的教程，发现在重写一个新的QLineEdit类的情况下是可以使用的，重写的类如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyQLine&lt;/span>(QLineEdit):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34;实现文件拖放功能&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> super()&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">__init__&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setAcceptDrops(&lt;span style="color:#66d9ef">True&lt;/span>) &lt;span style="color:#75715e"># 设置接受拖放动作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dragEnterEvent&lt;/span>(self, e):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>endswith(&lt;span style="color:#e6db74">&amp;#39;.srt&amp;#39;&lt;/span>): &lt;span style="color:#75715e"># 如果是.srt结尾的路径接受&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>accept()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e&lt;span style="color:#f92672">.&lt;/span>ignore()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">dropEvent&lt;/span>(self, e): &lt;span style="color:#75715e"># 放下文件后的动作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path &lt;span style="color:#f92672">=&lt;/span> e&lt;span style="color:#f92672">.&lt;/span>mimeData()&lt;span style="color:#f92672">.&lt;/span>text()&lt;span style="color:#f92672">.&lt;/span>replace(&lt;span style="color:#e6db74">&amp;#39;file:///&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>) &lt;span style="color:#75715e"># 删除多余开头&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>setText(path)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最关键的是e.mimeData().text()获取路径，这里的mimeData()可以参考官方说明 &lt;a class="link" href="https://doc.qt.io/qtforpython/PySide2/QtCore/QMimeData.html" target="_blank" rel="noopener"
>https://doc.qt.io/qtforpython/PySide2/QtCore/QMimeData.html&lt;/a>。
在上面的动图里能看到拖放文件后获得的文件路径是以&amp;rsquo;file:///&amp;lsquo;开头的，所以需要去掉这玩意，剩下的应该很简单了。&lt;/p>
&lt;hr>
&lt;p>还有一个问题就是我是用qt设计师设计界面然后动态导入的，我自己新建了一个单行文本控件后，哪怕控件名字和之前的名字一样，最后生成的界面里还是会出现两个文本框，但我又不想在qt设计师里删除原来的文本框。所以我只好来个移花接木，把原来的文本框删掉并替换成我自己的。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path&lt;span style="color:#f92672">.&lt;/span>deleteLater() &lt;span style="color:#75715e"># 删除原有的路径框&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path &lt;span style="color:#f92672">=&lt;/span> MyQLine() &lt;span style="color:#75715e"># 新建自己的替换原有的&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path&lt;span style="color:#f92672">.&lt;/span>setPlaceholderText(&lt;span style="color:#e6db74">&amp;#39;浏览或拖拽SRT字幕文件到这里&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>horizontalLayout_2&lt;span style="color:#f92672">.&lt;/span>addWidget(self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file_path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>horizontalLayout_2&lt;span style="color:#f92672">.&lt;/span>addWidget(self&lt;span style="color:#f92672">.&lt;/span>ui&lt;span style="color:#f92672">.&lt;/span>file)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>针对上面的问题我后来找到了解决方案。
[post cid=&amp;ldquo;173&amp;rdquo; /]&lt;/p></description></item><item><title>几款看图软件测评</title><link>https://kizx.github.io/post/%E5%87%A0%E6%AC%BE%E7%9C%8B%E5%9B%BE%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%84/</link><pubDate>Tue, 17 Mar 2020 07:11:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%87%A0%E6%AC%BE%E7%9C%8B%E5%9B%BE%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%84/</guid><description>&lt;p>因为平时看图较多（不是那种图），所以一款好的看图软件显得很重要，我以连续查看4K大图作为测试手段，主要从速度、颜值、功能、便捷几个角度来评判。&lt;/p>
&lt;h2 id="honeyview">&lt;a href="#honeyview" class="header-anchor">&lt;/a>HoneyView
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317132914.jpg"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/03/0317133544.jpg"
loading="lazy"
>
我一直在用的看图软件，速度超级快，毫无卡顿，颜值在线，鼠标键位可以自由设置，右键有几个简单画面增强效果很好用，可以幻灯片播放，可以查看预览这点很棒。
唯一缺点是放大锁定后无法锁定住当前位置。&lt;/p>
&lt;h2 id="万能看图王">&lt;a href="#%e4%b8%87%e8%83%bd%e7%9c%8b%e5%9b%be%e7%8e%8b" class="header-anchor">&lt;/a>万能看图王
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317133945.jpg"
loading="lazy"
>
看这名字和2345那个流氓有点像，实际页面也很像，但既然下载了就测试下。底部有预览窗，颜值也还好。
缺点首先疑似会有广告，因为设置里有关闭广告的选项，至于流不流氓就不知道了。速度超级慢，光凭这一点就可以卸载了，放大锁定后不能锁定区域。&lt;/p>
&lt;h2 id="看图啦">&lt;a href="#%e7%9c%8b%e5%9b%be%e5%95%a6" class="header-anchor">&lt;/a>看图啦
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317134833.jpg"
loading="lazy"
>
同样是国产的一个软件，感觉也和上面那个有点像，但速度稍快一点，不过也仍然很慢，可以左右同时查看两张图这点是唯一亮点。
操作不是很方便，感觉是bug，图片缩放锁定功能虽然有但也是坏的，总之不推荐。&lt;/p>
&lt;h2 id="xnview">&lt;a href="#xnview" class="header-anchor">&lt;/a>XnView
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317140222.jpg"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/03/0317140510.jpg"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/03/0317140828.jpg"
loading="lazy"
>
很多人推荐的软件，刚打开是一个文件浏览器的亚子，一看就知道功能很丰富，速度较快，但没有HoneyView快，有局部裁剪功能，也有划定一个区域然后放大的功能，放大后能固定放大比和区域，同时拥有许多调节画面的功能，完全可以当作一个简易PS用。
缺点大概就是没有HoneyView快，然后那个浏览器界面复杂了点，把颜值一下拉低了，总体来说还是很推荐的。&lt;/p>
&lt;h2 id="iranfanview">&lt;a href="#iranfanview" class="header-anchor">&lt;/a>IranfanView
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317142951.jpg"
loading="lazy"
>
一个英文界面的软件，和上面的软件风格有点像，像是上面软件的精简版，有划定区域放大的功能，速度很快，和HoneyView差不多。
缺点是无法锁定放大区域，颜值也不是很高，英文界面让我懒得看设置了(虽然好像有中文语言包)，不设置的话可以说体验不太好。&lt;/p>
&lt;h2 id="jpegview">&lt;a href="#jpegview" class="header-anchor">&lt;/a>JPEGView
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317150037.jpg"
loading="lazy"
>
一款小巧的软件，速度很快，毫无卡顿，有许多增强图片的功能，并且能保持参数，当然也能保持锁定放大比和放大区域。
缺点是找不到设置快捷键的地方，只有一个配置文件，仔细找找应该有设置快捷键的地方。界面过于简陋，颜值差点。
不在意颜值的话，这些增强功能真的很棒，而且可以保持参数这点太棒了。&lt;/p>
&lt;h2 id="acdsee">&lt;a href="#acdsee" class="header-anchor">&lt;/a>ACDSee
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317152330.jpg"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2020/03/0317152200.jpg"
loading="lazy"
>
官方免费版有广告，使用前还需要注册，打开一看就知道更偏向于图片管理软件，只是兼带图片查看功能而已，速度一般，功能似乎很多但懒得看了。
免费版带广告这点就劝退了，偏向于管理图片而非单纯的图片查看。&lt;/p>
&lt;h2 id="faststone-image-viewer">&lt;a href="#faststone-image-viewer" class="header-anchor">&lt;/a>FastStone Image Viewer
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317220051.jpg"
loading="lazy"
>
和上面的XnView有点类似，颜值稍高一点，可以批量处理图片，没有缩放锁定。&lt;/p>
&lt;h2 id="imageglass">&lt;a href="#imageglass" class="header-anchor">&lt;/a>ImageGlass
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317220859.jpg"
loading="lazy"
>
颜值不错，但速度太慢，不考虑。&lt;/p>
&lt;h2 id="pictus">&lt;a href="#pictus" class="header-anchor">&lt;/a>&lt;a class="link" href="https://poppeman.se/pictus/" target="_blank" rel="noopener"
>Pictus&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317221730.jpg"
loading="lazy"
>
非常小巧的一款软件，只有5M大小，所以功能没有很多，速度一般，适合追求极简的用户。&lt;/p>
&lt;h2 id="fastpictureviewer">&lt;a href="#fastpictureviewer" class="header-anchor">&lt;/a>&lt;a class="link" href="https://www.fastpictureviewer.com/downloads/" target="_blank" rel="noopener"
>FastPictureViewer&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/0317223134.jpg"
loading="lazy"
>
左键按住显示原始大小，右键按住显示三倍大小，这个设定倒是很有趣，速度较慢，不支持tif格式。&lt;/p></description></item><item><title>Kite——让代码补全更智能</title><link>https://kizx.github.io/post/kite%E8%AE%A9%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%9B%B4%E6%99%BA%E8%83%BD/</link><pubDate>Mon, 16 Mar 2020 11:48:17 +0000</pubDate><guid>https://kizx.github.io/post/kite%E8%AE%A9%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%9B%B4%E6%99%BA%E8%83%BD/</guid><description>&lt;p>Kite是一款基于深度学习的代码自动补全的应用，其特点就是智能化，人性化，不仅代码补全更智能，还贴心的自动为你搜索方法文档和使用案例，甚至可以使面向谷歌编程变成面向Kite编程。
介绍视频： &lt;a class="link" href="https://www.youtube.com/watch?v=bF50YPyUKTQ" target="_blank" rel="noopener"
>https://www.youtube.com/watch?v=bF50YPyUKTQ&lt;/a>&lt;/p>
&lt;h2 id="使用">&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>使用
&lt;/h2>&lt;p>官网下载：https://kite.com/
下载安装登录后会自动下载相关插件，然后打开你的IDE就可以用了。
&lt;img src="https://pan.2bboy.com/img/2020/03/0316185906.jpg"
loading="lazy"
>
更多详细说明可以参考帮助文档。&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>官方帮助文档： &lt;a class="link" href="https://help.kite.com/" target="_blank" rel="noopener"
>https://help.kite.com/&lt;/a>&lt;/p>
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>用了有一段时间了，说实话没感觉带来多大方便，不过当个函数手册查查参数也还行。&lt;/p></description></item><item><title>pip设置pypi国内镜像</title><link>https://kizx.github.io/post/pip%E8%AE%BE%E7%BD%AEpypi%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F/</link><pubDate>Wed, 11 Mar 2020 12:14:00 +0000</pubDate><guid>https://kizx.github.io/post/pip%E8%AE%BE%E7%BD%AEpypi%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F/</guid><description>&lt;h2 id="开源镜像站">&lt;a href="#%e5%bc%80%e6%ba%90%e9%95%9c%e5%83%8f%e7%ab%99" class="header-anchor">&lt;/a>开源镜像站
&lt;/h2>&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]&lt;a class="link" href="https://developer.aliyun.com/mirror/" target="_blank" rel="noopener"
>阿里镜像&lt;/a>&lt;code>https://mirrors.aliyun.com/pypi/simple/&lt;/code>[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]&lt;a class="link" href="https://mirrors.163.com/" target="_blank" rel="noopener"
>网易镜像&lt;/a>&lt;code>https://mirrors.163.com/pypi/simple/&lt;/code>[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]&lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/" target="_blank" rel="noopener"
>清华镜像&lt;/a>&lt;code>https://pypi.tuna.tsinghua.edu.cn/simple&lt;/code>[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]&lt;a class="link" href="https://pypi.doubanio.com/simple/" target="_blank" rel="noopener"
>豆瓣镜像&lt;/a>&lt;code>https://pypi.doubanio.com/simple/&lt;/code>[/scode]&lt;/p>
&lt;h2 id="临时使用">&lt;a href="#%e4%b8%b4%e6%97%b6%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>临时使用
&lt;/h2>&lt;p>使用pip的时候在后面加上-i参数，指定pip源：
&lt;code>pip install xxx -i 镜像地址&lt;/code>&lt;/p>
&lt;h2 id="一劳永逸">&lt;a href="#%e4%b8%80%e5%8a%b3%e6%b0%b8%e9%80%b8" class="header-anchor">&lt;/a>一劳永逸
&lt;/h2>&lt;h3 id="linuxunix中使用">&lt;a href="#linuxunix%e4%b8%ad%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>Linux/Unix中使用
&lt;/h3>&lt;p>&lt;code>~/.pip/pip.conf&lt;/code>
修改pip.conf&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>[global]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>index-url = 镜像地址
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="windows中使用">&lt;a href="#windows%e4%b8%ad%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>Windows中使用
&lt;/h3>&lt;p>一句命令
&lt;code>pip config set global.index-url 镜像地址&lt;/code>&lt;/p>
&lt;p>这句命令命令干了什么事呢，其实就是创建了一个pip.ini文件，我们也可以手动创建，在哪创建呢，我们输入
&lt;code>pip config list -v&lt;/code>
得到如下输出&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>D:&lt;span style="color:#ae81ff">\a&lt;/span>dmin&lt;span style="color:#ae81ff">\D&lt;/span>esktop&amp;gt;pip config list -v
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>For variant &lt;span style="color:#e6db74">&amp;#39;global&amp;#39;&lt;/span>, will try loading &lt;span style="color:#e6db74">&amp;#39;C:\ProgramData\pip\pip.ini&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>For variant &lt;span style="color:#e6db74">&amp;#39;user&amp;#39;&lt;/span>, will try loading &lt;span style="color:#e6db74">&amp;#39;C:\Users\admin\pip\pip.ini&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>For variant &lt;span style="color:#e6db74">&amp;#39;user&amp;#39;&lt;/span>, will try loading &lt;span style="color:#e6db74">&amp;#39;C:\Users\admin\AppData\Roaming\pip\pip.ini&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>For variant &lt;span style="color:#e6db74">&amp;#39;site&amp;#39;&lt;/span>, will try loading &lt;span style="color:#e6db74">&amp;#39;c:\users\admin\appdata\local\programs\python\python37-32\pip.ini&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>global.index-url&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;https://mirrors.aliyun.com/pypi/simple/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>install.trusted-host&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;mirrors.aliyun.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以看出pip安装时搜索pip.ini来源的路径以及搜索到的镜像源，所以我们只需向其中任一个路径创建一个pip文件夹，然后创建pip.ini文件就行了，可以看到前面的路径都是类似系统路径，最后一个路径是pip环境的路径，所以靠后的路径优先级是更高的，但一般我们只需在系统环境里设置一下就可以一劳永逸了，上面的一句命令行是向Roaming路径（也就是%APPDATA%路径）写入pip/pip.ini。
pip.ini里可以这样写&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>[global]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>index-url = https://mirrors.aliyun.com/pypi/simple/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[install]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>trusted-host=mirrors.aliyun.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面的一句trusted-host是添加信任防止报错&lt;/p>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="http://mirrors.163.com/.help/pypi.html" target="_blank" rel="noopener"
>http://mirrors.163.com/.help/pypi.html&lt;/a>
&lt;a class="link" href="https://mirror.tuna.tsinghua.edu.cn/help/pypi/" target="_blank" rel="noopener"
>https://mirror.tuna.tsinghua.edu.cn/help/pypi/&lt;/a>
&lt;a class="link" href="https://developer.aliyun.com/mirror/pypi?spm=a2c6h.13651102.0.0.3e221b11kAuK9K" target="_blank" rel="noopener"
>https://developer.aliyun.com/mirror/pypi?spm=a2c6h.13651102.0.0.3e221b11kAuK9K&lt;/a>
&lt;a class="link" href="https://pip.pypa.io/en/stable/user_guide/#config-file" target="_blank" rel="noopener"
>https://pip.pypa.io/en/stable/user_guide/#config-file&lt;/a>&lt;/p></description></item><item><title>Pyinstaller打包的正确姿势</title><link>https://kizx.github.io/post/pyinstaller%E6%89%93%E5%8C%85%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</link><pubDate>Wed, 04 Mar 2020 06:03:00 +0000</pubDate><guid>https://kizx.github.io/post/pyinstaller%E6%89%93%E5%8C%85%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</guid><description>&lt;p>python打包成exe程序的方法有不少，但最常用的还是pyinstaller，打包python程序主要是为了给那些不懂python的人用的，而且如果是像pyqt一类的图形界面程序，打包一下也会变得更易用。&lt;/p>
&lt;h2 id="安装">&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>安装
&lt;/h2>&lt;p>建议被打包的程序都放在一个虚拟环境中，不论是用venv，pipenv还是conda都是可以的，然后在虚拟环境中安装pyinstaller。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install pyinstaller
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="使用">&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>使用
&lt;/h2>&lt;p>命令行进入虚拟环境，使用pyinstaller就是一条命令行的事，命令的格式如下：
&lt;code>pyinstaller [选项] xxx.py&lt;/code>
其中选项可以用命令 &lt;code>pyinstaller -h&lt;/code> 查看，常用命令如下:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>选项&lt;/th>
&lt;th>功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>-h, &amp;ndash;help&lt;/td>
&lt;td>帮助&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;ndash;distpath DIR&lt;/td>
&lt;td>生成exe程序的位置，默认在当前目录的dist文件下&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;ndash;workpath WORKPATH&lt;/td>
&lt;td>生成临时文件的位置，默认在当前目录的build文件下&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;ndash;clean&lt;/td>
&lt;td>清除生成的文件（重新生成前先清除）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-D, &amp;ndash;onedir&lt;/td>
&lt;td>打包成一个包含exe程序的文件夹&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-F, &amp;ndash;onefile&lt;/td>
&lt;td>打包成一个独立的exe程序（运行起来会慢很多）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;ndash;hidden-import MODULENAME&lt;/td>
&lt;td>有些依赖包是动态导入的需手动导入告诉pyinstaller&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-d {all,imports,bootloader,noarchive}&lt;/td>
&lt;td>生成debug版本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-w, &amp;ndash;windowed, &amp;ndash;noconsole&lt;/td>
&lt;td>隐藏命令行窗口&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-i &amp;lt;FILE.ico or FILE.exe,ID or FILE.icns&amp;gt;&lt;/td>
&lt;td>为程序添加ico图标&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-n NAME, &amp;ndash;name NAME&lt;/td>
&lt;td>为exe程序指定名称，默认和py程序名一样&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>打包完成后会生成三个文件(夹)：build，dist，以及一个.spec文件，这个文件记录你的打包参数，可以直接在里面修改参数，然后执行以下命令直接打包，对于依赖复杂的程序这么做更方便，毕竟谁也不想每次打包都输那么长的命令行。
&lt;code>pyinstaller xxx.spec&lt;/code>
至于spec文件具体怎么用参考&lt;a class="link" href="https://pyinstaller.readthedocs.io/en/stable/spec-files.html" target="_blank" rel="noopener"
>官方文档&lt;/a>。&lt;/p>
&lt;h2 id="一些坑">&lt;a href="#%e4%b8%80%e4%ba%9b%e5%9d%91" class="header-anchor">&lt;/a>一些坑
&lt;/h2>&lt;h3 id="打包pyqt程序">&lt;a href="#%e6%89%93%e5%8c%85pyqt%e7%a8%8b%e5%ba%8f" class="header-anchor">&lt;/a>打包pyqt程序
&lt;/h3>&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]
虽然理论上程序打包很简单，但实际上可能会遇到各种问题，在打包pyqt程序时如果用的是动态导入ui文件，那么就得加上 &lt;code>--hidden-import PySide2.QtXml&lt;/code> 并且把ui文件也一同放入exe文件夹内，因为程序并不会打包ui文件；如果程序用到了什么像图标，图片之类的静态文件，也需要都放到exe文件夹下。
[/scode]&lt;/p>
&lt;h3 id="单个程序还是文件夹">&lt;a href="#%e5%8d%95%e4%b8%aa%e7%a8%8b%e5%ba%8f%e8%bf%98%e6%98%af%e6%96%87%e4%bb%b6%e5%a4%b9" class="header-anchor">&lt;/a>单个程序还是文件夹
&lt;/h3>&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]
程序打包默认打包成一个文件夹，使用&lt;code>-F&lt;/code>参数可以打包成一个单独的exe程序，但经测试，单独一个程序启动速度起码慢了10倍不止，所以建议还是默认文件夹方式，但文件夹太乱了怎么办，可以采取后面的方法整理一下。
另外我发现我的程序在打包成一个独立的exe的情况下，隐藏命令行窗口的话，程序中间有个命令无法正常运行，但是打包成文件夹就可以正常运行，由此可见打包成文件夹的容错率更大。
[/scode]
[tabs]
[tab name=&amp;ldquo;方法1. 利用runtime-hook参数&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]
新建一个runtimehook.py文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> sys
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> os
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>currentdir &lt;span style="color:#f92672">=&lt;/span> os&lt;span style="color:#f92672">.&lt;/span>path&lt;span style="color:#f92672">.&lt;/span>dirname(sys&lt;span style="color:#f92672">.&lt;/span>argv[&lt;span style="color:#ae81ff">0&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libdir &lt;span style="color:#f92672">=&lt;/span> os&lt;span style="color:#f92672">.&lt;/span>path&lt;span style="color:#f92672">.&lt;/span>join(currentdir, &lt;span style="color:#e6db74">&amp;#34;lib&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(currentdir)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sys&lt;span style="color:#f92672">.&lt;/span>path&lt;span style="color:#f92672">.&lt;/span>append(libdir)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>os&lt;span style="color:#f92672">.&lt;/span>environ[&lt;span style="color:#e6db74">&amp;#39;path&amp;#39;&lt;/span>] &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;;./lib&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后打包时加上参数 &lt;code>--runtime-hook=&amp;quot;runtimehook.py&amp;quot;&lt;/code> ，这样就可以把除了下面的几个文件外的库文件放到一个&lt;code>lib&lt;/code>文件夹中了。&lt;/p>
&lt;pre tabindex="0">&lt;code>base_library.zip
xxxx.exe
xxxx.exe.manifest
python37.dll
&lt;/code>&lt;/pre>&lt;p>这个方法摘自&lt;a class="link" href="http://www.python3.vip/doc/tutorial/python/level2/toexe/" target="_blank" rel="noopener"
>白月黑羽&lt;/a>，注意文件夹不能放到lib里。[/tab]
[tab name=&amp;ldquo;方法2. 利用快捷方式&amp;rdquo;]
新建一个快捷方式或者符号链接，可以参照我另一篇&lt;a class="link" href="https://www.2bboy.com/archives/99.html" target="_blank" rel="noopener"
>文章&lt;/a>。不过在自己电脑新建的快捷方式不能打包发给别人，因为绝对路径不一样，如果用符号链接的话在打成压缩包时会被打回原型。
所以我们可以仿照某些软件安装包的样子做一个自解压的压缩包，在解压软件安装时加上生成桌面快捷方式的选项。打包可以用一些打包工具（比如某些压缩工具就带这个功能），直接打包生成自解压的exe文件然后还带桌面快捷方式，这样显得更高大上。[/tab]
[/tabs]&lt;/p>
&lt;h3 id="隐藏命令行窗口">&lt;a href="#%e9%9a%90%e8%97%8f%e5%91%bd%e4%bb%a4%e8%a1%8c%e7%aa%97%e5%8f%a3" class="header-anchor">&lt;/a>隐藏命令行窗口
&lt;/h3>&lt;p>[scode type=&amp;ldquo;blue&amp;rdquo;]&lt;/p>
&lt;ul>
&lt;li>如果你是gui程序自然不希望出现命令行，那么加上&lt;code>-w&lt;/code>参数就行了。&lt;/li>
&lt;li>另外隐藏命令行的话，就无法查看报错信息，那么只能在程序里捕捉异常然后通过gui的方法把错误显示出来。但这种错误显示通常不能获取多少有用信息，只是给用户看的。&lt;/li>
&lt;li>有时候程序隐藏了窗口，但运行时总有黑黑的命令行窗口不时的闪现出来，网上查找到的弹窗多半是因为程序中引用了&lt;code>os.system&lt;/code>引起的，但其实任何可能调用命令行窗口的程序命令都有可能导致弹窗。&lt;/li>
&lt;li>比如我的程序因为黑窗口闪现太快肉眼无法捕捉，为了看清这个窗口究竟是什么，我利用录屏一帧帧查看发现是ffmpeg.exe的窗口，好吧，我的程序的pydub库的确用到了它，但怎么让它消失呢，我找到了一篇&lt;a class="link" href="https://www.cnblogs.com/hard-snail/p/12154532.html" target="_blank" rel="noopener"
>参考文章&lt;/a>。因为pydub库的源码是直接使用subprocess调用ffmpeg.exe和ffprobe.exe的，只需要在audio_segment.py和utils.py文件中调用subprocess.Popen()时指定参数 shell=True, stdin=subprocess.PIPE 即可。
[/scode]&lt;/li>
&lt;/ul>
&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>Pyinstaller文档：https://pyinstaller.readthedocs.io/en/stable/
白月黑羽教Python：http://www.python3.vip/doc/tutorial/python/level2/gui/qt_04/&lt;/p></description></item><item><title>OneDrive-OneManager云盘程序onemoe主题</title><link>https://kizx.github.io/post/onedrive-onemanager%E4%BA%91%E7%9B%98%E7%A8%8B%E5%BA%8Fonemoe%E4%B8%BB%E9%A2%98/</link><pubDate>Wed, 19 Feb 2020 13:28:00 +0000</pubDate><guid>https://kizx.github.io/post/onedrive-onemanager%E4%BA%91%E7%9B%98%E7%A8%8B%E5%BA%8Fonemoe%E4%B8%BB%E9%A2%98/</guid><description>&lt;p>假期刚看了一点css教程，就花了两个晚上给&lt;a class="link" href="https://github.com/qkqpttgf/OneManager-php" target="_blank" rel="noopener"
>onedrive-OneManager&lt;/a>重新写了个样式当作练手了，本来是想在原有的基础上做一点美化，但程序原样式都是内部样式，而且还有许多内联样式，改起来超级麻烦，所以干脆就从头开始重写了。&lt;/p>
&lt;h2 id="下载地址">&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%9c%b0%e5%9d%80" class="header-anchor">&lt;/a>下载地址
&lt;/h2>&lt;p>[scode type=&amp;ldquo;green&amp;rdquo;]&lt;a class="link" href="https://github.com/kizx/onedrive-index-theme" target="_blank" rel="noopener"
>下载地址&lt;/a>[/scode]&lt;/p>
&lt;h2 id="预览">&lt;a href="#%e9%a2%84%e8%a7%88" class="header-anchor">&lt;/a>预览
&lt;/h2>&lt;p>[scode type=&amp;ldquo;green&amp;rdquo;]&lt;a class="link" href="https://pan.2bboy.com/" target="_blank" rel="noopener"
>在线预览&lt;/a>[/scode]
虽然本人的审美不咋地，但是原主题那个超大的圆角我已经忍了很久了┻━┻ ヘ╰( ??ε?? ╰)，主题的配色我不是很懂，你要是不喜欢反正在我css的基础上改起来也简单。&lt;/p>
&lt;h2 id="使用说明">&lt;a href="#%e4%bd%bf%e7%94%a8%e8%af%b4%e6%98%8e" class="header-anchor">&lt;/a>使用说明
&lt;/h2>&lt;p>[tabs]
[tab name=&amp;quot;&lt;del>旧版本&lt;/del>&amp;quot;]&lt;/p>
&lt;ul>
&lt;li>简单点就是直接把下载的onemoe.php复制到theme文件夹下然后网站后台切换主题即可。&lt;/li>
&lt;li>我的onemoe.php其实是在classic.php基础上改的，本着尽量不改动内部的原则（其实是我不会php,另一个是改动的越少主程序更新时就修改的越少），改动的地方是把head里所有内部样式删除，然后替换成下面这句。
&lt;code>&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;[onemoe.css的地址]&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;/code>&lt;/li>
&lt;li>更新多盘后发现多了个div不好定位，无奈只好在内部加了两个onemoe的class，一个位于底部readme，一个位于多盘位置，另外删除了文件大小和时间两个标题的内联样式。所以如果你用这个主题出现什么问题，除了显示样式上的问题，其余的bug肯定与我无瓜。&lt;/li>
&lt;li>现在我把onemoe.css文件放在我的网站上并提供了百度cdn加速，如果你想修改主题配色什么的，可以直接在我的css上进行修改，然后把你修改的css文件放在自己的onedrive目录或者别的cdn处，然后把上面的链接替换下就可以了，主题更新时同理也只需把新的css文件链接替换下就行。
[/tab]
[tab name=&amp;ldquo;新版本&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]&lt;/li>
&lt;li>程序已内置本主题，后台切换主题即可使用。&lt;/li>
&lt;li>或者可以手动下载onemoe.html放在程序theme文件夹下后台启用主题，以此来获取最新主题。&lt;/li>
&lt;li>本主题只是基于classic主题的css重写，并未改动原主题任何主体内容。&lt;/li>
&lt;li>css文件默认从 &lt;a class="link" href="https://cdn.jsdelivr.net/gh/kizx/onemoe-theme/onemoe.min.css" target="_blank" rel="noopener"
>https://cdn.jsdelivr.net/gh/kizx/onemoe-theme/onemoe.min.css&lt;/a> 加载，你也可以自行修改上述地址，改成自己的cdn地址。&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">link&lt;/span> &lt;span style="color:#a6e22e">rel&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://cdn.jsdelivr.net/gh/kizx/onemoe-theme/onemoe.min.css&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text/css&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>[/tab]
[/tabs]&lt;/p>
&lt;h2 id="更多关于onemanager的设置">&lt;a href="#%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eonemanager%e7%9a%84%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>更多关于OneManager的设置
&lt;/h2>&lt;p>[post cid=&amp;ldquo;176&amp;rdquo; /]&lt;/p></description></item><item><title>PyCharm主题，插件推荐</title><link>https://kizx.github.io/post/pycharm%E4%B8%BB%E9%A2%98%E6%8F%92%E4%BB%B6%E6%8E%A8%E8%8D%90/</link><pubDate>Sun, 16 Feb 2020 10:50:00 +0000</pubDate><guid>https://kizx.github.io/post/pycharm%E4%B8%BB%E9%A2%98%E6%8F%92%E4%BB%B6%E6%8E%A8%E8%8D%90/</guid><description>&lt;p>&lt;code>Setting&lt;/code> -&amp;gt; &lt;code>Plugins&lt;/code>里搜索相应插件名即可，或者去网页 &lt;a class="link" href="https://plugins.jetbrains.com/pycharm" target="_blank" rel="noopener"
>https://plugins.jetbrains.com/pycharm&lt;/a> 搜索插件下载后本地安装亦可，唯一的问题可能就是网络连接性可能不太好。&lt;/p>
&lt;h2 id="主题推荐">&lt;a href="#%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>主题推荐
&lt;/h2>&lt;p>先说说主题设置，下好主题后在设置&lt;code>Appearance&lt;/code>里切换主题。
设完主题后还可以设置代码样式，这两个是可以分开设置的，比如我主题是One Dark，代码样式是Atom One Dark。如果你不喜欢现有的代码配色风格，可以在&lt;a class="link" href="http://color-themes.com" target="_blank" rel="noopener"
>Color Theme网站&lt;/a> 下载喜欢的配色，然后在代码样式里导入即可。
&lt;img src="https://pan.2bboy.com/img/2020/03/0313180726.jpg"
loading="lazy"
>&lt;/p>
&lt;p>另外字体也可以自定义，软件界面字体在settings-&amp;gt;appearance里修改。代码字体在settings-&amp;gt;editor-&amp;gt;font里（如果直接改这里没用，点上面有个感叹号那里，其实就是color scheme font里改）。
&lt;img src="https://pan.2bboy.com/img/2020/02/0216182934.jpg"
loading="lazy"
>&lt;/p>
&lt;h3 id="1-one-dark">&lt;a href="#1-one-dark" class="header-anchor">&lt;/a>1. One Dark
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/11938-one-dark-theme" target="_blank" rel="noopener"
>主题地址&lt;/a>
我最常用的主题，还有一个&lt;a class="link" href="https://plugins.jetbrains.com/plugin/12178-atom-onedark-theme" target="_blank" rel="noopener"
>Atom One Dark&lt;/a>的主题也不错。
&lt;img src="https://plugins.jetbrains.com/files/11938/screenshot_19494.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="2-material-theme-ui">&lt;a href="#2-material-theme-ui" class="header-anchor">&lt;/a>2. Material Theme UI
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/8006-material-theme-ui" target="_blank" rel="noopener"
>主题地址&lt;/a>
这大概是使用最广泛的主题了吧，毕竟人家样式全，美化全面，但是个人不是很喜欢。
&lt;img src="https://plugins.jetbrains.com/files/8006/screenshot_17526.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="3-the-doki-doki-theme">&lt;a href="#3-the-doki-doki-theme" class="header-anchor">&lt;/a>3. The Doki-Doki Theme
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/10804-the-doki-doki-theme/" target="_blank" rel="noopener"
>主题地址&lt;/a>
看这名字就知道是一款二次元主题，不仅有心跳人物的主题，还包含Re0等二次元人物，下面只列举部分，作者更新相当勤快，可以说是老二次元了。
[album]
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22344.png"
loading="lazy"
>
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22341.png"
loading="lazy"
>
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22346.png"
loading="lazy"
>
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22349.png"
loading="lazy"
>
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22503.png"
loading="lazy"
>
&lt;img src="https://plugins.jetbrains.com/files/10804/screenshot_22342.png"
loading="lazy"
>
[/album]&lt;/p>
&lt;h3 id="4-gruvbox-theme">&lt;a href="#4-gruvbox-theme" class="header-anchor">&lt;/a>4. gruvbox-theme
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/12310-gruvbox-theme" target="_blank" rel="noopener"
>主题地址&lt;/a>
深色配色很舒服
&lt;img src="https://plugins.jetbrains.com/files/12310/screenshot_19486.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="5-visual-studio-code-dark-plus-theme">&lt;a href="#5-visual-studio-code-dark-plus-theme" class="header-anchor">&lt;/a>5. Visual Studio Code Dark Plus Theme
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/12255-visual-studio-code-dark-plus-theme" target="_blank" rel="noopener"
>主题地址&lt;/a>
vscode风格主题，适合vscode爱好者
&lt;img src="https://plugins.jetbrains.com/files/12255/screenshot_19350.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="插件推荐">&lt;a href="#%e6%8f%92%e4%bb%b6%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>插件推荐
&lt;/h2>&lt;h3 id="1-codeglance">&lt;a href="#1-codeglance" class="header-anchor">&lt;/a>1. CodeGlance
&lt;/h3>&lt;p>可以像VScode一样在右侧显示预览条，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/index?xmlId=net.vektah.codeglance" target="_blank" rel="noopener"
>插件地址&lt;/a>
&lt;img src="https://plugins.jetbrains.com/files/7275/screenshot_16821.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="2-save-actions">&lt;a href="#2-save-actions" class="header-anchor">&lt;/a>2. Save Actions
&lt;/h3>&lt;p>Pycharm的代码格式化每次都要按快捷键太麻烦了，有了这个插件就可以在保存的时候自动格式化了，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/7642-save-actions" target="_blank" rel="noopener"
>插件地址&lt;/a>
插件需要在&lt;code>Setting&lt;/code> -&amp;gt; &lt;code>Other Settings&lt;/code>里启动才行
&lt;img src="https://pan.2bboy.com/img/2020/02/0216163232.jpg"
loading="lazy"
>
唯一不足的是这个插件的设置是针对每个项目单独设置的，默认下图是都没有勾选的，每次新开一个工程都需要重新设置一遍
要想新建工程时默认勾选，需要你打开软件时在configure里进行设置（前提设置打开软件弹出这个界面而非上次的工程）
&lt;img src="https://pan.2bboy.com/img/2020/07/0714100107.png"
loading="lazy"
>
该插件还有另一个分支版本功能相同&lt;a class="link" href="https://plugins.jetbrains.com/plugin/13331-save-actions-reborn" target="_blank" rel="noopener"
>Save Actions Reborn&lt;/a>&lt;/p>
&lt;h3 id="3-background-image-plus-">&lt;a href="#3-background-image-plus-" class="header-anchor">&lt;/a>3. Background Image Plus +
&lt;/h3>&lt;p>可以设置背景图的插件，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/11247-background-image-plus-" target="_blank" rel="noopener"
>插件地址&lt;/a>，下载后在下图所示的位置设置背景图片文件夹。
&lt;img src="https://pan.2bboy.com/img/2020/02/0216175836.jpg"
loading="lazy"
>
如果只是一张图的话，软件默认就带这个功能，不需要插件。
&lt;img src="https://pan.2bboy.com/img/2020/02/0216180519.jpg"
loading="lazy"
>&lt;/p>
&lt;h3 id="4-key-promoter-x">&lt;a href="#4-key-promoter-x" class="header-anchor">&lt;/a>4. Key Promoter X
&lt;/h3>&lt;p>如果你使用鼠标点击了某个按钮，右下角就会弹窗提醒你相应的快捷键，想不记住快捷键都难。
&lt;img src="https://plugins.jetbrains.com/files/9792/screenshot_17105.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="5-translation">&lt;a href="#5-translation" class="header-anchor">&lt;/a>5. Translation
&lt;/h3>&lt;p>翻译插件，可以随时随地一键翻译，再也不用担心读不懂源码注释了，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/8579-translation" target="_blank" rel="noopener"
>插件地址&lt;/a>，使用方法可以参照插件地址。
&lt;img src="https://plugins.jetbrains.com/files/8579/screenshot_20602.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="6atom-material-icons">&lt;a href="#6atom-material-icons" class="header-anchor">&lt;/a>6.Atom Material Icons
&lt;/h3>&lt;p>&lt;a class="link" href="https://plugins.jetbrains.com/plugin/10044-atom-material-icons" target="_blank" rel="noopener"
>插件地址&lt;/a>，更改文件图标的插件。
&lt;img src="https://plugins.jetbrains.com/files/10044/screenshot_21309.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="7rainbow-brackets">&lt;a href="#7rainbow-brackets" class="header-anchor">&lt;/a>7.Rainbow Brackets
&lt;/h3>&lt;p>彩虹括号，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/10080-rainbow-brackets" target="_blank" rel="noopener"
>插件地址&lt;/a>
&lt;img src="https://plugins.jetbrains.com/files/10080/screenshot_17373.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="8indent-rainbow">&lt;a href="#8indent-rainbow" class="header-anchor">&lt;/a>8.Indent Rainbow
&lt;/h3>&lt;p>彩虹缩进，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/13308-indent-rainbow" target="_blank" rel="noopener"
>插件地址&lt;/a>
&lt;img src="https://plugins.jetbrains.com/files/13308/screenshot_20509.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="9rainbow-fart">&lt;a href="#9rainbow-fart" class="header-anchor">&lt;/a>9.Rainbow Fart
&lt;/h3>&lt;p>彩虹屁插件，一个在你编程时持续用语音夸你写的牛逼的插件，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/14543-rainbow-fart" target="_blank" rel="noopener"
>插件地址&lt;/a>，支持自定义语音包：https://github.com/izhangzhihao/intellij-rainbow-fart&lt;/p>
&lt;h3 id="10nyan-progress-bar">&lt;a href="#10nyan-progress-bar" class="header-anchor">&lt;/a>10.Nyan Progress Bar
&lt;/h3>&lt;p>彩虹猫进度条，&lt;a class="link" href="https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar" target="_blank" rel="noopener"
>插件地址&lt;/a>&lt;/p>
&lt;h3 id="11中文语言包">&lt;a href="#11%e4%b8%ad%e6%96%87%e8%af%ad%e8%a8%80%e5%8c%85" class="header-anchor">&lt;/a>11.中文语言包
&lt;/h3>&lt;p>官方出的中文语言包，比什么汉化都要好使
&lt;a class="link" href="https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----" target="_blank" rel="noopener"
>插件地址&lt;/a>&lt;/p>
&lt;h2 id="附">&lt;a href="#%e9%99%84" class="header-anchor">&lt;/a>附
&lt;/h2>&lt;p>官方帮助：https://www.jetbrains.com/help/pycharm/2020.1/quick-start-guide.html
一个很全的设置说明：https://blog.csdn.net/u013088062/article/details/50388329
对部分设置选项功能进行说明：https://segmentfault.com/a/1190000022799670
一些有用的设置：https://cloud.tencent.com/developer/news/393471
一个炒鸡棒的PyCharm 中文指南：http://pycharm.iswbm.com/zh_CN/latest/index.html&lt;/p></description></item><item><title>CSS选择器</title><link>https://kizx.github.io/post/css%E9%80%89%E6%8B%A9%E5%99%A8/</link><pubDate>Sat, 01 Feb 2020 05:43:08 +0000</pubDate><guid>https://kizx.github.io/post/css%E9%80%89%E6%8B%A9%E5%99%A8/</guid><description>&lt;ul>
&lt;li>&lt;a class="link" href="http://houdunren.gitee.io/note/css/2%20%E9%80%89%E6%8B%A9%E5%99%A8.html#%e9%80%89%e6%8b%a9%e5%99%a8" target="_blank" rel="noopener"
>后盾人|选择器&lt;/a>[/scode]&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*标签选择器*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">red&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*子代选择 h1&amp;gt;h2*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*同代选择 h1~h2*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*相邻选择 h1+h2*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*class类选择器*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">h1-class&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">orange&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*id选择器*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#h1-id {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">yellow&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*属性选择，可以指定多个，如h1[title][class]，
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">也可以指定属性的值 如h1[title=&amp;#34;h1&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">属性值可以使用正则匹配 如：^=表示开头匹配 $=表示结尾匹配 *=表示包含匹配 ~=表示单词匹配 |=表示结尾或-结尾匹配*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#f92672">title&lt;/span>&lt;span style="color:#f92672">]&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">green&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*伪类选择器*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">a&lt;/span>:&lt;span style="color:#a6e22e">link&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">blue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">font-size&lt;/span>: &lt;span style="color:#66d9ef">xx-large&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">a&lt;/span>:&lt;span style="color:#a6e22e">visited&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">blue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">a&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">yellow&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">a&lt;/span>:&lt;span style="color:#a6e22e">active&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">green&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">input&lt;/span>:&lt;span style="color:#a6e22e">focus&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#66d9ef">red&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">input&lt;/span>:&lt;span style="color:#a6e22e">target&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">input&lt;/span>:&lt;span style="color:#a6e22e">empty&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/*display: none;*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*标签限定位置的伪类*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span> &lt;span style="color:#f92672">h2&lt;/span>:&lt;span style="color:#a6e22e">first-child&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/*第一个标签是h2 last同理*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span> &lt;span style="color:#f92672">h2&lt;/span>:&lt;span style="color:#a6e22e">first-of-type&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/*出现的第一个h2 last同理*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span> &lt;span style="color:#f92672">h2&lt;/span>:&lt;span style="color:#a6e22e">only-of-type&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/*唯一的*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">h1&lt;/span> &lt;span style="color:#f92672">h2&lt;/span>:&lt;span style="color:#a6e22e">nth-child&lt;/span>&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">2&lt;/span>&lt;span style="color:#f92672">)&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/*限定为第二个* last同理/
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">h1 h2:nth-of-type(2){
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> /*第二个出现的* last同理/
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*一个样式可以对应多个标签 如：h1,h2,.class*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*一个标签也可以对应多个样式 如：&amp;lt;h1 class=&amp;#34;class1 class2&amp;#34;&amp;gt;&amp;lt;/h1&amp;gt;*/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>字幕朗读器——由字幕文件生成音频</title><link>https://kizx.github.io/post/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB%E5%99%A8%E7%94%B1%E5%AD%97%E5%B9%95%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E9%9F%B3%E9%A2%91/</link><pubDate>Mon, 27 Jan 2020 12:46:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB%E5%99%A8%E7%94%B1%E5%AD%97%E5%B9%95%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E9%9F%B3%E9%A2%91/</guid><description>&lt;p>最新版本请转下面这篇
[post cid=&amp;ldquo;210&amp;rdquo; /]&lt;/p>
&lt;h2 id="这是什么">&lt;a href="#%e8%bf%99%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor">&lt;/a>这是什么
&lt;/h2>&lt;p>起因是我做视频懒得说话，最多在视频做好后加上字幕，但光有字幕没语音感觉还是差了点意思。市面上有很多文本朗读器，可是我并没有找到一款能朗读字幕的应用，我这里的朗读字幕指语音能自动和字幕时间轴匹配。虽然有几款播放器（potplayer、kmplayer、VLC）自带字幕朗读功能，通过一边朗读一遍录音的话就可以得到我想要的音频，但这种做法过于笨拙。本着学习的目的，我试着用py写了一个小程序实现了字幕朗读的功能。&lt;/p>
&lt;h2 id="实现原理">&lt;a href="#%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86" class="header-anchor">&lt;/a>实现原理
&lt;/h2>&lt;p>充分利用已有的轮子&lt;/p>
&lt;ul>
&lt;li>通过百度AI平台和阿里云语音服务实现&lt;a class="link" href="https://www.2bboy.com/archives/149.html" target="_blank" rel="noopener"
>语音合成&lt;/a>&lt;/li>
&lt;li>利用&lt;a class="link" href="https://github.com/cdown/srt" target="_blank" rel="noopener"
>srt库&lt;/a>处理srt字幕文件&lt;/li>
&lt;li>利用&lt;a class="link" href="https://www.2bboy.com/archives/150.html" target="_blank" rel="noopener"
>pydub库&lt;/a>对声音进行合成和拼接&lt;/li>
&lt;/ul>
&lt;h2 id="代码">&lt;a href="#%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>代码
&lt;/h2>&lt;p>写完了发现比想象中要简单，几行代码就搞定了。目前只支持SRT格式的字幕文件，反正字幕文件间可以互相转，对于复杂的字幕可能引发的bug现在一概忽略（比如字幕重叠、一句话语音过长，多轨字幕等）。
&lt;del>另外目前都是单线程，速度可能有点慢，程序可能出现假死无响应状态，只要后台文件一直在增加，大可不用管。（因为语音平台都是限制并发数的，感觉多线程有必要？）&lt;/del>
现已添加多线程。
[scode type=&amp;ldquo;green&amp;rdquo;]代码地址：https://github.com/kizx/subtitle2audio[/scode]&lt;/p>
&lt;h2 id="下载">&lt;a href="#%e4%b8%8b%e8%bd%bd" class="header-anchor">&lt;/a>下载
&lt;/h2>&lt;p>[button color=&amp;ldquo;success&amp;rdquo; icon=&amp;ldquo;fa fa-download&amp;rdquo; url=&amp;ldquo;https://pan.2bboy.com/Public/Software/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB/&amp;rdquo; type=&amp;quot;&amp;quot;]onedrive下载地址[/button]&lt;/p>
&lt;p>[button color=&amp;ldquo;success&amp;rdquo; icon=&amp;ldquo;fa fa-download&amp;rdquo; url=&amp;ldquo;https://wws.lanzous.com/b01hhub9g&amp;rdquo; type=&amp;quot;&amp;quot;]蓝奏云下载 密码:gyb3[/button]&lt;/p>
&lt;h2 id="使用">&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>使用
&lt;/h2>&lt;p>[tabs]
[tab name=&amp;quot;&lt;del>v1.0 控制台版&lt;/del>&amp;quot;]&lt;/p>
&lt;ul>
&lt;li>安装依赖 &lt;code>pip install -r requirements.txt&lt;/code>&lt;/li>
&lt;li>安装 ffmpeg&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>下载解压&lt;a class="link" href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener"
>ffmpeg&lt;/a>&lt;/li>
&lt;li>将解压的 ffmpeg/bin 路径添加到系统环境变量&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>填写百度 KEY在&lt;a class="link" href="https://console.bce.baidu.com/ai/?_=1550569312984#/ai/speech/overview/index" target="_blank" rel="noopener"
>百度 AI 平台&lt;/a>获取相关 KEY ，打开 main.py 填写相应 KEY&lt;/li>
&lt;li>启动 &lt;code>python main.py [.srt文件]&lt;/code>
[/tab]
[tab name=&amp;quot;&lt;del>v1.1 web-gui版&lt;/del>&amp;quot;]&lt;/li>
&lt;li>安装 ffmpeg&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>下载解压&lt;a class="link" href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener"
>ffmpeg&lt;/a>&lt;/li>
&lt;li>将解压的 ffmpeg/bin 路径添加到系统环境变量&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>安装依赖&lt;/p>
&lt;pre tabindex="0">&lt;code>python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
&lt;/code>&lt;/pre>&lt;/li>
&lt;li>
&lt;p>启动 &lt;code>flask run&lt;/code>浏览器打开 http://127.0.0.1:5000/ 获取并填写相关 key 后点击生成，所有生成的文件在 output 文件夹内。
&lt;img src="https://pan.2bboy.com/img/2020/02/0217145126.jpg"
loading="lazy"
>
[/tab]
[tab name=&amp;ldquo;v2.x pyqt-gui版&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]&lt;/p>
&lt;/li>
&lt;li>
&lt;p>安装 ffmpeg&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>下载解压&lt;a class="link" href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener"
>ffmpeg&lt;/a>&lt;/li>
&lt;li>将解压的 ffmpeg/bin 路径&lt;a class="link" href="https://blog.csdn.net/weixin_37204973/article/details/82504570" target="_blank" rel="noopener"
>添加到系统环境变量&lt;/a>（可能需要重启电脑）
&lt;img src="https://pan.2bboy.com/img/2020/05/0513123422.jpg"
loading="lazy"
>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>下载运行 &lt;a class="link" href="https://pan.2bboy.com/Public/Software/%E5%AD%97%E5%B9%95%E6%9C%97%E8%AF%BB/" target="_blank" rel="noopener"
>下载地址&lt;/a>
使用前需自行获取相关key&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>由于申请不了谷歌api，目前做不了谷歌接口
报毒请添加白名单或者信任，我自己电脑都报毒→_→，不放心自己下载源码运行&lt;/p>&lt;/blockquote>
&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/04/0414223933.jpg"
loading="lazy"
>
[/tab]
[/tabs]&lt;/p>
&lt;h2 id="视频案例演示">&lt;a href="#%e8%a7%86%e9%a2%91%e6%a1%88%e4%be%8b%e6%bc%94%e7%a4%ba" class="header-anchor">&lt;/a>视频案例演示
&lt;/h2>&lt;!-- raw HTML omitted -->
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>后来发现一个有同样功能的软件：http://www.cross-plus-a.com/cn/balabolka.htm 打开工具-&amp;gt;字幕转换器功能就是，这功能藏的太隐秘当初都没找到。&lt;/p>
&lt;hr>
&lt;p>后后来发现一个叫&lt;a class="link" href="http://www.subspeak.top/" target="_blank" rel="noopener"
>字幕说&lt;/a>的网站也有类似的服务，不过介绍来看，这个是输入文本，然后生成同步的语音和字幕。虽然节省了做字幕的功夫，但这种只适合那种一刻不停的说的视频，适用性还有待提高（有空我也可以整合实现这种功能）。&lt;/p></description></item><item><title>Python音频处理——pydub库</title><link>https://kizx.github.io/post/python%E9%9F%B3%E9%A2%91%E5%A4%84%E7%90%86pydub%E5%BA%93/</link><pubDate>Sat, 25 Jan 2020 15:41:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E9%9F%B3%E9%A2%91%E5%A4%84%E7%90%86pydub%E5%BA%93/</guid><description>&lt;p>&lt;a class="link" href="https://github.com/jiaaro/pydub#installation" target="_blank" rel="noopener"
>官方安装说明&lt;/a>&lt;/p>
&lt;ol>
&lt;li>下载解压&lt;a class="link" href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener"
>ffmpeg&lt;/a>或libav&lt;/li>
&lt;li>将解压的ffmpeg/bin路径添加到系统环境变量&lt;/li>
&lt;li>&lt;code>pip install pydub&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="使用教程">&lt;a href="#%e4%bd%bf%e7%94%a8%e6%95%99%e7%a8%8b" class="header-anchor">&lt;/a>使用教程
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://github.com/jiaaro/pydub/blob/master/API.markdown" target="_blank" rel="noopener"
>官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.cnblogs.com/felixwang2/p/9056726.html" target="_blank" rel="noopener"
>python音频处理&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://blog.csdn.net/baidu_29198395/article/details/86694365" target="_blank" rel="noopener"
>pydub的中文文档&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>百度语音合成平台使用</title><link>https://kizx.github.io/post/%E7%99%BE%E5%BA%A6%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E5%B9%B3%E5%8F%B0%E4%BD%BF%E7%94%A8/</link><pubDate>Sat, 25 Jan 2020 10:22:00 +0000</pubDate><guid>https://kizx.github.io/post/%E7%99%BE%E5%BA%A6%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E5%B9%B3%E5%8F%B0%E4%BD%BF%E7%94%A8/</guid><description>&lt;ul>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/tech/speech/tts" target="_blank" rel="noopener"
>在线试用&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/ai-doc/SPEECH/yk38y8h3j" target="_blank" rel="noopener"
>官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/ai-doc/SPEECH/jk38y8gno" target="_blank" rel="noopener"
>官方案例&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="自主调用">&lt;a href="#%e8%87%aa%e4%b8%bb%e8%b0%83%e7%94%a8" class="header-anchor">&lt;/a>自主调用
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>api_key &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;FpGBW******Mvz2SDG&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>secret_key &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;Poxd******XR27G7y&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>token_url &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&amp;amp;client_id=&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>api_key&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;amp;client_secret=&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>secret_key&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(token_url) &lt;span style="color:#75715e"># 从这个链接获取token&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>token &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;24.6430b0df******-18339246&amp;#39;&lt;/span> &lt;span style="color:#75715e"># 获取到的token&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test_url &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;http://tsn.baidu.com/text2audio?lan=zh&amp;amp;ctp=1&amp;amp;cuid=abcdxxx&amp;amp;tok=&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>token&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;amp;tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd&amp;amp;vol=9&amp;amp;per=0&amp;amp;spd=5&amp;amp;pit=5&amp;amp;aue=3&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(test_url) &lt;span style="color:#75715e"># 从这个链接获取音频&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/ai-doc/SPEECH/Qk38y8lrl" target="_blank" rel="noopener"
>请求方式及参数基本说明&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="利用官方sdk">&lt;a href="#%e5%88%a9%e7%94%a8%e5%ae%98%e6%96%b9sdk" class="header-anchor">&lt;/a>利用官方SDK
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/ai-doc/SPEECH/zk4nlz99s" target="_blank" rel="noopener"
>官方使用说明&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://ai.baidu.com/ai-doc/SPEECH/Gk4nlz8tc" target="_blank" rel="noopener"
>参数说明&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> aip &lt;span style="color:#f92672">import&lt;/span> AipSpeech
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&amp;#34; 你的 APPID AK SK &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>APP_ID &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;18***46&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>API_KEY &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;FpGBW******vz2SDG&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SECRET_KEY &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;Poxd******XR27G7y&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>client &lt;span style="color:#f92672">=&lt;/span> AipSpeech(APP_ID, API_KEY, SECRET_KEY)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>result &lt;span style="color:#f92672">=&lt;/span> client&lt;span style="color:#f92672">.&lt;/span>synthesis(&lt;span style="color:#e6db74">&amp;#39;你好百度&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;zh&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;vol&amp;#39;&lt;/span>: &lt;span style="color:#ae81ff">5&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">not&lt;/span> isinstance(result, dict):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;auido.mp3&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;wb&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(result)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Google Golab——免费的GPU深度学习平台</title><link>https://kizx.github.io/post/google-golab%E5%85%8D%E8%B4%B9%E7%9A%84gpu%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%B9%B3%E5%8F%B0/</link><pubDate>Mon, 13 Jan 2020 03:41:00 +0000</pubDate><guid>https://kizx.github.io/post/google-golab%E5%85%8D%E8%B4%B9%E7%9A%84gpu%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%B9%B3%E5%8F%B0/</guid><description>&lt;p>&lt;a class="link" href="https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d" target="_blank" rel="noopener"
>官方教程&lt;/a>
&lt;a class="link" href="https://www.jianshu.com/p/000d2a9d36a0" target="_blank" rel="noopener"
>Google Colab——用谷歌免费GPU跑你的深度学习代码&lt;/a>
&lt;a class="link" href="https://www.jianshu.com/p/a42d69568966" target="_blank" rel="noopener"
>如何正确地使用Google Colab&lt;/a>
&lt;a class="link" href="https://pytorch.org/tutorials/beginner/colab.html?highlight=colab" target="_blank" rel="noopener"
>在COLAB中使用GOOGLE云端硬盘中的教程数据&lt;/a>&lt;/p>
&lt;h2 id="经验">&lt;a href="#%e7%bb%8f%e9%aa%8c" class="header-anchor">&lt;/a>经验
&lt;/h2>&lt;ul>
&lt;li>在菜单的修改-&amp;gt;笔记本设置中开启GPU&lt;/li>
&lt;li>使用命令行命令只需在命令前加&lt;code>!&lt;/code>&lt;/li>
&lt;li>挂载google硬盘使用以下命令&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> google.colab &lt;span style="color:#f92672">import&lt;/span> drive
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>drive&lt;span style="color:#f92672">.&lt;/span>mount(&lt;span style="color:#e6db74">&amp;#39;/content/drive&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但实际上硬盘根目录在&lt;code>/content/drive/My Drive&lt;/code>，这个目录是固定的，直接输入这个目录会提示目录包含空格，太沙雕了，需要使用python命令切换工作目录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> os
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>os&lt;span style="color:#f92672">.&lt;/span>chdir(&lt;span style="color:#e6db74">&amp;#34;/content/drive/My Drive&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">！&lt;/span>ls &lt;span style="color:#75715e">#查看当前目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(os&lt;span style="color:#f92672">.&lt;/span>getcwd()) &lt;span style="color:#75715e">#或者&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(os&lt;span style="color:#f92672">.&lt;/span>listdir(os&lt;span style="color:#f92672">.&lt;/span>getcwd()))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不过有一说一，google硬盘速度还是很快的&lt;/p>
&lt;ul>
&lt;li>安装PyTorch
虽然google的cuda版本是10.0的，我懒得找相应的包了，直接&lt;code>!pip3 install torch torchvision&lt;/code>即可
&lt;img src="http://pan.2bboy.com/img/2020/01/0113115910.png"
loading="lazy"
alt="安装截图"
>&lt;/li>
&lt;/ul></description></item><item><title>基于深度学习的Vtuber生成器</title><link>https://kizx.github.io/post/%E5%9F%BA%E4%BA%8E%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%9A%84vtuber%E7%94%9F%E6%88%90%E5%99%A8/</link><pubDate>Sat, 11 Jan 2020 12:52:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%9F%BA%E4%BA%8E%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%9A%84vtuber%E7%94%9F%E6%88%90%E5%99%A8/</guid><description>&lt;p>什么是Vtuber我就不多说了，目前的Vtuber大概要么是传统的基于Live2D，然后配合视频捕捉；要么就是3D模型结合动补设备来实现。本篇介绍的这个生成器主要是类似前者，因为即使是平面的Live2D，制作起来也是非常耗时费力的。
那么有没有这么一种方法可以直接从一张人设图直接生成可动的模型呢，然后配合视频捕捉出道Vtuber呢，这就是今天所介绍的生成器的功能。&lt;/p>
&lt;h2 id="原理">&lt;a href="#%e5%8e%9f%e7%90%86" class="header-anchor">&lt;/a>原理
&lt;/h2>&lt;p>这是原作者的说明界面：https://pkhungurn.github.io/talking-head-anime/
里面较为详细介绍了他的生成器的原理和训练过程。
这里介绍一个图片生成网站：https://waifulabs.com/
一个可以生成老婆半身像的网站，作者用这个网站生成的图片来对软件进行测试，当然你也可以拿自己喜欢的图来测试。&lt;/p>
&lt;h2 id="试玩">&lt;a href="#%e8%af%95%e7%8e%a9" class="header-anchor">&lt;/a>试玩
&lt;/h2>&lt;p>这是原作者的源码：https://github.com/pkhungurn/talking-head-anime-demo
以下是我根据源码说明做的简单总结。
步骤：
[scode type=&amp;ldquo;lblue&amp;rdquo;]1. 安装PyTorch，电脑要求必须是能支持CUDA的N卡才行，&lt;a class="link" href="https://www.2bboy.com/archives/146.html" target="_blank" rel="noopener"
>PyTorch安装&lt;/a>[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;yellow&amp;rdquo;]后面作者的源码和readme都进行了一定更新，建议自己根据源码里的readme进行部署，本文的文件和方法可能过时，仅供参考。[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;lblue&amp;rdquo;] 2. 下载上面的源码，然后下载这里的&lt;a class="link" href="https://drive.google.com/file/d/1ajHViqyLDKFKfBtGPE5cbSGcMNa8rz8k/view" target="_blank" rel="noopener"
>模型数据&lt;/a> 和 &lt;a class="link" href="https://github.com/davisking/dlib-models/blob/master/shape_predictor_68_face_landmarks.dat.bz2" target="_blank" rel="noopener"
>这个文件&lt;/a>。下载好后把文件按源码说明解压放到data目录下。[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;lblue&amp;rdquo;]3. 接下来要安装相应的库，简单点就按作者文档里的运行要先安装cv2和dlib库，否则会报错，安装cv2用 &lt;code>pip install opencv-python &lt;/code>,安装dlib还有个坑，&lt;a class="link" href="https://blog.csdn.net/fengguanxi/article/details/80445652" target="_blank" rel="noopener"
>踩坑&lt;/a>。[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;lblue&amp;rdquo;] 4. 进入PyTorch环境，cd到项目文件夹，输入 &lt;code>python app/manual_poser.py&lt;/code>，弹出界面，导入图片即可，这里的图片还必须是256x256的背景为空的png图片，人物的脸也要保持在中间位置，然后拖动滑块图片就能动了。
强调一下这里仅仅是让图片动起来了，并不能生成其他的什么模型用于第三方软件，而且图片也挑的，不是随便张图片都能有很好的效果。[/scode]&lt;/p>
&lt;p>[scode type=&amp;ldquo;lblue&amp;rdquo;]5. 作者原文里还有一个 &lt;code>python app/puppeteer.py&lt;/code>应该是直接动补摄像头数据的，由于我电脑没有摄像头，后面有空再研究。[/scode]&lt;/p>
&lt;h2 id="视频演示">&lt;a href="#%e8%a7%86%e9%a2%91%e6%bc%94%e7%a4%ba" class="header-anchor">&lt;/a>视频演示
&lt;/h2>&lt;!-- raw HTML omitted -->
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>后来用手机摄像头连接电脑，测试了面捕功能，见视频的P2。&lt;/p></description></item><item><title>Win10安装PyTorch（GPU）</title><link>https://kizx.github.io/post/win10%E5%AE%89%E8%A3%85pytorchgpu/</link><pubDate>Sat, 11 Jan 2020 10:48:00 +0000</pubDate><guid>https://kizx.github.io/post/win10%E5%AE%89%E8%A3%85pytorchgpu/</guid><description>&lt;p>先确保你的电脑的独显支持CUDA，否则只能用CPU运算。
这里可以查看自己显卡型号是否支持CUDA以及CUDA计算能力：https://developer.nvidia.com/
安装工具：Anaconda &lt;a class="link" href="https://www.2bboy.com/archives/145.html" target="_blank" rel="noopener"
>常用命令&lt;/a>
这是官方安装指南：https://pytorch.org/get-started/locally/#anaconda&lt;/p>
&lt;h2 id="安装cuda">&lt;a href="#%e5%ae%89%e8%a3%85cuda" class="header-anchor">&lt;/a>安装CUDA
&lt;/h2>&lt;p>官方安装指南：https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html
查看自己的显卡驱动型号支持的CUDA版本：&lt;/p>
&lt;h3 id="方式一">&lt;a href="#%e6%96%b9%e5%bc%8f%e4%b8%80" class="header-anchor">&lt;/a>方式一
&lt;/h3>&lt;p>在命令行里依次输入下面两条命令&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">cd&lt;/span> C:\Program Files\NVIDIA Corporation\NVSMI
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nvidia-smi.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后根据显示的 Driver Version 和下面的图确定自己驱动支持的cude版本
&lt;img src="https://pan.2bboy.com/img/2020/06/062001.png"
loading="lazy"
>
上面这张表来自：https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions&lt;/p>
&lt;h3 id="方式二">&lt;a href="#%e6%96%b9%e5%bc%8f%e4%ba%8c" class="header-anchor">&lt;/a>方式二
&lt;/h3>&lt;p>通过NVIDIA的控制面板查看自己显卡驱动版本：https://jingyan.baidu.com/article/363872ecf07d652f4ba16fda.html&lt;/p>
&lt;hr>
&lt;p>确定CUDA版本后去官网下载：https://developer.nvidia.com/cuda-toolkit-archive
根据自己系统选择相应版本下载后安装。
下载完成后点击安装即可，安装完在cmd控制台输入&lt;code>nvcc -V&lt;/code>返回版本信息即安装成功。
&lt;img src="https://pan.2bboy.com/img/2020/01/0111183104.png"
loading="lazy"
>
注：有些安装教程会要求安装cudnn，我这里暂时不用&lt;/p>
&lt;h2 id="安装pytorch">&lt;a href="#%e5%ae%89%e8%a3%85pytorch" class="header-anchor">&lt;/a>安装PyTorch
&lt;/h2>&lt;p>因为是用Anaconda安装，先进入Anaconda控制台新建一个环境并激活，然后进入https://pytorch.org/get-started/locally/#anaconda 选择你要安装的版本和方式，会自动生成一条安装命令，复制命令粘贴运行。
&lt;img src="https://pan.2bboy.com/img/2020/01/0111183540.png"
loading="lazy"
>
安装过程可能会很艰辛，主要就是那个pytorch的包太大了，足足有480M，建议试试换镜像源看看速度是否会提升，反正我最后是开了全局代理才下下来的。其他安装方式也可以试试。
安装完成后输入python然后运行以下代码，返回Ture就说明CUDA是可以使用的&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> torch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>torch&lt;span style="color:#f92672">.&lt;/span>torch&lt;span style="color:#f92672">.&lt;/span>cuda&lt;span style="color:#f92672">.&lt;/span>is_available()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/01/0111184723.png"
loading="lazy"
>&lt;/p></description></item><item><title>Anaconda常用命令</title><link>https://kizx.github.io/post/anaconda%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Sat, 11 Jan 2020 08:03:00 +0000</pubDate><guid>https://kizx.github.io/post/anaconda%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;p>&lt;a class="link" href="https://www.jianshu.com/p/742dc4d8f4c5" target="_blank" rel="noopener"
>Anaconda简单入门&lt;/a>&lt;/p>
&lt;h2 id="命令">&lt;a href="#%e5%91%bd%e4%bb%a4" class="header-anchor">&lt;/a>命令
&lt;/h2>&lt;pre tabindex="0">&lt;code># 查看conda版本
conda --version
conda -V
# 获取帮助
conda --help
conda -h
# 查看当前环境
conda env list
# 新建环境
conda create -n env_name
conda create -n your_env_name python=3.7
conda create -n your_env_name python=3.7 numpy pandas
# 保存环境
conda env export &amp;gt; environment.yml
# 从保存环境新建
conda env create -f environment.yml
# 删除环境
conda remove -n env_name --all
# 一键更新
conda update --all
# 环境切换
activate env_name
conda deactivate env_name
# 包管理
conda install/updata/remove
# 换源
参考:https://blog.csdn.net/observador/article/details/83618540
保存在用户目录.condarc文件中
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
# 换回默认的源
conda config --remove-key channels
&lt;/code>&lt;/pre></description></item><item><title>MMD建模相关软件及插件</title><link>https://kizx.github.io/post/mmd%E5%BB%BA%E6%A8%A1%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6%E5%8F%8A%E6%8F%92%E4%BB%B6/</link><pubDate>Fri, 10 Jan 2020 08:15:00 +0000</pubDate><guid>https://kizx.github.io/post/mmd%E5%BB%BA%E6%A8%A1%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6%E5%8F%8A%E6%8F%92%E4%BB%B6/</guid><description>&lt;ol start="2">
&lt;li>&lt;a class="link" href="http://kkhk22.seesaa.net/category/14045227-1.html" target="_blank" rel="noopener"
>PMXEditer&lt;/a>
2.1 &lt;a class="link" href="http://tieba.baidu.com/p/4376107014" target="_blank" rel="noopener"
>PE多功能插件&lt;/a>&lt;/li>
&lt;li>[Blender_mmd_tools]9https://github.com/powroupi/blender_mmd_tools)&lt;/li>
&lt;/ol></description></item><item><title>腾讯云函数入门</title><link>https://kizx.github.io/post/%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E5%85%A5%E9%97%A8/</link><pubDate>Thu, 09 Jan 2020 13:43:00 +0000</pubDate><guid>https://kizx.github.io/post/%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E5%85%A5%E9%97%A8/</guid><description>&lt;h2 id="使用腾讯云控制台城建函数">&lt;a href="#%e4%bd%bf%e7%94%a8%e8%85%be%e8%ae%af%e4%ba%91%e6%8e%a7%e5%88%b6%e5%8f%b0%e5%9f%8e%e5%bb%ba%e5%87%bd%e6%95%b0" class="header-anchor">&lt;/a>使用腾讯云控制台城建函数
&lt;/h2>&lt;p>之前安装onedrive云盘用的就是这种方式，装多了感觉就简单了，官方文档：https://cloud.tencent.com/document/product/583/37509&lt;/p>
&lt;h2 id="使用控制台创建函数">&lt;a href="#%e4%bd%bf%e7%94%a8%e6%8e%a7%e5%88%b6%e5%8f%b0%e5%88%9b%e5%bb%ba%e5%87%bd%e6%95%b0" class="header-anchor">&lt;/a>使用控制台创建函数
&lt;/h2>&lt;p>官方文档：https://cloud.tencent.com/document/product/583/37510
其实就是使用cmd控制台来创建，和hexo或者git操作有点类似。
这里简单说下步骤：&lt;/p>
&lt;ol>
&lt;li>安装scf：&lt;code>pip install scf &lt;/code> 可通过&lt;code>scf --version&lt;/code>查看是否安装成功&lt;/li>
&lt;li>配置账号：&lt;code>scf configure set&lt;/code> 账号信息可以查看&lt;a class="link" href="https://cloud.tencent.com/document/product/583/33449#.E9.85.8D.E7.BD.AE.E8.B4.A6.E5.8F.B7.E4.BF.A1.E6.81.AF" target="_blank" rel="noopener"
>链接&lt;/a>&lt;/li>
&lt;li>初始化项目：&lt;code>scf init&lt;/code>&lt;/li>
&lt;li>cd进入项目后本地调试运行函数&lt;code>scf native invoke --no-event&lt;/code>，调试参数见&lt;a class="link" href="https://cloud.tencent.com/document/product/583/35402" target="_blank" rel="noopener"
>链接&lt;/a>，说一下调试环境python或nodejs均可，如果是用&lt;code>scf local invoke&lt;/code>则需要docker。&lt;/li>
&lt;li>编写函数和&lt;a class="link" href="https://cloud.tencent.com/document/product/583/36198" target="_blank" rel="noopener"
>配置文件&lt;/a>&lt;/li>
&lt;li>部署&lt;code>scf deploy&lt;/code>,成功后在腾讯云控制台可以查看&lt;/li>
&lt;li>将 serviceId 复制到 template.yaml&lt;/li>
&lt;/ol>
&lt;h2 id="vscode插件">&lt;a href="#vscode%e6%8f%92%e4%bb%b6" class="header-anchor">&lt;/a>VSCode插件
&lt;/h2>&lt;p>官方教程：https://cloud.tencent.com/document/product/583/37511
在插件市场搜索Tencent Serverless安装结果第一个即可，将之前的命令都按钮化了，更简单直观，还能在vscode里debug。&lt;/p>
&lt;h2 id="为云函数打包依赖">&lt;a href="#%e4%b8%ba%e4%ba%91%e5%87%bd%e6%95%b0%e6%89%93%e5%8c%85%e4%be%9d%e8%b5%96" class="header-anchor">&lt;/a>为云函数打包依赖
&lt;/h2>&lt;p>函数用到了第三方依赖需自行打包随函数一起上传：https://cloud.tencent.com/developer/article/1443081&lt;/p></description></item><item><title>VirtualBox安装linux虚拟机</title><link>https://kizx.github.io/post/virtualbox%E5%AE%89%E8%A3%85linux%E8%99%9A%E6%8B%9F%E6%9C%BA/</link><pubDate>Wed, 08 Jan 2020 09:47:00 +0000</pubDate><guid>https://kizx.github.io/post/virtualbox%E5%AE%89%E8%A3%85linux%E8%99%9A%E6%8B%9F%E6%9C%BA/</guid><description>&lt;p>VirtualBox下载地址：https://www.virtualbox.org/wiki/Downloads
系统镜像下载，这是网易的镜像下载地址，速度很快：http://mirrors.163.com/ubuntu-releases/&lt;/p>
&lt;h2 id="安装">&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>安装
&lt;/h2>&lt;p>安装教程：
&lt;a class="link" href="https://www.bilibili.com/video/av82489244" target="_blank" rel="noopener"
>https://www.bilibili.com/video/av82489244&lt;/a>&lt;/p>
&lt;h2 id="可能遇到的问题">&lt;a href="#%e5%8f%af%e8%83%bd%e9%81%87%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor">&lt;/a>可能遇到的问题
&lt;/h2>&lt;ol>
&lt;li>VirtualBox中默认启用了硬件虚拟化，可以在任务管理器cpu里进行查看,未启用的话需在bios里启用
&lt;img src="https://pan.2bboy.com/images/2020/01/0108175711.png"
loading="lazy"
>&lt;/li>
&lt;li>网络无法连接可以换回默认的连接方式&lt;/li>
&lt;/ol></description></item><item><title>aiohttp异步编程入门</title><link>https://kizx.github.io/post/aiohttp%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/</link><pubDate>Mon, 30 Dec 2019 03:56:00 +0000</pubDate><guid>https://kizx.github.io/post/aiohttp%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/</guid><description>&lt;p>教程官方教程就够了：
&lt;a class="link" href="https://docs.aiohttp.org/en/latest/client.html" target="_blank" rel="noopener"
>https://docs.aiohttp.org/en/latest/client.html&lt;/a>&lt;/p>
&lt;p>案例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> aiohttp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> aiofiles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> asyncio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">yiyan&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&amp;#39;简单的get请求&amp;#39;&amp;#39;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> aiohttp&lt;span style="color:#f92672">.&lt;/span>ClientSession() &lt;span style="color:#66d9ef">as&lt;/span> session:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>get(&lt;span style="color:#e6db74">&amp;#39;https://api.n-1.cn/yiyan&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> response:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#66d9ef">await&lt;/span> response&lt;span style="color:#f92672">.&lt;/span>text())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">acgpic1&lt;/span>(name):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&amp;#39;下载是异步的&amp;#39;&amp;#39;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> aiohttp&lt;span style="color:#f92672">.&lt;/span>ClientSession() &lt;span style="color:#66d9ef">as&lt;/span> session:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>get(&lt;span style="color:#e6db74">&amp;#39;https://api.n-1.cn/ACG&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> response:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;下载&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">中...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pic &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> response&lt;span style="color:#f92672">.&lt;/span>read()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">下载完成&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">.jpg&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;wb+&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(pic)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">保存完毕&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">acgpic2&lt;/span>(name):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&amp;#39;下载是异步的 保存也是异步的(虽然这里没体现出来)&amp;#39;&amp;#39;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> aiohttp&lt;span style="color:#f92672">.&lt;/span>ClientSession() &lt;span style="color:#66d9ef">as&lt;/span> session:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>get(&lt;span style="color:#e6db74">&amp;#39;https://api.n-1.cn/ACG&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> response:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;下载&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">中...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pic &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> response&lt;span style="color:#f92672">.&lt;/span>read()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">下载完成&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">with&lt;/span> aiofiles&lt;span style="color:#f92672">.&lt;/span>open(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">.jpg&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;wb&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">保存中...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>write(pic)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>name&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">保存完毕&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>loop &lt;span style="color:#f92672">=&lt;/span> asyncio&lt;span style="color:#f92672">.&lt;/span>get_event_loop()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>task &lt;span style="color:#f92672">=&lt;/span> [acgpic1(i) &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">10&lt;/span>)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>loop&lt;span style="color:#f92672">.&lt;/span>run_until_complete(asyncio&lt;span style="color:#f92672">.&lt;/span>wait(task))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>几款密码管理软件</title><link>https://kizx.github.io/post/%E5%87%A0%E6%AC%BE%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86%E8%BD%AF%E4%BB%B6/</link><pubDate>Sun, 29 Dec 2019 08:26:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%87%A0%E6%AC%BE%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86%E8%BD%AF%E4%BB%B6/</guid><description>&lt;p>i&amp;gt; We always have to remember a lot of accounts and passwords in our daily life. Some people like to use their particular passwords, while others like to keep them in a notebook. If you&amp;rsquo;re frustrated to manage your passwords, here are some password management tools you can have a try. Good tools can improve our efficiency, but even the best tools can be a burden if they don&amp;rsquo;t fit us; therefore, don&amp;rsquo;t use a tool just to use the tool.&lt;/p>
&lt;h2 id="keepass">&lt;a href="#keepass" class="header-anchor">&lt;/a>keepass
&lt;/h2>&lt;p>一款本地的密码管理软件，不能云端，就是个高级的带密码的记事本或者数据库，好像有浏览器插件但必须本地开着keepass的客户端才能用。如果只是喜欢记一些数据到本地，配合坚果云同步用用还可以。&lt;/p>
&lt;h2 id="1password">&lt;a href="#1password" class="header-anchor">&lt;/a>1password
&lt;/h2>&lt;p>之前刚好有活动就领了一年的试用，软件界面很漂亮，浏览器插件用着也很舒服，云端同步，平台齐全，唯一的缺点就是太贵了，虽然有一年试用，但我觉得还是没有必要在密码管理上花一笔钱就没继续用了&lt;/p>
&lt;h2 id="lastpass">&lt;a href="#lastpass" class="header-anchor">&lt;/a>lastpass
&lt;/h2>&lt;p>一款免费的密码管理软件，浏览器插件界面略丑，不支持中文，用了一个多月，老是弹升级信息。总之一句话不够简洁，越用越讨厌。&lt;/p>
&lt;h2 id="bitwarden">&lt;a href="#bitwarden" class="header-anchor">&lt;/a>Bitwarden
&lt;/h2>&lt;p>也是免费的一款软件，特点是可以自建云端，同时也自带的云端同步。浏览器插件界面简洁，支持中文，各方面都还优秀，唯一的缺点就是无法自动感知你网页密码的添加和改变，也不能自动填入密码，得在插件上点一下才行。如果不怕麻烦的话这款软件用着很舒服。&lt;/p></description></item><item><title>Typecho+Handsome主题美化</title><link>https://kizx.github.io/post/typecho+handsome%E4%B8%BB%E9%A2%98%E7%BE%8E%E5%8C%96/</link><pubDate>Sat, 28 Dec 2019 06:06:00 +0000</pubDate><guid>https://kizx.github.io/post/typecho+handsome%E4%B8%BB%E9%A2%98%E7%BE%8E%E5%8C%96/</guid><description>&lt;h2 id="美化教程">&lt;a href="#%e7%be%8e%e5%8c%96%e6%95%99%e7%a8%8b" class="header-anchor">&lt;/a>美化教程
&lt;/h2>&lt;p>&lt;a class="link" href="https://auth.ihewro.com/user/docs/#/" target="_blank" rel="noopener"
>handsome使用文档&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://auth.ihewro.com/user/course.html" target="_blank" rel="noopener"
>handsome社区分享&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.kancloud.cn/jarvis0912/handsome/1500818" target="_blank" rel="noopener"
>史上最全的handsome美化，没有之一！&lt;/a>&lt;/p>
&lt;hr>
&lt;p>&lt;a class="link" href="https://sunpma.com/674.html" target="_blank" rel="noopener"
>sunpma.com主题美化记录&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.onlaly.com/archives/268/" target="_blank" rel="noopener"
>www.onlaly.com的魔改&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://blog.qqiyu.cn/397.html" target="_blank" rel="noopener"
>blog.qqiyu.cn美化魔改&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://itudo.cn/handsome-change.html" target="_blank" rel="noopener"
>itudo.cn魔改合集&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://gordsky.cn/106.html" target="_blank" rel="noopener"
>gordsky.cn美化分享&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.cooyf.com/default/1.html" target="_blank" rel="noopener"
>www.cooyf.com的一些美化&lt;/a>&lt;/p>
&lt;hr>
&lt;p>&lt;a class="link" href="https://www.phenxso.com/archives/194.html" target="_blank" rel="noopener"
>typecho评论后台图片超出范围&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://dxoca.cn/front/257.html" target="_blank" rel="noopener"
>typecho文章挂载Bilibili视频&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://eas1.cn/190.html" target="_blank" rel="noopener"
>弹窗提醒以及个性化提示&lt;/a>&lt;/p>
&lt;h2 id="插件">&lt;a href="#%e6%8f%92%e4%bb%b6" class="header-anchor">&lt;/a>插件
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.xcnte.com/archives/523/" target="_blank" rel="noopener"
>代码高亮插件Code Prettify&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.hoehub.com/PHP/typecho-HoerMouse.html" target="_blank" rel="noopener"
>Typecho炫彩鼠标插件:HoerMouse&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/gaobinzhan/CommentPush" target="_blank" rel="noopener"
>评论通知推送多服务&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://minirizhi.com/104.html" target="_blank" rel="noopener"
>百度提交插件BaiduSubmit魔改&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://paugram.com/coding/add-poster-girl-with-plugin.html" target="_blank" rel="noopener"
>Live2D 插件Pio&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://qqdie.com/archives/tyepcho-tag-select-plugin.html" target="_blank" rel="noopener"
>后台编辑文章时增加标签选择列表&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://qqdie.com/archives/tereplace-plugin-typecho.html" target="_blank" rel="noopener"
>文章内容替换工具&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/ShadowySpirits/BangumiList" target="_blank" rel="noopener"
>Bangumi 追番列表&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://blog.imalan.cn/archives/128/" target="_blank" rel="noopener"
>PandaBangumi 追番列表&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://zjhblog.cc/index.php/archives/159/" target="_blank" rel="noopener"
>EditorMD + handsome 编辑器插件整合&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://keymoe.com/archives/55/" target="_blank" rel="noopener"
>WowScroll动感元素插件&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.zpblogs.cn/103.html" target="_blank" rel="noopener"
>WenYu特效管理插件&lt;/a>&lt;/p>
&lt;h2 id="博主的介绍">&lt;a href="#%e5%8d%9a%e4%b8%bb%e7%9a%84%e4%bb%8b%e7%bb%8d" class="header-anchor">&lt;/a>博主的介绍
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--博主介绍的闪字特效--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;text-muted text-xs block&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;chakhsu&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">chakhsu&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">r&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">t&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>[Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">e&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> String.&lt;span style="color:#a6e22e">fromCharCode&lt;/span>(&lt;span style="color:#ae81ff">94&lt;/span> &lt;span style="color:#f92672">*&lt;/span> Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">33&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">n&lt;/span>(&lt;span style="color:#a6e22e">r&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">n&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">createDocumentFragment&lt;/span>(), &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; &lt;span style="color:#a6e22e">r&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">l&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">createElement&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;span&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">l&lt;/span>.&lt;span style="color:#a6e22e">textContent&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">e&lt;/span>(), &lt;span style="color:#a6e22e">l&lt;/span>.&lt;span style="color:#a6e22e">style&lt;/span>.&lt;span style="color:#a6e22e">color&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">t&lt;/span>(), &lt;span style="color:#a6e22e">n&lt;/span>.&lt;span style="color:#a6e22e">appendChild&lt;/span>(&lt;span style="color:#a6e22e">l&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">n&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">t&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>[&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillI&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">step&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">step&lt;/span>&lt;span style="color:#f92672">--&lt;/span> &lt;span style="color:#f92672">:&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">step&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">g&lt;/span>, &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">l&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">?&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span> &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">l&lt;/span>[&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span>]),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;forward&amp;#34;&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">direction&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">t&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">?&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">t&lt;/span>[&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">delay&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">delay&lt;/span>&lt;span style="color:#f92672">--&lt;/span> &lt;span style="color:#f92672">:&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">direction&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;backward&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">delay&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#f92672">?&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>.&lt;span style="color:#a6e22e">slice&lt;/span>(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>), &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span>&lt;span style="color:#f92672">--&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillI&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillI&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#a6e22e">o&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>, &lt;span style="color:#a6e22e">c&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">direction&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;forward&amp;#34;&lt;/span>)), &lt;span style="color:#a6e22e">r&lt;/span>.&lt;span style="color:#a6e22e">textContent&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">text&lt;/span>, &lt;span style="color:#a6e22e">r&lt;/span>.&lt;span style="color:#a6e22e">appendChild&lt;/span>(&lt;span style="color:#a6e22e">n&lt;/span>(&lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">l&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Math.&lt;span style="color:#a6e22e">min&lt;/span>(&lt;span style="color:#a6e22e">s&lt;/span>, &lt;span style="color:#a6e22e">s&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">prefixP&lt;/span>) &lt;span style="color:#f92672">:&lt;/span> Math.&lt;span style="color:#a6e22e">min&lt;/span>(&lt;span style="color:#a6e22e">s&lt;/span>, &lt;span style="color:#a6e22e">t&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span> &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#a6e22e">c&lt;/span>.&lt;span style="color:#a6e22e">skillP&lt;/span>))), &lt;span style="color:#a6e22e">setTimeout&lt;/span>(&lt;span style="color:#a6e22e">i&lt;/span>, &lt;span style="color:#a6e22e">d&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#75715e">/*以下内容自定义修改*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">l&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">o&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;我好菜啊&amp;#34;&lt;/span>].&lt;span style="color:#a6e22e">map&lt;/span>(&lt;span style="color:#66d9ef">function&lt;/span> (&lt;span style="color:#a6e22e">r&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">r&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">g&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">s&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">d&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">75&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">b&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;rgb(110,64,170)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(150,61,179)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(191,60,175)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(228,65,157)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(254,75,131)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;rgb(255,94,99)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(255,120,71)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(251,150,51)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(226,183,47)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(198,214,60)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;rgb(175,240,91)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(127,246,88)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(82,246,103)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(48,239,130)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(29,223,163)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;rgb(26,199,194)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(35,171,216)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(54,140,225)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(76,110,219)&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rgb(96,84,200)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">c&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">text&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">prefixP&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#a6e22e">s&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">skillI&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">skillP&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">direction&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;forward&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">delay&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">step&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">g&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">i&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">chakhsu&lt;/span>(document.&lt;span style="color:#a6e22e">getElementById&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;chakhsu&amp;#39;&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="左侧边栏导航">&lt;a href="#%e5%b7%a6%e4%be%a7%e8%be%b9%e6%a0%8f%e5%af%bc%e8%88%aa" class="header-anchor">&lt;/a>左侧边栏导航
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;留言板&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-liuyan&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://www.2bboy.com/guestbook.html&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;target&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;_self&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;动态&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-dongtai2&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://www.2bboy.com/cross.html&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;target&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;_self&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;归档&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-rili2&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://www.2bboy.com/file.html&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;target&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;_self&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;追番&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-pgc_bangumi&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://www.2bboy.com/bangumi.html&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;target&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;_self&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;云盘&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-yun&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://pan.2bboy.com/Public&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;home&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;hide&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="顶部导航">&lt;a href="#%e9%a1%b6%e9%83%a8%e5%af%bc%e8%88%aa" class="header-anchor">&lt;/a>顶部导航
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;bilibili&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-bilibili-fill&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://space.bilibili.com/22411920&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;github&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-github&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://github.com/kizx&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;steam&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;iconfont icon-steam&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://steamcommunity.com/id/kizxmoe&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;talk&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;hide&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="时光机社交按钮">&lt;a href="#%e6%97%b6%e5%85%89%e6%9c%ba%e7%a4%be%e4%ba%a4%e6%8c%89%e9%92%ae" class="header-anchor">&lt;/a>时光机社交按钮
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;微博&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;fontello fontello-weibo&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://weibo.com/u/5938819173&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;github&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;fa fa-github&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://github.com/kizx&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;gitee&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;fa fa-git&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://gitee.com/kizx&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;steam&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;fa fa-steam&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://steamcommunity.com/id/kizxmoe&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;bilibili&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;single&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://space.bilibili.com/22411920&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;网易云&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;single&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;https://music.163.com/#/user/home?id=111496719&amp;#34;&lt;/span>}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;bangumi&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;single&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;class&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;fa fa-heartbeat&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;http://bangumi.tv/user/305237&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="pjax回调函数">&lt;a href="#pjax%e5%9b%9e%e8%b0%83%e5%87%bd%e6%95%b0" class="header-anchor">&lt;/a>pjax回调函数
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--&lt;/span>&lt;span style="color:#a6e22e">彩色标签云&lt;/span>&lt;span style="color:#f92672">--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">tags&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">querySelectorAll&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;#tag_cloud-2 a&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;#428BCA&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#AEDCAE&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#ECA9A7&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#DA99FF&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#FFB380&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#D9B999&amp;#34;&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">tags&lt;/span>.&lt;span style="color:#a6e22e">forEach&lt;/span>(&lt;span style="color:#a6e22e">tag&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tagsColor&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span>[Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>)];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tag&lt;/span>.&lt;span style="color:#a6e22e">style&lt;/span>.&lt;span style="color:#a6e22e">backgroundColor&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">tagsColor&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--&lt;/span>&lt;span style="color:#a6e22e">代码高亮&lt;/span>&lt;span style="color:#f92672">--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#66d9ef">typeof&lt;/span> &lt;span style="color:#a6e22e">Prism&lt;/span> &lt;span style="color:#f92672">!==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;undefined&amp;#39;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Prism&lt;/span>.&lt;span style="color:#a6e22e">highlightAll&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span>,&lt;span style="color:#66d9ef">null&lt;/span>);}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--&lt;/span>&lt;span style="color:#a6e22e">复制提示&lt;/span>&lt;span style="color:#f92672">--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">kaygb_copy&lt;/span>();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="博客底部左侧">&lt;a href="#%e5%8d%9a%e5%ae%a2%e5%ba%95%e9%83%a8%e5%b7%a6%e4%be%a7" class="header-anchor">&lt;/a>博客底部左侧
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;github-badge&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;./&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;?2019 kizx&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-subject&amp;#34;&lt;/span>&amp;gt;Copyright&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-value bg-blue&amp;#34;&lt;/span>&amp;gt;?2019 kizx&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;github-badge&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;http://beian.miit.gov.cn&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">target&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;_blank&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;陕ICP备19016973号&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">style&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;cursor: url(&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">usr&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">HoerMouse&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">static&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">image&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">dew&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">link&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">cur&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;),&lt;/span> &lt;span style="color:#a6e22e">pointer&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">;&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-subject&amp;#34;&lt;/span>&amp;gt;陕ICP备&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-value bg-green&amp;#34;&lt;/span>&amp;gt;19016973号&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="博客底部右侧">&lt;a href="#%e5%8d%9a%e5%ae%a2%e5%ba%95%e9%83%a8%e5%8f%b3%e4%be%a7" class="header-anchor">&lt;/a>博客底部右侧
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;github-badge&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;http://www.typecho.org&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">target&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;_blank&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;由 Typecho 强力驱动&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">style&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;cursor: url(&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">usr&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">HoerMouse&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">static&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">image&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">dew&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">link&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">cur&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;),&lt;/span> &lt;span style="color:#a6e22e">pointer&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">;&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-subject&amp;#34;&lt;/span>&amp;gt;Powered&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-value bg-blue&amp;#34;&lt;/span>&amp;gt;Typecho&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;github-badge&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://www.ihewro.com/archives/489/&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">target&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;_blank&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Handsome主题&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">style&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;cursor: url(&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">usr&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">plugins&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">HoerMouse&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">static&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">image&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">dew&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/&lt;/span>&lt;span style="color:#a6e22e">link&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">cur&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;),&lt;/span> &lt;span style="color:#a6e22e">pointer&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">;&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-subject&amp;#34;&lt;/span>&amp;gt;Theme&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;&amp;lt;&lt;span style="color:#f92672">span&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;badge-value bg-orange&amp;#34;&lt;/span>&amp;gt;Handsome&amp;lt;/&lt;span style="color:#f92672">span&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="自定义css">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89css" class="header-anchor">&lt;/a>自定义css
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/* 首页文章列表悬停上浮 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">blog-post&lt;/span> .&lt;span style="color:#a6e22e">panel&lt;/span>:&lt;span style="color:#a6e22e">not&lt;/span>&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">article&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transition&lt;/span>: &lt;span style="color:#66d9ef">all&lt;/span> &lt;span style="color:#ae81ff">0.3&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">blog-post&lt;/span> .&lt;span style="color:#a6e22e">panel&lt;/span>:&lt;span style="color:#a6e22e">not&lt;/span>&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">article&lt;/span>&lt;span style="color:#f92672">)&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: translateY(&lt;span style="color:#ae81ff">-10&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">8&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> rgba(&lt;span style="color:#ae81ff">73&lt;/span>, &lt;span style="color:#ae81ff">90&lt;/span>, &lt;span style="color:#ae81ff">47&lt;/span>, &lt;span style="color:#ae81ff">0.47&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/* 头像呼吸光环和鼠标悬停旋转放大 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">img-full&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-radius&lt;/span>: &lt;span style="color:#ae81ff">50&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">animation&lt;/span>: light &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span> &lt;span style="color:#66d9ef">ease-in-out&lt;/span> &lt;span style="color:#66d9ef">infinite&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transition&lt;/span>: &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">img-square&lt;/span>&lt;span style="color:#f92672">,&lt;/span> .&lt;span style="color:#a6e22e">img-circle&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transition&lt;/span>: &lt;span style="color:#ae81ff">0.5&lt;/span>&lt;span style="color:#66d9ef">s&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">img-square&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span>&lt;span style="color:#f92672">,&lt;/span> .&lt;span style="color:#a6e22e">img-circle&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: scale(&lt;span style="color:#ae81ff">1.15&lt;/span>) rotate(&lt;span style="color:#ae81ff">360&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">img-full&lt;/span>:&lt;span style="color:#a6e22e">hover&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transform&lt;/span>: scale(&lt;span style="color:#ae81ff">1.15&lt;/span>) rotate(&lt;span style="color:#ae81ff">720&lt;/span>&lt;span style="color:#66d9ef">deg&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">keyframes&lt;/span> &lt;span style="color:#f92672">light&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">0&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">#f00&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">25&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">16&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">#0f0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">50&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">#00f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">75&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">16&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">#0f0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">100&lt;/span>&lt;span style="color:#f92672">%&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">box-shadow&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">#f00&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*底部页脚*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">inline-block&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-radius&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">text-shadow&lt;/span>: &lt;span style="color:#66d9ef">none&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">font-size&lt;/span>: &lt;span style="color:#ae81ff">12&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">color&lt;/span>: &lt;span style="color:#ae81ff">#fff&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">line-height&lt;/span>: &lt;span style="color:#ae81ff">15&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#abbac3&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">margin-bottom&lt;/span>: &lt;span style="color:#ae81ff">5&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">badge-subject&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">inline-block&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#4d4d4d&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">padding&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-top-left-radius&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-bottom-left-radius&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">badge-value&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">display&lt;/span>: &lt;span style="color:#66d9ef">inline-block&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">padding&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-top-right-radius&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">border-bottom-right-radius&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#66d9ef">px&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">bg-blue&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#007ec6&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">bg-orange&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#ffa500&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">bg-red&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#f00&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">bg-green&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#3bca6e&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">github-badge&lt;/span> .&lt;span style="color:#a6e22e">bg-purple&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">background-color&lt;/span>: &lt;span style="color:#ae81ff">#ab34e9&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/*Bilibili视频挂载*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">iframe_video&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">media&lt;/span> &lt;span style="color:#f92672">only&lt;/span> &lt;span style="color:#f92672">screen&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">max-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">767px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">iframe_video&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">15&lt;/span>&lt;span style="color:#66d9ef">em&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">media&lt;/span> &lt;span style="color:#f92672">only&lt;/span> &lt;span style="color:#f92672">screen&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">min-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">768px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">max-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">991px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">iframe_video&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">20&lt;/span>&lt;span style="color:#66d9ef">em&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">media&lt;/span> &lt;span style="color:#f92672">only&lt;/span> &lt;span style="color:#f92672">screen&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">min-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">992px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">max-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">1199px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">iframe_video&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">30&lt;/span>&lt;span style="color:#66d9ef">em&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#66d9ef">media&lt;/span> &lt;span style="color:#f92672">only&lt;/span> &lt;span style="color:#f92672">screen&lt;/span> &lt;span style="color:#f92672">and&lt;/span> &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#f92672">min-width&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">1200px&lt;/span>&lt;span style="color:#f92672">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">iframe_video&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">40&lt;/span>&lt;span style="color:#66d9ef">em&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">iframe_cross&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">relative&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">padding-bottom&lt;/span>: &lt;span style="color:#ae81ff">75&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#a6e22e">iframe_cross&lt;/span> &lt;span style="color:#f92672">iframe&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">position&lt;/span>: &lt;span style="color:#66d9ef">absolute&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">width&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">height&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#66d9ef">%&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">left&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">top&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="自定义javascript">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89javascript" class="header-anchor">&lt;/a>自定义javascript
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/* 彩色标签云 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">tags&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">querySelectorAll&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;#tag_cloud-2 a&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;#428BCA&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#AEDCAE&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#ECA9A7&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#DA99FF&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#FFB380&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;#D9B999&amp;#34;&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">tags&lt;/span>.&lt;span style="color:#a6e22e">forEach&lt;/span>(&lt;span style="color:#a6e22e">tag&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tagsColor&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span>[Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">colorArr&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>)];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tag&lt;/span>.&lt;span style="color:#a6e22e">style&lt;/span>.&lt;span style="color:#a6e22e">backgroundColor&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">tagsColor&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/* 复制提示 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">kaygb_copy&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">kaygb_copy&lt;/span>(){&lt;span style="color:#a6e22e">$&lt;/span>(document).&lt;span style="color:#a6e22e">ready&lt;/span>(&lt;span style="color:#66d9ef">function&lt;/span>(){&lt;span style="color:#a6e22e">$&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;body&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">bind&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;copy&amp;#39;&lt;/span>,&lt;span style="color:#66d9ef">function&lt;/span>(&lt;span style="color:#a6e22e">e&lt;/span>){&lt;span style="color:#a6e22e">hellolayer&lt;/span>()})});&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">sitesurl&lt;/span>&lt;span style="color:#f92672">=&lt;/span>window.&lt;span style="color:#a6e22e">location&lt;/span>.&lt;span style="color:#a6e22e">href&lt;/span>;&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">hellolayer&lt;/span>(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">$&lt;/span>.&lt;span style="color:#a6e22e">message&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">message&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;尊重原创，转载请注明出处！&amp;lt;br&amp;gt; 本文作者：醉后的星星&amp;lt;br&amp;gt;原文链接：&amp;lt;br&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#a6e22e">sitesurl&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;复制成功&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;success&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">autoHide&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">time&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;15000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="自定义head">&lt;a href="#%e8%87%aa%e5%ae%9a%e4%b9%89head" class="header-anchor">&lt;/a>自定义Head
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--图标--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">link&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">rel&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;stylesheet&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--分享内容--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">itemprop&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;醉后的星星&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">itemprop&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://www.2bboy.com/usr/uploads/txmk.jpg&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">meta&lt;/span> &lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">itemprop&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">content&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;我好菜啊&amp;#34;&lt;/span> /&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--百度统计--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&amp;lt;!--动态标题--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span>&amp;gt;document.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;visibilitychange&amp;#39;&lt;/span>, &lt;span style="color:#66d9ef">function&lt;/span> () { &lt;span style="color:#66d9ef">if&lt;/span> (document.&lt;span style="color:#a6e22e">visibilityState&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;hidden&amp;#39;&lt;/span>) { &lt;span style="color:#a6e22e">normal_title&lt;/span> &lt;span style="color:#f92672">=&lt;/span> document.&lt;span style="color:#a6e22e">title&lt;/span>; document.&lt;span style="color:#a6e22e">title&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;人呢？快回来！&amp;#39;&lt;/span>; } &lt;span style="color:#66d9ef">else&lt;/span> { document.&lt;span style="color:#a6e22e">title&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">normal_title&lt;/span>; } });&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="pio插件设置">&lt;a href="#pio%e6%8f%92%e4%bb%b6%e8%ae%be%e7%bd%ae" class="header-anchor">&lt;/a>pio插件设置
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;welcome&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;你好，欢迎来到本站！&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;有问题欢迎留言&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;touch&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;你这个绅士！&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;别碰我！&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;你在干什么？&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;再摸我就报警了！&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;HENTAI!&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;你够了喔！&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;萝莉是什么呀&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;skin&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;想看看我的新服装吗？&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;新衣服真漂亮~&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;home&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;点击这里回到首页&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://docs.paul.ren/pio/#/&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;referer&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Hi，欢迎来自 %t 的朋友&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;close&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;QWQ 下次再见吧~&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;custom&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;read&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.post-meta&amp;gt;h2 a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.music-box&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;你想听歌吗o((;=? 3? =))o～?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.comment-form-comment&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;填写真实邮箱可以收到回复通知哦(??ω-)～&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.searchform&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;会搜索的人运气不会太差o(≧▽≦)o&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.dropdown:nth-last-child(4)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;想关注我的bilibili频道吗&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.dropdown:nth-last-child(3)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;人生苦短&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;selector&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;.dropdown:nth-last-child(2)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;text&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;可以不玩，不能没有&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>利用windows自带的网络位置进行ftp登录</title><link>https://kizx.github.io/post/%E5%88%A9%E7%94%A8windows%E8%87%AA%E5%B8%A6%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BD%8D%E7%BD%AE%E8%BF%9B%E8%A1%8Cftp%E7%99%BB%E5%BD%95/</link><pubDate>Sun, 15 Dec 2019 06:21:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%88%A9%E7%94%A8windows%E8%87%AA%E5%B8%A6%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BD%8D%E7%BD%AE%E8%BF%9B%E8%A1%8Cftp%E7%99%BB%E5%BD%95/</guid><description>&lt;h2 id="使用方法">&lt;a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>使用方法
&lt;/h2>&lt;p>打开我的电脑，空白处右键添加网络位置，点下一步然后参照示例添加ftp地址
&lt;img src="https://pan.2bboy.com/img/2019/12/1215141252.png"
loading="lazy"
>
后面就是设置些名称和登录密码，总之要啥填啥就是了，然后就可以点击资源浏览器里新添加的网络位置来连接了。
&lt;img src="https://pan.2bboy.com/img/2019/12/1215144516.png"
loading="lazy"
>
[scode type=&amp;ldquo;blue&amp;rdquo;]其实这就是个快捷方式，在资源管理器地址栏直接输入ftp地址就可以直接登陆。
另外，在浏览器里直接输入ftp地址也是可以进行访问的。[/scode]&lt;/p></description></item><item><title>远程开机的几种方式</title><link>https://kizx.github.io/post/%E8%BF%9C%E7%A8%8B%E5%BC%80%E6%9C%BA%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/</link><pubDate>Wed, 04 Dec 2019 10:16:00 +0000</pubDate><guid>https://kizx.github.io/post/%E8%BF%9C%E7%A8%8B%E5%BC%80%E6%9C%BA%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/</guid><description>&lt;h2 id="开机棒">&lt;a href="#%e5%bc%80%e6%9c%ba%e6%a3%92" class="header-anchor">&lt;/a>开机棒
&lt;/h2>&lt;p>开机棒是插在路由器LAN口上使用的，如果是校园网那就用不了，因为你根本不知道路由器或者交换机在哪，知道在哪你也不能插个这么个玩意上去，不过你自己单独再整个路由器，然后电脑连路由器上应该可以。
开机棒由一个usb线单独供电，远程开机的原理应该是WOL网络远程唤醒电脑，只要不是古董机，一般电脑主板都有这个功能。其实这个功能本来只能用于局域网唤醒主机，要实现外网唤醒，必须做内网穿透，但开机棒自己就能连接外网，所以内网穿透就不用我们操心了。&lt;/p>
&lt;h2 id="开机插座">&lt;a href="#%e5%bc%80%e6%9c%ba%e6%8f%92%e5%ba%a7" class="header-anchor">&lt;/a>开机插座
&lt;/h2>&lt;p>开机插座和普通的智能插座没有多大不同，就是可以远程控制电源的开关。电脑的主板上都有一个通电后自启动的功能，这也是我们电脑为什么有时停电来电后能自动开机的原因。插座必须要连无线网，一般只支持2.4GWiFi，这样你才能远程控制插座的开关。开机插座可以和向日葵软件配合，实现电脑系统关机后过一会再断电，比起用一般的智能插座强制断电要好。但我寻思你远程桌面点击关机后再过两分钟关闭智能插座，效果不也一样嘛。&lt;/p>
&lt;h2 id="开机卡">&lt;a href="#%e5%bc%80%e6%9c%ba%e5%8d%a1" class="header-anchor">&lt;/a>开机卡
&lt;/h2>&lt;p>一块插在电脑主板PCI-E口上的板子，PCI-E的接口只有供电的作用。因为主板有系统关机但PCI-E不断电的功能，所以就保证了这块卡在关机状态下也能工作。开机卡也需要联网，板子上有接口和电脑的开机和重启的跳线相接，其实就是模拟你按下开机键进行开关机。通过开机卡的软件客户端可以实现定时开关机和语音唤醒等功能，具体就看厂商支持那些功能了。&lt;/p>
&lt;hr>
&lt;p>我买回来后才发现我这校园网虽然有2.4G信号，但需要网页验证，所以无法识别成功，没办法我就淘了个路由器利用路由器的WiFi才行。然后我就又发现淘的路由器太辣鸡不支持ipv6，无奈又整了个交换机，这一波投入有点亏，这是后话。&lt;/p></description></item><item><title>Rime-小狼毫输入法使用指南</title><link>https://kizx.github.io/post/rime-%E5%B0%8F%E7%8B%BC%E6%AF%AB%E8%BE%93%E5%85%A5%E6%B3%95%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Wed, 27 Nov 2019 17:29:00 +0000</pubDate><guid>https://kizx.github.io/post/rime-%E5%B0%8F%E7%8B%BC%E6%AF%AB%E8%BE%93%E5%85%A5%E6%B3%95%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;p>下载地址：https://rime.im/
官方说明：https://github.com/rime/home/wiki/UserGuide
输入方案：https://github.com/rime/plum
其他教程：
&lt;a class="link" href="https://www.jianshu.com/p/296bba666604" target="_blank" rel="noopener"
>https://www.jianshu.com/p/296bba666604&lt;/a>
&lt;a class="link" href="https://www.bilibili.com/video/av31013072" target="_blank" rel="noopener"
>https://www.bilibili.com/video/av31013072&lt;/a>
&lt;a class="link" href="https://segmentfault.com/a/1190000005754706" target="_blank" rel="noopener"
>https://segmentfault.com/a/1190000005754706&lt;/a>&lt;/p>
&lt;h2 id="使用入门">&lt;a href="#%e4%bd%bf%e7%94%a8%e5%85%a5%e9%97%a8" class="header-anchor">&lt;/a>使用入门
&lt;/h2>&lt;ul>
&lt;li>
&lt;p>简体设置
按&lt;code>F4&lt;/code>调出选项，选择&lt;code>西/半/漢&lt;/code>，再选择&lt;code>漢字-&amp;gt;汉字&lt;/code>，如果你只使用全拼的话，也可以直接使用带简化字的方案&lt;/p>
&lt;/li>
&lt;li>
&lt;p>选择候选方案和主题
右键输入法设定，为需要的方案打上钩，然后点击&lt;code>中&lt;/code>选择配色方案，最后再点击&lt;code>中&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>添加双拼方案
右键输入法设定，选择更多方案，弹出cmd窗口，输入相应的方案名称如&lt;code>double-pinyin&lt;/code>，也可自行下载解压到用户文件夹中。值得一提的是，安装&lt;code>prelude&lt;/code>可以下载一些用户配置，方便后面配置不用新建文件了。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>删除错误的候选词
输入法会记住你输入的词组，当你第一次输入一个输入法不认识的词语后，第二次输入同样的词语该词语就会出现在候选词中，也正是如此才叫聪明的输入法，不过有时候会打错词语，等到下次再打相同词语时就会出现错误的候选词，这时可以选中该错误的候选词，按&lt;code>shift+del&lt;/code>删除&lt;/p>
&lt;/li>
&lt;li>
&lt;p>改变候选词个数
在用户文件夹下新建&lt;code>default.custom.yaml&lt;/code>文件(如果没有的话)，添加以下内容，然后重新部署&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;menu/page_size&amp;#34;: &lt;/span>&lt;span style="color:#ae81ff">9&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="进阶定制">&lt;a href="#%e8%bf%9b%e9%98%b6%e5%ae%9a%e5%88%b6" class="header-anchor">&lt;/a>进阶定制
&lt;/h2>&lt;ul>
&lt;li>添加符号
新建&lt;code>double_pinyin_mspy.custom.yaml&lt;/code>文件（以你使用的输入方案名为准），添加以下内容&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># double_pinyin_mspy.custom.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;punctuator/import_preset&amp;#34;: &lt;/span>&lt;span style="color:#ae81ff">symbols&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;recognizer/patterns/punct&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;^/([A-Z|a-z]*|[0-9]|10)$&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重新部署后输入&lt;code>/fh&lt;/code>等字样就可以输入各种符号了，这些符号保存在程序文件夹的&lt;code>data/symbols.yaml&lt;/code>文件中。&lt;/p>
&lt;ul>
&lt;li>自定义符号
如果想添加自定义符号，可以将&lt;code>symbols.yaml&lt;/code>文件复制到用户文件夹下，然后在其中按照格式添加自己的符号，但更建议添加在自定义方案设置中，比如我自定义了常用邮箱&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#double_pinyin_mspy.custom.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">punctuator/symbols&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;/mail&amp;#34;: &lt;/span>[&lt;span style="color:#ae81ff">kizxmoe@gmail.com, 3317200497@qq.com, kizx@qq.com, contact@2bboy.com]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后重新部署，输入&lt;code>/mail&lt;/code>即可弹出常用邮箱&lt;/p>
&lt;ul>
&lt;li>修改符号候选
有时候在打出一个符号时会出现多个候选，这不符合大众习惯，这些设置也在symbols.yaml文件中，同样建议在自定义方案中修改,比如我把书名号改成唯一的样式&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;punctuator/import_preset&amp;#34;: &lt;/span>&lt;span style="color:#ae81ff">symbols&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;recognizer/patterns/punct&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;^/([A-Z|a-z]*|[0-9]|10)$&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">punctuator/full_shape&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;[&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;【&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;]&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;】&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">punctuator/half_shape&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;[&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;【&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;]&amp;#34;: &lt;/span>&lt;span style="color:#e6db74">&amp;#34;】&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>切换英文直接上屏&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># default.custom.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ascii_composer&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">good_old_caps_lock&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">switch_key&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Shift_L&lt;/span>: &lt;span style="color:#ae81ff">commit_code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Shift_R&lt;/span>: &lt;span style="color:#ae81ff">commit_code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Control_L&lt;/span>: &lt;span style="color:#ae81ff">noop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Control_R&lt;/span>: &lt;span style="color:#ae81ff">noop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Caps_Lock&lt;/span>: &lt;span style="color:#ae81ff">noop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">Eisu_toggle&lt;/span>: &lt;span style="color:#ae81ff">clear&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>定义某些应用默认中英文输入
比如我想让vscode默认是英文输入，可以在任务管理器中查看进程名称，然后注意要小写&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># weasel.custom.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">app_options/code.exe&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ascii_mode&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其实rime输入法能记住不同应用的中英文状态&lt;/p>
&lt;ul>
&lt;li>其他设置&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># weasel.custom.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">patch&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">style/horizontal&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#75715e"># 候选横排显示&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">style/display_tray_icon&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#75715e"># 显示托盘图标&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>[scode type=&amp;ldquo;yellow&amp;rdquo;]以上操作都记得重新部署生效[/scode]&lt;/p>
&lt;ul>
&lt;li>同步
点击菜单中的用户资料同步即会在sync目录下生成一个同步文件夹，记录了当前电脑上的用户配置文件和词库，只需把这个文件夹同步到另一台电脑上相同的位置下，词库便会自动合并，但用户配置文件不会自动合并，需手动进行替换。文件夹的名字和位置可以在&lt;code>installation.yaml&lt;/code>中自行指定。&lt;/li>
&lt;/ul></description></item><item><title>Git常用命令</title><link>https://kizx.github.io/post/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Sun, 24 Nov 2019 02:30:00 +0000</pubDate><guid>https://kizx.github.io/post/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;p>&lt;a class="link" href="https://gitee.com/help/categories/43" target="_blank" rel="noopener"
>https://gitee.com/help/categories/43&lt;/a>
&lt;a class="link" href="https://git-scm.com/book/zh/v2/" target="_blank" rel="noopener"
>https://git-scm.com/book/zh/v2/&lt;/a>
&lt;a class="link" href="https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5" target="_blank" rel="noopener"
>https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5&lt;/a>&lt;/p>
&lt;h2 id="初始化">&lt;a href="#%e5%88%9d%e5%a7%8b%e5%8c%96" class="header-anchor">&lt;/a>初始化
&lt;/h2>&lt;pre tabindex="0">&lt;code class="language-git" data-lang="git"># 设置用户信息
git config --global user.name kizx
git config --global user.email kizxmoe@gmail.com
# 查看设置
git config --list
# 生成密钥
ssh-keygen
# 查看公钥
cat ~/.ssh/id_rsa.pub
&lt;/code>&lt;/pre>&lt;h2 id="创建仓库">&lt;a href="#%e5%88%9b%e5%bb%ba%e4%bb%93%e5%ba%93" class="header-anchor">&lt;/a>创建仓库
&lt;/h2>&lt;pre tabindex="0">&lt;code class="language-git" data-lang="git"># 初始化
git init
# 添加所有文件
git add .
# 提交
git commit -m &amp;#34;first commit&amp;#34;
# 添加远程仓库
git remote add origin git@gitee.com:kizx/rime.git
# 推送
git push -u origin master
&lt;/code>&lt;/pre></description></item><item><title>我用的软件</title><link>https://kizx.github.io/post/%E6%88%91%E7%94%A8%E7%9A%84%E8%BD%AF%E4%BB%B6/</link><pubDate>Fri, 22 Nov 2019 11:52:00 +0000</pubDate><guid>https://kizx.github.io/post/%E6%88%91%E7%94%A8%E7%9A%84%E8%BD%AF%E4%BB%B6/</guid><description>&lt;ul>
&lt;li>百分浏览器 &lt;a class="link" href="https://www.centbrowser.cn/" target="_blank" rel="noopener"
>https://www.centbrowser.cn/&lt;/a>&lt;/li>
&lt;li>压缩 &lt;a class="link" href="http://www.bandisoft.com/bandizip/" target="_blank" rel="noopener"
>http://www.bandisoft.com/bandizip/&lt;/a>&lt;/li>
&lt;li>输入法&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;a class="link" href="https://rime.im/" target="_blank" rel="noopener"
>https://rime.im/&lt;/a>
&lt;a class="link" href="https://shurufa.baidu.com/" target="_blank" rel="noopener"
>https://shurufa.baidu.com/&lt;/a>&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>浏览器插件推荐 &lt;a class="link" href="https://chrome.zzzmh.cn" target="_blank" rel="noopener"
>https://chrome.zzzmh.cn&lt;/a>&lt;/li>
&lt;li>鼠标驱动 &lt;a class="link" href="https://zh.roccat.org/Support" target="_blank" rel="noopener"
>https://zh.roccat.org/Support&lt;/a>&lt;/li>
&lt;li>文本编辑器
&lt;ul>
&lt;li>&lt;a class="link" href="https://github.com/stefankueng/BowPad" target="_blank" rel="noopener"
>https://github.com/stefankueng/BowPad&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.editpadpro.com/screen.html/" target="_blank" rel="noopener"
>http://www.editpadpro.com/screen.html/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.pnotepad.org/" target="_blank" rel="noopener"
>http://www.pnotepad.org/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.rizonesoft.com/downloads/notepad3/" target="_blank" rel="noopener"
>https://www.rizonesoft.com/downloads/notepad3/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>office下载管理 &lt;a class="link" href="https://otp.landian.vip/zh-cn/" target="_blank" rel="noopener"
>https://otp.landian.vip/zh-cn/&lt;/a>&lt;/li>
&lt;li>卸载&amp;ndash;geek &lt;a class="link" href="https://geekuninstaller.com/" target="_blank" rel="noopener"
>https://geekuninstaller.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="程序类">&lt;a href="#%e7%a8%8b%e5%ba%8f%e7%b1%bb" class="header-anchor">&lt;/a>程序类
&lt;/h2>&lt;ul>
&lt;li>vs &lt;a class="link" href="https://visualstudio.microsoft.com/zh-hans/" target="_blank" rel="noopener"
>https://visualstudio.microsoft.com/zh-hans/&lt;/a>&lt;/li>
&lt;li>网速显示 &lt;a class="link" href="https://github.com/zhongyang219/TrafficMonitorSkinEditor" target="_blank" rel="noopener"
>https://github.com/zhongyang219/TrafficMonitorSkinEditor&lt;/a>&lt;/li>
&lt;li>cmder &lt;a class="link" href="https://cmder.net/" target="_blank" rel="noopener"
>https://cmder.net/&lt;/a>&lt;/li>
&lt;li>sqlite数据库管理 &lt;a class="link" href="https://sqlitebrowser.org/dl/" target="_blank" rel="noopener"
>https://sqlitebrowser.org/dl/&lt;/a>&lt;/li>
&lt;li>git管理 &lt;a class="link" href="https://git-fork.com/" target="_blank" rel="noopener"
>https://git-fork.com/&lt;/a>&lt;/li>
&lt;li>SSH&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;a class="link" href="https://www.vandyke.com/products/securecrt/" target="_blank" rel="noopener"
>https://www.vandyke.com/products/securecrt/&lt;/a>
&lt;a class="link" href="http://www.hostbuf.com/t/988.html" target="_blank" rel="noopener"
>http://www.hostbuf.com/t/988.html&lt;/a>
&lt;a class="link" href="https://www.netsarang.com/zh/free-for-home-school/" target="_blank" rel="noopener"
>https://www.netsarang.com/zh/free-for-home-school/&lt;/a>&lt;/p>&lt;/blockquote>
&lt;h2 id="办公类">&lt;a href="#%e5%8a%9e%e5%85%ac%e7%b1%bb" class="header-anchor">&lt;/a>办公类
&lt;/h2>&lt;ul>
&lt;li>万彩办公大师 &lt;a class="link" href="http://www.wofficebox.com/" target="_blank" rel="noopener"
>http://www.wofficebox.com/&lt;/a>&lt;/li>
&lt;li>PDF&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;a class="link" href="https://www.sumatrapdfreader.org/downloadafter.html" target="_blank" rel="noopener"
>https://www.sumatrapdfreader.org/downloadafter.html&lt;/a>
&lt;a class="link" href="https://www.sumatrapdfreader.org/free-pdf-reader.html" target="_blank" rel="noopener"
>https://www.sumatrapdfreader.org/free-pdf-reader.html&lt;/a>
&lt;a class="link" href="https://tools.pdf24.org/zh/" target="_blank" rel="noopener"
>https://tools.pdf24.org/zh/&lt;/a>&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>markdown &lt;a class="link" href="https://www.typora.io/#windows" target="_blank" rel="noopener"
>https://www.typora.io/#windows&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="多媒体类">&lt;a href="#%e5%a4%9a%e5%aa%92%e4%bd%93%e7%b1%bb" class="header-anchor">&lt;/a>多媒体类
&lt;/h2>&lt;ul>
&lt;li>看图
&lt;ul>
&lt;li>&lt;a class="link" href="http://www.bandisoft.com/honeyview/" target="_blank" rel="noopener"
>http://www.bandisoft.com/honeyview/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://sourceforge.net/projects/jpegview/" target="_blank" rel="noopener"
>https://sourceforge.net/projects/jpegview/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.vieas.com/en/software/vieas.html" target="_blank" rel="noopener"
>http://www.vieas.com/en/software/vieas.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>图片压缩 + &lt;a class="link" href="https://tuya.xinxiao.tech/" target="_blank" rel="noopener"
>https://tuya.xinxiao.tech/&lt;/a>&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>视频播放器
&lt;ul>
&lt;li>&lt;a class="link" href="https://potplayer.daum.net/?lang=zh_CN" target="_blank" rel="noopener"
>https://potplayer.daum.net/?lang=zh_CN&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.dandanplay.com/" target="_blank" rel="noopener"
>http://www.dandanplay.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>录屏-OBS &lt;a class="link" href="https://obsproject.com/" target="_blank" rel="noopener"
>https://obsproject.com/&lt;/a>&lt;/li>
&lt;li>音乐播放器-AIMP &lt;a class="link" href="https://www.aimp.ru/" target="_blank" rel="noopener"
>https://www.aimp.ru/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="应用类">&lt;a href="#%e5%ba%94%e7%94%a8%e7%b1%bb" class="header-anchor">&lt;/a>应用类
&lt;/h2>&lt;ul>
&lt;li>鼠标手势
&lt;blockquote>
&lt;p>&lt;a class="link" href="https://shuax.com/project/mouseinc/" target="_blank" rel="noopener"
>https://shuax.com/project/mouseinc/&lt;/a>
&lt;a class="link" href="http://www.yingdev.com/projects/wgestures" target="_blank" rel="noopener"
>http://www.yingdev.com/projects/wgestures&lt;/a>&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>文件管理器TAB &lt;a class="link" href="http://qttabbar.wikidot.com/" target="_blank" rel="noopener"
>http://qttabbar.wikidot.com/&lt;/a>&lt;/li>
&lt;li>gif录制 &lt;a class="link" href="https://www.screentogif.com/?l=zh_cn" target="_blank" rel="noopener"
>https://www.screentogif.com/?l=zh_cn&lt;/a>&lt;/li>
&lt;li>快速复制 &lt;a class="link" href="https://fastcopy.jp/" target="_blank" rel="noopener"
>https://fastcopy.jp/&lt;/a>&lt;/li>
&lt;li>符号链接 &lt;a class="link" href="https://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html" target="_blank" rel="noopener"
>https://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html&lt;/a>&lt;/li>
&lt;li>文件窗口标签 &lt;a class="link" href="https://shutters.160.com/" target="_blank" rel="noopener"
>https://shutters.160.com/&lt;/a>&lt;/li>
&lt;li>哈希校检工具 &lt;a class="link" href="https://www.binaryfortress.com/HashTools/" target="_blank" rel="noopener"
>https://www.binaryfortress.com/HashTools/&lt;/a>&lt;/li>
&lt;li>文献翻译 &lt;a class="link" href="http://i.zhiyunwenxian.cn/195.html" target="_blank" rel="noopener"
>http://i.zhiyunwenxian.cn/195.html&lt;/a>&lt;/li>
&lt;li>复制翻译 &lt;a class="link" href="https://copytranslator.github.io/download/" target="_blank" rel="noopener"
>https://copytranslator.github.io/download/&lt;/a>&lt;/li>
&lt;li>下载
&lt;ul>
&lt;li>&lt;a class="link" href="https://v3-beta.6pan.cn/" target="_blank" rel="noopener"
>https://v3-beta.6pan.cn/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.kancloud.cn/myzfb/thunderbird/1684667" target="_blank" rel="noopener"
>https://www.kancloud.cn/myzfb/thunderbird/1684667&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.internetdownloadmanager.com/" target="_blank" rel="noopener"
>http://www.internetdownloadmanager.com/&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://www.internetdownloadmanager.com/download.html" target="_blank" rel="noopener"
>http://www.internetdownloadmanager.com/download.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="软件分享网站">&lt;a href="#%e8%bd%af%e4%bb%b6%e5%88%86%e4%ba%ab%e7%bd%91%e7%ab%99" class="header-anchor">&lt;/a>软件分享网站
&lt;/h2>&lt;ul>
&lt;li>这个网站有超多实用小程序
&lt;a class="link" href="http://www.nirsoft.net/utils/index.html" target="_blank" rel="noopener"
>http://www.nirsoft.net/utils/index.html&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>利用QQ机器人发送时光机</title><link>https://kizx.github.io/post/%E5%88%A9%E7%94%A8qq%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8F%91%E9%80%81%E6%97%B6%E5%85%89%E6%9C%BA/</link><pubDate>Fri, 15 Nov 2019 12:38:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%88%A9%E7%94%A8qq%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8F%91%E9%80%81%E6%97%B6%E5%85%89%E6%9C%BA/</guid><description>&lt;p>现在handsome主题已经有了微信公众号和浏览器拓展两种方式向时光机发送消息，那么自然就想到QQ端是否也可以做到，所以我就通过对浏览器扩展发送时光机进行抓包，然后基于酷Q和nonebot，实现了通过向QQ小号发送消息的方式向时光机发送消息。
[scode type=&amp;ldquo;share&amp;rdquo;]代码见&lt;a class="link" href="https://github.com/kizx/coolq-cross-bot" target="_blank" rel="noopener"
>github&lt;/a>[/scode]&lt;/p>
&lt;h2 id="使用方法">&lt;a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>使用方法
&lt;/h2>&lt;p>和微信公众号的用法大同小异，所有消息需要私聊机器人&lt;/p>
&lt;blockquote>
&lt;p>发送&lt;code>帮助 时光机&lt;/code>查看帮助信息
发送&lt;code>绑定&lt;/code>然后根据提示输入绑定信息，发送&lt;code>解绑&lt;/code>取消绑定
发送&lt;code>时光鸡&lt;/code>然后根据提示输入你要发送的消息（也可以一次性输入&lt;code>时光鸡 你要发送的消息&lt;/code>中间加空格即可）
发送&lt;code>开始&lt;/code>然后可以逐条发送消息，发送&lt;code>结束&lt;/code>结束混合消息，发送&lt;code>取消&lt;/code>取消发送
发送的第一条消息如果以&lt;code>#&lt;/code>开头即为私密消息
发送&lt;code>博客&lt;/code>获取博客地址
发送&lt;code>图床&lt;/code>更改图床&lt;/p>&lt;/blockquote>
&lt;p>如有需要，可以直接加群体验我已经搭建好的QQ机器人
[button color=&amp;ldquo;success&amp;rdquo; icon=&amp;ldquo;fa fa-qq&amp;rdquo; url=&amp;quot;//shang.qq.com/wpa/qunwpa?idkey=786f97195ca56ef0a1888eef7e803fabee0b70cb01d6dbf0c2295454797d803b&amp;quot;]QQ群 642739195[/button]&lt;/p>
&lt;h2 id="已知问题">&lt;a href="#%e5%b7%b2%e7%9f%a5%e9%97%ae%e9%a2%98" class="header-anchor">&lt;/a>已知问题
&lt;/h2>&lt;ol>
&lt;li>由于QQ可以在一条消息里同时塞进文字和图片，所以发送单条消息也可以达到混合消息的效果，但经我测试在QQ手机客户端如果一条消息同时包含文字和图片，那么图片会无法解析，但是电脑的TIM客户端不存在这个问题。这个问题出在酷Q上，所以要同时发送文字和图片，在手机客户端最好采用逐条发送的模式。&lt;/li>
&lt;li>由于handsome_6.0对上传的图片进行了压缩，所以上传gif图片会被压缩成jpg图片，因此图片增加图床功能并默认采用QQ图片的源地址，省去了下载和上传操作，速度更快，但QQ源图片腾讯可能采取限制而无法引用，而且目前已知腾讯对这些图片的缓存会过一段时间就清掉，所以QQ源图床慎用。最好的当然是接入自己的图床，暂时先懒得弄。&lt;/li>
&lt;/ol>
&lt;h2 id="安装方法windows">&lt;a href="#%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95windows" class="header-anchor">&lt;/a>安装方法（Windows）
&lt;/h2>&lt;p>你可以先在自己的电脑上安装和熟悉使用&lt;/p>
&lt;h3 id="1-准备">&lt;a href="#1-%e5%87%86%e5%a4%87" class="header-anchor">&lt;/a>1. 准备
&lt;/h3>&lt;p>所有需要下载的东西已打包-&amp;gt;&lt;a class="link" href="https://pan.2bboy.com/Public/Software/QQ%E6%9C%BA%E5%99%A8%E4%BA%BA/" target="_blank" rel="noopener"
>点击下载&lt;/a>
因为是基于酷Q和Python运行的，所以需要先安装酷Q Air-&amp;gt;&lt;a class="link" href="https://cqp.cc/t/23253" target="_blank" rel="noopener"
>下载地址&lt;/a>，然后打开酷Q，登陆你的作为QQ机器人的QQ小号，熟悉酷Q的使用，尤其是插件的安装和启用，酷Q论坛里也有许多其他插件可供玩耍。
然后下载安装python，建议下载安装&lt;a class="link" href="https://www.python.org/ftp/python/3.7.4/python-3.7.4.exe" target="_blank" rel="noopener"
>Python 3.7.x 32位版本&lt;/a>，因为我是基于这个版本开发的，别的版本尤其是最新的3.8版本可能会有未知的不兼容的bug。安装的时候记得勾选环境变量。
&lt;img src="https://pan.2bboy.com/img/2019/12/3530015735.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="2-安装插件">&lt;a href="#2-%e5%ae%89%e8%a3%85%e6%8f%92%e4%bb%b6" class="header-anchor">&lt;/a>2. 安装插件
&lt;/h3>&lt;p>这里可以参考&lt;a class="link" href="https://cqhttp.cc/docs/4.12/#/" target="_blank" rel="noopener"
>CoolQ HTTP API官方说明&lt;/a>
将io.github.richardchien.coolqhttpapi.cpk移动至酷Q的app文件下，然后重启酷Q或者在应用管理里重载应用，在应用管理里选中HTTP API插件，点击启用，接下来几个弹窗统统选是。启用成功后会弹出控制台窗口。
[scode type=&amp;ldquo;yellow&amp;rdquo;]如果弹窗提示应用加载失败，先安装[ Visual C++ 可再发行软件包]( Visual C++ 可再发行软件包)[/scode]
&lt;img src="https://pan.2bboy.com/img/2019/12/1695724369.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="3启用nonebot">&lt;a href="#3%e5%90%af%e7%94%a8nonebot" class="header-anchor">&lt;/a>3.启用nonebot
&lt;/h3>&lt;p>这里可以参考&lt;a class="link" href="https://nonebot.cqp.moe/guide/getting-started.html" target="_blank" rel="noopener"
>Nonebot官方说明&lt;/a>
如果你之前成功开启了插件，那么酷Q的data/app/io.github.richardchien.coolqhttpapi/config/目录中应该已经有了一个名为 &lt;!-- raw HTML omitted -->.json 的文件（&lt;!-- raw HTML omitted --> 为你登录的 QQ 账号），修改其中的内容如下：
[collapse status=&amp;ldquo;false&amp;rdquo; title=&amp;ldquo;json文件内容&amp;rdquo;]&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;host&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;[::]&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;port&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">5700&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;use_http&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_host&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;[::]&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_port&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">6700&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;use_ws&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_reverse_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_reverse_api_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ws://127.0.0.1:8080/ws/api/&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_reverse_event_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ws://127.0.0.1:8080/ws/event/&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_reverse_reconnect_interval&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">3000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ws_reverse_reconnect_on_code_1000&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;use_ws_reverse&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;post_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;access_token&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;secret&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;post_message_format&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;string&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;serve_data_files&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;update_source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;github&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;update_channel&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;stable&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;auto_check_update&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;auto_perform_update&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;show_log_console&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;log_level&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;info&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>[/collapse]&lt;/p>
&lt;p>然后下载找到我写的&lt;code>coolq-cross-bot&lt;/code>文件，用python运行该文件夹下的&lt;code>bot.py&lt;/code>文件，运行前要先安装依赖库。&lt;/p>
&lt;p>[tabs]
[tab name=&amp;ldquo;运行方式&amp;rdquo; active=&amp;ldquo;true&amp;rdquo;]
打开命令提示符窗口，执行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>pip install nonebot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install aiohttp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后在控制台进入&lt;code>coolq-cross-bot&lt;/code>文件夹内，输入&lt;code>python bot.py&lt;/code>运行该文件，当然也可以用IDE运行。
[/tab]
[/tabs]
[scode type=&amp;ldquo;yellow&amp;rdquo;]阿里云服务器如果一直卡在下载图片且ping不通c2cpicdw.qpic.cn可能是因为节点问题，需添加host记录&lt;code>113.96.232.144 c2cpicdw.qpic.cn &lt;/code>[/scode]
最后重启酷Q软件或者重载插件，弹出来的控制台如下显示成功字样则代表配置成功，这时你就可以私聊机器人发送&lt;code>初始化&lt;/code>创建一个数据库后就可以使用了（初始化命令只需执行一次，用于在文件目录下新建bind_info.sqlite文件用于记录绑定信息）,最后要注意两个控制台窗口都不能关闭，你可以选择新建一个桌面单独用于运行他们。
&lt;img src="https://pan.2bboy.com/img/2019/12/2111826091.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="安装方法linux">&lt;a href="#%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95linux" class="header-anchor">&lt;/a>安装方法（Linux）
&lt;/h2>&lt;p>详细参考：&lt;a class="link" href="https://cqhttp.cc/docs/4.13/#/Docker" target="_blank" rel="noopener"
>CoolQ HTTP API官方说明&lt;/a>
Linux系统需要在docker中运行酷Q，所以要先安装docker，安装教程请自行百度，以下仅供参考，以我的Ubuntu16.04 64位为例，ssh连上服务器后运行以下命令安装docker&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ curl -fsSL https://get.docker.com -o get-docker.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ sudo sh get-docker.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后安装酷Q和HTTP API插件（配置参数无所谓，后面手动替换）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ docker pull richardchien/cqhttp:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ mkdir coolq &lt;span style="color:#75715e"># 用于存储 酷Q 的程序文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ docker run -ti --rm --name cqhttp-test &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -v &lt;span style="color:#66d9ef">$(&lt;/span>pwd&lt;span style="color:#66d9ef">)&lt;/span>/coolq:/home/user/coolq &lt;span style="color:#ae81ff">\ &lt;/span> &lt;span style="color:#75715e"># 将宿主目录挂载到容器内用于持久化 酷Q 的程序文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -p 9000:9000 &lt;span style="color:#ae81ff">\ &lt;/span> &lt;span style="color:#75715e"># noVNC 端口，用于从浏览器控制 酷Q&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -p 5700:5700 &lt;span style="color:#ae81ff">\ &lt;/span> &lt;span style="color:#75715e"># HTTP API 插件开放的端口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -e COOLQ_ACCOUNT&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">123456&lt;/span> &lt;span style="color:#ae81ff">\ &lt;/span>&lt;span style="color:#75715e"># 要登录的 QQ 账号，可选但建议填&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -e CQHTTP_POST_URL&lt;span style="color:#f92672">=&lt;/span>http://example.com:8080 &lt;span style="color:#ae81ff">\ &lt;/span> &lt;span style="color:#75715e"># 事件上报地址&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -e CQHTTP_SERVE_DATA_FILES&lt;span style="color:#f92672">=&lt;/span>yes &lt;span style="color:#ae81ff">\ &lt;/span> &lt;span style="color:#75715e"># 允许通过 HTTP 接口访问 酷Q 数据文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> richardchien/cqhttp:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后访问 http://[你的服务器IP]:9000/ 进入 noVNC（默认密码 MAX8char），登录酷Q，即可开始使用（插件已自动启用，配置文件也根据启动命令的环境变量自动生成了）
[scode type=&amp;ldquo;yellow&amp;rdquo;]如果阿里云主机注意要先开放相应的端口，默认是9000端口[/scode]
把coolq-cross-bot文件夹上传至服务器，将之前的json文件也上传至服务器并替换掉app/io.github.richardchien.coolqhttpapi/下的ini配置文件（注意将配置文件中&lt;em>127.0.0.1&lt;/em>换成&lt;em>172.17.0.1&lt;/em>），然后用python3命令运行文件下的bot.py，重启插件&lt;/p>
&lt;h2 id="进阶自定义修改可选">&lt;a href="#%e8%bf%9b%e9%98%b6%e8%87%aa%e5%ae%9a%e4%b9%89%e4%bf%ae%e6%94%b9%e5%8f%af%e9%80%89" class="header-anchor">&lt;/a>进阶自定义修改（可选）
&lt;/h2>&lt;h3 id="1-自定义命令">&lt;a href="#1-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%91%bd%e4%bb%a4" class="header-anchor">&lt;/a>1. 自定义命令
&lt;/h3>&lt;p>其实时光机的触发命令不仅可以是‘时光机’，也可以是‘时光鸡’、‘时光姬’等，具体可以在 coolq-cross-bot/plugins/handsome/timeji.py 源码中找到类似下面的语句自行进行修改。
&lt;code>@on_command('timeji', aliases=('时光鸡', '时光机', '时光姬', '动态', '说说'))&lt;/code>
其他命令类似。&lt;/p>
&lt;h3 id="2-添加消息来源">&lt;a href="#2-%e6%b7%bb%e5%8a%a0%e6%b6%88%e6%81%af%e6%9d%a5%e6%ba%90" class="header-anchor">&lt;/a>2. 添加消息来源
&lt;/h3>&lt;p>&lt;img src="https://pan.2bboy.com/img/2019/12/291730057.png"
loading="lazy"
>&lt;/p>
&lt;p>如上图所示，在时光机消息的来源处，如果不对handsome的源码进行修改，就会显示来自未知浏览器，找到handsome/libs/UA.php文件，在文件的最后加入如下所示的QQ的来源，名称可以自定义。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">returnTimeUa&lt;/span>(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> ($this&lt;span style="color:#f92672">-&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">ua&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;weixin&amp;#34;&lt;/span> &lt;span style="color:#f92672">||&lt;/span> $this&lt;span style="color:#f92672">-&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">ua&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;weChat&amp;#34;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">array&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">_mt&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;微信公众号&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;icon&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#e6db74">&amp;#34;compass&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#66d9ef">elseif&lt;/span> ($this&lt;span style="color:#f92672">-&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">ua&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;crx&amp;#34;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">array&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">_mt&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Chrome扩展&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;icon&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#e6db74">&amp;#34;chrome&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#66d9ef">elseif&lt;/span> ($this&lt;span style="color:#f92672">-&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">ua&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;qq&amp;#34;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">array&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">_mt&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;QQ时光姬&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;icon&amp;#34;&lt;/span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span>&lt;span style="color:#e6db74">&amp;#34;compass&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#66d9ef">else&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> $ua &lt;span style="color:#f92672">=&lt;/span> $this&lt;span style="color:#f92672">-&amp;gt;&lt;/span>&lt;span style="color:#a6e22e">returnOS&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> $ua[&lt;span style="color:#e6db74">&amp;#34;icon&amp;#34;&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;disc&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> $ua;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3添加消息来源前的图标60主题不需要了">&lt;a href="#3%e6%b7%bb%e5%8a%a0%e6%b6%88%e6%81%af%e6%9d%a5%e6%ba%90%e5%89%8d%e7%9a%84%e5%9b%be%e6%a0%8760%e4%b8%bb%e9%a2%98%e4%b8%8d%e9%9c%80%e8%a6%81%e4%ba%86" class="header-anchor">&lt;/a>&lt;del>3.添加消息来源前的图标（6.0主题不需要了）&lt;/del>
&lt;/h3>&lt;p>主题默认呈现出来的都是清一色的小圆点图标，要更改消息来源前的小图标，首先要&lt;a class="link" href="https://handsome.ihewro.com/#/functions?id=%e6%b7%bb%e5%8a%a0%e8%87%aa%e5%ae%9a%e4%b9%89%e5%9b%be%e6%a0%87" target="_blank" rel="noopener"
>添加fontawesome图标&lt;/a>，然后找到handsome/component/say.php，找到下面第一条语句，改成第二句。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 找到下面这一句
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;glyphicon glyphicon-record m-l-sm&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&amp;lt;/&lt;/span>&lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">&amp;gt;&amp;amp;&lt;/span>&lt;span style="color:#a6e22e">nbsp&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 改成下面这样
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;lt;?php echo &lt;/span>&lt;span style="color:#e6db74">$ua-&amp;gt;returnTimeUa&lt;/span>&lt;span style="color:#e6db74">()[&amp;#39;icon&amp;#39;] ?&amp;gt; m-l-sm&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&amp;lt;/&lt;/span>&lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">&amp;gt;&amp;amp;&lt;/span>&lt;span style="color:#a6e22e">nbsp&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Python爬虫学习</title><link>https://kizx.github.io/post/python%E7%88%AC%E8%99%AB%E5%AD%A6%E4%B9%A0/</link><pubDate>Wed, 06 Nov 2019 09:21:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E7%88%AC%E8%99%AB%E5%AD%A6%E4%B9%A0/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> requests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> bs4 &lt;span style="color:#f92672">import&lt;/span> BeautifulSoup
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> lxml &lt;span style="color:#f92672">import&lt;/span> etree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>url &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;http://www.doutula.com/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>headers &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;User-Agent&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>response &lt;span style="color:#f92672">=&lt;/span> requests&lt;span style="color:#f92672">.&lt;/span>get(url, headers&lt;span style="color:#f92672">=&lt;/span>headers)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>soup &lt;span style="color:#f92672">=&lt;/span> BeautifulSoup(response&lt;span style="color:#f92672">.&lt;/span>text, &lt;span style="color:#e6db74">&amp;#39;lxml&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 保存网页html内容&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;content.html&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;w&amp;#39;&lt;/span>, encoding&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;utf-8&amp;#34;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> html &lt;span style="color:#f92672">=&lt;/span> soup&lt;span style="color:#f92672">.&lt;/span>prettify()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(html)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过find_all()选择&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>html &lt;span style="color:#f92672">=&lt;/span> soup&lt;span style="color:#f92672">.&lt;/span>find_all(&lt;span style="color:#e6db74">&amp;#39;img&amp;#39;&lt;/span>, class_&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;img-responsive lazy image_dta&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>links &lt;span style="color:#f92672">=&lt;/span> [i[&lt;span style="color:#e6db74">&amp;#39;data-original&amp;#39;&lt;/span>] &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> html]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过css选择&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>html &lt;span style="color:#f92672">=&lt;/span> soup&lt;span style="color:#f92672">.&lt;/span>select(&lt;span style="color:#e6db74">&amp;#34;img[data-original]&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>links &lt;span style="color:#f92672">=&lt;/span> [i[&lt;span style="color:#e6db74">&amp;#39;data-original&amp;#39;&lt;/span>] &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> html]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过xpath选择&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>root &lt;span style="color:#f92672">=&lt;/span> etree&lt;span style="color:#f92672">.&lt;/span>HTML(response&lt;span style="color:#f92672">.&lt;/span>text)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>links &lt;span style="color:#f92672">=&lt;/span> root&lt;span style="color:#f92672">.&lt;/span>xpath(&lt;span style="color:#e6db74">&amp;#39;//img/@data-original&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 保存图片&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> index, link &lt;span style="color:#f92672">in&lt;/span> enumerate(links):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> img &lt;span style="color:#f92672">=&lt;/span> requests&lt;span style="color:#f92672">.&lt;/span>get(link)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;img/&amp;#39;&lt;/span>&lt;span style="color:#f92672">+&lt;/span>str(index)&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#e6db74">&amp;#39;.jpg&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;wb+&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(img&lt;span style="color:#f92672">.&lt;/span>content)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Pycharm之自定义工具</title><link>https://kizx.github.io/post/pycharm%E4%B9%8B%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B7%A5%E5%85%B7/</link><pubDate>Sat, 02 Nov 2019 06:05:00 +0000</pubDate><guid>https://kizx.github.io/post/pycharm%E4%B9%8B%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B7%A5%E5%85%B7/</guid><description>&lt;p>可以在Tool里添加工具来代替某些命令行操作，新建一个工程后，建议使用系统环境解释器，这样安装包时可以直接安装到环境中，这样在别的工程里也能用上，使用虚拟环境的话，虚拟环境变动了就找不到工具了，当然本质上只要在选择程序时选择环境里的程序就行了。添加的地方在setting-&amp;gt;Tools-&amp;gt;External Tools。&lt;/p>
&lt;h2 id="示例">&lt;a href="#%e7%a4%ba%e4%be%8b" class="header-anchor">&lt;/a>示例
&lt;/h2>&lt;h3 id="1-qt-designer">&lt;a href="#1-qt-designer" class="header-anchor">&lt;/a>1. Qt Designer
&lt;/h3>&lt;p>首先确保库中安装了pyqt5，然后如下图配置&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-pycharm" data-lang="pycharm">program: C:\Users\ZXIN\Anaconda3\Library\bin\designer.exe
working directory: $ProjectFileDir$
&lt;/code>&lt;/pre>&lt;p>也可以安装pyqt5-tools，然后在Scripts中找到程序
&lt;img src="https://pan.2bboy.com/img/2019/11/3659543400.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="2-pyuic">&lt;a href="#2-pyuic" class="header-anchor">&lt;/a>2. PyUIC
&lt;/h3>&lt;pre tabindex="0">&lt;code class="language-pycharm" data-lang="pycharm">program: C:\Users\ZXIN\Anaconda3\Scripts\pyuic5.exe
Arguments: $FileName$ -o $FileNameWithoutExtension$.py
working directory: $FileDir$
&lt;/code>&lt;/pre>&lt;p>&lt;img src="https://pan.2bboy.com/img/2019/11/490591843.png"
loading="lazy"
>&lt;/p>
&lt;h3 id="3-autopep8">&lt;a href="#3-autopep8" class="header-anchor">&lt;/a>3. autopep8
&lt;/h3>&lt;pre tabindex="0">&lt;code class="language-pycharm" data-lang="pycharm">program: C:\Users\ZXIN\AppData\Roaming\Python\Python37\Scripts\autopep8.exe
Arguments: --in-place --aggressive --aggressive $FilePath$
working directory: $ProjectFileDir$
&lt;/code>&lt;/pre>&lt;h3 id="4-black">&lt;a href="#4-black" class="header-anchor">&lt;/a>4. Black
&lt;/h3>&lt;p>需要先安装black&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-pycharm" data-lang="pycharm">program: C:\Users\ZXIN\AppData\Roaming\Python\Python37\Scripts\black.exe
Arguments: $FilePath$
working directory: $FileDir$
&lt;/code>&lt;/pre></description></item><item><title>Nonebot酷Q应用开发</title><link>https://kizx.github.io/post/nonebot%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</link><pubDate>Wed, 30 Oct 2019 13:49:00 +0000</pubDate><guid>https://kizx.github.io/post/nonebot%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</guid><description>&lt;p>前面已经研究过&lt;a class="link" href="https://www.2bboy.com/archives/3.html" target="_blank" rel="noopener"
>Python&lt;/a>和&lt;a class="link" href="https://www.2bboy.com/archives/116.html" target="_blank" rel="noopener"
>C++&lt;/a>的酷Q应用开发流程了，其中慕晓飞大大的SDK虽然前期配置需要一定经验，但配置好后上手很快很简单的，但这个SDK不支持并发是最大的硬伤，限制了其使用范围。而C++的SDK无疑写起来过于麻烦，好在该SDK的大神richardchien在C++ SDK的基础上开发出了基于&lt;a class="link" href="https://github.com/richardchien/coolq-http-api" target="_blank" rel="noopener"
>HTTP的API接口&lt;/a>，由此衍生出了基于该HTTP API的多种语言开发版本，其中就有同样是该作者基于Quart框架开发的&lt;a class="link" href="https://github.com/richardchien/nonebot" target="_blank" rel="noopener"
>Nonebot&lt;/a>,支持异步处理是其最大的特点，但也由于对消息封装的过于深入，使得在入手使用Nonebot带来不小的挑战。&lt;/p>
&lt;h2 id="入门">&lt;a href="#%e5%85%a5%e9%97%a8" class="header-anchor">&lt;/a>入门
&lt;/h2>&lt;p>要使用Nonebot得先从HTTP API开始，先根据这篇说明：https://cqhttp.cc/docs/4.12/#/ 完成对HTTP API的成功调用，然后再到我们的Nonebot出场，官方的入门文档写的已经很仔细了：https://nonebot.cqp.moe/guide/installation.html， 走完这篇入门文档，应该很容易就实现了案例中的天气和图灵机器人案例。
接下来来梳理以下Nonebot的编写逻辑，他将消息处理分为on_command，on_natural_language，on_request（其他的暂不清楚）几个类型，command用于处理命令，也是用的最多的类型，这里就不用我们手动检测消息里的命令关键字了，然后未被匹配的消息会送到natural_language中处理，如果没有natural_language消息就会被忽略。request用于处理加群请求等非消息类的任务。
还有许多细节问题就需要慢慢研究了，比如想在群聊中也是用命令，可以加&lt;code>only_to_me=False&lt;/code>参数。
要主动调用&lt;a class="link" href="https://cqhttp.cc/docs/4.12/#/API?id=api-%e5%88%97%e8%a1%a8" target="_blank" rel="noopener"
>HTTP API&lt;/a>可以使用如下方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>bot &lt;span style="color:#f92672">=&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>bot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># bot = nonebot.get_bot()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">await&lt;/span> bot&lt;span style="color:#f92672">.&lt;/span>send_private_msg(user_id&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">12345678&lt;/span>, message&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;你好～&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>要获得&lt;a class="link" href="https://cqhttp.cc/docs/4.12/#/Post?id=%e4%ba%8b%e4%bb%b6%e5%88%97%e8%a1%a8" target="_blank" rel="noopener"
>上报事件&lt;/a>中的参数，需要访问session.ctx。
然后下面这个例子是发送测试获得该消息的上报内容，发送其他消息则会复读。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> nonebot &lt;span style="color:#f92672">import&lt;/span> on_command, CommandSession
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> nonebot &lt;span style="color:#f92672">import&lt;/span> on_natural_language, NLPSession, IntentCommand
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__plugin_name__ &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;测试&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__plugin_usage__ &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;测试 命令&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@on_command&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;test&amp;#39;&lt;/span>, aliases&lt;span style="color:#f92672">=&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;测试&amp;#39;&lt;/span>,), only_to_me&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">False&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">test&lt;/span>(session: CommandSession):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ctx &lt;span style="color:#f92672">=&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>ctx
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>send(str(ctx))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@on_natural_language&lt;/span>(only_to_me&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">False&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">repeat&lt;/span>(session: NLPSession):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> msg &lt;span style="color:#f92672">=&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>ctx[&lt;span style="color:#e6db74">&amp;#34;message&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> session&lt;span style="color:#f92672">.&lt;/span>send(msg)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还有更多应用后续再研究。。。&lt;/p></description></item><item><title>C++酷Q应用开发</title><link>https://kizx.github.io/post/c++%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</link><pubDate>Sat, 26 Oct 2019 09:31:00 +0000</pubDate><guid>https://kizx.github.io/post/c++%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</guid><description>&lt;p>以前自己的水平不够，这个项目一直搞不懂，现在起码能跑通了，其实也是比较简单的，项目地址：https://github.com/richardchien/coolq-cpp-sdk&lt;/p>
&lt;h2 id="步骤">&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor">&lt;/a>步骤
&lt;/h2>&lt;p>在该装的东西都装了后，在cmd中依次执行以下命令即可。其中最后一个命令，可能需要先进powershell管理员模式运行&lt;code>Set-ExecutionPolicy&lt;/code>并选择是来打开权限。另外由于网络原因，可能会在Unpacking objects这一步卡住，我是通过加速来解决的。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>git clone https://github.com/richardchien/coolq-cpp-sdk.git my-awesome-app
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">cd&lt;/span> my-awesome-app
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git submodule init
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git submodule update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>powershell .\scripts\prepare_prebuilt.ps1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后编译项目，把编译出来的相应文件丢进酷Q的dev文件夹里就行了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>powershell .\scripts\generate.ps1 Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>powershell .\scripts\build.ps1 Release
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Python多进程，多线程，协程</title><link>https://kizx.github.io/post/python%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%8D%8F%E7%A8%8B/</link><pubDate>Wed, 23 Oct 2019 12:31:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%8D%8F%E7%A8%8B/</guid><description>&lt;p>以下仅为个人理解&lt;/p>
&lt;ul>
&lt;li>进程——在windows的任务管理器里看到的一个个程序就是进程，最常看见的多进程就是浏览器的多进程，一个程序启动后至少会有一个进程，通常为了效率，会给多核CPU每个核分配几个进程以充分利用CPU。进程之间互不影响，一个进程挂了并不会影响另一个进程。&lt;/li>
&lt;li>线程——一个进程至少会有一个线程，线程是最小的执行单位。一个进程可以有多线程，多线程可以提高效率。一个线程挂了会导致该进程挂了从而该进程下的线程都会挂掉。&lt;/li>
&lt;li>协程——协程类似于线程，但在控制上稍有不同，是比线程更轻便的一种运行方式，通常和异步IO相关。&lt;/li>
&lt;li>并行——并行就是指同时执行多个任务。&lt;/li>
&lt;li>并发——和并行差不多意思，应用场合不同。&lt;/li>
&lt;li>同步——一个任务执行完了再去执行下一个任务。&lt;/li>
&lt;li>异步——一个任务执行到一半转而执行另一个任务收到消息后再回头处理等待的任务&lt;/li>
&lt;/ul>
&lt;p>这里有一个更为详细和硬核的教程：https://github.com/denglj/aiotutorial&lt;/p>
&lt;h2 id="2多进程">&lt;a href="#2%e5%a4%9a%e8%bf%9b%e7%a8%8b" class="header-anchor">&lt;/a>2、多进程
&lt;/h2>&lt;p>Python由于CPython解释器的原因，似乎对多进程并不支持，但是可以通过multiprocessing调用多个解释器来实现多进程。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> multiprocessing &lt;span style="color:#f92672">import&lt;/span> Process
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> os
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 子进程要执行的代码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">run_proc&lt;/span>(name):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Run child process &lt;/span>&lt;span style="color:#e6db74">%d&lt;/span>&lt;span style="color:#e6db74"> (&lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74">)...&amp;#39;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> (name, os&lt;span style="color:#f92672">.&lt;/span>getpid()))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;__main__&amp;#39;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>perf_counter()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Parent process &lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74">.&amp;#39;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> os&lt;span style="color:#f92672">.&lt;/span>getpid())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p &lt;span style="color:#f92672">=&lt;/span> []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">5&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>append(Process(target&lt;span style="color:#f92672">=&lt;/span>run_proc, args&lt;span style="color:#f92672">=&lt;/span>(i,)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Child process will start.&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">5&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p[i]&lt;span style="color:#f92672">.&lt;/span>start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [x&lt;span style="color:#f92672">.&lt;/span>join() &lt;span style="color:#66d9ef">for&lt;/span> x &lt;span style="color:#f92672">in&lt;/span> p]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Child process end.&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>perf_counter()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;cost time:&amp;#39;&lt;/span>, end &lt;span style="color:#f92672">-&lt;/span> start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从最后的运行时间可以看出该代码实现了5个进程的并行，从任务管理器里也可以看到多个Python进程。
也可以通过pool模块来开启多进程，其中运行中的进程数和CPU的核数是匹配的。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> multiprocessing &lt;span style="color:#f92672">import&lt;/span> Pool
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> os&lt;span style="color:#f92672">,&lt;/span> time&lt;span style="color:#f92672">,&lt;/span> random
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">long_time_task&lt;/span>(name):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Run task &lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74"> (&lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74">)...&amp;#39;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> (name, os&lt;span style="color:#f92672">.&lt;/span>getpid()))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(random&lt;span style="color:#f92672">.&lt;/span>random() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">3&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Task &lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74"> runs &lt;/span>&lt;span style="color:#e6db74">%0.2f&lt;/span>&lt;span style="color:#e6db74"> seconds.&amp;#39;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> (name, (end &lt;span style="color:#f92672">-&lt;/span> start)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__&lt;span style="color:#f92672">==&lt;/span>&lt;span style="color:#e6db74">&amp;#39;__main__&amp;#39;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Parent process &lt;/span>&lt;span style="color:#e6db74">%s&lt;/span>&lt;span style="color:#e6db74">.&amp;#39;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> os&lt;span style="color:#f92672">.&lt;/span>getpid())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p &lt;span style="color:#f92672">=&lt;/span> Pool(&lt;span style="color:#ae81ff">4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">5&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>apply_async(long_time_task, args&lt;span style="color:#f92672">=&lt;/span>(i,))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;Waiting for all subprocesses done...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>join()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;All subprocesses done.&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3多线程">&lt;a href="#3%e5%a4%9a%e7%ba%bf%e7%a8%8b" class="header-anchor">&lt;/a>3、多线程
&lt;/h2>&lt;h3 id="实现">&lt;a href="#%e5%ae%9e%e7%8e%b0" class="header-anchor">&lt;/a>实现
&lt;/h3>&lt;p>多线程要用到threading模块，新线程调用函数的方法一般有两种，一种是直接调用threading.Thread等指定target的参数，一种是通过新写一个对象继承threading.Thread，然后重写run方法。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> threading
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">water&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;开始烧水&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;水烧开了&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">rice&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;开始煮饭&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">10&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;饭煮熟了&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t1&lt;span style="color:#f92672">=&lt;/span>threading&lt;span style="color:#f92672">.&lt;/span>Thread(target&lt;span style="color:#f92672">=&lt;/span>water)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t2&lt;span style="color:#f92672">=&lt;/span>threading&lt;span style="color:#f92672">.&lt;/span>Thread(target&lt;span style="color:#f92672">=&lt;/span>rice)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t1&lt;span style="color:#f92672">.&lt;/span>start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t2&lt;span style="color:#f92672">.&lt;/span>start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t1&lt;span style="color:#f92672">.&lt;/span>join()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t2&lt;span style="color:#f92672">.&lt;/span>join()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stop &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(stop &lt;span style="color:#f92672">-&lt;/span> start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="锁">&lt;a href="#%e9%94%81" class="header-anchor">&lt;/a>锁
&lt;/h3>&lt;p>一个线程锁的结构通常如下，线程的运行通常是并行的，如果线程之间需要共同处理某个数据，那么该数据可能就会失控，这是我们就希望一个线程在处理数据时别的线程不要插手，这就是锁的作用。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>lock &lt;span style="color:#f92672">=&lt;/span> threading&lt;span style="color:#f92672">.&lt;/span>Lock()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">run_thread&lt;/span>(n):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">100000&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 先要获取锁:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lock&lt;span style="color:#f92672">.&lt;/span>acquire()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> change_it(n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">finally&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 释放锁:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lock&lt;span style="color:#f92672">.&lt;/span>release()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="join">&lt;a href="#join" class="header-anchor">&lt;/a>join
&lt;/h3>&lt;p>在程序末尾经常能看到一个join函数，该函数本来的作用应该是在某处插入一个线程，并且只有当该线程结束时才能继续执行其他命令。被用在程序最后是为了保证所有子线程结束后再结束主线程，没有这句你就会发现你的主线程会比子线程先结束。&lt;/p>
&lt;h3 id="守护线程">&lt;a href="#%e5%ae%88%e6%8a%a4%e7%ba%bf%e7%a8%8b" class="header-anchor">&lt;/a>守护线程
&lt;/h3>&lt;p>一个程序的线程之间可以是不平等的，分为普通线程和守护线程。进程也有守护进程，守护进程会在主进程代码运行结束的情况下，立即挂掉。普通线程在主线程结束后仍然可以继续运行，引用说法“该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉”。这东西到底有什么用我还没搞清楚。。。
守护线程的实现方法是设置线程的.daemon=True&lt;/p>
&lt;h2 id="4协程">&lt;a href="#4%e5%8d%8f%e7%a8%8b" class="header-anchor">&lt;/a>4、协程
&lt;/h2>&lt;p>Python的协程是通过yield来完成的，yield本质是一个生成器，可以通过next()来进行迭代，还可以通过send()来传递参数，多任务并发使用起来很方便。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">func1&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">yield&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;func1&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">func2&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> g &lt;span style="color:#f92672">=&lt;/span> func1()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(&lt;span style="color:#ae81ff">3&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> next(g)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;func2&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>func2()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stop &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(stop &lt;span style="color:#f92672">-&lt;/span> start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>协程想要并行还需要借用其他一些库比如asyncio&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> threading
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> asyncio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@asyncio.coroutine&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">water&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;开始烧水&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">yield from&lt;/span> asyncio&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;水烧开了&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@asyncio.coroutine&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">rice&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;开始煮饭&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">yield from&lt;/span> asyncio&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">10&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#39;饭煮熟了&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>loop &lt;span style="color:#f92672">=&lt;/span> asyncio&lt;span style="color:#f92672">.&lt;/span>get_event_loop()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tasks &lt;span style="color:#f92672">=&lt;/span> [water(), rice()]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>loop&lt;span style="color:#f92672">.&lt;/span>run_until_complete(asyncio&lt;span style="color:#f92672">.&lt;/span>wait(tasks))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>loop&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stop &lt;span style="color:#f92672">=&lt;/span> time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(stop &lt;span style="color:#f92672">-&lt;/span> start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个程序最终需要时间仅为10秒多点，因此是并行的，但要注意这利用的是 yield from asyncio.sleep(5)，这里代表的是一个IO阻塞，并不是什么函数放在这里都能够并行的。&lt;/p></description></item><item><title>Windows中的高级“快捷方式”</title><link>https://kizx.github.io/post/windows%E4%B8%AD%E7%9A%84%E9%AB%98%E7%BA%A7%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F/</link><pubDate>Sat, 19 Oct 2019 05:18:00 +0000</pubDate><guid>https://kizx.github.io/post/windows%E4%B8%AD%E7%9A%84%E9%AB%98%E7%BA%A7%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F/</guid><description>&lt;p>很久以前就知道windows中这么一种快捷方式，不同于普通的快捷方式，是一种可以和源文件发挥相同功效作用的“快捷方式”，但是一直未深入探索使用过，现在想起来或许这种快捷方式可以为我们的工作带来很大便利。
部分参考资料：
&lt;a class="link" href="https://baike.baidu.com/item/mklink/566760?fr=aladdin" title="mklink_百度百科"
target="_blank" rel="noopener"
>mklink_百度百科&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/5hongbing/article/details/77389079" target="_blank" rel="noopener"
>Windows硬链接 软链接 符号链接 快捷方式&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/cxrsdn/article/details/86631541" title="Windows上创建符号链接的完整指南"
target="_blank" rel="noopener"
>Windows上创建符号链接的完整指南&lt;/a>
&lt;a class="link" href="https://blog.csdn.net/guyue35/article/details/49761347" target="_blank" rel="noopener"
>Windows下mklink使用, 硬链接, 软链接和快捷方式的区别&lt;/a>
&lt;a class="link" href="https://www.jianshu.com/p/b1614a073087" target="_blank" rel="noopener"
>windows mklink /d /h /j 精讲&lt;/a>
&lt;a class="link" href="https://social.microsoft.com/Forums/zh-CN/95d0efc9-3ae9-4611-bb9d-68560c3c15ee/vista19979318672241120026junction21644symlink3034025991202142284126377?forum=vistazhchs" title="Vista下类型为JUNCTION和SYMLINK的文件夹有什么区别"
target="_blank" rel="noopener"
>Vista下类型为JUNCTION和SYMLINK的文件夹有什么区别&lt;/a>&lt;/p>
&lt;h2 id="实践">&lt;a href="#%e5%ae%9e%e8%b7%b5" class="header-anchor">&lt;/a>实践
&lt;/h2>&lt;p>看完许多资料，还是对windows下的mklink命令感到有些迷惑，我觉得还是自己实践下比较好。
&lt;img src="https://pan.2bboy.com/img/2019/10/359859328.png"
loading="lazy"
>
mklink一共只有3种链接，针对3种方式我分别对文件和文件夹进行如下实验。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>文件测试
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /d D:\d.txt C:\Users\ZXIN\Desktop\src.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /h D:\h.txt C:\Users\ZXIN\Desktop\src.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /h C:\Users\ZXIN\Desktop\opencv\h.txt C:\Users\ZXIN\Desktop\src.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /j D:\j.txt C:\Users\ZXIN\Desktop\src.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>文件夹测试
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /d D:\d C:\Users\ZXIN\Desktop\src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /h D:\h C:\Users\ZXIN\Desktop\src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /h C:\Users\ZXIN\Desktop\opencv\h C:\Users\ZXIN\Desktop\src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /j D:\j C:\Users\ZXIN\Desktop\src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>占用空间测试
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /d D:\bigd &lt;span style="color:#e6db74">&amp;#34;G:\ONE PIECE\820-866&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /d G:\bigd &lt;span style="color:#e6db74">&amp;#34;G:\ONE PIECE\820-866&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /h G:\bigh.zip &lt;span style="color:#e6db74">&amp;#34;G:\NPUBits\偷星九月天.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /j D:\bigj &lt;span style="color:#e6db74">&amp;#34;G:\ONE PIECE\820-866&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">mklink&lt;/span> /j G:\bigj &lt;span style="color:#e6db74">&amp;#34;G:\ONE PIECE\820-866&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下是实验结果：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>符号链接&lt;/th>
&lt;th>硬链接&lt;/th>
&lt;th>目录链接&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>参数&lt;/td>
&lt;td>/D&lt;/td>
&lt;td>/H&lt;/td>
&lt;td>/J&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>管理员权限&lt;/td>
&lt;td>需要&lt;/td>
&lt;td>不需要&lt;/td>
&lt;td>不需要&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>文件&lt;/td>
&lt;td>不支持&lt;/td>
&lt;td>支持&lt;/td>
&lt;td>不支持&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>文件夹&lt;/td>
&lt;td>支持&lt;/td>
&lt;td>不支持&lt;/td>
&lt;td>支持&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>空间&lt;/td>
&lt;td>不占用&lt;/td>
&lt;td>不占用(理应占用)&lt;/td>
&lt;td>不占用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>跨磁盘&lt;/td>
&lt;td>可以&lt;/td>
&lt;td>不可以&lt;/td>
&lt;td>可以&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>删除或移动源文件(夹)&lt;/td>
&lt;td>无法访问&lt;/td>
&lt;td>存在&lt;/td>
&lt;td>无法访问&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>移动链接&lt;/td>
&lt;td>秒移，整个文件夹被移动&lt;/td>
&lt;td>秒移&lt;/td>
&lt;td>跨盘的话会发生复制行为，原地遗留一个空文件夹&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>和网上的图进行比较：
&lt;img src="https://pan.2bboy.com/img/2019/10/2866579881.png"
loading="lazy"
>&lt;/p>
&lt;p>奇怪的地方来了，在我测试中三种方式都是不占用空间的，硬链接应该是会占用空间的才对，我检查占用空间的方式是右键磁盘查看可用空间，但是三种方式都不改变磁盘剩余空间，右键查看文件的占用空间三种方式也都是一样的，可能这种查看方式并不科学。&lt;/p>
&lt;h2 id="总结">&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor">&lt;/a>总结
&lt;/h2>&lt;ul>
&lt;li>与其叫快捷方式，其实这三种方式更像是文件共享，共同点都是文件的改动都是同步的，但是链接文件或目录的删除不影响源文件。&lt;/li>
&lt;li>至于区别首先就是硬链接源文件的删除不影响链接文件，但是硬链接只能链接文件不能链接文件夹，而另两种方式只能链接文件夹，所以硬链接很适合备份数据。&lt;/li>
&lt;li>如果什么参数都不加，创建的是文件符号链接。&lt;/li>
&lt;li>另两种文件链接方式似乎没有什么大差别，/D需要管理员权限，在移动链接文件夹时是整体移动的，不会留下一个空文件夹。需要注意的是虽然删除目录链接的目录本身不会影响源文件，但是删除删除目录下的文件会导致同步删除。&lt;/li>
&lt;/ul>
&lt;h2 id="应用">&lt;a href="#%e5%ba%94%e7%94%a8" class="header-anchor">&lt;/a>应用
&lt;/h2>&lt;ul>
&lt;li>除了用硬链接备份数据外，因为这种创建链接的方式几乎是瞬间完成的，可以和OneDrive云盘配合使用，也可用作程序间的数据共享。&lt;/li>
&lt;li>一个有意思的技巧，如果想使硬链接跨盘符使用该怎么办？可以使用软连接和硬链接相结合的方式，即在一个可以跨盘连接的软链接里创建硬链接，这样硬链接就会同步到另一个盘里。&lt;/li>
&lt;li>另外如果每次都用命令行的方式进行操作未免太过极客了，刚好在参考文件里找到一个软件，直接将该功能集成到右键菜单里了，我觉得很赞。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>软件下载地址：http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html
[button color=&amp;ldquo;info&amp;rdquo; icon=&amp;ldquo;fa fa-download&amp;rdquo;]&lt;a class="link" href="https://pan.2bboy.com/Public/Software/HardLinkShellExt_X64.exe" target="_blank" rel="noopener"
>本地下载&lt;/a>[/button]&lt;/p>&lt;/blockquote>
&lt;h2 id="后记">&lt;a href="#%e5%90%8e%e8%ae%b0" class="header-anchor">&lt;/a>后记
&lt;/h2>&lt;p>这个up在视频里讲解了硬链接，本文有些错误懒得改了，建议结合视频观看理解
&lt;a class="link" href="https://www.bilibili.com/video/BV11b4y1t72B" target="_blank" rel="noopener"
>https://www.bilibili.com/video/BV11b4y1t72B&lt;/a>&lt;/p></description></item><item><title>Matplotlib学习</title><link>https://kizx.github.io/post/matplotlib%E5%AD%A6%E4%B9%A0/</link><pubDate>Mon, 14 Oct 2019 13:46:00 +0000</pubDate><guid>https://kizx.github.io/post/matplotlib%E5%AD%A6%E4%B9%A0/</guid><description>&lt;ul>
&lt;li>&lt;a class="link" href="https://matplotlib.org/tutorials/index.html" target="_blank" rel="noopener"
>官方网站&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.runoob.com/w3cnote/matplotlib-tutorial.html" target="_blank" rel="noopener"
>菜鸟教程1&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.runoob.com/numpy/numpy-matplotlib.html" target="_blank" rel="noopener"
>菜鸟教程2&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="安装">&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>安装
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cmd" data-lang="cmd">&lt;span style="display:flex;">&lt;span>python -m pip install -U matplotlib
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="练习">&lt;a href="#%e7%bb%83%e4%b9%a0" class="header-anchor">&lt;/a>练习
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> matplotlib.pyplot &lt;span style="color:#66d9ef">as&lt;/span> plt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 导入 matplotlib 的所有内容（nympy 可以用 np 这个名字来使用）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#from pylab import *&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建一个 8 * 6 点（point）的图，并设置分辨率为 80&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>figure(figsize&lt;span style="color:#f92672">=&lt;/span>(&lt;span style="color:#ae81ff">8&lt;/span>,&lt;span style="color:#ae81ff">6&lt;/span>), dpi&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">100&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>X &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>linspace(&lt;span style="color:#f92672">-&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>pi, np&lt;span style="color:#f92672">.&lt;/span>pi, &lt;span style="color:#ae81ff">256&lt;/span>,endpoint&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>C,S &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>cos(X), np&lt;span style="color:#f92672">.&lt;/span>sin(X)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建一个新的 2 * 2 的子图，接下来的图样绘制在其中的第 1 块&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>subplot(&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 绘制余弦曲线，使用蓝色的、连续的、宽度为 1 （像素）的线条&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, C, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;blue&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1.0&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 绘制正弦曲线，使用绿色的、连续的、宽度为 1 （像素）的线条&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>subplot(&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, S, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;green&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1.0&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#回执第三个合并图&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>subplot(&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">3&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, C, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;blue&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1.0&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, S, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;green&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1.0&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置轴的上下限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xmin ,xmax &lt;span style="color:#f92672">=&lt;/span> X&lt;span style="color:#f92672">.&lt;/span>min(), X&lt;span style="color:#f92672">.&lt;/span>max()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ymin, ymax &lt;span style="color:#f92672">=&lt;/span> C&lt;span style="color:#f92672">.&lt;/span>min(), C&lt;span style="color:#f92672">.&lt;/span>max()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dx &lt;span style="color:#f92672">=&lt;/span> (xmax &lt;span style="color:#f92672">-&lt;/span> xmin) &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">0.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dy &lt;span style="color:#f92672">=&lt;/span> (ymax &lt;span style="color:#f92672">-&lt;/span> ymin) &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">0.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>xlim(xmin &lt;span style="color:#f92672">-&lt;/span> dx, xmax &lt;span style="color:#f92672">+&lt;/span> dx)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>ylim(ymin &lt;span style="color:#f92672">-&lt;/span> dy, ymax &lt;span style="color:#f92672">+&lt;/span> dy)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置横轴记号&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>xticks(np&lt;span style="color:#f92672">.&lt;/span>linspace(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>,&lt;span style="color:#ae81ff">4&lt;/span>,&lt;span style="color:#ae81ff">9&lt;/span>,endpoint&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>xticks([&lt;span style="color:#f92672">-&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>pi, &lt;span style="color:#f92672">-&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>pi&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>, np&lt;span style="color:#f92672">.&lt;/span>pi&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>, np&lt;span style="color:#f92672">.&lt;/span>pi],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$-\pi$&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$-\pi/2$&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$0$&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$+\pi/2$&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$+\pi$&amp;#39;&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置纵轴记号&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>yticks(np&lt;span style="color:#f92672">.&lt;/span>linspace(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>,&lt;span style="color:#ae81ff">1&lt;/span>,&lt;span style="color:#ae81ff">5&lt;/span>,endpoint&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#改变坐标轴位置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax &lt;span style="color:#f92672">=&lt;/span> plt&lt;span style="color:#f92672">.&lt;/span>gca()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>spines[&lt;span style="color:#e6db74">&amp;#39;right&amp;#39;&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>set_color(&lt;span style="color:#e6db74">&amp;#39;none&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>spines[&lt;span style="color:#e6db74">&amp;#39;top&amp;#39;&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>set_color(&lt;span style="color:#e6db74">&amp;#39;none&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>xaxis&lt;span style="color:#f92672">.&lt;/span>set_ticks_position(&lt;span style="color:#e6db74">&amp;#39;bottom&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>spines[&lt;span style="color:#e6db74">&amp;#39;bottom&amp;#39;&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>set_position((&lt;span style="color:#e6db74">&amp;#39;data&amp;#39;&lt;/span>,&lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>yaxis&lt;span style="color:#f92672">.&lt;/span>set_ticks_position(&lt;span style="color:#e6db74">&amp;#39;left&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ax&lt;span style="color:#f92672">.&lt;/span>spines[&lt;span style="color:#e6db74">&amp;#39;left&amp;#39;&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>set_position((&lt;span style="color:#e6db74">&amp;#39;data&amp;#39;&lt;/span>,&lt;span style="color:#ae81ff">0&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#增加图例&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, C, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;blue&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2.5&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>, label&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;cosine&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot(X, S, color&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;red&amp;#34;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2.5&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>, label&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;sine&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>legend(loc&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;upper left&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#标注特殊点&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>t &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">*&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>pi&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot([t,t],[&lt;span style="color:#ae81ff">0&lt;/span>,np&lt;span style="color:#f92672">.&lt;/span>cos(t)], color &lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;blue&amp;#39;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2.5&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;--&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>scatter([t,],[np&lt;span style="color:#f92672">.&lt;/span>cos(t),], &lt;span style="color:#ae81ff">50&lt;/span>, color &lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;blue&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>annotate(&lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$\sin(\frac{2\pi}&lt;/span>&lt;span style="color:#e6db74">{3}&lt;/span>&lt;span style="color:#e6db74">)=\frac{\sqrt&lt;/span>&lt;span style="color:#e6db74">{3}&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">{2}&lt;/span>&lt;span style="color:#e6db74">$&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xy&lt;span style="color:#f92672">=&lt;/span>(t, np&lt;span style="color:#f92672">.&lt;/span>sin(t)), xycoords&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;data&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xytext&lt;span style="color:#f92672">=&lt;/span>(&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">30&lt;/span>), textcoords&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;offset points&amp;#39;&lt;/span>, fontsize&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">8&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arrowprops&lt;span style="color:#f92672">=&lt;/span>dict(arrowstyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;gt;&amp;#34;&lt;/span>, connectionstyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;arc3,rad=.2&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>plot([t,t],[&lt;span style="color:#ae81ff">0&lt;/span>,np&lt;span style="color:#f92672">.&lt;/span>sin(t)], color &lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;red&amp;#39;&lt;/span>, linewidth&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2.5&lt;/span>, linestyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;--&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>scatter([t,],[np&lt;span style="color:#f92672">.&lt;/span>sin(t),], &lt;span style="color:#ae81ff">50&lt;/span>, color &lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;red&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>annotate(&lt;span style="color:#e6db74">r&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$\cos(\frac{2\pi}&lt;/span>&lt;span style="color:#e6db74">{3}&lt;/span>&lt;span style="color:#e6db74">)=-\frac&lt;/span>&lt;span style="color:#e6db74">{1}{2}&lt;/span>&lt;span style="color:#e6db74">$&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xy&lt;span style="color:#f92672">=&lt;/span>(t, np&lt;span style="color:#f92672">.&lt;/span>cos(t)), xycoords&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;data&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xytext&lt;span style="color:#f92672">=&lt;/span>(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">90&lt;/span>, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">50&lt;/span>), textcoords&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;offset points&amp;#39;&lt;/span>, fontsize&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">8&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arrowprops&lt;span style="color:#f92672">=&lt;/span>dict(arrowstyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;-&amp;gt;&amp;#34;&lt;/span>, connectionstyle&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;arc3,rad=.2&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#文字无遮挡&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> label &lt;span style="color:#f92672">in&lt;/span> ax&lt;span style="color:#f92672">.&lt;/span>get_xticklabels() &lt;span style="color:#f92672">+&lt;/span> ax&lt;span style="color:#f92672">.&lt;/span>get_yticklabels():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> label&lt;span style="color:#f92672">.&lt;/span>set_fontsize(&lt;span style="color:#ae81ff">8&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> label&lt;span style="color:#f92672">.&lt;/span>set_bbox(dict(facecolor&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;green&amp;#39;&lt;/span>, edgecolor&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;None&amp;#39;&lt;/span>, alpha&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0.5&lt;/span> ))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#保存图片&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>savefig(&lt;span style="color:#e6db74">&amp;#34;exercice_2.png&amp;#34;&lt;/span>,dpi&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">200&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 在屏幕上显示&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plt&lt;span style="color:#f92672">.&lt;/span>show()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Windows下使用make命令</title><link>https://kizx.github.io/post/windows%E4%B8%8B%E4%BD%BF%E7%94%A8make%E5%91%BD%E4%BB%A4/</link><pubDate>Sun, 13 Oct 2019 08:47:03 +0000</pubDate><guid>https://kizx.github.io/post/windows%E4%B8%8B%E4%BD%BF%E7%94%A8make%E5%91%BD%E4%BB%A4/</guid><description>&lt;p>看CMake教程时每次在cmake后都会跟着一个make命令，Linux系统下天然有这个命令。但是我的电脑装了MinGW，也设了环境变量却用不了make命令。&lt;/p>
&lt;h2 id="解决">&lt;a href="#%e8%a7%a3%e5%86%b3" class="header-anchor">&lt;/a>解决
&lt;/h2>&lt;p>先去MinGW的安装目录下的bin目录里看看有没有mingw32-make.exe文件，如果没有用以下命令下载：
&lt;code>mingw-get install gcc g++ mingw32-make&lt;/code>
然后将该文件重命名为make.exe即可。
这样通过CMake利用MinGW编译生成MakeFile相关文件，直接调用make命令就能生成可执行文件了，比起用微软的VS要方便不少。&lt;/p></description></item><item><title>CMake+VS2017编译OpenCV程序</title><link>https://kizx.github.io/post/cmake+vs2017%E7%BC%96%E8%AF%91opencv%E7%A8%8B%E5%BA%8F/</link><pubDate>Fri, 11 Oct 2019 16:27:00 +0000</pubDate><guid>https://kizx.github.io/post/cmake+vs2017%E7%BC%96%E8%AF%91opencv%E7%A8%8B%E5%BA%8F/</guid><description>&lt;p>起因来自下面的OpenCVd官方的一个教程，尝试使用CMake。&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://docs.opencv.org/4.1.1/db/df5/tutorial_linux_gcc_cmake.html" target="_blank" rel="noopener"
>https://docs.opencv.org/4.1.1/db/df5/tutorial_linux_gcc_cmake.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>但是按照官方的教程会出现很多问题。&lt;/p>
&lt;h2 id="建立工程">&lt;a href="#%e5%bb%ba%e7%ab%8b%e5%b7%a5%e7%a8%8b" class="header-anchor">&lt;/a>建立工程
&lt;/h2>&lt;ul>
&lt;li>先建立下面的这样一个结构
&lt;img src="https://pan.2bboy.com/img/2019/10/1102879862.png"
loading="lazy"
>&lt;/li>
&lt;li>主函数代码&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;opencv2/core.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;opencv2/highgui.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> cv;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> argc, &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">**&lt;/span> argv )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Mat image;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> image &lt;span style="color:#f92672">=&lt;/span> imread( &lt;span style="color:#e6db74">&amp;#34;C:&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">Users&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">ZXIN&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">Desktop&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">001.png&amp;#34;&lt;/span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> namedWindow(&lt;span style="color:#e6db74">&amp;#34;Display Image&amp;#34;&lt;/span>, WINDOW_AUTOSIZE );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> imshow(&lt;span style="color:#e6db74">&amp;#34;Display Image&amp;#34;&lt;/span>, image);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> waitKey(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>CMakeLists.txt内容&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>cmake_minimum_required(VERSION 2.8)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>project( DisplayImage )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>find_package( OpenCV REQUIRED )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>add_executable( DisplayImage DisplayImage.cpp )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>target_link_libraries( DisplayImage ${OpenCV_LIBS} )
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="编译">&lt;a href="#%e7%bc%96%e8%af%91" class="header-anchor">&lt;/a>编译
&lt;/h2>&lt;ul>
&lt;li>如果在命令行cmake的话会找不到路径，所以我改用CMake GUI，先选择CMakeLists所在文件夹和编译后的一个空文件夹
&lt;img src="https://pan.2bboy.com/img/2019/10/1024986576.png"
loading="lazy"
>&lt;/li>
&lt;li>点击Configure，按下图配置，点击Finish
&lt;img src="https://pan.2bboy.com/img/2019/10/2555629652.png"
loading="lazy"
>&lt;/li>
&lt;li>这是应该会报错，这是就体现gui的方便之处了，点击替换正确的OpenCV路径
&lt;img src="https://pan.2bboy.com/img/2019/10/2692616696.png"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2019/10/889438698.png"
loading="lazy"
>&lt;/li>
&lt;li>如果还有报错的话，建议gui左上角清除CMake缓存重新开始，没有问题的话继续点击Generate和Open Project，软件自动打开build下的VS工程文件，VS里右键生成解决方案即可。&lt;/li>
&lt;/ul></description></item><item><title>We live in an “age of anxiety”</title><link>https://kizx.github.io/post/we-live-in-an-age-of-anxiety/</link><pubDate>Fri, 11 Oct 2019 14:50:00 +0000</pubDate><guid>https://kizx.github.io/post/we-live-in-an-age-of-anxiety/</guid><description>&lt;p>The teacher of our group introduced us to some research and views about anxiety. Although we are no longer suffering from diseases, hunger and war in the present era, we still need to worry about health, billing, study, work, interpersonal relationships and so on. We are not only anxious for the present, but also for the future.&lt;/p>
&lt;p>After the speech, the teacher asked us three questions.&lt;/p>
&lt;p>The first question is &amp;ldquo;Have you ever experienced mental anxiety, and what are you anxious about?&amp;rdquo;. Some of our team members are anxious about the exam, while others are worried about their relationship with their classmates, and generally we are all anxious about future work.&lt;/p>
&lt;p>The second question is &amp;ldquo;What do you think are the causes of anxiety?&amp;rdquo;. After our group discussion, we have summarized the following reasons. First of all, we feel anxious because of the lack of knowledge of anxiety and lack of ability and experience. The second reason is our mentality. When we encounter challenging things, an optimistic and confident attitude will help us overcome anxiety. On the contrary, a negative attitude will contribute to our anxiety.&lt;/p>
&lt;p>The last question is &amp;ldquo;Do you know how to relieve anxiety? Can you recommend some good ways to relieve anxiety?&amp;rdquo;. In response to the anxiety factors we discussed above, our group members believe that to relieve anxiety, we should first learn more and improve our abilities and experience. So that we can have enough confidence and optimism to overcome anxiety. If we are already in anxiety, we can use the means of self-motivation to distract ourselves from anxiety. And we think that proper venting or relaxation is also a good way to relieve anxiety.&lt;/p>
&lt;p>Finally, I hope everyone can stay away from anxiety and enjoy life!&lt;/p></description></item><item><title>用Astyle为Qt Creator添加代码自动格式化功能</title><link>https://kizx.github.io/post/%E7%94%A8astyle%E4%B8%BAqt-creator%E6%B7%BB%E5%8A%A0%E4%BB%A3%E7%A0%81%E8%87%AA%E5%8A%A8%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%8A%9F%E8%83%BD/</link><pubDate>Wed, 09 Oct 2019 11:55:00 +0000</pubDate><guid>https://kizx.github.io/post/%E7%94%A8astyle%E4%B8%BAqt-creator%E6%B7%BB%E5%8A%A0%E4%BB%A3%E7%A0%81%E8%87%AA%E5%8A%A8%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%8A%9F%E8%83%BD/</guid><description>&lt;p>先要下载安装Astyle &lt;a class="link" href="https://sourceforge.net/projects/astyle/files/" target="_blank" rel="noopener"
>https://sourceforge.net/projects/astyle/files/&lt;/a>&lt;/p>
&lt;h2 id="2-添加beautifier插件">&lt;a href="#2-%e6%b7%bb%e5%8a%a0beautifier%e6%8f%92%e4%bb%b6" class="header-anchor">&lt;/a>2. 添加Beautifier插件
&lt;/h2>&lt;p>打开Qt Creator，在帮助-&amp;gt;关于插件中打开Beautifier插件&lt;/p>
&lt;h2 id="3-配置astyle">&lt;a href="#3-%e9%85%8d%e7%bd%aeastyle" class="header-anchor">&lt;/a>3. 配置Astyle
&lt;/h2>&lt;p>打开工具-&amp;gt;选项-&amp;gt;Beautifier&lt;/p>
&lt;p>设置Astyle的路径&lt;/p>
&lt;p>设置自定义风格&lt;/p>
&lt;p>风格可以参考官方说明http://astyle.sourceforge.net/astyle.html#_Brace%20Style%20Options&lt;/p>
&lt;h2 id="4-设置快捷键">&lt;a href="#4-%e8%ae%be%e7%bd%ae%e5%bf%ab%e6%8d%b7%e9%94%ae" class="header-anchor">&lt;/a>4. 设置快捷键
&lt;/h2>&lt;p>在选项-&amp;gt;环境-&amp;gt;键盘里搜索format，选择相应项设置快捷键，当然我们设置了保存时自动规范，不用快捷键也行，在工具菜单栏里也可以相应命令&lt;/p>
&lt;p>参考：&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://www.techieliang.com/2018/01/873/" target="_blank" rel="noopener"
>https://www.techieliang.com/2018/01/873/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>OpenCV + Qt 配置</title><link>https://kizx.github.io/post/opencv--+-qt-%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 07 Oct 2019 14:20:00 +0000</pubDate><guid>https://kizx.github.io/post/opencv--+-qt-%E9%85%8D%E7%BD%AE/</guid><description>&lt;p>假设已经下载安装了OpenCV和Qt并且配置好了OpenCV的环境变量，环境变量设置可以参考以前的文章。&lt;/p>
&lt;h2 id="cmake编译">&lt;a href="#cmake%e7%bc%96%e8%af%91" class="header-anchor">&lt;/a>CMake编译
&lt;/h2>&lt;p>许多教程都会从CMake编译OpenCV开始，但其实我们下载的安装包解压后已经编译好了，bulid文件下就是编译后的文件，除非有特殊要求，可以不用亲自编译。主要是我尝试用CMake编译Source但是报错失败了，就此作罢。&lt;/p>
&lt;h2 id="编写pri文件">&lt;a href="#%e7%bc%96%e5%86%99pri%e6%96%87%e4%bb%b6" class="header-anchor">&lt;/a>编写pri文件
&lt;/h2>&lt;p>新建一个文件，重命名为&lt;code>opencv.pri&lt;/code>，写入以下内容，其实和在VS2017里配置库环境是一样的道理。&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-pri" data-lang="pri">INCLUDEPATH += c:/opencv/build/include
Debug: {
LIBS += -lc:/opencv/build/x64/vc15/lib/opencv_world411d
}
Release: {
LIBS += -lc:/opencv/build/x64/vc15/lib/opencv_world411
}
&lt;/code>&lt;/pre>&lt;h2 id="新建工程">&lt;a href="#%e6%96%b0%e5%bb%ba%e5%b7%a5%e7%a8%8b" class="header-anchor">&lt;/a>新建工程
&lt;/h2>&lt;p>在Qt里新建一个最普通的工程，编译器选择VS2017 64bit，新建完成后在工程的pro文件最后添加刚才的pri文件路径：
&lt;code>include(c:/opencv/opencv.pri)&lt;/code>&lt;/p>
&lt;h2 id="测试代码">&lt;a href="#%e6%b5%8b%e8%af%95%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>测试代码
&lt;/h2>&lt;p>在main函数里进行测试&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;#34;mainwindow.h&amp;#34;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;QApplication&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;#34;opencv2/opencv.hpp&amp;#34;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> argc, &lt;span style="color:#66d9ef">char&lt;/span> &lt;span style="color:#f92672">*&lt;/span>argv[])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> QApplication a(argc, argv);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> cv;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Mat img &lt;span style="color:#f92672">=&lt;/span> imread(&lt;span style="color:#e6db74">&amp;#34;../001.png&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> imshow(&lt;span style="color:#e6db74">&amp;#34;TEST&amp;#34;&lt;/span>,img);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> waitKey(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> a.exec();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>jupyter安装和配置</title><link>https://kizx.github.io/post/jupyter%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 07 Oct 2019 08:38:00 +0000</pubDate><guid>https://kizx.github.io/post/jupyter%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/</guid><description>&lt;h2 id="方案一anaconda自带">&lt;a href="#%e6%96%b9%e6%a1%88%e4%b8%80anaconda%e8%87%aa%e5%b8%a6" class="header-anchor">&lt;/a>方案一：Anaconda自带
&lt;/h2>&lt;p>这个不用细说，进入&lt;a class="link" href="https://www.anaconda.com/distribution/" target="_blank" rel="noopener"
>Anaconda官网&lt;/a>下载安装包安装即可，安装完自带jupyter。&lt;/p>
&lt;h2 id="方案二手动安装">&lt;a href="#%e6%96%b9%e6%a1%88%e4%ba%8c%e6%89%8b%e5%8a%a8%e5%ae%89%e8%a3%85" class="header-anchor">&lt;/a>方案二：手动安装
&lt;/h2>&lt;ul>
&lt;li>通过pip安装
&lt;code>pip install jupyter notebook&lt;/code>&lt;/li>
&lt;li>安装完命令行输入命令打开
&lt;code>jupyter notebook&lt;/code>&lt;/li>
&lt;/ul>
&lt;h1 id="配置">&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>配置
&lt;/h1>&lt;h2 id="先安装nbextension">&lt;a href="#%e5%85%88%e5%ae%89%e8%a3%85nbextension" class="header-anchor">&lt;/a>先安装nbextension
&lt;/h2>&lt;pre>&lt;code>jupyter contrib nbextension install
jupyter contrib nbextension install --user
&lt;/code>&lt;/pre>
&lt;p>安装完打开jupyter首页应该就会多出一个Nbextension的插件配置页&lt;/p>
&lt;h2 id="代码自动规范">&lt;a href="#%e4%bb%a3%e7%a0%81%e8%87%aa%e5%8a%a8%e8%a7%84%e8%8c%83" class="header-anchor">&lt;/a>代码自动规范
&lt;/h2>&lt;ul>
&lt;li>安装插件
&lt;code>pip install yapf &lt;/code>&lt;/li>
&lt;li>在插件配置页勾选&lt;code>Code prettify&lt;/code>
安装启用完在代码页的菜单栏就会多出一个油漆滚筒的图标，点击即可代码自动格式化&lt;/li>
&lt;/ul>
&lt;h2 id="代码提示">&lt;a href="#%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba" class="header-anchor">&lt;/a>代码提示
&lt;/h2>&lt;p>虽然在写代码时按&lt;code>Tab&lt;/code>键可以进行代码提示，但不是实时的，效率很低，最好能像ide里一样进行自动提示。方法很简单，在Nbextension的插件配置页勾选&lt;code>Hinterland&lt;/code>即可。&lt;/p></description></item><item><title>IG Nobel Prize</title><link>https://kizx.github.io/post/ig-nobel-prize/</link><pubDate>Mon, 30 Sep 2019 17:07:00 +0000</pubDate><guid>https://kizx.github.io/post/ig-nobel-prize/</guid><description>&lt;p>Good afternoon everyone, then I will share with you a news about the IG Nobel Prize. This prize is an interesting imitation of the Nobel Prize, and it is awarded to those scientific achievements that first make people laugh, then make them think deeply.&lt;/p>
&lt;p>This month, the 29th first Ig Nobel Prize was announced, and this year&amp;rsquo;s winners, covering 10 categories. So next I will choose some of them to introduce to you.&lt;/p>
&lt;p>First of all. The Medical Prize was awarded to Italian scientists for pizza and illness studies. The researchers showed that “often eat pizza ” seems to have a lower risk of cancer and heart attack. But there&amp;rsquo;s just one catch – the pizza must be made and eaten in Italy. Maybe they only did experiments on Italians.&lt;/p>
&lt;p>The next prize is very interesting. The award for the Medical Education Prize is to train the surgeon with &amp;ldquo;clicker training&amp;rdquo;. People often use it to train dogs and other animals. But the study found that training a surgeon would be as similar as training a dog.&lt;/p>
&lt;p>The Biology Prize is more interesting. The researchers placed a group of live cockroaches and dead cockroaches in a strong magnetic field. After 20 minutes, the dead cockroaches could be sucked into the refrigerator like a sticker, but the live group could not. This research may reveal the connection between biology and magnetic fields, and could help in the development of new magnetic sensors.&lt;/p>
&lt;p>The Engineering Prize was awarded to the invention of an automatic baby-diaper-changing machine. That&amp;rsquo;s sounds like a good invention. unfortunately the machine doesn&amp;rsquo;t actually change the child&amp;rsquo;s diaper. Instead, it is a bit like an oven to dry the diaper.&lt;/p>
&lt;p>The Chemistry Prize examines how much saliva a 5-year-old child will produce one day. It turned out that the five-year-old child produce about 500 milliliter of saliva a day. But we are still not sure what the significance of this study.&lt;/p>
&lt;p>The most funny award is the Physics Prize. Researchers had discovered how the wombat manages to produce cube-shaped poo. It&amp;rsquo;s the only animal in the world known to do this, and the team found the secret of the cube-shaped poo is their intestine movement. But the researchers still don&amp;rsquo;t know for sure why wombats evolved to produce cube-shaped poo.&lt;/p>
&lt;p>(Next is the Peace Prize. Tickling will always make you feel good. However, do you know which part of the body can effectively relieve itching? Do you know how to scratch to maximize your body and mind? This research will make you feel comfortable and scratched.&lt;/p>
&lt;p>The Economics Prize examines which country&amp;rsquo;s banknotes are the most susceptible to dangerous bacteria. Does this have anything to do with the economy?)&lt;/p>
&lt;ul>
&lt;li>reference
&lt;a class="link" href="https://newatlas.com/science/ig-nobel-awards-2019/" target="_blank" rel="noopener"
>https://newatlas.com/science/ig-nobel-awards-2019/&lt;/a>
&lt;a class="link" href="https://mp.weixin.qq.com/s/jcjwCNhju1eK_ehSKHiq7g" target="_blank" rel="noopener"
>https://mp.weixin.qq.com/s/jcjwCNhju1eK_ehSKHiq7g&lt;/a>&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>Questions&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>Do you think the Ig Nobel Prize makes sense, or is it just for fun?&lt;/li>
&lt;li>Which Prize do you think is the most interesting？&lt;/li>
&lt;li>Can you also give a similar interesting research?&lt;/li>
&lt;/ol></description></item><item><title>NumPy学习（二）</title><link>https://kizx.github.io/post/numpy%E5%AD%A6%E4%B9%A0%E4%BA%8C/</link><pubDate>Thu, 26 Sep 2019 10:18:00 +0000</pubDate><guid>https://kizx.github.io/post/numpy%E5%AD%A6%E4%B9%A0%E4%BA%8C/</guid><description>&lt;h2 id="1-加减">&lt;a href="#1-%e5%8a%a0%e5%87%8f" class="header-anchor">&lt;/a>1. 加减
&lt;/h2>&lt;p>得益于广播机制，numpy的算术比较灵活&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>], [&lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>, &lt;span style="color:#ae81ff">8&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">20&lt;/span>, &lt;span style="color:#ae81ff">30&lt;/span>, &lt;span style="color:#ae81ff">40&lt;/span>], [&lt;span style="color:#ae81ff">50&lt;/span>, &lt;span style="color:#ae81ff">60&lt;/span>, &lt;span style="color:#ae81ff">70&lt;/span>, &lt;span style="color:#ae81ff">80&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>c &lt;span style="color:#f92672">=&lt;/span> a &lt;span style="color:#f92672">+&lt;/span> b
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d &lt;span style="color:#f92672">=&lt;/span> a &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>e &lt;span style="color:#f92672">=&lt;/span> a &lt;span style="color:#f92672">+&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(c)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(d)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(e)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意：当两个数据类型不同的数组相加减时，结果以范围大的为准，比如uint8+float32=float32，uint8超出范围数据溢出时对255取模后减1。&lt;/p>
&lt;h2 id="2-乘除">&lt;a href="#2-%e4%b9%98%e9%99%a4" class="header-anchor">&lt;/a>2. 乘除
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>], np&lt;span style="color:#f92672">.&lt;/span>uint8)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">125&lt;/span>, &lt;span style="color:#ae81ff">150&lt;/span>, &lt;span style="color:#ae81ff">200&lt;/span>], np&lt;span style="color:#f92672">.&lt;/span>uint8)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 乘法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a &lt;span style="color:#f92672">*&lt;/span> b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(np&lt;span style="color:#f92672">.&lt;/span>multiply(&lt;span style="color:#ae81ff">2&lt;/span>, b))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 除法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b &lt;span style="color:#f92672">/&lt;/span> a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 矩阵乘法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(np&lt;span style="color:#f92672">.&lt;/span>dot(a, b&lt;span style="color:#f92672">.&lt;/span>T))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a &lt;span style="color:#f92672">@&lt;/span> b&lt;span style="color:#f92672">.&lt;/span>T)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3-其他运算">&lt;a href="#3-%e5%85%b6%e4%bb%96%e8%bf%90%e7%ae%97" class="header-anchor">&lt;/a>3. 其他运算
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">方法&lt;/th>
&lt;th>示例&lt;/th>
&lt;th>注意事项&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">转置&lt;/td>
&lt;td>A.T&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">转置&lt;/td>
&lt;td>np.transpose(A)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">改变形状&lt;/td>
&lt;td>A.reshape(4,2)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">改变形状&lt;/td>
&lt;td>np.resize(A, (4,2))&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">迭代&lt;/td>
&lt;td>for element in A.flat:&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">迭代&lt;/td>
&lt;td>A.flatten()&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">迭代&lt;/td>
&lt;td>for element in np.nditer(A):&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">展开&lt;/td>
&lt;td>A.ravel()&lt;/td>
&lt;td>会改变原数组&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">分割&lt;/td>
&lt;td>np.split(A,3)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">添加&lt;/td>
&lt;td>np.append(A, [7,8,9],axis=1)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">插入&lt;/td>
&lt;td>np.insert(A, 2, [7,8,9],axis=1)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">删除&lt;/td>
&lt;td>np.deleter(A,1,axis = 1)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">乘方&lt;/td>
&lt;td>np.power(A,2)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">乘方&lt;/td>
&lt;td>**&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>NumPy学习（一）</title><link>https://kizx.github.io/post/numpy%E5%AD%A6%E4%B9%A0%E4%B8%80/</link><pubDate>Wed, 25 Sep 2019 08:43:00 +0000</pubDate><guid>https://kizx.github.io/post/numpy%E5%AD%A6%E4%B9%A0%E4%B8%80/</guid><description>&lt;h2 id="1-安装和学习">&lt;a href="#1-%e5%ae%89%e8%a3%85%e5%92%8c%e5%ad%a6%e4%b9%a0" class="header-anchor">&lt;/a>1. 安装和学习
&lt;/h2>&lt;ul>
&lt;li>pip安装 &lt;code>pip install numpy&lt;/code>&lt;/li>
&lt;li>Anaconda自带&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>学习资源&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>&lt;a class="link" href="https://www.runoob.com/numpy/numpy-tutorial.html" target="_blank" rel="noopener"
>菜鸟NumPy 教程&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.numpy.org.cn/user/" target="_blank" rel="noopener"
>NumPy中文网&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="2-ndarray">&lt;a href="#2-ndarray" class="header-anchor">&lt;/a>2. ndarray
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 一维数列&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a1 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a1)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 二维数列&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a2 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义最小维度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a3 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>], ndmin&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 指定数据类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a4 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>], dtype&lt;span style="color:#f92672">=&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>float32)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a4)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3-数据类型">&lt;a href="#3-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b" class="header-anchor">&lt;/a>3. 数据类型
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 使用标量类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dt1 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dtype(np&lt;span style="color:#f92672">.&lt;/span>int32)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(dt1)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># int8, int16, int32, int64 四种数据类型可以使用字符串 &amp;#39;i1&amp;#39;, &amp;#39;i2&amp;#39;,&amp;#39;i4&amp;#39;,&amp;#39;i8&amp;#39; 代替&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dt2 &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dtype(&lt;span style="color:#e6db74">&amp;#39;i4&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(dt2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 还可以像结构体一样用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>student &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>dtype([(&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;S20&amp;#39;&lt;/span>), (&lt;span style="color:#e6db74">&amp;#39;age&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;i1&amp;#39;&lt;/span>), (&lt;span style="color:#e6db74">&amp;#39;marks&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;f4&amp;#39;&lt;/span>)])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([(&lt;span style="color:#e6db74">&amp;#39;abc&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">21&lt;/span>, &lt;span style="color:#ae81ff">50&lt;/span>), (&lt;span style="color:#e6db74">&amp;#39;xyz&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">18&lt;/span>, &lt;span style="color:#ae81ff">75&lt;/span>)], dtype&lt;span style="color:#f92672">=&lt;/span>student)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[&lt;span style="color:#ae81ff">1&lt;/span>])
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-数组属性">&lt;a href="#4-%e6%95%b0%e7%bb%84%e5%b1%9e%e6%80%a7" class="header-anchor">&lt;/a>4. 数组属性
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>], [&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 维度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a&lt;span style="color:#f92672">.&lt;/span>ndim)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 各维度大小&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a&lt;span style="color:#f92672">.&lt;/span>shape)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 现在调整其大小&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a&lt;span style="color:#f92672">.&lt;/span>shape &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>reshape(&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b&lt;span style="color:#f92672">.&lt;/span>ndim)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># b 现在拥有三个维度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>reshape(&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b&lt;span style="color:#f92672">.&lt;/span>ndim)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 数组元素的字节大小 &lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">3&lt;/span>], dtype &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>int8)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print (x&lt;span style="color:#f92672">.&lt;/span>itemsize)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="5特殊数组">&lt;a href="#5%e7%89%b9%e6%ae%8a%e6%95%b0%e7%bb%84" class="header-anchor">&lt;/a>5.特殊数组
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 未初始化的数组&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>empty([&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], dtype&lt;span style="color:#f92672">=&lt;/span>int)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 元素为零&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 默认为浮点数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>zeros(&lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置类型为整数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>zeros((&lt;span style="color:#ae81ff">5&lt;/span>, ), dtype&lt;span style="color:#f92672">=&lt;/span>np&lt;span style="color:#f92672">.&lt;/span>int)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(y)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 自定义类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>z &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>zeros((&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>), dtype&lt;span style="color:#f92672">=&lt;/span>[(&lt;span style="color:#e6db74">&amp;#39;x&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;i4&amp;#39;&lt;/span>), (&lt;span style="color:#e6db74">&amp;#39;y&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;f4&amp;#39;&lt;/span>)])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(z)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 对角矩阵&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>eye(&lt;span style="color:#ae81ff">4&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 从列表或元组转换&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># numpy.asarray(a, dtype = None, order = None)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>asarray(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 序列&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># numpy.arange(start, stop, step, dtype)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>arange(&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">20&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>linspace(&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">20&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重复&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bb &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>tile(b, (&lt;span style="color:#ae81ff">2&lt;/span>, ))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(bb)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="6-数组切片">&lt;a href="#6-%e6%95%b0%e7%bb%84%e5%88%87%e7%89%87" class="header-anchor">&lt;/a>6. 数组切片
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>arange(&lt;span style="color:#ae81ff">10&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>s &lt;span style="color:#f92672">=&lt;/span> slice(&lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>) &lt;span style="color:#75715e"># 从索引 2 开始到索引 7 停止，间隔为2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[s])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#f92672">=&lt;/span> a[&lt;span style="color:#ae81ff">2&lt;/span>:&lt;span style="color:#ae81ff">7&lt;/span>:&lt;span style="color:#ae81ff">2&lt;/span>] &lt;span style="color:#75715e"># 效果同上&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(b)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>], [&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 从某个索引处开始切割&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[&lt;span style="color:#ae81ff">1&lt;/span>:, &lt;span style="color:#ae81ff">1&lt;/span>:])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[&lt;span style="color:#ae81ff">1&lt;/span>:, [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(a[:, &lt;span style="color:#ae81ff">0&lt;/span>]) &lt;span style="color:#75715e">#获取列元素&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="7-高级索引">&lt;a href="#7-%e9%ab%98%e7%ba%a7%e7%b4%a2%e5%bc%95" class="header-anchor">&lt;/a>7. 高级索引
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> numpy &lt;span style="color:#66d9ef">as&lt;/span> np
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>], [&lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y &lt;span style="color:#f92672">=&lt;/span> x[[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], [&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>]] &lt;span style="color:#75715e">#获取数组中(0,0)，(1,1)和(2,0)位置处的元素&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(y)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">5&lt;/span>], [&lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>, &lt;span style="color:#ae81ff">8&lt;/span>], [&lt;span style="color:#ae81ff">9&lt;/span>, &lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">11&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rows &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">3&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cols &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>array([[&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>], [&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>]]) &lt;span style="color:#75715e"># 获取四个角元素&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>y &lt;span style="color:#f92672">=&lt;/span> x[rows, cols]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(y)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过判断布尔&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x[x &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 通过索引&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>arange(&lt;span style="color:#ae81ff">32&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>reshape((&lt;span style="color:#ae81ff">8&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x[[&lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>]])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>x &lt;span style="color:#f92672">=&lt;/span> np&lt;span style="color:#f92672">.&lt;/span>arange(&lt;span style="color:#ae81ff">32&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>reshape((&lt;span style="color:#ae81ff">8&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(x[np&lt;span style="color:#f92672">.&lt;/span>ix_([&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#ae81ff">7&lt;/span>], [&lt;span style="color:#ae81ff">3&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>])])
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>OneDrive使用指南</title><link>https://kizx.github.io/post/onedrive%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Mon, 23 Sep 2019 03:35:00 +0000</pubDate><guid>https://kizx.github.io/post/onedrive%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;h2 id="1-获取5t空间">&lt;a href="#1-%e8%8e%b7%e5%8f%965t%e7%a9%ba%e9%97%b4" class="header-anchor">&lt;/a>1. 获取5T空间
&lt;/h2>&lt;p>OneDrive当云盘的好处是不限速，但实际速度并不会跑满带宽，具体速度以实际情况为准，我的速度用客户端上传的话最快能跑到7M/s，网页下载配合idm的话有时能跑满带宽，还是相当给力的。其次还有一个优点就是内容不会被和谐。&lt;/p>
&lt;p>但普通邮箱注册只有5G的免费空间，教育邮箱注册可以获得5T的免费空间，但一般正规教育邮箱注册只有1T的可用空间，不过1T也基本上够用了，如果没有教育邮箱可以选择花几块钱买一个5T账号省的麻烦。&lt;/p>
&lt;p>注意我们这里注册的是office365的账号和微软账号通用，可以通过以下方法查看空间大小：登录到office365，进入OneDrive，选择右上角设置-&amp;gt;OneDrive设置，继续选择其他设置-&amp;gt;存储标准即可看到空间大小，或者打开onedrive桌面客户端也可以进行查看。&lt;/p>
&lt;h2 id="2-桌面客户端使用">&lt;a href="#2-%e6%a1%8c%e9%9d%a2%e5%ae%a2%e6%88%b7%e7%ab%af%e4%bd%bf%e7%94%a8" class="header-anchor">&lt;/a>2. 桌面客户端使用
&lt;/h2>&lt;p>win10系统是自带Onedrive客户端的，搜索打开OneDrive并登录后，设置一个文件夹为同步文件夹。&lt;/p>
&lt;p>OneDrive不同于国内的网盘，和国内的坚果云有点类似。他是一个同步云盘，同步文件夹里所有文件都是和云端同步的，上传文件只需把文件拖进同步文件夹内即可。&lt;/p>
&lt;p>但由于是同步的如果本地删除文件云端也会删除，云端删除文件本地也会删除，这点就很坑了，可能国人更喜欢把云盘当一个存储资料的硬盘来使用，我本地删除了云端也没了那还存个屁啊。在这一点上国内云盘就很人性化了，单独有一个同步文件夹可供使用。&lt;/p>
&lt;p>所以微软是怎么解决这个问题的呢，OneDrive有个文件随选功能，具体见官方说明&lt;a class="link" href="https://support.office.com/zh-cn/article/%E9%80%9A%E8%BF%87%E9%80%82%E7%94%A8%E4%BA%8E-windows-10-%E7%9A%84-onedrive-%E6%96%87%E4%BB%B6%E9%9A%8F%E9%80%89%E8%8A%82%E7%9C%81%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4-0e6860d3-d9f3-4971-b321-7092438fb38e?ui=zh-CN&amp;amp;rs=zh-CN&amp;amp;ad=CN" target="_blank" rel="noopener"
>通过适用于 Windows 10 的 OneDrive 文件随选节省磁盘空间&lt;/a>。
通过右键文件选择释放空间，文件就会被标注为在联机时下载使用，也就是本地就是一个快捷方式一样的东西，在打开使用这个文件时就会下载这个文件。但要注意的是如果你删除这个“快捷方式”，云端同样会删除文件，坑啊。&lt;/p>
&lt;p>还有一个办法是打开OneDrive设置，找到一个同步选项，去掉你想删除的文件使其不同步，这样一来本地文件就自动删除了而云端数据仍然保留，也就是使这个文件在本地不同步。但这个做法你想要再下载这个文件的话，要么去云端再下载，要么重新勾上同步，这就有点小麻烦了。&lt;/p>
&lt;h2 id="3-搭建云盘">&lt;a href="#3-%e6%90%ad%e5%bb%ba%e4%ba%91%e7%9b%98" class="header-anchor">&lt;/a>3. 搭建云盘
&lt;/h2>&lt;p>使用OneDrive还有一个好处就是可以用来搭建个人云盘，也可以用来搭建个人图床，如果你有一台服务器的话，那么你可以选择OneIndex,OLAINDEX,PyOne,CuteOne等方案来部署你的个人云盘，搭建过程和你安装博客程序差不多。&lt;/p>
&lt;p>如果你手头没有空闲的主机，那么也可通过下面的方式利用腾讯云的云函数服务来搭建一个。
我当初是参考这个教程的：https://logi.im/back-end/scf-onedrive-filelistor.html
项目地址：https://github.com/qkqpttgf/OneManager-php
顺便说下学校教育邮箱申请的onedrive可能无法使用这个项目，好像是无法开通api的缘故，但可以用下面的方案通过分享的方式来访问。&lt;/p>
&lt;p>和上面的类似，可以尝试另一个云函数网盘方案&lt;a class="link" href="https://github.com/ukuq/onepoint" target="_blank" rel="noopener"
>onepoint&lt;/a>。
这里是使用说明：https://www.onesrc.cn/p/onepoint-configuration-process.html&lt;/p>
&lt;h2 id="附onedrive种类示意图">&lt;a href="#%e9%99%84onedrive%e7%a7%8d%e7%b1%bb%e7%a4%ba%e6%84%8f%e5%9b%be" class="header-anchor">&lt;/a>附onedrive种类示意图
&lt;/h2>&lt;p>&lt;img src="https://pan.2bboy.com/img/2020/03/20200312191455.jpg"
loading="lazy"
>&lt;/p></description></item><item><title>Typecho主题推荐</title><link>https://kizx.github.io/post/typecho%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</link><pubDate>Sun, 15 Sep 2019 14:05:00 +0000</pubDate><guid>https://kizx.github.io/post/typecho%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</guid><description>&lt;h1 id="typecho主题推荐">&lt;a href="#typecho%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>Typecho主题推荐
&lt;/h1>&lt;h2 id="1-purelovefortypecho">&lt;a href="#1-purelovefortypecho" class="header-anchor">&lt;/a>1. &lt;a class="link" href="https://www.hoehub.com/PHP/typecho-pureLove.html" target="_blank" rel="noopener"
>PureLoveForTypecho&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://www.hoehub.com/usr/uploads/2018/11/1320732040.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="2-pinghsu-theme">&lt;a href="#2-pinghsu-theme" class="header-anchor">&lt;/a>2. &lt;a class="link" href="https://www.linpx.com/p/pinghsu-a-typecho-theme.html" target="_blank" rel="noopener"
>Pinghsu Theme&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://camo.githubusercontent.com/9ae215dc7ba9c5ad391708b9b777d7dc80c04a8a/68747470733a2f2f7773312e73696e61696d672e636e2f6c617267652f37633938333937646779316664796472336a7730796a3230727330666e74617a2e6a7067"
loading="lazy"
>&lt;/p>
&lt;h2 id="3-rinvay-theme">&lt;a href="#3-rinvay-theme" class="header-anchor">&lt;/a>3. &lt;a class="link" href="https://www.rinvay.cc/archives/225/" target="_blank" rel="noopener"
>Rinvay Theme&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://camo.githubusercontent.com/b7537b5d7bd2472027ce3a809316172e9130ab13/68747470733a2f2f7777772e72696e7661792e63632f7573722f7468656d65732f52696e7661792f73637265656e73686f742e6a7067"
loading="lazy"
>&lt;/p>
&lt;h2 id="4-void">&lt;a href="#4-void" class="header-anchor">&lt;/a>4. &lt;a class="link" href="https://blog.imalan.cn/archives/247/" target="_blank" rel="noopener"
>VOID&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://raw.githubusercontent.com/AlanDecode/Typecho-Theme-VOID/master/screenshot.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="5-armxmod">&lt;a href="#5-armxmod" class="header-anchor">&lt;/a>5. &lt;a class="link" href="https://vircloud.net/default/change-theme.html" target="_blank" rel="noopener"
>ArmxMod&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://static.yecdn.com/jrotty/2019/08/2865738641.jpg"
loading="lazy"
>&lt;/p>
&lt;h2 id="6-al_">&lt;a href="#6-al_" class="header-anchor">&lt;/a>6. &lt;a class="link" href="http://typecho.alapi.cn/archives/6/" target="_blank" rel="noopener"
>AL_lolimeow&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://i.alone88.cn/usr/uploads/2019/04/4143539668.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="7-dux主题">&lt;a href="#7-dux%e4%b8%bb%e9%a2%98" class="header-anchor">&lt;/a>7. &lt;a class="link" href="https://github.com/hiCasper/Typecho-theme-DUX" target="_blank" rel="noopener"
>DUX主题&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://camo.githubusercontent.com/f8253ebd611e01fefd113081337b4c8a5dc73e36/68747470733a2f2f692e6c6f6c692e6e65742f323031382f30392f32322f356261356430653536663363392e706e67"
loading="lazy"
>&lt;/p>
&lt;h2 id="8-miracles">&lt;a href="#8-miracles" class="header-anchor">&lt;/a>8. &lt;a class="link" href="https://guhub.cn/p/miracles.html" target="_blank" rel="noopener"
>Miracles&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://static.yecdn.com/jrotty/2019/08/979560890.jpg"
loading="lazy"
>&lt;/p>
&lt;h2 id="9-typecho-theme-raw">&lt;a href="#9-typecho-theme-raw" class="header-anchor">&lt;/a>9. &lt;a class="link" href="https://blog.imalan.cn/archives/163/" target="_blank" rel="noopener"
>Typecho-Theme-RAW&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://blog.imalan.cn/usr/uploads/2018/12/805561084.png#vwid=1910&amp;amp;vhei=895"
loading="lazy"
>&lt;/p>
&lt;h2 id="10-hufman">&lt;a href="#10-hufman" class="header-anchor">&lt;/a>10. &lt;a class="link" href="https://github.com/foxnes/tp_theme" target="_blank" rel="noopener"
>hufman&lt;/a>
&lt;/h2>&lt;p>&lt;img src="https://user-images.githubusercontent.com/22344037/57577796-760b5b80-74b1-11e9-8475-b18e17371f31.jpg"
loading="lazy"
>&lt;/p></description></item><item><title>百度云虚拟主机BCH + Typecho的一些坑</title><link>https://kizx.github.io/post/%E7%99%BE%E5%BA%A6%E4%BA%91%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BAbch-+-typecho%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</link><pubDate>Fri, 13 Sep 2019 17:31:00 +0000</pubDate><guid>https://kizx.github.io/post/%E7%99%BE%E5%BA%A6%E4%BA%91%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BAbch-+-typecho%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</guid><description>&lt;h2 id="1-ssl配置">&lt;a href="#1-ssl%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>1. SSL配置
&lt;/h2>&lt;p>默认情况下使用SSL浏览器会提示有危险加载项，而且后台也进不去，这时只需要在后台将在目录下的 &lt;code>config.inc.php&lt;/code>文件中添加一下代码即可一切正常&lt;/p>
&lt;pre tabindex="0">&lt;code>/** 开启HTTPS */
define(&amp;#39;__TYPECHO_SECURE__&amp;#39;,true);
&lt;/code>&lt;/pre>&lt;h2 id="2-只显示首页">&lt;a href="#2-%e5%8f%aa%e6%98%be%e7%a4%ba%e9%a6%96%e9%a1%b5" class="header-anchor">&lt;/a>2. 只显示首页
&lt;/h2>&lt;ul>
&lt;li>这个问题比较蛋疼，只有首页和后台可以显示，文章页和其他页面无法显示，点击任何文章或其他链接都只会显示首页，刚开始我还以为是安装过程出错，来回重装了好几次都还是这样，经过大量搜索查阅，都说是当前php不支持pathinfo的缘故，但我发现只要把设置里的永久链接自定义文章路径改成除默认路径以外的路径，点击文章就能够正常打开文章页了。&lt;/li>
&lt;li>但问题是文章是可以显示了，还有其他页面比如下一页和分类页面还是无法跳转啊，于是我又继续研读了百度云虚拟主机的官方文档，在尝试了网上各种设置后均失败了。但经过大量尝试发现应该是网址中只要出现index.php就无法正常跳转，于是我灵机一动如果设置伪静态rewrite是不是就可以了，结果尝试了一下果然可以。设置也很简单，在后台开启地址重写，然后ftp登录网站空间，在webroot下新建bcloud_nginx_user.conf文件，并写入以下代码即可：&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
&lt;/code>&lt;/pre>&lt;h2 id="参考">&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor">&lt;/a>参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/enweitech/article/details/75108048" target="_blank" rel="noopener"
>https://blog.csdn.net/enweitech/article/details/75108048&lt;/a>&lt;/p></description></item><item><title>OpenCV + Visual Studio2017 配置</title><link>https://kizx.github.io/post/opencv-+-visual-studio2017-%E9%85%8D%E7%BD%AE/</link><pubDate>Wed, 11 Sep 2019 17:25:00 +0000</pubDate><guid>https://kizx.github.io/post/opencv-+-visual-studio2017-%E9%85%8D%E7%BD%AE/</guid><description>&lt;h2 id="1-下载安装opencv并添加环境变量">&lt;a href="#1-%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85opencv%e5%b9%b6%e6%b7%bb%e5%8a%a0%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f" class="header-anchor">&lt;/a>1. 下载安装OpenCV并添加环境变量
&lt;/h2>&lt;p>下载地址：https://opencv.org/releases/
安装参考：http://c.biancheng.net/view/1104.html
我安装的是Opencv4.1.1版本，然后管理员cmd命令添加环境变量，其实不用命令手动添加也行,不过这一步似乎不是必须的，但可能会与某些步骤有关联。
&lt;code>setx -m OPENCV_DIR C:\opencv\build\x64\vc15&lt;/code>
&lt;img src="https://pan.2bboy.com/img/2019/10/3652238186.png"
loading="lazy"
>
&lt;img src="https://pan.2bboy.com/img/2019/10/4000912026.png"
loading="lazy"
>
然后添加以下OpenCV环境变量到PATH中，VS2017应该对应的是vc15，不过都加进去也不会出错。路径直接填%OPENCV_DIR%\bin也行。
&lt;code>C:\opencv\build\x64\vc14\bin&lt;/code>
&lt;code>C:\opencv\build\x64\vc15\bin&lt;/code>&lt;/p>
&lt;h2 id="2-新建工程">&lt;a href="#2-%e6%96%b0%e5%bb%ba%e5%b7%a5%e7%a8%8b" class="header-anchor">&lt;/a>2. 新建工程
&lt;/h2>&lt;p>打开vs2017，新建控制台程序，将系统平台改成64位，在项目上右键属性配置下列项目&lt;/p>
&lt;ul>
&lt;li>
&lt;p>点击VC++目录-&amp;gt;包含目录，添加include文件夹目录
&lt;img src="https://pan.2bboy.com/img/2019/10/20190912174155.png"
loading="lazy"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>点击VC++目录-&amp;gt;库目录，添加lib文件夹目录
&lt;img src="https://pan.2bboy.com/img/2019/10/20190912174251.png"
loading="lazy"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>点击链接库-&amp;gt;输入-&amp;gt;附加项，添加lib，其中opencv_world411d.lib为debug模式用的，opencv_world411.lib为release模式用的，都可以在lib文件夹下找到
&lt;img src="https://pan.2bboy.com/img/2019/10/20190912174625.png"
loading="lazy"
>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="3-测试代码">&lt;a href="#3-%e6%b5%8b%e8%af%95%e4%bb%a3%e7%a0%81" class="header-anchor">&lt;/a>3. 测试代码
&lt;/h2>&lt;p>打开一张图片进行测试&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;opencv2/core.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;opencv2/highgui.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> cv;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Mat img &lt;span style="color:#f92672">=&lt;/span> imread(&lt;span style="color:#e6db74">&amp;#34;C:&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">Users&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">ZXIN&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">Desktop&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">cv&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">001.png&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> imshow(&lt;span style="color:#e6db74">&amp;#34;001&amp;#34;&lt;/span>, img);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> waitKey(&lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>OpenCV + Anaconda + VSCode 配置</title><link>https://kizx.github.io/post/opencv-+-anaconda-+-vscode-%E9%85%8D%E7%BD%AE/</link><pubDate>Wed, 11 Sep 2019 08:23:00 +0000</pubDate><guid>https://kizx.github.io/post/opencv-+-anaconda-+-vscode-%E9%85%8D%E7%BD%AE/</guid><description>&lt;p>我这个搭配有点奇怪，但是顺手最重要嘛，先收藏几个教程
&lt;a class="link" href="http://c.biancheng.net/opencv/" target="_blank" rel="noopener"
>OpenCV教程&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>下载安装OpenCV
&lt;a class="link" href="https://opencv.org/releases/" target="_blank" rel="noopener"
>https://opencv.org/releases/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>下载安装Anaconda
&lt;a class="link" href="https://www.anaconda.com/distribution/" target="_blank" rel="noopener"
>https://www.anaconda.com/distribution/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配置文件
如果都是默认安装路径的话，将&lt;code>C:\opencv\build\python\cv2\python-3.7\cv2.cp37-win_amd64.pyd&lt;/code>复制到&lt;code>C:\Users\ZXIN\Anaconda3\Lib&lt;/code>目录下&lt;/p>
&lt;/li>
&lt;li>
&lt;p>新建测试文件
打开VSCode，将左下角Python运行环境切换到Anaconda的Python解释器，敲入一下测试代码：&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> cv2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>img &lt;span style="color:#f92672">=&lt;/span> cv2&lt;span style="color:#f92672">.&lt;/span>imread(&lt;span style="color:#e6db74">&amp;#34;001.png&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cv2&lt;span style="color:#f92672">.&lt;/span>imshow(&lt;span style="color:#e6db74">&amp;#34;Image&amp;#34;&lt;/span>, img)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cv2&lt;span style="color:#f92672">.&lt;/span>waitKey(&lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cv2&lt;span style="color:#f92672">.&lt;/span>destroyAllWindows()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Hexo、WordPress、Zblog、Typecho比较</title><link>https://kizx.github.io/post/hexowordpresszblogtypecho%E6%AF%94%E8%BE%83/</link><pubDate>Fri, 06 Sep 2019 18:22:00 +0000</pubDate><guid>https://kizx.github.io/post/hexowordpresszblogtypecho%E6%AF%94%E8%BE%83/</guid><description>&lt;h2 id="总览">&lt;a href="#%e6%80%bb%e8%a7%88" class="header-anchor">&lt;/a>总览
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>方案&lt;/th>
&lt;th style="text-align: center">Hexo&lt;/th>
&lt;th style="text-align: center">WordPress&lt;/th>
&lt;th style="text-align: center">Zblog&lt;/th>
&lt;th style="text-align: center">Typecho&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>静态&lt;/td>
&lt;td style="text-align: center">是&lt;/td>
&lt;td style="text-align: center">否&lt;/td>
&lt;td style="text-align: center">否&lt;/td>
&lt;td style="text-align: center">否&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>后台&lt;/td>
&lt;td style="text-align: center">无&lt;/td>
&lt;td style="text-align: center">有&lt;/td>
&lt;td style="text-align: center">有&lt;/td>
&lt;td style="text-align: center">有&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>源生Markdown&lt;/td>
&lt;td style="text-align: center">是&lt;/td>
&lt;td style="text-align: center">否&lt;/td>
&lt;td style="text-align: center">否&lt;/td>
&lt;td style="text-align: center">是&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作简单&lt;/td>
&lt;td style="text-align: center">☆&lt;/td>
&lt;td style="text-align: center">☆☆&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>主题美观&lt;/td>
&lt;td style="text-align: center">☆☆☆☆&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;td style="text-align: center">☆☆&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>风格简洁&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;td style="text-align: center">☆&lt;/td>
&lt;td style="text-align: center">☆☆☆&lt;/td>
&lt;td style="text-align: center">☆☆☆☆&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="评价">&lt;a href="#%e8%af%84%e4%bb%b7" class="header-anchor">&lt;/a>评价
&lt;/h2>&lt;ul>
&lt;li>
&lt;p>Hexo所有数据都在本地操作，操作完后本地生成静态页面，然后再通过git或者ftp部署上传到服务器空间，但是我试了官方的ftp插件根本就用不了，只能借助第三方的ftp工具或插件，而且上传速度还贼慢，故不建议ftp到服务器上。优点是完全静态的，故不需要数据库和任何语言运行环境，所以可以部署到github或者coding这样的免费数据托管空间。虽然Hexo对服务器的要求最低，但在本地的操作有点繁琐，需要敲一些代码，很有极客范。Hexo的主题大部分都是免费的，不乏很多漂亮的主题，&lt;a class="link" href="https://www.2bboy.com/archives/7.html" target="_blank" rel="noopener"
>我的Hexo主题搜集&lt;/a>，Hexo的主题很时髦精致。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>WordPress作为使用最广泛的建站方案，东西最多也最全，但这也造成其自身的臃肿，安装包有好几十兆，后台的操作也不是特别简洁好懂，对于追求简洁的人来说，WordPress并不是最好选择。WordPress的主题很多，但要想找到一个合适的主题并不容易，&lt;a class="link" href="https://www.2bboy.com/archives/8.html" target="_blank" rel="noopener"
>我的WordPress主题搜集&lt;/a>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Zblog在使用上和WordPress差不多，但是后台要更简洁明了，本身的体积也比WordPress小得多，只有几兆，运行效率据说也快得多，主题虽然不多但也很多不错的选择，而且Zblog的主题给人一种简洁感，&lt;a class="link" href="https://www.2bboy.com/archives/9.html" target="_blank" rel="noopener"
>我的Zblog主题搜集&lt;/a>，Zblog的主题多偏向于扁平风格，不追求更多功能时在我看来是比WordPress更好地选择。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>说到简介，Typecho显然更胜一筹，安装包只有几百kb大小，后台也简洁到没有一处多余功能，Typecho的主题大都也继承这种简洁风格，可供选择主题的主题还算是蛮多的，&lt;a class="link" href="https://www.2bboy.com/archives/16.html" target="_blank" rel="noopener"
>我的Typecho主题搜集&lt;/a>，虽然简洁但也是五脏俱全，如果能懂一点网页编程的话就能更好的改造出适合自己的主题了。&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>Zblog主题推荐</title><link>https://kizx.github.io/post/zblog%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</link><pubDate>Fri, 06 Sep 2019 17:20:00 +0000</pubDate><guid>https://kizx.github.io/post/zblog%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</guid><description>&lt;h1 id="zblog主题推荐">&lt;a href="#zblog%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>Zblog主题推荐
&lt;/h1>&lt;h2 id="1-filmlee">&lt;a href="#1-filmlee" class="header-anchor">&lt;/a>1. filmlee
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.talklee.com/blog/162.html" target="_blank" rel="noopener"
>https://www.talklee.com/blog/162.html&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907014938.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="2-免费博客主题blogs">&lt;a href="#2-%e5%85%8d%e8%b4%b9%e5%8d%9a%e5%ae%a2%e4%b8%bb%e9%a2%98blogs" class="header-anchor">&lt;/a>2. 免费博客主题Blogs
&lt;/h2>&lt;p>&lt;a class="link" href="https://app.zblogcn.com/?id=1405" target="_blank" rel="noopener"
>https://app.zblogcn.com/?id=1405&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907015136.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="3-奇客">&lt;a href="#3-%e5%a5%87%e5%ae%a2" class="header-anchor">&lt;/a>3. 奇客
&lt;/h2>&lt;p>&lt;a class="link" href="http://jiuwanwl.com/post/81.html" target="_blank" rel="noopener"
>http://jiuwanwl.com/post/81.html&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907015331.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="4-博客cms图片布局三合一主题">&lt;a href="#4-%e5%8d%9a%e5%ae%a2cms%e5%9b%be%e7%89%87%e5%b8%83%e5%b1%80%e4%b8%89%e5%90%88%e4%b8%80%e4%b8%bb%e9%a2%98" class="header-anchor">&lt;/a>4. 博客CMS图片布局三合一主题
&lt;/h2>&lt;p>&lt;a class="link" href="https://app.zblogcn.com/?id=1326" target="_blank" rel="noopener"
>https://app.zblogcn.com/?id=1326&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907015516.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="5-业余爱好">&lt;a href="#5-%e4%b8%9a%e4%bd%99%e7%88%b1%e5%a5%bd" class="header-anchor">&lt;/a>5. 业余爱好
&lt;/h2>&lt;p>&lt;a class="link" href="https://app.zblogcn.com/?id=494" target="_blank" rel="noopener"
>https://app.zblogcn.com/?id=494&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907020019.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="6-博客模板">&lt;a href="#6-%e5%8d%9a%e5%ae%a2%e6%a8%a1%e6%9d%bf" class="header-anchor">&lt;/a>6. 博客模板
&lt;/h2>&lt;p>&lt;a class="link" href="https://app.zblogcn.com/?id=1168" target="_blank" rel="noopener"
>https://app.zblogcn.com/?id=1168&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907020306.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="7-简单格子列表主题">&lt;a href="#7-%e7%ae%80%e5%8d%95%e6%a0%bc%e5%ad%90%e5%88%97%e8%a1%a8%e4%b8%bb%e9%a2%98" class="header-anchor">&lt;/a>7. 简单格子列表主题
&lt;/h2>&lt;p>&lt;a class="link" href="https://app.zblogcn.com/?id=877" target="_blank" rel="noopener"
>https://app.zblogcn.com/?id=877&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907020425.png"
loading="lazy"
>&lt;/p></description></item><item><title>WordPress主题推荐</title><link>https://kizx.github.io/post/wordpress%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</link><pubDate>Thu, 05 Sep 2019 17:19:00 +0000</pubDate><guid>https://kizx.github.io/post/wordpress%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</guid><description>&lt;h1 id="wordpress主题推荐">&lt;a href="#wordpress%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>WordPress主题推荐
&lt;/h1>&lt;h2 id="1-dobby">&lt;a href="#1-dobby" class="header-anchor">&lt;/a>1. Dobby
&lt;/h2>&lt;p>Download: &lt;a class="link" href="https://github.com/Vtrois/Dobby" target="_blank" rel="noopener"
>https://github.com/Vtrois/Dobby&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907010136.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="2-git">&lt;a href="#2-git" class="header-anchor">&lt;/a>2. Git
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://gitcafe.net/" target="_blank" rel="noopener"
>https://gitcafe.net/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://gitee.com/yunluo/git" target="_blank" rel="noopener"
>https://gitee.com/yunluo/git&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907010317.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="3-h-siren">&lt;a href="#3-h-siren" class="header-anchor">&lt;/a>3. H-Siren
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://haremu.com/" target="_blank" rel="noopener"
>https://haremu.com/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://github.com/galnetwen/H-Siren" target="_blank" rel="noopener"
>https://github.com/galnetwen/H-Siren&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907010848.png"
loading="lazy"
>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907010921.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="4-kratos-pjax">&lt;a href="#4-kratos-pjax" class="header-anchor">&lt;/a>4. Kratos-pjax
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://moedog.org/787.html" target="_blank" rel="noopener"
>https://moedog.org/787.html&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://github.com/xb2016/kratos-pjax" target="_blank" rel="noopener"
>https://github.com/xb2016/kratos-pjax&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907011115.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="5-lolimoe">&lt;a href="#5-lolimoe" class="header-anchor">&lt;/a>5. lolimoe
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://www.boxmoe.com/" target="_blank" rel="noopener"
>https://www.boxmoe.com/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://github.com/baomihuahua/lolimeow" target="_blank" rel="noopener"
>https://github.com/baomihuahua/lolimeow&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907011322.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="6-sakura">&lt;a href="#6-sakura" class="header-anchor">&lt;/a>6. Sakura
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://2heng.xin/" target="_blank" rel="noopener"
>https://2heng.xin/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://github.com/mashirozx/Sakura" target="_blank" rel="noopener"
>https://github.com/mashirozx/Sakura&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907011544.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="7-memory">&lt;a href="#7-memory" class="header-anchor">&lt;/a>7. Memory
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="http://memory.shawnzeng.com/" target="_blank" rel="noopener"
>http://memory.shawnzeng.com/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://shawnzeng.com/wordpress-theme-memory.html" target="_blank" rel="noopener"
>https://shawnzeng.com/wordpress-theme-memory.html&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907012530.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="8-amativeness">&lt;a href="#8-amativeness" class="header-anchor">&lt;/a>8. Amativeness
&lt;/h2>&lt;p>Demo: &lt;a class="link" href="https://diygod.me/" target="_blank" rel="noopener"
>https://diygod.me/&lt;/a>&lt;br>
Download: &lt;a class="link" href="https://github.com/DIYgod/Amativeness" target="_blank" rel="noopener"
>https://github.com/DIYgod/Amativeness&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907013129.png"
loading="lazy"
>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907013155.png"
loading="lazy"
>&lt;/p></description></item><item><title>Hexo主题推荐</title><link>https://kizx.github.io/post/hexo%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</link><pubDate>Tue, 03 Sep 2019 17:18:00 +0000</pubDate><guid>https://kizx.github.io/post/hexo%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90/</guid><description>&lt;h1 id="hexo主题推荐">&lt;a href="#hexo%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="header-anchor">&lt;/a>Hexo主题推荐
&lt;/h1>&lt;h2 id="双栏">&lt;a href="#%e5%8f%8c%e6%a0%8f" class="header-anchor">&lt;/a>双栏
&lt;/h2>&lt;h3 id="1-a-ace">&lt;a href="#1-a-ace" class="header-anchor">&lt;/a>1. A-ACE
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://www.sumoon.com/" target="_blank" rel="noopener"
>http://www.sumoon.com/&lt;/a>&lt;/li>
&lt;li>Download：https://github.com/kinggozhang/hexo-theme-ace&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906005021.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="2-aria">&lt;a href="#2-aria" class="header-anchor">&lt;/a>2. ARIA
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://sh.alynx.moe/" target="_blank" rel="noopener"
>https://sh.alynx.moe/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/AlynxZhou/hexo-theme-aria/blob/master/README.zh_CN.md" target="_blank" rel="noopener"
>https://github.com/AlynxZhou/hexo-theme-aria/blob/master/README.zh_CN.md&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906005101.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="3-asnippet">&lt;a href="#3-asnippet" class="header-anchor">&lt;/a>3. Asnippet
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://www.91h5.cc/" target="_blank" rel="noopener"
>https://www.91h5.cc/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/shenliyang/hexo-theme-snippet" target="_blank" rel="noopener"
>https://github.com/shenliyang/hexo-theme-snippet&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190904211757.jpg"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="4-jacman">&lt;a href="#4-jacman" class="header-anchor">&lt;/a>4. Jacman
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://wuchong.me/jacman/" target="_blank" rel="noopener"
>http://wuchong.me/jacman/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/wuchong/jacman/blob/master/README_zh.md" target="_blank" rel="noopener"
>https://github.com/wuchong/jacman/blob/master/README_zh.md&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190904212308.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="5-gal">&lt;a href="#5-gal" class="header-anchor">&lt;/a>5. gal
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://sora3.coding.me/" target="_blank" rel="noopener"
>http://sora3.coding.me/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/ZEROKISEKI/hexo-theme-gal" target="_blank" rel="noopener"
>https://github.com/ZEROKISEKI/hexo-theme-gal&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190904212938.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="6-nexmoe">&lt;a href="#6-nexmoe" class="header-anchor">&lt;/a>6. Nexmoe
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://nexmoe.com/" target="_blank" rel="noopener"
>https://nexmoe.com/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://nexmoe.com/371865617.html" target="_blank" rel="noopener"
>https://nexmoe.com/371865617.html&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906005133.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="7-sakura">&lt;a href="#7-sakura" class="header-anchor">&lt;/a>7. Sakura
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://sakura.hojun.cn/" target="_blank" rel="noopener"
>https://sakura.hojun.cn/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/honjun/hexo-theme-sakura/blob/master/README-zh_cn.md" target="_blank" rel="noopener"
>https://github.com/honjun/hexo-theme-sakura/blob/master/README-zh_cn.md&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906005218.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="8-diaspora">&lt;a href="#8-diaspora" class="header-anchor">&lt;/a>8. Diaspora
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://fech.in/" target="_blank" rel="noopener"
>http://fech.in/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/Fechin/hexo-theme-diaspora" target="_blank" rel="noopener"
>https://github.com/Fechin/hexo-theme-diaspora&lt;/a>&lt;br>
&lt;img src="https://camo.githubusercontent.com/2a90d0266d4d54e618c7cbb46af683174f37347c/68747470733a2f2f666563682e696e2f7374617469632f696d616765732f44696173706f72612e6a7067"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h2 id="卡片式">&lt;a href="#%e5%8d%a1%e7%89%87%e5%bc%8f" class="header-anchor">&lt;/a>卡片式
&lt;/h2>&lt;h3 id="1-skapp">&lt;a href="#1-skapp" class="header-anchor">&lt;/a>1. skapp
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://blog.minfive.com/" target="_blank" rel="noopener"
>http://blog.minfive.com/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/Mrminfive/hexo-theme-skapp/blob/master/README-cn.md" target="_blank" rel="noopener"
>https://github.com/Mrminfive/hexo-theme-skapp/blob/master/README-cn.md&lt;/a>&lt;br>
&lt;img src="https://camo.githubusercontent.com/8fb49fe91a647fdf7d073a28789fbbad2724cf41/687474703a2f2f626c6f672e7374617469632e6d696e666976652e636f6d2f6f746865722f536b6170702e706e67"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="2-flex-block">&lt;a href="#2-flex-block" class="header-anchor">&lt;/a>2. flex-block
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://miiiku.xyz/" target="_blank" rel="noopener"
>https://miiiku.xyz/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/miiiku/flex-block" target="_blank" rel="noopener"
>https://github.com/miiiku/flex-block&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190904214141.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="3-matery">&lt;a href="#3-matery" class="header-anchor">&lt;/a>3. Matery
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://blinkfox.github.io" target="_blank" rel="noopener"
>https://blinkfox.github.io&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://blinkfox.github.io/2018/09/28/qian-duan/hexo-bo-ke-zhu-ti-zhi-hexo-theme-matery-de-jie-shao/" target="_blank" rel="noopener"
>https://blinkfox.github.io/2018/09/28/qian-duan/hexo-bo-ke-zhu-ti-zhi-hexo-theme-matery-de-jie-shao/&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10//matery-20181202-3.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="4-hueman">&lt;a href="#4-hueman" class="header-anchor">&lt;/a>4. Hueman
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://blog.zhangruipeng.me/hexo-theme-hueman/" target="_blank" rel="noopener"
>https://blog.zhangruipeng.me/hexo-theme-hueman/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/ppoffice/hexo-theme-hueman" target="_blank" rel="noopener"
>https://github.com/ppoffice/hexo-theme-hueman&lt;/a>&lt;br>
&lt;img src="https://camo.githubusercontent.com/0902c896a283714f7a795338dbfeca67092e9b02/687474703a2f2f70706f66666963652e6769746875622e696f2f6865786f2d7468656d652d6875656d616e2f67616c6c6572792f73637265656e73686f742e6a7067"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="5-material-flow">&lt;a href="#5-material-flow" class="header-anchor">&lt;/a>5. Material Flow
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="https://kntan.coding.me/kntan/" target="_blank" rel="noopener"
>https://kntan.coding.me/kntan/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com/stkevintan/hexo-theme-material-flow" target="_blank" rel="noopener"
>https://github.com/stkevintan/hexo-theme-material-flow&lt;/a>&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906005257.png"
loading="lazy"
>&lt;/li>
&lt;/ul>
&lt;h3 id="6-mic">&lt;a href="#6-mic" class="header-anchor">&lt;/a>6. Mic
&lt;/h3>&lt;ul>
&lt;li>Demo: &lt;a class="link" href="http://miccall.tech/" target="_blank" rel="noopener"
>http://miccall.tech/&lt;/a>&lt;/li>
&lt;li>Download: &lt;a class="link" href="https://github.com" target="_blank" rel="noopener"
>https://github.com&lt;/a>、miccall/hexo-theme-Mic_Theme&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190906002802.png"
loading="lazy"
>&lt;/li>
&lt;/ul></description></item><item><title>Python酷Q应用开发</title><link>https://kizx.github.io/post/python%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</link><pubDate>Tue, 03 Sep 2019 16:59:00 +0000</pubDate><guid>https://kizx.github.io/post/python%E9%85%B7q%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/</guid><description>&lt;h2 id="前言">&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor">&lt;/a>前言
&lt;/h2>&lt;ul>
&lt;li>酷Q机器人应用一般都是用易语言开发的，但是一方面不想再多学一门易语言，另一方面开发脚本还是用Python比较舒服。关于Python的酷Q的SDK我在论坛找了一下，目前用的比较多的有两个（现在应该是三个了，见文末），一个是基于http的none-bot，功能更强大，但上手有一定难度，所以最简单的我觉得还是慕晓飞大大的 &lt;a class="link" href="https://gitee.com/muxiaofei/coolq_sdk_x/wikis/pages?sort_id=1415025&amp;amp;doc_id=287242" target="_blank" rel="noopener"
>&lt;strong>Python酷Q_SDK_X&lt;/strong>&lt;/a>&lt;/li>
&lt;li>本站更多关于酷Q的文章：&lt;a class="link" href="https://www.2bboy.com/tag/coolq/" target="_blank" rel="noopener"
>点我&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="环境配置">&lt;a href="#%e7%8e%af%e5%a2%83%e9%85%8d%e7%bd%ae" class="header-anchor">&lt;/a>环境配置
&lt;/h2>&lt;p>首先需要按照文档的说明配置开发环境，这点文档讲的很详细，就不赘述了，需要注意的是：&lt;/p>
&lt;ol>
&lt;li>酷Q本身是32位程序，开发时只支持32位的Python。&lt;/li>
&lt;li>还有一点就是app_id应该按照官方规范来，否则可能会出问题，&lt;a class="link" href="https://docs.cqp.im/dev/v9/appid/" target="_blank" rel="noopener"
>&lt;strong>规范说明&lt;/strong>&lt;/a>。&lt;/li>
&lt;li>酷Q升级后开发环境的目录移动至酷Q的dev目录下，如果酷Q没有自动更正的话请手动更正。更正方法为，在dev目录下新建cn.muxiaofei.coolq_sdk_x文件夹，将原来的cn.muxiaofei.coolq_sdk_x.dll和cn.muxiaofei.coolq_sdk_x.json重命名为app.dll和app.json移动至新建的文件夹下，其他不变。&lt;/li>
&lt;/ol>
&lt;p>配置完环境，如果不出意外的话，应该就能在酷Q日志的DEBUG里看到输出的hello world。&lt;/p>
&lt;h2 id="编写程序">&lt;a href="#%e7%bc%96%e5%86%99%e7%a8%8b%e5%ba%8f" class="header-anchor">&lt;/a>编写程序
&lt;/h2>&lt;ul>
&lt;li>接下来就是敲自己的代码了，这个SDK的所有事件处理和API调用都在&lt;em>CQPlusHandler.py&lt;/em>文件的?&lt;em>MainHandler&lt;/em>类中进行编写，关于事件和参数的说明在开发文档中都有说明，API可以通过输入&lt;em>self.api&lt;/em>的代码提示进行查看，也可以转到一个_api.py的文件中查看，至于这些API函数和参数的意义基本上看名字就能猜到八九分了，具体使用方法需要自己去尝试。&lt;/li>
&lt;li>新手需要注意的是这个&lt;em>CQPlusHandler.py&lt;/em>程序是由酷Q软件自动执行的，不需要在Python的IDE里点运行，当然你点了也没用，如果setting里的DEBUG参数你没改的话，只要修改代码并保存，修改的代码就会实时生效。&lt;/li>
&lt;li>然后需要说明的就是@和表情，这个需要使用CQ码，&lt;a class="link" href="https://docs.cqp.im/manual/cqcode/" target="_blank" rel="noopener"
>&lt;strong>CQ码详细介绍&lt;/strong>&lt;/a>。但一般只需在QQ中发一条包含@或表情的消息，然后通过酷Q的日志就能直接进行右键复制了，复制后只需将相应的格式通过字符串的格式和普通消息一样输出就行了。&lt;/li>
&lt;li>举个例子，在&lt;em>CQPlusHandler.py&lt;/em>文件中写入以下代码就能实现在群聊里复读并@发言的人的功能：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -*- coding:utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> cqplus
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MainHandler&lt;/span>(cqplus&lt;span style="color:#f92672">.&lt;/span>CQPlusHandler):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">handle_event&lt;/span>(self, event, params):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> event &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;on_group_msg&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> msg &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;[CQ:at,qq=&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> str(params[&lt;span style="color:#e6db74">&amp;#39;from_qq&amp;#39;&lt;/span>]) &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#39;]&amp;#39;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> params[&lt;span style="color:#e6db74">&amp;#39;msg&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>api&lt;span style="color:#f92672">.&lt;/span>send_group_msg(params[&lt;span style="color:#e6db74">&amp;#39;from_group&amp;#39;&lt;/span>], msg)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="案例">&lt;a href="#%e6%a1%88%e4%be%8b" class="header-anchor">&lt;/a>案例
&lt;/h2>&lt;ul>
&lt;li>然后下面是我根据需求给群友写的一个自助Roll游戏的插件，和论坛上我能找到的抽奖插件相比，这个插件的特点在于完全由qq消息进行命令，可以直接丢到服务器上就不用管了，另一个特点是可以同时进行多个Roll游戏活动而互不干扰，以下是一个使用案例。这个应用其实还有一些功能我想过但还没加进去，以后根据需要有时间再看看吧，我把我写的垃圾代码放在了GitHub上，希望可以给有需要的人一点有价值的参考：&lt;a class="link" href="https://github.com/kizx/coolq-rollgames-bot" target="_blank" rel="noopener"
>&lt;strong>Github链接&lt;/strong>&lt;/a>
&lt;img src="https://pan.2bboy.com/img/2019/10/roll_game.jpg"
loading="lazy"
alt="案例"
>&lt;/li>
&lt;/ul>
&lt;h2 id="已知问题">&lt;a href="#%e5%b7%b2%e7%9f%a5%e9%97%ae%e9%a2%98" class="header-anchor">&lt;/a>已知问题
&lt;/h2>&lt;h3 id="打包">&lt;a href="#%e6%89%93%e5%8c%85" class="header-anchor">&lt;/a>打包
&lt;/h3>&lt;ul>
&lt;li>最后就是应用的打包，直接使用打包生成的cpk文件会报错，需要像开发应用一样配置好环境并把源程序也放进去，唯一的差别就在于可以不用进入酷Q的开发者模式，所以要丢到服务器上的话，还有一丢丢的麻烦。由于Python的SDK的特性，编写的插件就不能像论坛上别的插件一样只发布cpk文件即可，而且使用者还需配置环境，对于普通用户来说过于麻烦了，所以这个还是只适合开发者自己使用。&lt;/li>
&lt;/ul>
&lt;h3 id="消息并发处理">&lt;a href="#%e6%b6%88%e6%81%af%e5%b9%b6%e5%8f%91%e5%a4%84%e7%90%86" class="header-anchor">&lt;/a>消息并发处理
&lt;/h3>&lt;ul>
&lt;li>由于Python的GLI锁机制，本插件不支持并发处理。表现为有事件发生时，比如各种消息和定时器事件，插件便会调用一次&lt;em>CQPlusHandler.py&lt;/em>进行事件处理，所以当上一次事件还未处理完时，下一个事件又紧接着发，这时便会发生内存报错。虽然报错了程序并不会崩溃，不过如果程序要处理网络请求一类的耗时任务，这个缺陷是致命的。要想避免这种报错，只在&lt;em>CQPlusHandler.py&lt;/em>文件里下功夫（比如用多线程）应该是不行的，估计得从源码上想想办法才行。不过我的机器人不需要处理大量消息，消息处理的也很快，所以凑合用用也还行。&lt;/li>
&lt;li>后来有大神重新写了个支持并发的&lt;a class="link" href="https://github.com/crud-boy/cqp-sdk-for-py37-native" target="_blank" rel="noopener"
>python SDK&lt;/a>，现在也更推荐使用这个或者更高级的nonebot。&lt;/li>
&lt;/ul></description></item><item><title>零基础不花一分钱建站之WordPress篇</title><link>https://kizx.github.io/post/%E9%9B%B6%E5%9F%BA%E7%A1%80%E4%B8%8D%E8%8A%B1%E4%B8%80%E5%88%86%E9%92%B1%E5%BB%BA%E7%AB%99%E4%B9%8Bwordpress%E7%AF%87/</link><pubDate>Sat, 17 Aug 2019 17:17:00 +0000</pubDate><guid>https://kizx.github.io/post/%E9%9B%B6%E5%9F%BA%E7%A1%80%E4%B8%8D%E8%8A%B1%E4%B8%80%E5%88%86%E9%92%B1%E5%BB%BA%E7%AB%99%E4%B9%8Bwordpress%E7%AF%87/</guid><description>&lt;h2 id="前言">&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor">&lt;/a>前言
&lt;/h2>&lt;p>最近懒癌犯了，本来应该紧接着上一个hexo篇写的，这样也好做一个对比，但长时间不操作我也有点忘了，赶紧靠着仅存的记忆记一下wp建站的操作。&lt;/p>
&lt;p>比起hexo建站，wp在操作上可以说是很简单了，但wp的功能和可玩性比hexo更强，毕竟是应用最广泛的建站方案，其主题数量和应用范围远远超过hexo，除了博客网站，各种新闻、商店、图片等网站也大量使用wp。&lt;/p>
&lt;p>本篇主题为零基础不花一分钱建站，建站需要两样东西：主机空间和域名。我这里的不花一分钱主要指免费的主机空间，主机空间一般都有临时域名可以拿来用用，所以买域名的钱我就不算了，而且最便宜的域名也只要1块钱，也不算贵。&lt;/p>
&lt;h2 id="方案一coding一键部署方案">&lt;a href="#%e6%96%b9%e6%a1%88%e4%b8%80coding%e4%b8%80%e9%94%ae%e9%83%a8%e7%bd%b2%e6%96%b9%e6%a1%88" class="header-anchor">&lt;/a>方案一：coding一键部署方案
&lt;/h2>&lt;p>没错还是hexo里用到的那个coding，依赖于腾讯的在线云平台cloud studio实现免费的主机空间，只需两步即可款速实现一键部署wp。&lt;/p>
&lt;p>&lt;a class="link" href="https://dev.tencent.com/help/cloud-studio/one-click-deploy#i-4" target="_blank" rel="noopener"
>这是官方使用指南&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>第一步进入cloud studio从模板新建一个wordpress工作空间&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907022353.png"
loading="lazy"
alt="新建工作空间"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>第二步进入工作空间打开右侧的一键部署，点击一键部署，部署完毕后点击打开测试域名就进入到下图所示的wp的初始化界面了，然后填写相应信息网站即创建成功，数据库的信息在一键部署的资源面板里可以查到，注意信息不能填错了。&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907022418.png"
loading="lazy"
alt="欢迎界面"
>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>第二步补充，如果信息怎么填都不对的话，可以试试主动修改主目录下的wp-config-sample.php文件其中的四个参数，注意主机要填写 mysql.coding.io，填写好后另存为wp-config.php文件即可。&lt;br>
建议采用补充的方法，这样每次重新部署时就不需要重新再填一遍信息了，不过要注意相应的仓库不能公开，不然别人就知道你的数据库了。&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907022443.png"
loading="lazy"
alt="手动填写"
>&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>第三步，如果你有域名的话，可以为域名添加解析，然后在一键部署面板里添加域名绑定，这样就可以用域名来访问网站了，添加解析的操作具体看官方指南这里略过。&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>评价&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>优点：操作简单无脑，在线操作不需要下载上传任何文件，只要cloud stidio不关门应该就能一直用，而且由于coding是香港服务器访问速度也比较快。&lt;/li>
&lt;li>缺点：免费必然有限制，coding默认模板的wp版本较低且为英文版，没有中文，而且coding一键部署的网站不能连接外网，导致wp不能更新，更不能在线下载主题和插件，想要更新wp版本和安装主题只能单独下载新版本wp和自己喜欢的主题，然后自己在coding上新开一个仓库把自己下载解压后的wp和主题push到仓库中，然后以这个仓库为模板新建一个php环境的工作空间进行一键部署，还是比较麻烦的。&lt;/li>
&lt;/ul>&lt;/blockquote>&lt;/blockquote>
&lt;h2 id="方案二免费的网站服务器">&lt;a href="#%e6%96%b9%e6%a1%88%e4%ba%8c%e5%85%8d%e8%b4%b9%e7%9a%84%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor">&lt;/a>方案二：免费的网站服务器
&lt;/h2>&lt;p>虽然coding的一键部署很方便，但是还是有很多的限制，不如白嫖一个服务器来的实在，哎这里并不是在打广告，我之前找到一个叫强人网络的服务商，可以白嫖一年的网站服务器，凑合着玩玩还是相当不错的。注意这是真的免费而不是像国内有些服务商打着免费的旗号骗注册然后发现要免费使用还要帮它宣传，实在是太恶心了。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>第一步：从wordpress官网下载最新安装包，上传到主机上，我白嫖的这个服务器有自己的控制台，所以连ftp都省了，直接从网页控制台上传压缩包然后在线解压就成了。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>第二步：进入服务商提供的临时域名，后面就和方案一没差了，填写相关信息完成网站初始化，相关信息服务商应该会发邮件给你。&lt;br>
&lt;img src="https://pan.2bboy.com/img/2019/10/20190907022516.png"
loading="lazy"
alt="控制台"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>第三步：如果有域名的话，为域名添加解析，并在服务器控制台绑定域名，然后你就可以通过域名访问你创建的网站了。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>评价：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>优点：操作上由于有控制台，免去了ftp和解压的麻烦，还是相当方便的，最重要的是免费哈哈。&lt;/li>
&lt;li>缺点：服务器在国外访问速度较慢，但也还能接受啦，只能免费用一年。&lt;/li>
&lt;/ul>&lt;/blockquote>&lt;/blockquote>
&lt;h2 id="和hexo比较">&lt;a href="#%e5%92%8chexo%e6%af%94%e8%be%83" class="header-anchor">&lt;/a>和Hexo比较
&lt;/h2>&lt;p>由于wordpress有自己的后台管理，在功能上比静态的hexo要强大不少，部署的操作上比较简单，但是部署后网站的后台维护和管理感觉会更麻烦，后台里一堆设置看得人眼花。虽然wp的主题多到数不过来，但是优秀的主题如大海捞针，而且好看的主题大部分都是收费的。从操作上我更喜欢wp，hexo每次都要部署实属麻烦，但hexo的主题我倒是更喜欢。一句话喜欢折腾搞花样的选择wp，喜欢轻便只写博客的选择hexo。&lt;/p></description></item><item><title>零基础不花一分钱建站之Hexo篇</title><link>https://kizx.github.io/post/%E9%9B%B6%E5%9F%BA%E7%A1%80%E4%B8%8D%E8%8A%B1%E4%B8%80%E5%88%86%E9%92%B1%E5%BB%BA%E7%AB%99%E4%B9%8Bhexo%E7%AF%87/</link><pubDate>Fri, 16 Aug 2019 17:15:00 +0000</pubDate><guid>https://kizx.github.io/post/%E9%9B%B6%E5%9F%BA%E7%A1%80%E4%B8%8D%E8%8A%B1%E4%B8%80%E5%88%86%E9%92%B1%E5%BB%BA%E7%AB%99%E4%B9%8Bhexo%E7%AF%87/</guid><description>&lt;h2 id="前言">&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor">&lt;/a>前言
&lt;/h2>&lt;p>之前一个偶然的机会b站首页推荐了一个github+hexo建站的视频，虽然我对写博客没什么兴趣，但是对建站本身倒是很感兴趣，于是尝试做了一下，下面只宏观介绍下，不细节展开了。&lt;/p>
&lt;h2 id="建站流程">&lt;a href="#%e5%bb%ba%e7%ab%99%e6%b5%81%e7%a8%8b" class="header-anchor">&lt;/a>建站流程
&lt;/h2>&lt;p>建站流程大致如下（这只是一般步骤，后面还有更简单的方案）&lt;/p>
&lt;ol>
&lt;li>注册github账号并新建一个github.io仓库并进行相应设置&lt;/li>
&lt;li>下载安装git并配置好ssh连接&lt;/li>
&lt;li>下载安装node.js&lt;/li>
&lt;li>开始建站&lt;/li>
&lt;/ol>
&lt;p>前两步对于大多数接触过github和git的人来说应该不难，但对于新手来说尤其是git操作其实是还蛮复杂的，但好在这方面的教程相当多，网上随便找找都是教程，b站也有很多视频教程，下面是一个写得很好的比较简洁的教程：&lt;a class="link" href="https://www.simon96.online/2018/10/12/hexo-tutorial/" target="_blank" rel="noopener"
>另一个教程&lt;/a>&lt;/p>
&lt;p>后两步也可以参照下面hexo的官网步骤一步步来就好了：&lt;a class="link" href="https://hexo.io/zh-cn/docs/" target="_blank" rel="noopener"
>Hexo官方文档&lt;/a>&lt;/p>
&lt;p>视频教程的话推荐上面官方文档里的视频，视频在b站也有：&lt;a class="link" href="https://space.bilibili.com/362224537/channel/detail?cid=61636" target="_blank" rel="noopener"
>官方视频教程B站链接&lt;/a>&lt;/p>
&lt;ul>
&lt;li>个人遇到的坑大概就是由于网络不佳，其中有些命令执行后在下载时经常卡住，多来几次就好了(可能需要fq)，建议命令都在git-bash里执行，cmd里可能会卡住。&lt;/li>
&lt;/ul>
&lt;p>然后就是让博客换个好看点的主题，官网提供了不少主题，而且都是免费的，主题的使用方法一般主题介绍里会有写。下面是官方所有主题地址：&lt;a class="link" href="https://hexo.io/themes/" target="_blank" rel="noopener"
>Hexo官方主题&lt;/a>&lt;/p>
&lt;p>完成上面的步骤，在浏览器里输入相应的github.io的博客网址应该就能看到属于自己的博客网站了，到这里也就大功告成了。&lt;/p>
&lt;h2 id="域名">&lt;a href="#%e5%9f%9f%e5%90%8d" class="header-anchor">&lt;/a>域名
&lt;/h2>&lt;p>如果你还想继续折腾的话，可以去注册一个域名，这个免费的域名我倒没见过，不过最便宜的域名也只要1块钱，去腾讯云、阿里云、百度云都可以，哪个便宜就选哪个。国内域名购买后首先需要上传身份证实名认证一下，由于github服务器在海外，备案就不需要了。然后按照教程给域名添加解析，并在github里添加绑定。如果这一趟下来无误的话，浏览器里输入你的域名就可以重定向到博客网站上了。&lt;/p>
&lt;p>还有一点不得不提的就是github的国内访问速度较慢，可以使用国内的代码托管平台码云或者是coding。个人更推荐coding，因为码云免费版不支持自定义域名，要想绑定域名还得花钱升级pro版才行。而coding支持自定义域名，而且服务器在香港也不用备案。&lt;/p>
&lt;h2 id="一个更简单的方法">&lt;a href="#%e4%b8%80%e4%b8%aa%e6%9b%b4%e7%ae%80%e5%8d%95%e7%9a%84%e6%96%b9%e6%b3%95" class="header-anchor">&lt;/a>一个更简单的方法
&lt;/h2>&lt;p>说到coding就不得不提一个更骚的操作，因为coding现在好像和腾讯合作，腾讯出了个cloud studio的云平台功能，可以直接用云平台码代码，这也就意味着只要我们有网络，什么环境都不用装，利用腾讯的cloud studio直接从第四步开始建站就行了，这个可以说是最简单的方法了，非常适合小白。具体教程见下面的链接，用云平台的话部署就不用hexo g命令了，因为平台已经向我们提供了一键部署的功能，具体可以看coding的帮助文档。最后在退出的时候别忘了将代码提交和推送，下次再继续写文章时前拉取一下就可以回到上次提交的进度了。&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://blog.coding.net/blog/CS-Hexo" target="_blank" rel="noopener"
>最快的 Hexo 博客搭建方法&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Hexo搭配代码托管平台搭建博客网站的好处是轻量化，文章支持markdown格式，但只能搭建静态网页，没有后台，一切操作都在本地进行，本地编辑完了再生成网页并部署上传到代码托管平台，至于这是优点还是缺点就看个人偏好了。&lt;/p></description></item><item><title>加速Python的几种方法</title><link>https://kizx.github.io/post/%E5%8A%A0%E9%80%9Fpython%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 04 Aug 2019 17:12:00 +0000</pubDate><guid>https://kizx.github.io/post/%E5%8A%A0%E9%80%9Fpython%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/</guid><description>&lt;h2 id="前言">&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor">&lt;/a>前言
&lt;/h2>&lt;p>&lt;em>注意以下内容均为本人主观操作感受，运行环境为Win10+python3.7_32位，仅供本人日后查阅&lt;/em>&lt;/p>
&lt;p>众所周知，python是一门优美而简洁的编程语言，其最大的不足在于运行速度过于感人，而C语言作为最接近底层的高级语言，速度快是他最大的优势。python被誉为胶水语言，应该有办法和C语言胶和起来，我查阅资料发现python调用C语言最普遍的方式大概有三种：&lt;/p>
&lt;ol>
&lt;li>将C语言的函数编译成dll动态链接库，然后通过python的ctypes模块对dll进行调用。&lt;/li>
&lt;li>借由cython先将python代码编译成C语言代码，然后再讲C代码编译成.pyd文件直接在python中导入进行调用，cython本身有一定语法，不过不会一般也不太影响使用。&lt;/li>
&lt;li>使用Swig可以将C代码直接封装成python代码，过程略为复杂，优点是可以为多种语言提供接口。&lt;/li>
&lt;/ol>
&lt;p>以上几种方法的原理和过程下图很好的解释了：&lt;/p>
&lt;p>&lt;img src="https://pan.2bboy.com/img/2019/10/20190907022654.png"
loading="lazy"
alt="图片来自网络"
>&lt;/p>
&lt;p>本文以斐波拉契函数为例，探究python和C的合璧之法。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Python" data-lang="Python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> fib(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> fib(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#34;计算结果:&lt;/span>&lt;span style="color:#e6db74">%d&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> fib(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;python time cost:&amp;#39;&lt;/span>,end&lt;span style="color:#f92672">-&lt;/span>start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;time.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">clock_t&lt;/span> start, end;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">clock&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;计算结果:%d&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">fib&lt;/span>(&lt;span style="color:#ae81ff">40&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">clock&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;C cost time:%f&amp;#34;&lt;/span>, (&lt;span style="color:#66d9ef">double&lt;/span>)(end &lt;span style="color:#f92672">-&lt;/span> start) &lt;span style="color:#f92672">/&lt;/span> CLOCKS_PER_SEC);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">system&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;pause&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过运行上面的代码可以得到运行时间：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>纯python：&lt;br>
计算结果:102334155&lt;br>
python time cost: 87.49325394630432&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;blockquote>
&lt;ul>
&lt;li>纯C语言：&lt;br>
计算结果:102334155&lt;br>
C cost time:0.863000&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>差不多差了两个数量级吧。。。&lt;/p>
&lt;h2 id="1-通过ctypes调用dll">&lt;a href="#1-%e9%80%9a%e8%bf%87ctypes%e8%b0%83%e7%94%a8dll" class="header-anchor">&lt;/a>1. 通过ctypes调用dll
&lt;/h2>&lt;p>首先得先生成一个dll，你可以在ide里新建一个dll工程进行创建。更简单的做法是利用下面的gcc命令直接在cmd里进行编译，但前提是你已经装了Mingw或者并Mingw-w64且设置了环境变量，其中有个比较坑的地方就是你编译出来的dll位数要和你的python位数要匹配，像我笔记本上装的是Mingw-w64，而pyhton是32位的，32的python无法调用64位的dll，而这位Mingw-w64虽说同时支持64位和32位，但是前提是安装时勾选的是sjlj而不是seh，seh不支持32位！&lt;/p>
&lt;ul>
&lt;li>
&lt;p>安装Mingw建议用下面这位up的工具，简单快捷。&lt;br>
&lt;a class="link" href="https://www.bilibili.com/video/av52434248" target="_blank" rel="noopener"
>【一键】20秒配置VScodeC语言C++开发环境！&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>安装Mingw-w64可以参考：&lt;a class="link" href="https://www.cnblogs.com/ggg-327931457/p/9694516.html" target="_blank" rel="noopener"
>Mingw-w64安装&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>用于编译dll的c语言代码只需给出函数就好了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span>(n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span>(n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面是cmd中将C原文件编译成dll的命令：&lt;/p>
&lt;pre tabindex="0">&lt;code>gcc -fPIC -shared name.c -o name.dll
&lt;/code>&lt;/pre>&lt;p>如果是sjlj的Mingw-w64加上-m32可以编译出32位dll：&lt;/p>
&lt;pre tabindex="0">&lt;code>gcc -fPIC -shared -m32?name.c -o?name.dll
&lt;/code>&lt;/pre>&lt;p>然后在python中导入ctypes模块就可以调用dll了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> ctypes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fibpy&lt;span style="color:#f92672">=&lt;/span>ctypes&lt;span style="color:#f92672">.&lt;/span>CDLL(&lt;span style="color:#e6db74">&amp;#39;fibpy.dll&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#34;计算结果:&lt;/span>&lt;span style="color:#e6db74">%d&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> fibpy&lt;span style="color:#f92672">.&lt;/span>fib(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;dll time cost:&amp;#39;&lt;/span>,end&lt;span style="color:#f92672">-&lt;/span>start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ctype调用dll运行时间：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>计算结果:102334155&lt;/li>
&lt;li>dll time cost: 0.9999649524688721&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>因为只有一个函数，还调用的是C语言的，所以速度和纯C差不多。&lt;/p>
&lt;h2 id="2-cython">&lt;a href="#2-cython" class="header-anchor">&lt;/a>2. cython
&lt;/h2>&lt;p>先给出官方的一个教程：&lt;a class="link" href="http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html" target="_blank" rel="noopener"
>官方教程&lt;/a>&lt;/p>
&lt;p>使用cython首先要安装cython模块：&lt;/p>
&lt;pre tabindex="0">&lt;code>pip install Cython
&lt;/code>&lt;/pre>&lt;p>然后你需要安装Mingw进行一番配置或者直接下载安装Visual Studio安装C++环境，因为我用的是Mingw-win64，所以自然就先抛弃后面那个巨无霸选用前者，一番尝试后发现还是Visual Studio真香。当然可能单纯的是因为Mingw-win64不支持而已，用Mingw的话应该是可以的（但愿）。&lt;/p>
&lt;p>安装完环境后就可以直接把之前的纯python代码中的函数部分进行cython转换，不过需要现将其后缀名改为.pyx，然后需要再创建一个setup.py文件，其中写入代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> distutils.core &lt;span style="color:#f92672">import&lt;/span> setup
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> Cython.Build &lt;span style="color:#f92672">import&lt;/span> cythonize
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>setup(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">?&lt;/span> ext_modules &lt;span style="color:#f92672">=&lt;/span> cythonize(&lt;span style="color:#e6db74">&amp;#34;fibcy.pyx&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后还是cmd中执行：&lt;/p>
&lt;pre tabindex="0">&lt;code>python setup.py build_ext --inplace
&lt;/code>&lt;/pre>&lt;p>这时应该会生成一个.pyd文件，这个文件本质和前面的dll应该差不多，可以通过import在python中使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> fibcy
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#34;计算结果:&lt;/span>&lt;span style="color:#e6db74">%d&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> fibcy&lt;span style="color:#f92672">.&lt;/span>fib(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;cython time cost:&amp;#39;&lt;/span>,end&lt;span style="color:#f92672">-&lt;/span>start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行结果：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>计算结果:102334155&lt;/li>
&lt;li>cython time cost: 15.108871698379517&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>可以看到即使是在没有使用任何cython语法的情况下，cython的加速能力也是令人惊叹的，运行速度提高了一个数量级左右！&lt;/p>
&lt;h2 id="3-swig">&lt;a href="#3-swig" class="header-anchor">&lt;/a>3. Swig
&lt;/h2>&lt;p>同样先给出一个教程参考：&lt;a class="link" href="https://www.jianshu.com/p/ccd239bd11d9" target="_blank" rel="noopener"
>Swig教程&lt;/a>&lt;/p>
&lt;p>其实swig的原理和前面也差不多，但是过程更为复杂。首先当然要安装swig，下载解压后同样添加到系统环境变量。&lt;/p>
&lt;p>然后要准备的有C语言源文件，一个.i文件，还有一个setup.py文件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">%&lt;/span>module fib
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">%&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#f92672">%&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> n);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> setuptools &lt;span style="color:#f92672">import&lt;/span> setup,Extension
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>setup( name&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;fib&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> version&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;1.0&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ext_modules&lt;span style="color:#f92672">=&lt;/span>[Extension(&lt;span style="color:#e6db74">&amp;#39;_fib&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;fib.c&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;fib.i&amp;#39;&lt;/span>])]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后在命令行运行setup.py：&lt;/p>
&lt;pre tabindex="0">&lt;code>python setup.py build_ext --inplace
&lt;/code>&lt;/pre>&lt;p>最后生成的文件中应该有一个python文件，可以直接进行调用，除此之外我发现还有一个.pyd文件，果然和前面的方法都差不多呢，导入运行方法也和之前相同。&lt;/p>
&lt;p>运行结果：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>计算结果:102334155&lt;/li>
&lt;li>swig time cost: 0.6825790405273438&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>居然比纯C语言还要快！大概是因为去掉了计时模块的缘故，可能python的计时模块比C的要快？结果还是很匪夷所思呢？&lt;/p>
&lt;h2 id="4-namba的jit加速">&lt;a href="#4-namba%e7%9a%84jit%e5%8a%a0%e9%80%9f" class="header-anchor">&lt;/a>4. namba的@jit加速
&lt;/h2>&lt;p>namba加速不同于以上3种方法，上面3种方法多多少少会和C语言扯上点关系。numba则是直接在python源文件里通过加上一些代码直接运行并获得加速效果，本质原理也是使数据向静态靠拢，但是实现过程与上面3种方法相比更简单，可以参考&lt;a class="link" href="http://numba.pydata.org/numba-doc/latest/user/5minguide.html" target="_blank" rel="noopener"
>官方入门教程&lt;/a>&lt;/p>
&lt;p>下面具体看一下实现过程：
首先肯定是要先安装numba包&lt;/p>
&lt;pre tabindex="0">&lt;code>pip install numba
&lt;/code>&lt;/pre>&lt;p>然后只需在Python代码中导入numba并用jit修饰相应的函&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> numba &lt;span style="color:#f92672">import&lt;/span> jit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@jit&lt;/span>(nopython&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">fib&lt;/span>(n):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> n &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> fib(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> fib(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#34;计算结果:&lt;/span>&lt;span style="color:#e6db74">%d&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">%&lt;/span> fib(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end&lt;span style="color:#f92672">=&lt;/span>time&lt;span style="color:#f92672">.&lt;/span>time()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">&amp;#39;numba@jit time cost:&amp;#39;&lt;/span>,end&lt;span style="color:#f92672">-&lt;/span>start)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行结果：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>计算结果:102334155&lt;/li>
&lt;li>numba@jit time cost: 1.2832109928131104&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>加速效果可以说是相当惊人的，比cython要快，而且操作也特别简单，不用导来导去，和numpy相配合使用可以使运行速度得到极大的提升。&lt;/p>
&lt;h2 id="总结">&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor">&lt;/a>总结
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">方案&lt;/th>
&lt;th style="text-align: center">运行时间&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">纯Python&lt;/td>
&lt;td style="text-align: center">87.49325394630432&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">纯C语言&lt;/td>
&lt;td style="text-align: center">0.863000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">ctypes&lt;/td>
&lt;td style="text-align: center">0.9999649524688721&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">cython&lt;/td>
&lt;td style="text-align: center">15.108871698379517&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">swig&lt;/td>
&lt;td style="text-align: center">0.6825790405273438&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">numba&lt;/td>
&lt;td style="text-align: center">1.2832109928131104&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>python结合c语言的三种方法中ctypes方法最简单，将C代码直接编译成dll即可使用，cython可以为现有的python代码加速，swig可以直接将C转换为python，就是有点麻烦，但速度是最快的。numba的jit加速比上面三种方法都要更简单，只需在python源码里加几句就行了，而且速度也很可观。&lt;/p></description></item><item><title>关于</title><link>https://kizx.github.io/page/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kizx.github.io/page/about/</guid><description>&lt;blockquote>
&lt;p>不以物喜，不以己悲&lt;/p>&lt;/blockquote></description></item><item><title>归档</title><link>https://kizx.github.io/page/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kizx.github.io/page/archives/</guid><description/></item><item><title>链接</title><link>https://kizx.github.io/page/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kizx.github.io/page/links/</guid><description/></item><item><title>搜索</title><link>https://kizx.github.io/page/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kizx.github.io/page/search/</guid><description/></item></channel></rss>